{"version":3,"sources":["vendor/ember-cli/app-prefix.js","semente-web-app/adapters/application.js","semente-web-app/analytics.js","semente-web-app/app.js","semente-web-app/authenticators/auth.js","semente-web-app/authenticators/authold.js","semente-web-app/authenticators/jwt.js","semente-web-app/authenticators/personificacao.js","semente-web-app/authenticators/token.js","semente-web-app/components/link-to-external.js","semente-web-app/components/login-coreskills.js","semente-web-app/components/login-plataforma-s.js","semente-web-app/components/login-plataforma-semente.js","semente-web-app/config/asset-manifest.js","semente-web-app/controllers/cadastro-responsavel.js","semente-web-app/controllers/descadastro.js","semente-web-app/controllers/login.js","semente-web-app/controllers/maintenance.js","semente-web-app/data-adapter.js","semente-web-app/helpers/act.js","semente-web-app/helpers/equalstr.js","semente-web-app/helpers/first.js","semente-web-app/initializers/clear-stale-session-on-sso.js","semente-web-app/initializers/ember-data.js","semente-web-app/initializers/ember-engines-router-service.js","semente-web-app/initializers/ember-simple-auth.js","semente-web-app/initializers/engines.js","semente-web-app/initializers/inflector-rules.js","semente-web-app/initializers/promise-many-array-compat.js","semente-web-app/initializers/unregister-orphan-service-worker.js","semente-web-app/instance-initializers/a11y-teclado.js","semente-web-app/instance-initializers/load-asset-manifest.js","semente-web-app/models/acompanhamento-atividade-instituicao.js","semente-web-app/models/acompanhamento-atividade-turma.js","semente-web-app/models/acompanhamento-atividade.js","semente-web-app/models/acompanhamento-curso-instituicao.js","semente-web-app/models/acompanhamento-instituicao-comp.js","semente-web-app/models/acompanhamento-pessoa-dominio.js","semente-web-app/models/agrupamento.js","semente-web-app/models/alternativa-comp.js","semente-web-app/models/alternativa.js","semente-web-app/models/ano.js","semente-web-app/models/aplicacao-aula.js","semente-web-app/models/aplicacao-plataforma-aula.js","semente-web-app/models/aplicacao-questionario.js","semente-web-app/models/area-marketing.js","semente-web-app/models/area.js","semente-web-app/models/arquivo.js","semente-web-app/models/atividade.js","semente-web-app/models/aula-recomendada.js","semente-web-app/models/aula.js","semente-web-app/models/avaliacao.js","semente-web-app/models/biblioteca.js","semente-web-app/models/bloco.js","semente-web-app/models/calendario.js","semente-web-app/models/codigo-cadastro.js","semente-web-app/models/comp-recomendada.js","semente-web-app/models/comp.js","semente-web-app/models/conteudo-arquivo.js","semente-web-app/models/conteudo.js","semente-web-app/models/conversa-chatbot.js","semente-web-app/models/dominio.js","semente-web-app/models/download-arquivo.js","semente-web-app/models/ebook.js","semente-web-app/models/escala.js","semente-web-app/models/estado-questao.js","semente-web-app/models/estado-video-alternativa.js","semente-web-app/models/estado-video.js","semente-web-app/models/help.js","semente-web-app/models/html.js","semente-web-app/models/instituicao-plataforma-ano-sistema.js","semente-web-app/models/instituicao.js","semente-web-app/models/interacao-dominio.js","semente-web-app/models/leitura.js","semente-web-app/models/limite-faixa-dominio.js","semente-web-app/models/limite-faixa.js","semente-web-app/models/livro.js","semente-web-app/models/marketing.js","semente-web-app/models/material.js","semente-web-app/models/matricula.js","semente-web-app/models/modulo.js","semente-web-app/models/pasta-marketing.js","semente-web-app/models/percurso.js","semente-web-app/models/pessoa.js","semente-web-app/models/pilar.js","semente-web-app/models/plataforma-ano.js","semente-web-app/models/plataforma-conteudo.js","semente-web-app/models/plataforma-turma.js","semente-web-app/models/publico.js","semente-web-app/models/questao-comp.js","semente-web-app/models/questao.js","semente-web-app/models/quiz-comp.js","semente-web-app/models/quiz.js","semente-web-app/models/relacao-comp.js","semente-web-app/models/relacao-dominio.js","semente-web-app/models/relatorio-chatbot.js","semente-web-app/models/relatorio-detalhado-comp.js","semente-web-app/models/relatorio-detalhado-formacao.js","semente-web-app/models/relatorio-detalhado.js","semente-web-app/models/relatorio-geral-dominio.js","semente-web-app/models/relatorio-geral.js","semente-web-app/models/relatorio-instituicao-comp.js","semente-web-app/models/relatorio-instituicao-dominio.js","semente-web-app/models/relatorio-instituicao.js","semente-web-app/models/relatorio-percentual-concluido.js","semente-web-app/models/resposta-comp.js","semente-web-app/models/resposta.js","semente-web-app/models/secao.js","semente-web-app/models/segmento.js","semente-web-app/models/sistema.js","semente-web-app/models/sugestao.js","semente-web-app/models/tema.js","semente-web-app/models/tempo-resposta.js","semente-web-app/models/turma.js","semente-web-app/models/video.js","semente-web-app/register-sw.js","semente-web-app/resolver.js","semente-web-app/router.js","semente-web-app/routes/application.js","semente-web-app/routes/cadastro-responsavel.js","semente-web-app/routes/descadastro.js","semente-web-app/routes/index.js","semente-web-app/routes/login.js","semente-web-app/routes/webapp.js","semente-web-app/routes/webapp/index.js","semente-web-app/serializers/application.js","semente-web-app/services/asset-loader.js","semente-web-app/services/cookies.js","semente-web-app/services/engine-router-service.js","semente-web-app/services/offline.js","semente-web-app/services/personificacao.js","semente-web-app/services/session.js","semente-web-app/services/store.js","semente-web-app/session-stores/application.js","semente-web-app/templates/application.js","semente-web-app/templates/cadastro-responsavel.js","semente-web-app/templates/descadastro.js","semente-web-app/templates/index.js","semente-web-app/templates/login.js","semente-web-app/templates/maintenance.js","semente-web-app/templates/webapp.js","semente-web-app/templates/webapp/index.js","semente-web-app/transforms/boolean.js","semente-web-app/transforms/date.js","semente-web-app/transforms/number.js","semente-web-app/transforms/string.js","semente-web-app/utils/api-publica.js","semente-web-app/utils/arrays.js","semente-web-app/utils/computed-sobrescrevivel.js","semente-web-app/utils/inflector-rules.js","semente-web-app/utils/json-api-ids.js","semente-web-app/utils/offline-arquivos.js","semente-web-app/utils/offline-idb.js","semente-web-app/utils/offline-prefetch.js","semente-web-app/utils/offline-sync.js","semente-web-app/utils/offline-videos.js","semente-web-app/utils/offline.js","semente-web-app/utils/personificacao.js","semente-web-app/utils/taxonomia-vigentes.js","vendor/ember-cli/app-suffix.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","define(\"semente-web-app/adapters/application\", [\"exports\", \"rsvp\", \"@ember/service\", \"@ember-data/adapter/error\", \"@ember-data/adapter/json-api\", \"@ember/object\", \"semente-web-app/config/environment\", \"semente-web-app/utils/inflector-rules\"], function (_exports, _rsvp, _service, _error, _jsonApi, _object, _environment, _inflectorRules) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"rsvp\",0,\"@ember/service\",0,\"@ember-data/adapter/error\",0,\"@ember-data/adapter/json-api\",0,\"@ember/object\",0,\"semente-web-app/config/environment\",0,\"semente-web-app/utils/inflector-rules\"eaimeta@70e063a35619d71f\n // import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin';\n // Regras de plural/singular em português (também registradas no boot por initializers/inflector-rules.js).\n var _default = _exports.default = _jsonApi.default.extend({\n envnmt: _environment.default.APP,\n session: (0, _service.service)('session'),\n // Feature Offline (SESI, fase 2): fila offline. Tudo abaixo passa direto para o\n // comportamento original (this._super) quando a instituição não tem offline habilitado ou\n // quando o model/operação não é da fila (utils/offline-sync.js#OPERACOES_INTERCEPTADAS).\n offline: (0, _service.service)(),\n // Feature 04 (SESI): modo \"Ver como\" é somente leitura (o back é a garantia real).\n personificacao: (0, _service.service)(),\n host: (0, _object.computed)('envnmt', function () {\n //this will define if the server endpoint for the API calls are relative or absolute. Dev - absolute API endpoint; Prod - relative\n return this.get('envnmt.host');\n }),\n namespace: (0, _object.computed)('envnmt', function () {\n return this.get('envnmt.namespace');\n }),\n // getter nativo: recalculado a cada acesso (substitui computed().volatile(), removido no Ember 4)\n get headers() {\n let header = localStorage.getItem('person_logged');\n let header_person;\n if (header) {\n header = JSON.parse(header);\n header_person = header.id;\n } else {\n header_person = \"\";\n }\n let sessionData = this.get('session.data');\n let tok = sessionData.authenticated.access_token;\n let temp = 'Bearer ';\n let userToken = temp.concat(tok);\n return {\n 'Content-Type': 'application/json',\n 'pessoaid': header_person,\n 'Authorization': userToken\n };\n },\n // ---- Feature 04 (SESI): personificação ---------------------------------------------\n // Com personificação ativa, create/update/delete são rejeitados na hora (sem ir à rede nem\n // à fila offline) e um aviso não bloqueante é exibido. Sem personificação: null (segue igual).\n _bloqueioPersonificacao() {\n let personificacao = this.get('personificacao');\n if (!personificacao || !personificacao.get('ativa')) return null;\n personificacao.avisarBloqueio();\n return (0, _rsvp.reject)(new _error.ForbiddenError([{\n status: '403',\n codigo: 'personificacao-somente-leitura',\n detail: \"Ação indisponível no modo 'Ver como'\"\n }], \"Ação indisponível no modo 'Ver como'\"));\n },\n // ---- Feature Offline (SESI, fase 2) --------------------------------------------------\n _salvarOffline(kind, store, type, snapshot, enviar) {\n let bloqueio = this._bloqueioPersonificacao();\n if (bloqueio) return bloqueio;\n let offline = this.get('offline');\n if (!offline || !offline.interceptaOperacao(kind, type.modelName)) return enviar();\n return offline.salvarComFila(kind, store, type, snapshot, enviar);\n },\n createRecord(store, type, snapshot) {\n const sup = this._super,\n args = arguments;\n return this._salvarOffline('createRecord', store, type, snapshot, () => sup.apply(this, args));\n },\n updateRecord(store, type, snapshot) {\n const sup = this._super,\n args = arguments;\n return this._salvarOffline('updateRecord', store, type, snapshot, () => sup.apply(this, args));\n },\n deleteRecord(store, type, snapshot) {\n const sup = this._super,\n args = arguments;\n return this._salvarOffline('deleteRecord', store, type, snapshot, () => sup.apply(this, args));\n },\n findRecord(store, type, id, snapshot) {\n const sup = this._super,\n args = arguments;\n let offline = this.get('offline');\n if (!offline || !offline.get('habilitado')) return sup.apply(this, args);\n return offline.buscarComFallback(store, type, id, snapshot, () => sup.apply(this, args));\n },\n findAll(store, type) {\n const sup = this._super,\n args = arguments;\n let offline = this.get('offline');\n if (!offline || !offline.get('habilitado')) return sup.apply(this, args);\n return offline.buscarTodosComFallback(type.modelName, () => sup.apply(this, args));\n }\n });\n});","define(\"semente-web-app/analytics\", [\"@ember/routing/router\"], function (_router) {\n \"use strict\";\n\n 0; //eaimeta@70e063a35619d71f0,\"@ember/routing/router\"eaimeta@70e063a35619d71f\n // O evento `didTransition` do Router foi removido no Ember 4; `routeDidChange` é o equivalente.\n _router.default.reopen({\n init() {\n this._super(...arguments);\n this.on('routeDidChange', () => this.notifyGoogleAnalytics());\n },\n notifyGoogleAnalytics() {\n let ga = window.ga;\n if (typeof ga != 'function') {\n return;\n }\n return ga('send', 'pageview', {\n 'page': this.get('url'),\n 'title': this.get('url')\n });\n }\n });\n});","define(\"semente-web-app/app\", [\"exports\", \"@ember/application\", \"semente-web-app/resolver\", \"ember-load-initializers\", \"semente-web-app/config/environment\", \"semente-web-app/analytics\", \"semente-web-app/register-sw\"], function (_exports, _application, _resolver, _emberLoadInitializers, _environment, _analytics, _registerSw) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/application\",0,\"semente-web-app/resolver\",0,\"ember-load-initializers\",0,\"semente-web-app/config/environment\",0,\"semente-web-app/analytics\",0,\"semente-web-app/register-sw\"eaimeta@70e063a35619d71f\n const App = _application.default.extend({\n modulePrefix: _environment.default.modulePrefix,\n podModulePrefix: _environment.default.podModulePrefix,\n Resolver: _resolver.default,\n engines: {\n // ember-engines 0.13: a chave deve ser o nome do engine como montado no router ('semente-engine'), nao camelCase\n 'semente-engine': {\n dependencies: {\n services: ['session', 'store', 'offline', 'personificacao' // Feature 04 (SESI)\n ]\n }\n }\n }\n });\n (0, _emberLoadInitializers.default)(App, _environment.default.modulePrefix);\n var _default = _exports.default = App;\n});","define(\"semente-web-app/authenticators/auth\", [\"exports\", \"@ember/runloop\", \"@ember/utils\", \"@ember/object\", \"jquery\", \"rsvp\", \"@ember/service\", \"ember-simple-auth-token/authenticators/jwt\", \"semente-web-app/utils/offline\"], function (_exports, _runloop, _utils, _object, _jquery, _rsvp, _service, _jwt, _offline) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/runloop\",0,\"@ember/utils\",0,\"@ember/object\",0,\"jquery\",0,\"rsvp\",0,\"@ember/service\",0,\"ember-simple-auth-token/authenticators/jwt\",0,\"semente-web-app/utils/offline\"eaimeta@70e063a35619d71f\n var _default = _exports.default = _jwt.default.extend({\n // Feature Offline (SESI, decisão 11). Hoje o login usa `authenticator:authold` (sem timer de\n // expiração); estes overrides protegem sessões salvas com este autenticador JWT. Sem a flag,\n // chamam o comportamento da biblioteca sem mudança.\n offline: (0, _service.service)(),\n // Token vencido não derruba a sessão restaurada: offline, ler do cache não precisa de token; na\n // volta da rede o serviço `offline` pede login (pedirLoginPorExpiracao).\n restore(data) {\n const restaurar = this._super(...arguments);\n if (!(0, _offline.lerFlagOffline)()) return restaurar;\n return restaurar.catch(erro => {\n if (erro && erro.message === 'token is expired') {\n let offline = this.get('offline');\n if (offline) offline.set('tokenExpirado', true);\n return data;\n }\n throw erro;\n });\n },\n // Timer de expiração da biblioteca (tokenExpirationInvalidateSession): com a flag, o serviço\n // `offline` decide — offline não invalida; online pede login como saída por expiração.\n handleAccessTokenExpiration() {\n if (!(0, _offline.lerFlagOffline)()) return this._super(...arguments);\n let offline = this.get('offline');\n let semRede = typeof navigator !== 'undefined' && navigator.onLine === false;\n if (offline && semRede) offline.set('tokenExpirado', true);else if (offline) offline.pedirLoginPorExpiracao();\n return (0, _rsvp.resolve)();\n },\n makeRequest(url, credentials, headers) {\n let content_data = 'UserName=' + credentials.username + '&password=' + credentials.password + '&grant_type=password&KeepLogged=' + credentials.remember;\n return _jquery.default.ajax({\n url: url,\n method: 'POST',\n // data: JSON.stringify(data),\n data: content_data,\n dataType: 'json',\n contentType: 'application/json',\n headers: this.headers,\n beforeSend: (xhr, settings) => {\n if (this.headers['Accept'] === null || this.headers['Accept'] === undefined) {\n xhr.setRequestHeader('Accept', settings.accepts.json);\n }\n if (headers) {\n Object.keys(headers).forEach(key => {\n xhr.setRequestHeader(key, headers[key]);\n });\n }\n }\n });\n },\n handleAuthResponse(response) {\n const token = (0, _object.get)(response, 'access_token');\n if ((0, _utils.isEmpty)(token)) {\n throw new Error('Token is empty. Please check your backend response.');\n }\n const tokenData = this.getTokenData(token);\n // const user_role = tokenData.role.toLowerCase();\n // localStorage.setItem('user_role', user_role);\n const expiresAt = (0, _object.get)(tokenData, this.tokenExpireName);\n const tokenExpireData = {};\n tokenExpireData[this.tokenExpireName] = expiresAt;\n this.scheduleAccessTokenRefresh(expiresAt, token);\n return Object.assign(this.getResponseData(response), tokenExpireData);\n },\n authenticate(credentials, headers) {\n return new _rsvp.Promise((resolve, reject) => {\n this.makeRequest(this.serverTokenEndpoint, credentials, headers).then(response => {\n (0, _runloop.run)(() => {\n try {\n const sessionData = this.handleAuthResponse(response);\n resolve(sessionData);\n } catch (error) {\n reject(error);\n }\n });\n }, xhr => {\n (0, _runloop.run)(() => {\n reject(xhr.responseJSON || xhr.responseText);\n });\n });\n });\n }\n });\n});","define(\"semente-web-app/authenticators/authold\", [\"exports\", \"@ember/object/computed\", \"@ember/object\", \"rsvp\", \"@ember/utils\", \"@ember/runloop\", \"ember-simple-auth/authenticators/base\", \"fetch\", \"semente-web-app/config/environment\"], function (_exports, _computed, _object, _rsvp, _utils, _runloop, _base, _fetch, _environment) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object/computed\",0,\"@ember/object\",0,\"rsvp\",0,\"@ember/utils\",0,\"@ember/runloop\",0,\"ember-simple-auth/authenticators/base\",0,\"fetch\",0,\"semente-web-app/config/environment\"eaimeta@70e063a35619d71f\n const JSON_CONTENT_TYPE = 'application/json';\n var _default = _exports.default = _base.default.extend({\n envnmt: _environment.default.APP,\n serverTokenEndpoint: (0, _object.computed)('envnmt', function () {\n //this will define if the server endpoint for the API calls are relative or absolute. Dev - absolute API endpoint; Prod - relative\n return this.get('envnmt.host') + '/' + this.get('envnmt.namespace') + '/auth/login';\n }),\n rejectWithXhr: (0, _computed.deprecatingAlias)('rejectWithResponse', {\n id: `ember-simple-auth.authenticator.reject-with-xhr`,\n until: '2.0.0'\n }),\n rejectWithResponse: false,\n restore(data) {\n return this._validate(data) ? _rsvp.Promise.resolve(data) : _rsvp.Promise.reject();\n },\n authenticate(identification, password, life) {\n return new _rsvp.Promise((resolve, reject) => {\n const useResponse = this.get('rejectWithResponse');\n let data = 'UserName=' + identification + '&password=' + password + '&grant_type=password&KeepLogged=' + life;\n // let data = 'UserName=' + identification + '&password='+ password + '&grant_type=password&KeepLogged=' + life + '&client_id=ngAuthApp';\n this.makeRequest(data).then(response => {\n if (response.ok) {\n response.json().then(json => {\n if (this._validate(json)) {\n const _json = json;\n (0, _runloop.run)(null, resolve, _json);\n } else {\n (0, _runloop.run)(null, reject, `Check that server response includes a token`);\n }\n });\n } else {\n if (useResponse) {\n (0, _runloop.run)(null, reject, response);\n } else {\n response.json().then(json => (0, _runloop.run)(null, reject, json));\n }\n }\n }).catch(error => (0, _runloop.run)(null, reject, error));\n });\n },\n invalidate() {\n return _rsvp.Promise.resolve();\n },\n makeRequest(data, options = {}) {\n let url = options.url || this.get('serverTokenEndpoint');\n let requestOptions = {};\n let body = data;\n Object.assign(requestOptions, {\n body,\n method: 'POST',\n headers: {\n 'Accept': 'application/json, text/javascript',\n 'Content-Type': JSON_CONTENT_TYPE,\n 'Data-Type': 'json'\n }\n });\n Object.assign(requestOptions, options || {});\n return (0, _fetch.default)(url, requestOptions);\n },\n _validate(data) {\n return !(0, _utils.isEmpty)(data['access_token']);\n }\n });\n});","define(\"semente-web-app/authenticators/jwt\", [\"exports\", \"ember-simple-auth-token/authenticators/jwt\"], function (_exports, _jwt) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _jwt.default;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"ember-simple-auth-token/authenticators/jwt\"eaimeta@70e063a35619d71f\n});","define(\"semente-web-app/authenticators/personificacao\", [\"exports\", \"rsvp\", \"@ember/utils\", \"ember-simple-auth/authenticators/base\"], function (_exports, _rsvp, _utils, _base) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"rsvp\",0,\"@ember/utils\",0,\"ember-simple-auth/authenticators/base\"eaimeta@70e063a35619d71f\n var _default = _exports.default = _base.default.extend({\n restore(data) {\n return this._validate(data) ? _rsvp.Promise.resolve(data) : _rsvp.Promise.reject();\n },\n authenticate(dados) {\n if (!this._validate(dados)) return _rsvp.Promise.reject('Check that server response includes a token');\n let conteudo = Object.assign({}, dados);\n delete conteudo.authenticator;\n return _rsvp.Promise.resolve(conteudo);\n },\n invalidate() {\n return _rsvp.Promise.resolve();\n },\n _validate(data) {\n return !!data && !(0, _utils.isEmpty)(data['access_token']);\n }\n });\n});","define(\"semente-web-app/authenticators/token\", [\"exports\", \"ember-simple-auth-token/authenticators/token\"], function (_exports, _token) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _token.default;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"ember-simple-auth-token/authenticators/token\"eaimeta@70e063a35619d71f\n});","define(\"semente-web-app/components/link-to-external\", [\"exports\", \"ember-engines/components/link-to-external\"], function (_exports, _linkToExternal) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _linkToExternal.default;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"ember-engines/components/link-to-external\"eaimeta@70e063a35619d71f\n});","define(\"semente-web-app/components/login-coreskills\", [\"exports\", \"@ember/component\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _object, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/component\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n /*\n
\n \n
\n

Login

\n \n \"\"\n \n \n
\n \n
\n
\n
\n \n Caps Lock is on\n \n \n \n
\n \n
\n {{#if this.errorMessage}}\n
\n \n

{{this.errorMessage}}

\n
\n {{/if}}\n \n {{#if this.success_mail}}\n
\n \n

{{this.success_mail}}

\n
\n {{/if}}\n \n \n {{!-- Conheça nossa Política de Privcidade --}}\n
\n
\n \n \n */\n {\n \"id\": \"p0cwLwQp\",\n \"block\": \"[[[11,\\\"form\\\"],[24,0,\\\"login bg--login-coreskills\\\"],[4,[38,1],[\\\"submit\\\",[28,[37,2],[[30,0,[\\\"authenticateAction\\\"]]],null]],null],[12],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"login__box-coreskills\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,0,\\\"scr-only\\\"],[12],[1,\\\"Login\\\"],[13],[1,\\\"\\\\n \\\\n \\\"],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"assets/img/coreskills.png\\\"],[14,\\\"alt\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,0,\\\"login__box-coreskills\\\"],[14,1,\\\"identification22\\\"],[14,\\\"autocomplete\\\",\\\"on\\\"],[15,2,[30,0,[\\\"identification\\\"]]],[14,\\\"autofocus\\\",\\\"autofocus\\\"],[14,5,\\\"display: none; position: absolute;\\\"],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\" login__form-group form-group form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,1,\\\"identification\\\"],[14,0,\\\"login__box-coreskills\\\"],[15,2,[30,0,[\\\"user_email\\\"]]],[14,\\\"placeholder\\\",\\\"usuário ou cpf sem pontos e traço\\\"],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"textbox\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\" form-group form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"login__passInputWrapper\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,1,\\\"msg-caps-on\\\"],[14,0,\\\"form__msg form__msg--error\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"form__msg-icon icon-alert-triangle\\\"],[12],[13],[1,\\\"Caps Lock is on\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,1,\\\"password\\\"],[15,2,[30,0,[\\\"user_email\\\"]]],[14,0,\\\"login__input-pass pwd login__box-coreskills\\\"],[14,\\\"placeholder\\\",\\\"senha\\\"],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"password\\\"],[12],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"login__box-coreskills--show-pass\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"passwordVisibilityAction\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-eye-off\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-eye\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"login__box-coreskills--forgot-pass\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"forgotPassAction\\\"]]],null]],null],[12],[1,\\\"Esqueceu sua\\\\n senha?\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"errorMessage\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"login__alert alert alert--has-icon alert--error alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-x\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"errorMessage\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"success_mail\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"login__alert alert alert--has-icon alert--success alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-check\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"success_mail\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,0,\\\"login__coreskills\\\"],[14,1,\\\"login_button\\\"],[14,4,\\\"submit\\\"],[12],[10,1],[12],[13],[1,\\\"Acessar\\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"aside\\\"],[14,1,\\\"forgot_modal\\\"],[14,0,\\\"modal\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__content modal__content--sm\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"header\\\"],[14,0,\\\"modal__header\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"modal__close btn btn--icon icon-x\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"cancelForgotAction\\\"]]],null]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"h3\\\"],[14,0,\\\"modal__title\\\"],[12],[1,\\\"Solicitar nova senha\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__body\\\"],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Preencha seu e-mail abaixo para receber uma nova senha.\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"login__form-group form-group form-group--full-width form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"form-group__label\\\"],[12],[1,\\\"E-mail\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,0,\\\"form-group__input form-group--full-width\\\"],[24,1,\\\"user_email\\\"],[16,2,[30,0,[\\\"user_email\\\"]]],[24,4,\\\"textbox\\\"],[4,[38,1],[\\\"keyup\\\",[30,0,[\\\"submtirOnEnter\\\"]]],null],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error_forgot\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"alert alert--error alert--has-icon alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-alert-triangle\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"error_forgot\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__footer modal__footer--center\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"btn\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"sendMailAction\\\"]]],null]],null],[12],[1,\\\"Solicitar nova senha\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__overlayer\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],[\\\"form\\\",\\\"on\\\",\\\"act\\\",\\\"div\\\",\\\"h2\\\",\\\"img\\\",\\\"input\\\",\\\"span\\\",\\\"button\\\",\\\"if\\\",\\\"p\\\",\\\"aside\\\",\\\"header\\\",\\\"h3\\\",\\\"label\\\"]]\",\n \"moduleName\": \"semente-web-app/components/login-coreskills.hbs\",\n \"isStrictMode\": false\n });\n var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, _component.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n authenticateAction: (0, _object.action)(function (...args) {\n return this.send('authenticate', ...args);\n }),\n cancelForgotAction: (0, _object.action)(function (...args) {\n return this.send('cancelForgot', ...args);\n }),\n forgotPassAction: (0, _object.action)(function (...args) {\n return this.send('forgotPass', ...args);\n }),\n passwordVisibilityAction: (0, _object.action)(function (...args) {\n return this.send('passwordVisibility', ...args);\n }),\n sendMailAction: (0, _object.action)(function (...args) {\n return this.send('sendMail', ...args);\n }),\n submtirOnEnter: (0, _object.action)(function (...args) {\n return this.send('submtirOnEnter', ...args);\n }),\n actions: {\n authenticate() {\n this.get('authenticate')();\n },\n passwordVisibility() {\n this.get('passwordVisibility')();\n },\n forgotPass() {\n this.get('forgotPass')();\n },\n cancelForgot() {\n this.get('cancelForgot')();\n },\n submtirOnEnter() {\n this.get('submtirOnEnter')();\n },\n sendMail() {\n this.get('sendMail')();\n }\n },\n init: function () {\n this._super();\n this.get('value');\n }\n }));\n});","define(\"semente-web-app/components/login-plataforma-s\", [\"exports\", \"@ember/component\", \"@ember/object\", \"@ember/template-factory\"], function (_exports, _component, _object, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/component\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n /*\n \n
\n \n
\n

Login

\n \n \"\"\n \n \n
\n \n \n
\n
\n \n
\n \n Caps Lock is on\n \n \n \n
\n \n \n
\n {{#if this.errorMessage}}\n
\n \n

{{this.errorMessage}}

\n
\n {{/if}}\n \n {{#if this.success_mail}}\n
\n \n

{{this.success_mail}}

\n
\n {{/if}}\n \n \n
\n
\n \n \n */\n {\n \"id\": \"3pw+Elf7\",\n \"block\": \"[[[3,\\\" Top content \\\"],[1,\\\"\\\\n\\\"],[11,\\\"form\\\"],[24,0,\\\"login bg--black-blue-print\\\"],[4,[38,1],[\\\"submit\\\",[28,[37,2],[[30,0,[\\\"authenticateAction\\\"]]],null]],null],[12],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"login__box\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,0,\\\"scr-only\\\"],[12],[1,\\\"Login\\\"],[13],[1,\\\"\\\\n \\\\n \\\"],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"assets/img/logo-plataforma-s.png\\\"],[14,\\\"alt\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,0,\\\"login__input form-group__input\\\"],[14,1,\\\"identification22\\\"],[14,\\\"autocomplete\\\",\\\"on\\\"],[15,2,[30,0,[\\\"identification\\\"]]],[14,\\\"autofocus\\\",\\\"autofocus\\\"],[14,5,\\\"display: none; position: absolute;\\\"],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"login__form-group form-group form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"form-group__label\\\"],[12],[1,\\\"Login ou CPF\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,0,\\\"login__input form-group__input\\\"],[14,1,\\\"identification\\\"],[14,\\\"autocomplete\\\",\\\"off\\\"],[14,\\\"autocomplete\\\",\\\"false\\\"],[14,\\\"autocomplete\\\",\\\"new-password\\\"],[15,2,[30,0,[\\\"identification\\\"]]],[14,\\\"autofocus\\\",\\\"autofocus\\\"],[12],[13],[1,\\\" \\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"login__form-group form-group form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"form-group__label\\\"],[12],[1,\\\"Senha\\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"form-group__container\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,1,\\\"msg-caps-on\\\"],[14,0,\\\"form__msg form__msg--error\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"form__msg-icon icon-alert-triangle\\\"],[12],[13],[1,\\\"Caps Lock is on\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,0,\\\"login__input login__input-pass form-group__input pwd\\\"],[14,1,\\\"password\\\"],[14,\\\"autocomplete\\\",\\\"off\\\"],[14,\\\"autocomplete\\\",\\\"false\\\"],[14,\\\"autocomplete\\\",\\\"new-password\\\"],[15,2,[30,0,[\\\"password\\\"]]],[14,4,\\\"password\\\"],[12],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"login__show-pass\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"passwordVisibilityAction\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-eye-off\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-eye\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"login__forgot-pass\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"forgotPassAction\\\"]]],null]],null],[12],[1,\\\"Esqueceu sua\\\\n senha?\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"errorMessage\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"login__alert alert alert--has-icon alert--error alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-x\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"errorMessage\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"success_mail\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"login__alert alert alert--has-icon alert--success alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-check\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"success_mail\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,0,\\\"login__cta btn\\\"],[14,1,\\\"login_button\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"Entrar\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"aside\\\"],[14,1,\\\"forgot_modal\\\"],[14,0,\\\"modal\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__content modal__content--sm\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"header\\\"],[14,0,\\\"modal__header\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"modal__close btn btn--icon icon-x\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"cancelForgotAction\\\"]]],null]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"h3\\\"],[14,0,\\\"modal__title\\\"],[12],[1,\\\"Solicitar nova senha\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__body\\\"],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Preencha seu e-mail abaixo para receber uma nova senha.\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"login__form-group form-group form-group--full-width form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"form-group__label\\\"],[12],[1,\\\"E-mail\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,0,\\\"form-group__input form-group--full-width\\\"],[24,1,\\\"user_email\\\"],[16,2,[30,0,[\\\"user_email\\\"]]],[24,4,\\\"textbox\\\"],[4,[38,1],[\\\"keyup\\\",[30,0,[\\\"submtirOnEnterAction\\\"]]],null],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error_forgot\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"alert alert--error alert--has-icon alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-alert-triangle\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"error_forgot\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__footer modal__footer--center\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"btn\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"sendMailAction\\\"]]],null]],null],[12],[1,\\\"Solicitar nova senha\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__overlayer\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],[\\\"form\\\",\\\"on\\\",\\\"act\\\",\\\"div\\\",\\\"h2\\\",\\\"img\\\",\\\"input\\\",\\\"label\\\",\\\"span\\\",\\\"button\\\",\\\"if\\\",\\\"p\\\",\\\"aside\\\",\\\"header\\\",\\\"h3\\\"]]\",\n \"moduleName\": \"semente-web-app/components/login-plataforma-s.hbs\",\n \"isStrictMode\": false\n });\n var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, _component.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n authenticateAction: (0, _object.action)(function (...args) {\n return this.send('authenticate', ...args);\n }),\n cancelForgotAction: (0, _object.action)(function (...args) {\n return this.send('cancelForgot', ...args);\n }),\n forgotPassAction: (0, _object.action)(function (...args) {\n return this.send('forgotPass', ...args);\n }),\n passwordVisibilityAction: (0, _object.action)(function (...args) {\n return this.send('passwordVisibility', ...args);\n }),\n sendMailAction: (0, _object.action)(function (...args) {\n return this.send('sendMail', ...args);\n }),\n submtirOnEnterAction: (0, _object.action)(function (...args) {\n return this.send('submtirOnEnter', ...args);\n }),\n actions: {\n authenticate() {\n this.get('authenticate')();\n },\n passwordVisibility() {\n this.get('passwordVisibility')();\n },\n forgotPass() {\n this.get('forgotPass')();\n },\n cancelForgot() {\n this.get('cancelForgot')();\n },\n submtirOnEnter() {\n this.get('submtirOnEnter')();\n },\n sendMail() {\n this.get('sendMail')();\n }\n },\n init: function () {\n this._super();\n this.get('value');\n }\n }));\n});","define(\"semente-web-app/components/login-plataforma-semente\", [\"exports\", \"@ember/component\", \"@ember/object\", \"semente-web-app/config/environment\", \"semente-web-app/utils/arrays\", \"@ember/template-factory\"], function (_exports, _component, _object, _environment, ArrayUtils, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/component\",0,\"semente-web-app/config/environment\",0,\"semente-web-app/utils/arrays\",0,\"@ember/template-factory\",0,\"@ember/component\"eaimeta@70e063a35619d71f\n const __COLOCATED_TEMPLATE__ = (0, _templateFactory.createTemplateFactory)(\n /*\n \n \n
\n
\n
\n \"Plataforma\n
\n
\n \n
\n
\n INSIRA SEUS DADOS E SUA SENHA\n ABAIXO\n \n
\n
\n
\n
\n
\n
\n \n
\n \n \n
\n
\n
\n
\n
\n
\n
\n Esqueceu sua senha?\n
\n
\n Esqueceu seu login?\n
\n
\n
\n
\n
\n {{#if this.authenticating}}\n \n {{else}}\n \n {{/if}}\n
\n {{#if this.errorMessage}}\n
\n
\n \n

{{{this.errorMessage}}}

\n
\n
\n {{/if}}\n
\n {{!-- Feature 02: autocadastro do responsável com a chave gerada pelo estudante --}}\n
\n
\n \n \n Sou responsável e tenho uma chave de cadastro\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n {{this.observeEsc}}\n */\n {\n \"id\": \"LaVtTDfX\",\n \"block\": \"[[[3,\\\" Top content \\\"],[1,\\\"\\\\n\\\\n\\\"],[11,\\\"form\\\"],[24,0,\\\"login-ps\\\"],[4,[38,1],[\\\"submit\\\",[28,[37,2],[[30,0,[\\\"authenticateAction\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"login-ps__wrapper\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row d-flex-justify--center\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/assets/img/logo-principal.png\\\"],[14,\\\"alt\\\",\\\"Plataforma Semente\\\"],[14,0,\\\"login-ps__wrapper-logo\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row d-flex-justify--center\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"login-ps__wrapper-instruction-line\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"login-ps__wrapper-instruction\\\"],[12],[1,\\\"INSIRA SEUS \\\"],[10,\\\"strong\\\"],[12],[1,\\\"DADOS\\\"],[13],[1,\\\" E SUA \\\"],[10,\\\"strong\\\"],[12],[1,\\\"SENHA\\\"],[13],[1,\\\"\\\\n ABAIXO\\\"],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"login-ps__wrapper-instruction-line\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row d-flex-justify--center\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"col-xs-12 col-sm-12\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"login-ps__wrapper-inputs\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,1,\\\"identification\\\"],[15,2,[30,0,[\\\"user_email\\\"]]],[14,\\\"placeholder\\\",\\\"e-mail, cpf ou nome de usuário\\\"],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"textbox\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"d-flex d-flex-align--center\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,1,\\\"password\\\"],[15,2,[30,0,[\\\"user_email\\\"]]],[14,\\\"placeholder\\\",\\\"sua senha\\\"],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"password\\\"],[12],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"login-ps__wrapper__show-pass\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"passwordVisibilityAction\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-eye-off\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-eye\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"col-xs-12 col-sm-12 login-ps__wrapper__forgots\\\"],[12],[1,\\\"\\\\n \\\"],[11,0],[24,\\\"role\\\",\\\"button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,0,\\\"row login-ps__wrapper__forgots-item\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"forgotPassAction\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,1],[12],[1,\\\"Esqueceu sua senha?\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row login-ps__wrapper__forgots-item\\\"],[12],[1,\\\"\\\\n \\\"],[11,1],[24,\\\"role\\\",\\\"button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"forgotUser\\\"]],\\\"username\\\"],null]],null],[12],[1,\\\"Esqueceu seu login?\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"col-xs-12 col-sm-12\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"authenticating\\\"]],[[[1,\\\" \\\"],[10,\\\"button\\\"],[14,0,\\\"login-ps__wrapper-submit--isProcessing\\\"],[14,1,\\\"login_button\\\"],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"img\\\"],[14,0,\\\"login-ps__wrapper-submit--isProcessing-spinner\\\"],[14,\\\"src\\\",\\\"/assets/img/spinner.gif\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[12],[1,\\\"Entrando...\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\" \\\"],[10,\\\"button\\\"],[14,0,\\\"login-ps__wrapper-submit\\\"],[14,1,\\\"login_button\\\"],[14,4,\\\"submit\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[12],[1,\\\"Entrar\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"errorMessage\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"row login-ps__error animated fadeIn\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"animated pulse slow\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-x\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[2,[30,0,[\\\"errorMessage\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"col-xs-12 col-sm-12 acesso-responsavel\\\"],[12],[1,\\\"\\\\n \\\"],[8,[39,12],[[24,0,\\\"acesso-responsavel__link\\\"]],[[\\\"@route\\\"],[\\\"cadastro-responsavel\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon-users acesso-responsavel__icone\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[12],[1,\\\"Sou responsável e tenho uma \\\"],[10,\\\"strong\\\"],[12],[1,\\\"chave de cadastro\\\"],[13],[13],[1,\\\"\\\\n \\\"]],[]]]]],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"col-xs-12\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"hr\\\"],[14,0,\\\"login-ps__wrapper-separator\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"col-xs-12 col-sm-12\\\"],[12],[1,\\\"\\\\n \\\"],[10,3],[14,6,\\\"https://sementeportal.blob.core.windows.net/plataforma/Pol%C3%ADtica%20de%20privacidade%20v1.pdf\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,0,\\\"login-ps__wrapper-btn_politica\\\"],[14,1,\\\"politica\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon icon-lock login-ps__wrapper-btn_politica-icon\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[12],[1,\\\"Conheça a nossa \\\"],[10,\\\"strong\\\"],[12],[1,\\\"política de privacidade\\\"],[13],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\\n\\\"],[10,\\\"aside\\\"],[14,1,\\\"forgot_pass\\\"],[14,0,\\\"modal\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__content modal__content--sm\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"header\\\"],[14,0,\\\"modal__header\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"modal__close btn btn--icon icon-x\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"cancelPassAction\\\"]]],null]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"h3\\\"],[14,0,\\\"modal__title\\\"],[12],[1,\\\"Solicitar nova senha\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__body\\\"],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Preencha seu e-mail abaixo para receber uma nova senha.\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"login-ps__form-group form-group form-group--full-width form-group--vertical\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"form-group__label\\\"],[12],[1,\\\"E-mail\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,0,\\\"form-group__input form-group--full-width\\\"],[24,1,\\\"user_email\\\"],[16,2,[30,0,[\\\"user_email\\\"]]],[24,4,\\\"textbox\\\"],[4,[38,1],[\\\"keyup\\\",[30,0,[\\\"submtirOnEnter\\\"]]],null],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"error_forgot\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"alert alert--error alert--has-icon alert--xxs\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert__icon icon-alert-triangle\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"error_forgot\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__footer modal__footer--center\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"btn\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"sendMailAction\\\"]]],null]],null],[12],[1,\\\"Solicitar nova senha\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__overlayer\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\\n\\\"],[10,\\\"aside\\\"],[14,1,\\\"forgot_modal_user\\\"],[14,0,\\\"modal animated fast fadeIn\\\"],[12],[1,\\\"\\\\n\\\\n\\\\n \\\"],[10,0],[14,1,\\\"modal-content\\\"],[14,0,\\\"modal__content modal__content--md modal__content--no-overflow\\\"],[12],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"header\\\"],[14,0,\\\"modal__header\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"modal__close btn-close icon-x\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"cancelForgot\\\"]]],null]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"h3\\\"],[14,0,\\\"modal__title\\\"],[12],[1,[30,0,[\\\"modalTitle\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,18],[[30,0,[\\\"modalType\\\"]],\\\"username\\\"],null],[[[1,\\\" \\\"],[10,0],[14,0,\\\"form-group form-group--full-width flow-md\\\"],[14,5,\\\"flex-shrink: 1; overflow:hidden;\\\"],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,[30,0,[\\\"modalInfo\\\"]]],[13],[1,\\\"\\\\n\\\\n \\\"],[10,0],[14,1,\\\"modal-login-recovery-container\\\"],[15,0,[29,[\\\"modal__login-recovery-container modal__is-login-recovery__carousel--\\\",[30,0,[\\\"loginStep\\\"]]]]],[12],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q0\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--0 flow-xs animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"0\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Você se lembra qual e-mail está cadastrado em sua conta?\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question1-alt1\\\"],[24,0,\\\"btn btn--xs modal--adjust-btn-on-mobile\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],\\\"email\\\",\\\"\\\"],null]],null],[12],[1,\\\"Sim\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question1-alt2\\\"],[24,0,\\\"btn btn--xs modal--adjust-btn-on-mobile\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],1,\\\"\\\"],null]],null],[12],[1,\\\"Não\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[11,\\\"form\\\"],[24,1,\\\"email-cadastrado\\\"],[4,[38,1],[\\\"submit\\\",[28,[37,2],[[30,0,[\\\"resgataLoginPorEmail\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,0],[14,1,\\\"qemail\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--email animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"email\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Informe o e-mail ou telefone cadastrado\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,1,\\\"informe-email\\\"],[24,0,\\\"w100 modal--is-registered-email\\\"],[24,\\\"required\\\",\\\"\\\"],[24,4,\\\"text\\\"],[4,[38,1],[\\\"keyup\\\",[30,0,[\\\"maskPhoneOrEmail\\\"]]],null],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"animated color-error-20 fadeIn m-top--xs self-auto\\\"],[14,5,\\\"opacity: 0; visibility: hidden; display:block;\\\"],[14,1,\\\"error-forgot\\\"],[12],[2,[30,0,[\\\"error_forgot\\\"]]],[13],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,1,\\\"checaEmail\\\"],[14,0,\\\"btn btn--xs m-top--xl modal--adjust-btn-on-mobile\\\"],[15,\\\"disabled\\\",[29,[[52,[30,0,[\\\"busy\\\"]],\\\" disabled\\\",\\\"\\\"]]]],[14,4,\\\"submit\\\"],[12],[1,[52,[30,0,[\\\"busy\\\"]],\\\"Consultando\\\",\\\"Resgatar\\\"]],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"goToPerguntas\\\"],[24,0,\\\"btn btn--xs m-top--sm modal--adjust-btn-on-mobile\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],1],null]],null],[12],[1,\\\"Resgatar de outra forma\\\"],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"alert alert--has-icon alert--success alert--xxs animated fadeIn m-top--md\\\"],[14,1,\\\"success-forgot\\\"],[14,5,\\\"display: none;\\\"],[12],[1,[30,0,[\\\"success_forgot\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q1\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--1 flow-xs animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"1\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Você é um aluno?\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question1-alt1\\\"],[24,0,\\\"btn btn--xs modal--adjust-btn-on-mobile\\\"],[24,2,\\\"Sim\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],3,\\\"Sim\\\"],null]],null],[12],[1,\\\"Sim\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question1-alt2\\\"],[24,0,\\\"btn btn--xs modal--adjust-btn-on-mobile\\\"],[24,2,\\\"Não\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],2,\\\"Não\\\"],null]],null],[12],[1,\\\"Não\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q2\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--2 animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"2\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Informe seu ano de nascimento\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,1,\\\"question2\\\"],[14,0,\\\"w100\\\"],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"date\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"animated color-error-20 fadeIn m-top--xs self-auto\\\"],[14,5,\\\"opacity: 0; visibility: hidden; display:block;\\\"],[12],[1,[30,0,[\\\"errorMessageInput\\\"]]],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question2-fwd\\\"],[24,0,\\\"btn btn--xs m-top--xxl modal--adjust-btn-on-mobile\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],3],null]],null],[12],[1,\\\"Avançar\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q3\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--3 animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"3\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Qual é o seu primeiro nome?\\\"],[13],[1,\\\"\\\\n \\\"],[1,[28,[35,8],null,[[\\\"id\\\",\\\"class\\\",\\\"required\\\",\\\"type\\\",\\\"value\\\"],[\\\"question3\\\",\\\"w100\\\",true,\\\"text\\\",[30,0,[\\\"question3Answer\\\"]]]]]],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"animated color-error-20 fadeIn m-top--xs self-auto\\\"],[14,5,\\\"opacity: 0; visibility: hidden; display:block;\\\"],[12],[1,[30,0,[\\\"errorMessageInput\\\"]]],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question3-fwd\\\"],[24,0,\\\"btn btn--xs m-top--xxl modal--adjust-btn-on-mobile\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],4,[30,0,[\\\"question3Answer\\\"]]],null]],null],[12],[1,\\\"Avançar\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q4\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--4 animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"4\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Qual é o seu último sobrenome?\\\"],[13],[1,\\\"\\\\n \\\"],[1,[28,[35,8],null,[[\\\"id\\\",\\\"class\\\",\\\"required\\\",\\\"type\\\",\\\"value\\\"],[\\\"question4\\\",\\\"w100\\\",true,\\\"text\\\",[30,0,[\\\"question4Answer\\\"]]]]]],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"animated color-error-20 fadeIn m-top--xs self-auto\\\"],[14,5,\\\"opacity: 0; visibility: hidden; display:block;\\\"],[12],[1,[30,0,[\\\"errorMessageInput\\\"]]],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question4-fwd\\\"],[24,0,\\\"btn btn--xs m-top--xxl modal--adjust-btn-on-mobile\\\"],[16,\\\"disabled\\\",[29,[[52,[30,0,[\\\"busy\\\"]],\\\" disabled\\\",\\\"\\\"]]]],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],5,[30,0,[\\\"question4Answer\\\"]]],null]],null],[12],[1,[52,[30,0,[\\\"busy\\\"]],\\\"Consultando...\\\",\\\"Avançar\\\"]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q5\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--5 animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"5\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,0],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Em qual das cidades abaixo fica sua escola?\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__is-login-recovery--cities-list\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,21],[[28,[37,21],[[30,0,[\\\"citiesList\\\"]]],null]],null],null,[[[1,\\\" \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn--xs m-top--sm modal--adjust-btn-on-mobile\\\"],[24,4,\\\"submit\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],6,[30,1]],null]],null],[12],[1,[30,1]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\" \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"q6\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--6 animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"6\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Qual o nome de sua escola?\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"input\\\"],[14,1,\\\"question6\\\"],[14,0,\\\"w100\\\"],[14,\\\"required\\\",\\\"\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,1],[14,0,\\\"animated color-error-20 fadeIn m-top--xs self-auto\\\"],[14,5,\\\"display:block;\\\"],[12],[1,[30,0,[\\\"errorMessageInput\\\"]]],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,1,\\\"question6-end\\\"],[24,0,\\\"btn btn--xs m-top--xxl modal--adjust-btn-on-mobile\\\"],[24,4,\\\"button\\\"],[4,[38,1],[\\\"click\\\",[28,[37,2],[[30,0,[\\\"moveToNextQuestion\\\"]],\\\"resgate\\\"],null]],null],[12],[1,\\\"Resgatar login\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\" \\\"],[10,0],[14,1,\\\"qf\\\"],[15,0,[29,[\\\"modal__is-login-recovery step--resgate animated d250 \\\",[52,[28,[37,18],[[30,0,[\\\"loginStep\\\"]],\\\"resgate\\\"],null],\\\"fadeInRightShort\\\"]]]],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,0,[\\\"successResgate\\\"]]],[[[1,\\\" \\\"],[10,2],[12],[1,\\\"Não encontramos um login que se adequa às respostas dadas.\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[12],[1,\\\"Por favor, entre em contato com \\\"],[10,3],[14,0,\\\"color-leaf-40\\\"],[14,6,\\\"mailto:relacionamento@sementeeducacao.com.br\\\"],[12],[1,\\\"relacionamento@sementeeducacao.com.br\\\"],[13],[1,\\\" e nos\\\\n informe sue escola e seu nome no corpo do e-mail.\\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\" \\\"],[10,2],[12],[1,\\\"Seu login é:\\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n \\\"],[10,2],[14,1,\\\"recovered-login\\\"],[14,0,\\\"modal__is-login-recovery--login--was-found\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"retrievedUsername\\\"]]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"loginIsEmail\\\"]],[[[1,\\\" \\\"],[10,2],[12],[1,\\\"Seu login é um endereço de e-mail. Omitimos parte do endereço por questões de segurança.\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\" \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\\n\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n\\\\n \\\"],[10,0],[14,0,\\\"modal__overlayer\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,[30,0,[\\\"observeEsc\\\"]]]],[\\\"city\\\"],[\\\"form\\\",\\\"on\\\",\\\"act\\\",\\\"div\\\",\\\"img\\\",\\\"span\\\",\\\"hr\\\",\\\"strong\\\",\\\"input\\\",\\\"button\\\",\\\"if\\\",\\\"p\\\",\\\"link-to\\\",\\\"a\\\",\\\"aside\\\",\\\"header\\\",\\\"h3\\\",\\\"label\\\",\\\"equalstr\\\",\\\"ul\\\",\\\"each\\\",\\\"-track-array\\\",\\\"li\\\",\\\"unless\\\"]]\",\n \"moduleName\": \"semente-web-app/components/login-plataforma-semente.hbs\",\n \"isStrictMode\": false\n });\n var _default = _exports.default = (0, _component.setComponentTemplate)(__COLOCATED_TEMPLATE__, _component.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n authenticateAction: (0, _object.action)(function (...args) {\n return this.send('authenticate', ...args);\n }),\n cancelForgot: (0, _object.action)(function (...args) {\n return this.send('cancelForgot', ...args);\n }),\n cancelPassAction: (0, _object.action)(function (...args) {\n return this.send('cancelPass', ...args);\n }),\n forgotPassAction: (0, _object.action)(function (...args) {\n return this.send('forgotPass', ...args);\n }),\n forgotUser: (0, _object.action)(function (...args) {\n return this.send('forgotUser', ...args);\n }),\n maskPhoneOrEmail: (0, _object.action)(function (...args) {\n return this.send('maskPhoneOrEmail', ...args);\n }),\n moveToNextQuestion: (0, _object.action)(function (...args) {\n return this.send('moveToNextQuestion', ...args);\n }),\n passwordVisibilityAction: (0, _object.action)(function (...args) {\n return this.send('passwordVisibility', ...args);\n }),\n resgataLoginPorEmail: (0, _object.action)(function (...args) {\n return this.send('resgataLoginPorEmail', ...args);\n }),\n sendMailAction: (0, _object.action)(function (...args) {\n return this.send('sendMail', ...args);\n }),\n submtirOnEnter: (0, _object.action)(function (...args) {\n return this.send('submtirOnEnter', ...args);\n }),\n loginStep: 0,\n answers: [],\n loginIsEmail: false,\n citiesList: null,\n // inicializado no init (estado comum, preenchido pela API)\n rawSchoolsList: null,\n observeEsc: (0, _object.computed)(function () {\n let that = this;\n document.addEventListener('keydown', function (event) {\n if (event.key === 'Escape' || event.keyCode === 27) {\n that.send('escPressed');\n }\n });\n }),\n successResgate: 0,\n busy: false,\n retrievedUsername: '',\n question3Answer: '',\n question4Answer: '',\n detectIE() {\n var ua = window.navigator.userAgent;\n\n // Test values; Uncomment to check result …\n\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n\n // Edge 12 (Spartan)\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n\n // Edge 13\n // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';\n\n var msie = ua.indexOf('MSIE ');\n if (msie > 0) {\n // IE 10 or older => return version number\n return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n }\n var trident = ua.indexOf('Trident/');\n if (trident > 0) {\n // IE 11 => return version number\n var rv = ua.indexOf('rv:');\n return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n }\n var edge = ua.indexOf('Edge');\n if (edge > 0) {\n // Edge (IE 12+) => return version number\n return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n }\n\n // other browser\n return false;\n },\n async refreshCitiesList() {\n let isAluno = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 1)).resposta == 'Sim';\n let dateOfBirth;\n if (ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 2))) {\n dateOfBirth = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 2)).resposta;\n }\n let firstName = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 3)).resposta;\n let lastName = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 4)).resposta;\n let data = {\n isAluno,\n dateOfBirth,\n firstName,\n lastName\n };\n let response = await fetch(`${_environment.default.APP.host}/${_environment.default.APP.namespace}/pessoas/CheckPossibleCities`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n });\n if (response.status != 200) return \"resgate\";\n let responseJson = await response.json();\n if (responseJson.cities.length == 0) return \"resgate\";\n this.set('rawSchoolsList', responseJson.schools);\n if (responseJson.cities.length == 1) {\n this.get('answers').push({\n pergunta: 5,\n resposta: responseJson.cities[0]\n });\n this.setupTypeahead();\n return 6;\n }\n this.set('citiesList', responseJson.cities);\n },\n hasAnyNonNumericalCharacters(str) {\n return /[A-Za-z]/.test(str);\n },\n validEmail(email) {\n return /[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{1,}$/.test(email);\n },\n validPhone(phone) {\n return /^\\((\\d{2}|\\d{0})\\)[-. ]?(\\d{5})[-. ]?(\\d{4})$/.test(phone);\n },\n async setupTypeahead() {\n let schoolsList = ArrayUtils.toArray(this.get('rawSchoolsList')).filter(x => x.schoolCity == ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 5)).resposta).map(x => x.schoolName);\n debugger;\n var states = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.whitespace,\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n // `states` is an array of state names defined in \"The Basics\"\n local: schoolsList\n });\n if ($('#question6').hasClass('tt-input')) {\n $('#question6').typeahead('destroy');\n }\n $(\"#question6\").typeahead({\n hint: true,\n highlight: true,\n minLength: 1\n }, {\n name: 'Escolas',\n source: states\n });\n },\n async resgatarLogin() {\n let isAluno = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 1)).resposta == 'Sim';\n let dateOfBirth;\n if (ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 2))) {\n dateOfBirth = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 2)).resposta;\n }\n let firstName = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 3)).resposta;\n let lastName = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 4)).resposta;\n let city;\n if (ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 5))) {\n city = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 5)).resposta;\n }\n let schoolName;\n if (ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 6))) {\n schoolName = ArrayUtils.first(ArrayUtils.toArray(this.get('answers')).filter(x => x.pergunta == 6)).resposta;\n }\n if (city == null || city == undefined || !schoolName) return;\n let data = {\n isAluno,\n dateOfBirth,\n firstName,\n lastName,\n city,\n schoolName\n };\n let response = await fetch(`${_environment.default.APP.host}/${_environment.default.APP.namespace}/pessoas/RetrieveLogin`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n });\n let successResgate = response.status == 200 ? 1 : 0;\n this.set('successResgate', successResgate);\n let responseJson = await response.json();\n this.set('loginIsEmail', responseJson.isEmail);\n if (successResgate == 1) {\n this.set('retrievedUsername', responseJson.username.replace(/[\"']/g, \"\"));\n }\n },\n actions: {\n authenticate() {\n this.get('authenticate')();\n },\n passwordVisibility() {\n this.get('passwordVisibility')();\n },\n forgotPass() {\n this.get('forgotPass')();\n },\n cancelPass() {\n this.get('cancelPass')();\n },\n escPressed() {\n let modal = document.getElementsByClassName('modal--is-show')[0];\n if (modal) {\n modal.classList.remove('modal--is-show');\n this.set('error_forgot', '');\n this.set('modalType', '');\n }\n },\n submtirOnEnter(key) {\n if (key.key === 'Enter') {\n this.send('sendMail');\n }\n },\n sendMail() {\n this.get('sendMail')();\n },\n forgotUser(type) {\n document.getElementById('forgot_modal_user').classList.remove('fadeOutDown');\n this.set('modalType', type);\n this.set('error_forgot', '');\n this.set('loginStep', 0);\n this.set('citiesList', []);\n this.set('successResgate', 0);\n this.set('retrievedUsername', '');\n this.set('modalTitle', 'Resgate de login');\n this.set('modalInfo', 'Por favor, responda às perguntas a seguir');\n document.getElementById('modal-content').classList.add('modal--large-height');\n document.getElementById('forgot_modal_user').classList.add('modal--is-show');\n //document.getElementById('error-forgot').style.display = 'none';\n },\n maskPhoneOrEmail(v) {\n let target = event.target;\n if (v) {\n var r = target.value;\n if (this.hasAnyNonNumericalCharacters(r)) return;\n var r = r.replace(/\\D/g, \"\");\n r = r.replace(/^0/, \"\");\n if (r.length > 10) {\n r = r.replace(/^(\\d\\d)(\\d{5})(\\d{4}).*/, \"($1) $2-$3\");\n } else if (r.length > 7) {\n r = r.replace(/^(\\d\\d)(\\d{4})(\\d{0,4}).*/, \"($1) $2-$3\");\n } else if (r.length > 2) {\n r = r.replace(/^(\\d\\d)(\\d{0,5})/, \"($1) $2\");\n } else if (r.length == 0) {\n r = \"\";\n } else {\n r = r.replace(/^(\\d*)/, \"($1\");\n }\n target.value = r;\n }\n },\n async moveToNextQuestion(moveTo, answer) {\n this.set('busy', true);\n if (this.get('loginStep') !== 'email') {\n let inputToCheck = document.querySelector('.step--' + this.get('loginStep') + ' input#question' + this.get('loginStep'));\n if (inputToCheck) {\n if (inputToCheck.value.length < 1) {\n this.set('errorMessageInput', 'Por favor, responda à pergunta');\n document.querySelector('.step--' + this.get('loginStep') + ' span.color-error-20').style.opacity = 1;\n document.querySelector('.step--' + this.get('loginStep') + ' span.color-error-20').style.visibility = 'visible';\n return;\n } else {\n this.set('errorMessageInput', '');\n document.querySelector('.step--' + this.get('loginStep') + ' span.color-error-20').style.opacity = 0;\n document.querySelector('.step--' + this.get('loginStep') + ' span.color-error-20').style.visibility = 'hidden';\n }\n }\n }\n if (this.get('loginStep') !== 'email' && this.get('loginStep') !== 0) {\n if (!answer) {\n let answerInput = document.querySelector('.step--' + this.get('loginStep') + ' input#question' + this.get('loginStep'));\n answer = answerInput.value;\n }\n this.send('registerAnswer', answer);\n if (this.get('loginStep') == 4) {\n let newMoveTo = await this.refreshCitiesList();\n if (newMoveTo) moveTo = newMoveTo;\n }\n if (this.get('loginStep') == 5) {\n this.setupTypeahead();\n }\n if (moveTo == \"resgate\") {\n await this.resgatarLogin();\n }\n }\n this.set('loginStep', moveTo);\n this.set('busy', false);\n },\n registerAnswer(answer) {\n let answers = this.get('answers');\n let step = this.get('loginStep');\n answers.push({\n pergunta: step,\n resposta: answer\n });\n },\n async resgataLoginPorEmail() {\n this.set('busy', true);\n let emailOrPhone = document.getElementById('informe-email').value;\n if (this.hasAnyNonNumericalCharacters(emailOrPhone) && !this.validEmail(emailOrPhone) || !this.hasAnyNonNumericalCharacters(emailOrPhone) && !this.validPhone(emailOrPhone)) {\n let errorContainer = document.getElementById('error-forgot');\n this.set('error_forgot', 'Por favor, informe um email ou telefone válido');\n errorContainer.style.opacity = 1;\n errorContainer.style.visibility = 'visible';\n this.set('busy', false);\n return;\n }\n let data = {\n emailOrPhone\n };\n let response = await fetch(`${_environment.default.APP.host}/${_environment.default.APP.namespace}/pessoas/RetrieveLogin`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n });\n if (response.status === 200) {\n let successContainer = document.getElementById('success-forgot');\n this.set('success_forgot', 'Seu login foi enviado para ' + emailOrPhone + ' com sucesso');\n successContainer.style.display = 'block';\n let errorContainer = document.getElementById('error-forgot');\n this.set('error_forgot', '');\n errorContainer.style.opacity = 0;\n errorContainer.style.visibility = 'hidden';\n setTimeout(() => {\n successContainer.style.display = 'none';\n }, 5000);\n } else {\n let errorContainer = document.getElementById('error-forgot');\n this.set('error_forgot', 'E-mail ou telefone não encontrado em nossos cadastros');\n errorContainer.style.opacity = 1;\n errorContainer.style.visibility = 'visible';\n }\n let errorContainer = document.getElementById('error-forgot');\n this.set('busy', false);\n },\n cancelForgot() {\n if (this.get('modalType') == 'username') {\n document.getElementById('forgot_modal_user').classList.remove('modal--is-show');\n document.getElementById('question2').value = '';\n this.set('question3Answer', '');\n this.set('question4Answer', '');\n document.getElementById('question6').value = '';\n document.getElementById('informe-email').value = '';\n document.getElementById('success-forgot').style.display = 'none';\n this.set('errorMessageInput', '');\n this.set('citiesList', []);\n this.set('answers', []);\n this.set('modalType', '');\n }\n }\n },\n init: function () {\n this._super();\n this.set('citiesList', []);\n this.set('rawSchoolsList', []);\n this.get('value');\n }\n }));\n});","define(\"semente-web-app/config/asset-manifest\", [\"exports\", \"require\", \"semente-web-app/config/environment\"], function (_exports, _require, _environment) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"require\",0,\"semente-web-app/config/environment\"eaimeta@70e063a35619d71f\n const modulePrefix = _environment.default.modulePrefix;\n const metaName = `${modulePrefix}/config/asset-manifest`;\n const nodeName = `${modulePrefix}/config/node-asset-manifest`;\n let config = {};\n try {\n // If we have a Node version of the asset manifest, use that for FastBoot and\n // similar environments.\n if (_require.default.has(nodeName)) {\n config = (0, _require.default)(nodeName).default; // eslint-disable-line\n } else {\n const rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n config = JSON.parse(unescape(rawConfig));\n }\n } catch (err) {\n throw new Error('Failed to load asset manifest. For browser environments, verify the meta tag with name \"' + metaName + '\" is present. For non-browser environments, verify that you included the node-asset-manifest module.');\n }\n var _default = _exports.default = config;\n});","define(\"semente-web-app/controllers/cadastro-responsavel\", [\"exports\", \"@ember/service\", \"@ember/runloop\", \"@ember/object/computed\", \"@ember/object\", \"@ember/controller\", \"semente-web-app/utils/api-publica\"], function (_exports, _service, _runloop, _computed, _object, _controller, _apiPublica) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/service\",0,\"@ember/runloop\",0,\"@ember/object/computed\",0,\"@ember/object\",0,\"@ember/controller\",0,\"semente-web-app/utils/api-publica\"eaimeta@70e063a35619d71f\n // Feature 02 — autocadastro do responsável (rota pública). Doc: feature-02-comunicacao-familias.md (pasta melhorias)\n //\n // Passos (`passo`):\n // 'chave' -> POST cadastro-responsavel/validar-chave {codigo}\n // 'email' -> POST cadastro-responsavel/verificar-email {codigo, email}\n // 'existente' -> conta já existe: pede a senha atual -> POST cadastro-responsavel {codigo, email, senha}\n // 'nova' -> conta nova: nome, telefone (opcional), senha + confirmação -> POST cadastro-responsavel\n // 'sucesso' -> botão \"Ir para o login\" (com o e-mail já preenchido no campo de login)\n //\n // A chave é exibida como XXXX-XXXX e enviada sem o hífen (8 caracteres, maiúsculos).\n\n const TAMANHO_CHAVE = 8;\n const SENHA_MINIMA = 6;\n const RE_EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n function normalizarChave(valor) {\n return String(valor || '').toUpperCase().replace(/[^A-Z0-9]/g, '').slice(0, TAMANHO_CHAVE);\n }\n function formatarChave(valor) {\n let limpo = normalizarChave(valor);\n return limpo.length > 4 ? limpo.slice(0, 4) + '-' + limpo.slice(4) : limpo;\n }\n function formatarTelefone(valor) {\n let r = String(valor || '').replace(/\\D/g, '').slice(0, 11);\n if (r.length > 10) return r.replace(/^(\\d\\d)(\\d{5})(\\d{0,4}).*/, '($1) $2-$3');\n if (r.length > 6) return r.replace(/^(\\d\\d)(\\d{4})(\\d{0,4}).*/, '($1) $2-$3');\n if (r.length > 2) return r.replace(/^(\\d\\d)(\\d{0,5})/, '($1) $2');\n if (r.length > 0) return '(' + r;\n return '';\n }\n var _default = _exports.default = _controller.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n alternarSenha: (0, _object.action)(function (...args) {\n return this.send('alternarSenha', ...args);\n }),\n cadastrarExistente: (0, _object.action)(function (...args) {\n return this.send('cadastrarExistente', ...args);\n }),\n cadastrarNova: (0, _object.action)(function (...args) {\n return this.send('cadastrarNova', ...args);\n }),\n digitarChave: (0, _object.action)(function (...args) {\n return this.send('digitarChave', ...args);\n }),\n digitarTelefone: (0, _object.action)(function (...args) {\n return this.send('digitarTelefone', ...args);\n }),\n irParaLogin: (0, _object.action)(function (...args) {\n return this.send('irParaLogin', ...args);\n }),\n validarChave: (0, _object.action)(function (...args) {\n return this.send('validarChave', ...args);\n }),\n verificarEmail: (0, _object.action)(function (...args) {\n return this.send('verificarEmail', ...args);\n }),\n voltar: (0, _object.action)(function (...args) {\n return this.send('voltar', ...args);\n }),\n router: (0, _service.service)(),\n passo: 'chave',\n chave: '',\n email: '',\n nome: '',\n telefone: '',\n senha: '',\n confirmacao: '',\n mostrarSenha: false,\n ocupado: false,\n erro: null,\n primeiroNomeDependente: '',\n instituicaoNome: '',\n vinculouContaExistente: false,\n reiniciar() {\n this.setProperties({\n passo: 'chave',\n chave: '',\n email: '',\n nome: '',\n telefone: '',\n senha: '',\n confirmacao: '',\n mostrarSenha: false,\n ocupado: false,\n erro: null,\n primeiroNomeDependente: '',\n instituicaoNome: '',\n vinculouContaExistente: false\n });\n },\n numeroPasso: (0, _object.computed)('passo', function () {\n return {\n chave: 1,\n email: 2,\n existente: 3,\n nova: 3,\n sucesso: 3\n }[this.get('passo')] || 1;\n }),\n emPassoChave: (0, _computed.equal)('passo', 'chave'),\n emPassoEmail: (0, _computed.equal)('passo', 'email'),\n emPassoExistente: (0, _computed.equal)('passo', 'existente'),\n emPassoNova: (0, _computed.equal)('passo', 'nova'),\n emPassoSucesso: (0, _computed.equal)('passo', 'sucesso'),\n // ---- foco: a cada passo, o título do passo recebe o foco (anunciado pelo leitor de tela)\n _focarPasso() {\n (0, _runloop.scheduleOnce)('afterRender', this, function () {\n let alvo = document.querySelector('.cadastro-responsavel__campo-inicial') || document.getElementById('cadastro-responsavel-passo');\n if (alvo) alvo.focus();\n });\n },\n _irPara(passo) {\n this.setProperties({\n passo: passo,\n erro: null,\n ocupado: false,\n senha: '',\n confirmacao: '',\n mostrarSenha: false\n });\n this._focarPasso();\n },\n _falhar(err, porStatus) {\n if (this.get('isDestroyed')) return;\n this.set('ocupado', false);\n this.set('erro', (0, _apiPublica.mensagemErroPublico)(err, porStatus));\n },\n _corpoBase() {\n return {\n codigo: normalizarChave(this.get('chave')),\n email: String(this.get('email') || '').trim()\n };\n },\n actions: {\n digitarChave(evt) {\n let alvo = evt && evt.target;\n let formatado = formatarChave(alvo ? alvo.value : '');\n this.set('chave', formatado);\n if (alvo && alvo.value !== formatado) alvo.value = formatado;\n },\n digitarTelefone(evt) {\n let alvo = evt && evt.target;\n let formatado = formatarTelefone(alvo ? alvo.value : '');\n this.set('telefone', formatado);\n if (alvo && alvo.value !== formatado) alvo.value = formatado;\n },\n alternarSenha() {\n this.toggleProperty('mostrarSenha');\n },\n validarChave() {\n if (this.get('ocupado')) return;\n let codigo = normalizarChave(this.get('chave'));\n if (codigo.length !== TAMANHO_CHAVE) {\n this.set('erro', 'A chave tem 8 letras e números, no formato XXXX-XXXX.');\n return;\n }\n this.setProperties({\n ocupado: true,\n erro: null\n });\n (0, _apiPublica.postPublico)('cadastro-responsavel/validar-chave', {\n codigo: codigo\n }).then(resp => {\n if (this.get('isDestroyed')) return;\n if (!resp || !resp.valida) {\n this.setProperties({\n ocupado: false,\n erro: 'Esta chave não é válida, já foi usada ou expirou. Peça ao estudante para gerar uma nova chave.'\n });\n return;\n }\n this.setProperties({\n primeiroNomeDependente: resp.primeiroNomeDependente || '',\n instituicaoNome: resp.instituicaoNome || ''\n });\n this._irPara('email');\n }, err => this._falhar(err, {\n 400: 'Esta chave não é válida, já foi usada ou expirou. Peça ao estudante para gerar uma nova chave.',\n 404: 'Esta chave não é válida, já foi usada ou expirou. Peça ao estudante para gerar uma nova chave.'\n }));\n },\n verificarEmail() {\n if (this.get('ocupado')) return;\n let corpo = this._corpoBase();\n if (!RE_EMAIL.test(corpo.email)) {\n this.set('erro', 'Informe um e-mail válido, por exemplo: nome@exemplo.com.');\n return;\n }\n this.setProperties({\n ocupado: true,\n erro: null,\n email: corpo.email\n });\n (0, _apiPublica.postPublico)('cadastro-responsavel/verificar-email', corpo).then(resp => {\n if (this.get('isDestroyed')) return;\n this._irPara(resp && resp.contaExiste ? 'existente' : 'nova');\n }, err => this._falhar(err));\n },\n cadastrarExistente() {\n if (this.get('ocupado')) return;\n let corpo = this._corpoBase();\n corpo.senha = this.get('senha') || '';\n if (!corpo.senha) {\n this.set('erro', 'Informe a senha da sua conta.');\n return;\n }\n this.setProperties({\n ocupado: true,\n erro: null\n });\n (0, _apiPublica.postPublico)('cadastro-responsavel', corpo).then(() => {\n if (this.get('isDestroyed')) return;\n this.set('vinculouContaExistente', true);\n this._irPara('sucesso');\n }, err => this._falhar(err, {\n 401: 'Senha incorreta. Confira e tente novamente.',\n 403: 'Senha incorreta. Confira e tente novamente.'\n }));\n },\n cadastrarNova() {\n if (this.get('ocupado')) return;\n let corpo = this._corpoBase();\n let nome = String(this.get('nome') || '').trim();\n let senha = this.get('senha') || '';\n if (nome.length < 3) {\n this.set('erro', 'Informe seu nome completo.');\n return;\n }\n if (senha.length < SENHA_MINIMA) {\n this.set('erro', 'A senha precisa ter pelo menos ' + SENHA_MINIMA + ' caracteres.');\n return;\n }\n if (senha !== this.get('confirmacao')) {\n this.set('erro', 'As senhas não são iguais. Digite a mesma senha nos dois campos.');\n return;\n }\n corpo.nome = nome;\n corpo.senha = senha;\n let telefone = String(this.get('telefone') || '').replace(/\\D/g, '');\n if (telefone) corpo.telefone = telefone;\n this.setProperties({\n ocupado: true,\n erro: null\n });\n (0, _apiPublica.postPublico)('cadastro-responsavel', corpo).then(() => {\n if (this.get('isDestroyed')) return;\n this.set('vinculouContaExistente', false);\n this._irPara('sucesso');\n }, err => this._falhar(err));\n },\n voltar(passo) {\n this._irPara(passo);\n },\n // Login com o e-mail já preenchido: o campo de login (#identification) é preenchido depois\n // da renderização, sem mexer no controller/componente de login.\n irParaLogin() {\n let email = this.get('email');\n this.router.transitionTo('login').then(() => {\n (0, _runloop.schedule)('afterRender', function () {\n let campo = document.getElementById('identification');\n let senha = document.getElementById('password');\n if (campo && email) campo.value = email;\n if (senha) {\n senha.value = '';\n senha.focus();\n }\n });\n });\n }\n }\n });\n});","define(\"semente-web-app/controllers/descadastro\", [\"exports\", \"@ember/object\", \"@ember/runloop\", \"@ember/object/computed\", \"@ember/controller\", \"semente-web-app/utils/api-publica\"], function (_exports, _object, _runloop, _computed, _controller, _apiPublica) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/runloop\",0,\"@ember/object/computed\",0,\"@ember/controller\",0,\"semente-web-app/utils/api-publica\"eaimeta@70e063a35619d71f\n // Feature 02 — descadastro: POST comunicacao-familias/descadastro {token} (anônimo, idempotente).\n // Estados: 'pergunta' -> 'enviando' -> 'concluido' (ou volta a 'pergunta' com `erro`).\n var _default = _exports.default = _controller.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n confirmar: (0, _object.action)(function (...args) {\n return this.send('confirmar', ...args);\n }),\n estado: 'pergunta',\n erro: null,\n enviando: (0, _computed.equal)('estado', 'enviando'),\n concluido: (0, _computed.equal)('estado', 'concluido'),\n actions: {\n confirmar() {\n if (this.get('enviando')) return;\n this.setProperties({\n estado: 'enviando',\n erro: null\n });\n (0, _apiPublica.postPublico)('comunicacao-familias/descadastro', {\n token: this.get('model.token')\n }).then(() => {\n if (this.get('isDestroyed')) return;\n this.set('estado', 'concluido');\n (0, _runloop.scheduleOnce)('afterRender', this, function () {\n let titulo = document.getElementById('descadastro-concluido');\n if (titulo) titulo.focus();\n });\n }, err => {\n if (this.get('isDestroyed')) return;\n this.setProperties({\n estado: 'pergunta',\n erro: (0, _apiPublica.mensagemErroPublico)(err, {\n 400: 'Este link não é válido. Confira se você abriu o link completo do e-mail.',\n 404: 'Este link não é válido. Confira se você abriu o link completo do e-mail.'\n })\n });\n });\n }\n }\n });\n});","define(\"semente-web-app/controllers/login\", [\"exports\", \"@ember/object\", \"rsvp\", \"@ember/service\", \"@ember/controller\", \"semente-web-app/config/environment\", \"@ember/template\"], function (_exports, _object, _rsvp, _service, _controller, _environment, _template) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"rsvp\",0,\"@ember/service\",0,\"@ember/controller\",0,\"semente-web-app/config/environment\",0,\"@ember/template\"eaimeta@70e063a35619d71f\n var _default = _exports.default = _controller.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n authenticate: (0, _object.action)(function (...args) {\n return this.send('authenticate', ...args);\n }),\n cancelForgot: (0, _object.action)(function (...args) {\n return this.send('cancelForgot', ...args);\n }),\n cancelPass: (0, _object.action)(function (...args) {\n return this.send('cancelPass', ...args);\n }),\n forgotPass: (0, _object.action)(function (...args) {\n return this.send('forgotPass', ...args);\n }),\n passwordVisibility: (0, _object.action)(function (...args) {\n return this.send('passwordVisibility', ...args);\n }),\n sendMail: (0, _object.action)(function (...args) {\n return this.send('sendMail', ...args);\n }),\n submtirOnEnter: (0, _object.action)(function (...args) {\n return this.send('submtirOnEnter', ...args);\n }),\n rootURL: _environment.default.rootURL,\n envnmt: _environment.default.APP,\n session: (0, _service.service)('session'),\n init: function () {\n this._super();\n if (window.location.href.includes('coreskills')) {\n this.set('coreskills', true);\n document.title = \"Coreskills\";\n var link = document.querySelector(\"link[rel*='icon']\") || document.createElement('link');\n link.type = 'image/x-icon';\n link.rel = 'shortcut icon';\n link.href = '/assets/img/favicon/coreskills.png';\n document.getElementsByTagName('head')[0].appendChild(link);\n }\n },\n makeCustomCall(verb, url, json) {\n let header = localStorage.getItem('person_logged');\n let header_person;\n if (header) {\n header = JSON.parse(header);\n header_person = header.id;\n } else {\n header_person = \"\";\n }\n let sessionData = this.get('session.data');\n let tok = sessionData.authenticated.access_token;\n let temp = 'Bearer ';\n let userToken = temp.concat(tok);\n return new _rsvp.Promise(function (resolve, reject) {\n let xhr = new XMLHttpRequest();\n xhr.open(verb, url);\n xhr.responseType = 'json';\n xhr.onreadystatechange = handler;\n // xhr.withCredentials = true; // does not permit request answer due to cross-origin. Can be activated when in production\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.setRequestHeader('content-type', 'application/json');\n xhr.setRequestHeader('data-type', 'application/json');\n xhr.setRequestHeader('pessoaid', header_person);\n xhr.setRequestHeader('Authorization', userToken);\n xhr.send(json);\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200 || this.status === 204) {\n resolve(this.response);\n } else if (this.status === 404) {\n //server unable to answer\n reject('Server not found');\n } else if (this.status >= 400) {\n reject(new Error(this.response.error));\n } else {\n reject(new Error('Failure from server call: [' + this.status + ']'));\n }\n }\n }\n });\n },\n capsLockDetection: window.addEventListener(\"keydown\", function (e) {\n if (navigator.vendor != 'Apple Computer, Inc.') {\n const caps = e.getModifierState && e.getModifierState('CapsLock');\n const msg = document.getElementById('msg-caps-on');\n if (msg != null) {\n if (caps) msg.classList.add('form__msg--on');else msg.classList.remove('form__msg--on');\n }\n }\n }),\n loadComponent: (0, _object.computed)('model', function () {\n return this.get('coreskills');\n }),\n actions: {\n passwordVisibility() {\n if (document.querySelector('.login__show-pass')) {\n document.querySelector('.login__show-pass').classList.toggle('login__show-pass--is-show');\n }\n if (document.querySelector('.login-ps__wrapper__show-pass')) {\n document.querySelector('.login-ps__wrapper__show-pass').classList.toggle('login-ps__wrapper__show-pass--is-show');\n }\n if (document.querySelector('.login__box-coreskills--show-pass')) {\n document.querySelector('.login__box-coreskills--show-pass').classList.toggle('login__show-pass--is-show');\n }\n const password = document.getElementById('password');\n if (password.type == 'password') password.type = 'text';else password.type = 'password';\n },\n authenticate() {\n this.set('errorMessage', false);\n document.getElementById('login_button').disabled = true;\n this.set('authenticating', true);\n function trim(stringToTrim) {\n return stringToTrim.replace(/^\\s+|\\s+$/g, \"\");\n }\n let life = 0;\n //if (document.getElementById('remember').checked) life = 1;\n let username = document.getElementById('identification').value;\n let password = trim(document.getElementById('password').value);\n if (this.get('session.isAuthenticated')) {\n localStorage.clear();\n this.get('session').invalidate();\n return;\n }\n this.get('session').authenticate('authenticator:authold', username, password, life).then(() => {}).catch(reason => {\n if (reason.error_description) {\n this.set('errorMessage', reason.error_description);\n this.set('success_mail', '');\n // if(this.get('loadComponent')) document.getElementById('login_button').innerHTML = ' Acessar';\n // else document.getElementById('login_button').innerHTML = 'Entrar';\n } else if (reason) {\n this.set('errorMessage', reason.error || reason);\n this.set('success_mail', '');\n } else {\n this.set('errorMessage', 'Erro desconhecido');\n this.set('success_mail', '');\n }\n this.set('authenticating', false);\n document.getElementById('login_button').disabled = false;\n });\n },\n forgotPass() {\n let email = document.getElementById('identification').value;\n this.set('user_email', '');\n if (email) {\n if (email.length > 4 && email.search('@') > 3) {\n this.set('user_email', email);\n }\n }\n this.set('error_forgot', '');\n this.set('success_mail', '');\n this.set('errorMessage', '');\n document.getElementById('forgot_pass').classList.add('modal--is-show');\n let emailInput = document.getElementById('user_email');\n setTimeout(function () {\n emailInput.focus();\n }, 250);\n },\n cancelPass() {\n document.getElementById('forgot_pass').classList.remove('modal--is-show');\n document.getElementById('user_email').value = '';\n this.set('user_email', '');\n this.set('success_mail', '');\n this.set('error_forgot', '');\n },\n sendMail() {\n let mail = document.getElementById('user_email').value;\n if (mail.length < 5 || mail.search('@') < 2) {\n this.set('error_forgot', 'Favor inserir endereço de e-mail válido');\n } else {\n let final_url = this.get('envnmt.host') + '/' + this.get('envnmt.namespace') + '/' + 'accounts/resetPassword';\n let string = JSON.stringify({\n 'data': {\n 'id': '1',\n 'type': 'email',\n 'attributes': {\n 'email': mail\n }\n }\n });\n let that = this;\n this.makeCustomCall('POST', final_url, string).then(() => {\n that.set('user_email', '');\n that.set('error_forgot', '');\n that.set('success_mail', (0, _template.htmlSafe)('

Enviamos sua nova senha para este endereço de e-mail.


Caso ele esteja cadastrado, você receberá em sua caixa de entrada.

'));\n this.set('errorMessage', '');\n document.getElementById('forgot_pass').classList.remove('modal--is-show');\n }).catch(() => {\n that.set('error_forgot', '');\n that.set('success_mail', (0, _template.htmlSafe)('

Enviamos sua nova senha para este endereço de e-mail.


Caso ele esteja cadastrado, você receberá em sua caixa de entrada.

'));\n this.set('errorMessage', '');\n });\n }\n }\n }\n });\n});","define(\"semente-web-app/controllers/maintenance\", [\"exports\", \"@ember/object\", \"@ember/controller\"], function (_exports, _object, _controller) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/controller\"eaimeta@70e063a35619d71f\n var _default = _exports.default = _controller.default.extend({\n // Ações usadas pelos templates via {{on}}/(act)/(fn) (o Ember 6 removeu {{action}}); encaminham para o hash `actions`.\n authenticate: (0, _object.action)(function (...args) {\n return this.send('authenticate', ...args);\n }),\n cancelForgot: (0, _object.action)(function (...args) {\n return this.send('cancelForgot', ...args);\n }),\n forgotPass: (0, _object.action)(function (...args) {\n return this.send('forgotPass', ...args);\n }),\n passwordVisibility: (0, _object.action)(function (...args) {\n return this.send('passwordVisibility', ...args);\n }),\n sendMail: (0, _object.action)(function (...args) {\n return this.send('sendMail', ...args);\n }),\n submtirOnEnter: (0, _object.action)(function (...args) {\n return this.send('submtirOnEnter', ...args);\n })\n });\n});","define(\"semente-web-app/data-adapter\", [\"exports\", \"@ember-data/debug/data-adapter\"], function (_exports, _dataAdapter) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _dataAdapter.default;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"@ember-data/debug/data-adapter\"eaimeta@70e063a35619d71f\n});","define(\"semente-web-app/helpers/act\", [\"exports\", \"@ember/component/helper\", \"@ember/object\"], function (_exports, _helper, _object) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/component/helper\",0,\"@ember/object\"eaimeta@70e063a35619d71f\n // Reproduz a semântica do modificador `{{action}}` (removido no Ember 6) para uso com `{{on}}`:\n // \n \n \n {{/if}}\n \n {{#if this.emPassoEmail}}\n
\n

Qual é o seu e-mail?

\n

É por ele que você vai entrar na plataforma e receber os comunicados da escola.

\n \n \n {{#if this.erro}}

{{this.erro}}

{{/if}}\n
\n \n \n
\n
\n {{/if}}\n \n {{#if this.emPassoExistente}}\n
\n

Você já tem uma conta

\n

\n Encontramos uma conta com o e-mail {{this.email}}. Digite a senha dessa conta para confirmar o vínculo.\n

\n \n
\n \n \n
\n

Esqueceu a senha? Volte ao login e use \"Esqueceu sua senha?\". Depois, use a chave novamente.

\n {{#if this.erro}}

{{this.erro}}

{{/if}}\n
\n \n \n
\n
\n {{/if}}\n \n {{#if this.emPassoNova}}\n
\n

Crie sua conta

\n

Você vai entrar com o e-mail {{this.email}} e a senha que escolher abaixo.

\n \n \n \n \n \n \n \n \n
\n \n \n
\n Use pelo menos 6 caracteres.\n \n \n \n \n {{#if this.erro}}

{{this.erro}}

{{/if}}\n
\n \n \n
\n
\n {{/if}}\n \n {{#if this.emPassoSucesso}}\n
\n \n

Tudo certo!

\n {{#if this.vinculouContaExistente}}\n

Sua conta agora está vinculada a {{this.primeiroNomeDependente}}. Entre com o seu e-mail e a sua senha de sempre.

\n {{else}}\n

Sua conta foi criada e vinculada a {{this.primeiroNomeDependente}}. Entre com o e-mail {{this.email}} e a senha que você acabou de criar.

\n {{/if}}\n
\n \n
\n
\n {{/if}}\n \n \n \n */\n {\n \"id\": \"3CvrN2fP\",\n \"block\": \"[[[10,\\\"main\\\"],[14,0,\\\"cadastro-responsavel\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__cartao\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/assets/img/logo-principal.png\\\"],[14,\\\"alt\\\",\\\"Plataforma Semente\\\"],[14,0,\\\"cadastro-responsavel__logo\\\"],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"h1\\\"],[14,0,\\\"cadastro-responsavel__titulo\\\"],[12],[1,\\\"Cadastro de responsável\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,0,[\\\"emPassoSucesso\\\"]]],[[[1,\\\" \\\"],[10,2],[14,0,\\\"cadastro-responsavel__progresso\\\"],[12],[1,\\\"Passo \\\"],[1,[30,0,[\\\"numeroPasso\\\"]]],[1,\\\" de 3\\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"instituicaoNome\\\"]],[[[41,[51,[30,0,[\\\"emPassoChave\\\"]]],[[[1,\\\" \\\"],[10,2],[14,0,\\\"cadastro-responsavel__vinculo\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"icon-users\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n Responsável por \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"primeiroNomeDependente\\\"]]],[13],[1,\\\" — \\\"],[1,[30,0,[\\\"instituicaoNome\\\"]]],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"emPassoChave\\\"]],[[[1,\\\" \\\"],[11,\\\"form\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,0,\\\"cadastro-responsavel__form\\\"],[24,\\\"novalidate\\\",\\\"\\\"],[4,[38,10],[\\\"submit\\\",[28,[37,11],[[30,0,[\\\"validarChave\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,1,\\\"cadastro-responsavel-passo\\\"],[14,0,\\\"cadastro-responsavel__subtitulo\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"Informe a chave de cadastro\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"cadastro-responsavel__texto\\\"],[12],[1,\\\"\\\\n A chave é gerada pelo estudante na Plataforma Semente, no menu \\\"],[10,\\\"strong\\\"],[12],[1,\\\"Chaves para responsáveis\\\"],[13],[1,\\\".\\\\n Ela tem 8 letras e números e vale por 7 dias.\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-chave\\\"],[12],[1,\\\"Chave de cadastro\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-chave\\\"],[24,\\\"inputmode\\\",\\\"text\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"autocapitalize\\\",\\\"characters\\\"],[24,\\\"spellcheck\\\",\\\"false\\\"],[24,\\\"maxlength\\\",\\\"9\\\"],[24,\\\"placeholder\\\",\\\"XXXX-XXXX\\\"],[24,0,\\\"cadastro-responsavel__input cadastro-responsavel__input--chave cadastro-responsavel__campo-inicial\\\"],[24,\\\"aria-describedby\\\",\\\"cadastro-responsavel-chave-dica\\\"],[16,2,[30,0,[\\\"chave\\\"]]],[24,\\\"required\\\",\\\"\\\"],[24,4,\\\"text\\\"],[4,[38,10],[\\\"input\\\",[30,0,[\\\"digitarChave\\\"]]],null],[12],[13],[1,\\\"\\\\n \\\"],[10,1],[14,1,\\\"cadastro-responsavel-chave-dica\\\"],[14,0,\\\"cadastro-responsavel__dica\\\"],[12],[1,\\\"Exemplo: K7QM-2XPA\\\"],[13],[1,\\\"\\\\n \\\"],[41,[30,0,[\\\"erro\\\"]],[[[10,2],[14,0,\\\"cadastro-responsavel__erro\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,[30,0,[\\\"erro\\\"]]],[13]],[]],null],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__acoes\\\"],[12],[1,\\\"\\\\n \\\"],[8,[39,15],[[24,0,\\\"cadastro-responsavel__botao cadastro-responsavel__botao--secundario\\\"]],[[\\\"@route\\\"],[\\\"login\\\"]],[[\\\"default\\\"],[[[[1,\\\"Voltar ao login\\\"]],[]]]]],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,0,\\\"cadastro-responsavel__botao\\\"],[15,\\\"disabled\\\",[30,0,[\\\"ocupado\\\"]]],[14,4,\\\"submit\\\"],[12],[1,[52,[30,0,[\\\"ocupado\\\"]],\\\"Verificando...\\\",\\\"Continuar\\\"]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"emPassoEmail\\\"]],[[[1,\\\" \\\"],[11,\\\"form\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,0,\\\"cadastro-responsavel__form\\\"],[24,\\\"novalidate\\\",\\\"\\\"],[4,[38,10],[\\\"submit\\\",[28,[37,11],[[30,0,[\\\"verificarEmail\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,1,\\\"cadastro-responsavel-passo\\\"],[14,0,\\\"cadastro-responsavel__subtitulo\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"Qual é o seu e-mail?\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"cadastro-responsavel__texto\\\"],[12],[1,\\\"É por ele que você vai entrar na plataforma e receber os comunicados da escola.\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-contato\\\"],[12],[1,\\\"E-mail\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-contato\\\"],[24,\\\"inputmode\\\",\\\"email\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"autocapitalize\\\",\\\"off\\\"],[24,\\\"spellcheck\\\",\\\"false\\\"],[24,\\\"required\\\",\\\"\\\"],[24,0,\\\"cadastro-responsavel__input cadastro-responsavel__campo-inicial\\\"],[16,2,[30,0,[\\\"email\\\"]]],[24,4,\\\"text\\\"],[4,[38,10],[\\\"input\\\",[28,[37,11],[[28,[37,17],[[28,[37,18],[[30,0,[\\\"email\\\"]]],null]],null]],[[\\\"value\\\",\\\"preventDefault\\\"],[\\\"target.value\\\",false]]]],null],[12],[13],[1,\\\"\\\\n \\\"],[41,[30,0,[\\\"erro\\\"]],[[[10,2],[14,0,\\\"cadastro-responsavel__erro\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,[30,0,[\\\"erro\\\"]]],[13]],[]],null],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__acoes\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"cadastro-responsavel__botao cadastro-responsavel__botao--secundario\\\"],[24,4,\\\"button\\\"],[4,[38,10],[\\\"click\\\",[28,[37,11],[[30,0,[\\\"voltar\\\"]],\\\"chave\\\"],null]],null],[12],[1,\\\"Voltar\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,0,\\\"cadastro-responsavel__botao\\\"],[15,\\\"disabled\\\",[30,0,[\\\"ocupado\\\"]]],[14,4,\\\"submit\\\"],[12],[1,[52,[30,0,[\\\"ocupado\\\"]],\\\"Verificando...\\\",\\\"Continuar\\\"]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"emPassoExistente\\\"]],[[[1,\\\" \\\"],[11,\\\"form\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,0,\\\"cadastro-responsavel__form\\\"],[24,\\\"novalidate\\\",\\\"\\\"],[4,[38,10],[\\\"submit\\\",[28,[37,11],[[30,0,[\\\"cadastrarExistente\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,1,\\\"cadastro-responsavel-passo\\\"],[14,0,\\\"cadastro-responsavel__subtitulo\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"Você já tem uma conta\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"cadastro-responsavel__texto\\\"],[12],[1,\\\"\\\\n Encontramos uma conta com o e-mail \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"email\\\"]]],[13],[1,\\\". Digite a senha dessa conta para confirmar o vínculo.\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-segredo-atual\\\"],[12],[1,\\\"Senha atual\\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__senha\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-segredo-atual\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"autocapitalize\\\",\\\"off\\\"],[24,\\\"spellcheck\\\",\\\"false\\\"],[24,\\\"required\\\",\\\"\\\"],[16,0,[29,[\\\"cadastro-responsavel__input \\\",[52,[51,[30,0,[\\\"mostrarSenha\\\"]]],\\\"cadastro-responsavel__input--sigiloso\\\"],\\\" cadastro-responsavel__campo-inicial\\\"]]],[16,2,[30,0,[\\\"senha\\\"]]],[24,4,\\\"text\\\"],[4,[38,10],[\\\"input\\\",[28,[37,11],[[28,[37,17],[[28,[37,18],[[30,0,[\\\"senha\\\"]]],null]],null]],[[\\\"value\\\",\\\"preventDefault\\\"],[\\\"target.value\\\",false]]]],null],[12],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"cadastro-responsavel__olho\\\"],[16,\\\"aria-pressed\\\",[52,[30,0,[\\\"mostrarSenha\\\"]],\\\"true\\\",\\\"false\\\"]],[16,\\\"aria-label\\\",[52,[30,0,[\\\"mostrarSenha\\\"]],\\\"Ocultar senha\\\",\\\"Mostrar senha\\\"]],[24,4,\\\"button\\\"],[4,[38,10],[\\\"click\\\",[28,[37,11],[[30,0,[\\\"alternarSenha\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,1],[15,0,[29,[[52,[30,0,[\\\"mostrarSenha\\\"]],\\\"icon-eye-off\\\",\\\"icon-eye\\\"]]]],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"cadastro-responsavel__dica\\\"],[12],[1,\\\"Esqueceu a senha? Volte ao login e use \\\\\\\"Esqueceu sua senha?\\\\\\\". Depois, use a chave novamente.\\\"],[13],[1,\\\"\\\\n \\\"],[41,[30,0,[\\\"erro\\\"]],[[[10,2],[14,0,\\\"cadastro-responsavel__erro\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,[30,0,[\\\"erro\\\"]]],[13]],[]],null],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__acoes\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"cadastro-responsavel__botao cadastro-responsavel__botao--secundario\\\"],[24,4,\\\"button\\\"],[4,[38,10],[\\\"click\\\",[28,[37,11],[[30,0,[\\\"voltar\\\"]],\\\"email\\\"],null]],null],[12],[1,\\\"Voltar\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,0,\\\"cadastro-responsavel__botao\\\"],[15,\\\"disabled\\\",[30,0,[\\\"ocupado\\\"]]],[14,4,\\\"submit\\\"],[12],[1,[52,[30,0,[\\\"ocupado\\\"]],\\\"Confirmando...\\\",\\\"Confirmar vínculo\\\"]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"emPassoNova\\\"]],[[[1,\\\" \\\"],[11,\\\"form\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,0,\\\"cadastro-responsavel__form\\\"],[24,\\\"novalidate\\\",\\\"\\\"],[4,[38,10],[\\\"submit\\\",[28,[37,11],[[30,0,[\\\"cadastrarNova\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,1,\\\"cadastro-responsavel-passo\\\"],[14,0,\\\"cadastro-responsavel__subtitulo\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"Crie sua conta\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"cadastro-responsavel__texto\\\"],[12],[1,\\\"Você vai entrar com o e-mail \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"email\\\"]]],[13],[1,\\\" e a senha que escolher abaixo.\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-nome\\\"],[12],[1,\\\"Nome completo\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-nome\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"required\\\",\\\"\\\"],[24,\\\"maxlength\\\",\\\"150\\\"],[24,0,\\\"cadastro-responsavel__input cadastro-responsavel__campo-inicial\\\"],[16,2,[30,0,[\\\"nome\\\"]]],[24,4,\\\"text\\\"],[4,[38,10],[\\\"input\\\",[28,[37,11],[[28,[37,17],[[28,[37,18],[[30,0,[\\\"nome\\\"]]],null]],null]],[[\\\"value\\\",\\\"preventDefault\\\"],[\\\"target.value\\\",false]]]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-telefone\\\"],[12],[1,\\\"Telefone \\\"],[10,1],[14,0,\\\"cadastro-responsavel__opcional\\\"],[12],[1,\\\"(opcional)\\\"],[13],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-telefone\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"inputmode\\\",\\\"numeric\\\"],[24,\\\"placeholder\\\",\\\"(00) 00000-0000\\\"],[24,0,\\\"cadastro-responsavel__input\\\"],[16,2,[30,0,[\\\"telefone\\\"]]],[24,4,\\\"tel\\\"],[4,[38,10],[\\\"input\\\",[30,0,[\\\"digitarTelefone\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-segredo\\\"],[12],[1,\\\"Senha\\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__senha\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-segredo\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"autocapitalize\\\",\\\"off\\\"],[24,\\\"spellcheck\\\",\\\"false\\\"],[24,\\\"required\\\",\\\"\\\"],[16,0,[29,[\\\"cadastro-responsavel__input \\\",[52,[51,[30,0,[\\\"mostrarSenha\\\"]]],\\\"cadastro-responsavel__input--sigiloso\\\"]]]],[24,\\\"aria-describedby\\\",\\\"cadastro-responsavel-segredo-dica\\\"],[16,2,[30,0,[\\\"senha\\\"]]],[24,4,\\\"text\\\"],[4,[38,10],[\\\"input\\\",[28,[37,11],[[28,[37,17],[[28,[37,18],[[30,0,[\\\"senha\\\"]]],null]],null]],[[\\\"value\\\",\\\"preventDefault\\\"],[\\\"target.value\\\",false]]]],null],[12],[13],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"cadastro-responsavel__olho\\\"],[16,\\\"aria-pressed\\\",[52,[30,0,[\\\"mostrarSenha\\\"]],\\\"true\\\",\\\"false\\\"]],[16,\\\"aria-label\\\",[52,[30,0,[\\\"mostrarSenha\\\"]],\\\"Ocultar senhas\\\",\\\"Mostrar senhas\\\"]],[24,4,\\\"button\\\"],[4,[38,10],[\\\"click\\\",[28,[37,11],[[30,0,[\\\"alternarSenha\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[10,1],[15,0,[29,[[52,[30,0,[\\\"mostrarSenha\\\"]],\\\"icon-eye-off\\\",\\\"icon-eye\\\"]]]],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,1],[14,1,\\\"cadastro-responsavel-segredo-dica\\\"],[14,0,\\\"cadastro-responsavel__dica\\\"],[12],[1,\\\"Use pelo menos 6 caracteres.\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"label\\\"],[14,0,\\\"cadastro-responsavel__label\\\"],[14,\\\"for\\\",\\\"cadastro-responsavel-segredo-confirmacao\\\"],[12],[1,\\\"Confirme a senha\\\"],[13],[1,\\\"\\\\n \\\"],[11,\\\"input\\\"],[24,\\\"data-lpignore\\\",\\\"true\\\"],[24,\\\"data-1p-ignore\\\",\\\"true\\\"],[24,\\\"data-bwignore\\\",\\\"true\\\"],[24,\\\"data-form-type\\\",\\\"other\\\"],[24,1,\\\"cadastro-responsavel-segredo-confirmacao\\\"],[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"autocapitalize\\\",\\\"off\\\"],[24,\\\"spellcheck\\\",\\\"false\\\"],[24,\\\"required\\\",\\\"\\\"],[16,0,[29,[\\\"cadastro-responsavel__input \\\",[52,[51,[30,0,[\\\"mostrarSenha\\\"]]],\\\"cadastro-responsavel__input--sigiloso\\\"]]]],[16,2,[30,0,[\\\"confirmacao\\\"]]],[24,4,\\\"text\\\"],[4,[38,10],[\\\"input\\\",[28,[37,11],[[28,[37,17],[[28,[37,18],[[30,0,[\\\"confirmacao\\\"]]],null]],null]],[[\\\"value\\\",\\\"preventDefault\\\"],[\\\"target.value\\\",false]]]],null],[12],[13],[1,\\\"\\\\n\\\\n \\\"],[41,[30,0,[\\\"erro\\\"]],[[[10,2],[14,0,\\\"cadastro-responsavel__erro\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,[30,0,[\\\"erro\\\"]]],[13]],[]],null],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"cadastro-responsavel__acoes\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"cadastro-responsavel__botao cadastro-responsavel__botao--secundario\\\"],[24,4,\\\"button\\\"],[4,[38,10],[\\\"click\\\",[28,[37,11],[[30,0,[\\\"voltar\\\"]],\\\"email\\\"],null]],null],[12],[1,\\\"Voltar\\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"button\\\"],[14,0,\\\"cadastro-responsavel__botao\\\"],[15,\\\"disabled\\\",[30,0,[\\\"ocupado\\\"]]],[14,4,\\\"submit\\\"],[12],[1,[52,[30,0,[\\\"ocupado\\\"]],\\\"Criando conta...\\\",\\\"Criar conta\\\"]],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"emPassoSucesso\\\"]],[[[1,\\\" \\\"],[10,0],[14,0,\\\"cadastro-responsavel__form cadastro-responsavel__sucesso\\\"],[12],[1,\\\"\\\\n \\\"],[10,1],[14,0,\\\"cadastro-responsavel__sucesso-icone icon-check\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"h2\\\"],[14,1,\\\"cadastro-responsavel-passo\\\"],[14,0,\\\"cadastro-responsavel__subtitulo\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"Tudo certo!\\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"vinculouContaExistente\\\"]],[[[1,\\\" \\\"],[10,2],[14,0,\\\"cadastro-responsavel__texto\\\"],[12],[1,\\\"Sua conta agora está vinculada a \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"primeiroNomeDependente\\\"]]],[13],[1,\\\". Entre com o seu e-mail e a sua senha de sempre.\\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\" \\\"],[10,2],[14,0,\\\"cadastro-responsavel__texto\\\"],[12],[1,\\\"Sua conta foi criada e vinculada a \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"primeiroNomeDependente\\\"]]],[13],[1,\\\". Entre com o e-mail \\\"],[10,\\\"strong\\\"],[12],[1,[30,0,[\\\"email\\\"]]],[13],[1,\\\" e a senha que você acabou de criar.\\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\" \\\"],[10,0],[14,0,\\\"cadastro-responsavel__acoes cadastro-responsavel__acoes--centro\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"cadastro-responsavel__botao\\\"],[24,4,\\\"button\\\"],[4,[38,10],[\\\"click\\\",[28,[37,11],[[30,0,[\\\"irParaLogin\\\"]]],null]],null],[12],[1,\\\"Ir para o login\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],[\\\"main\\\",\\\"div\\\",\\\"img\\\",\\\"h1\\\",\\\"unless\\\",\\\"p\\\",\\\"if\\\",\\\"span\\\",\\\"strong\\\",\\\"form\\\",\\\"on\\\",\\\"act\\\",\\\"h2\\\",\\\"label\\\",\\\"input\\\",\\\"link-to\\\",\\\"button\\\",\\\"fn\\\",\\\"mut\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/cadastro-responsavel.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/templates/descadastro\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n /*\n {{!-- Feature 02 — descadastro dos comunicados da escola (rota pública). Estilos: app/styles/layout/descadastro.scss --}}\n
\n
\n \"Plataforma\n {{#if this.concluido}}\n \n

Pronto, você não vai mais receber estas mensagens

\n

\n Seu e-mail foi retirado da lista de comunicados desta escola. Se mudar de ideia, fale com a escola.\n

\n

Já pode fechar esta página.

\n {{else}}\n

Deseja parar de receber mensagens desta escola?

\n

\n Ao confirmar, você deixa de receber os comunicados que a escola envia por e-mail pela Plataforma Semente.\n Seu acesso à plataforma continua o mesmo.\n

\n {{#if this.erro}}

{{this.erro}}

{{/if}}\n
\n \n
\n {{/if}}\n
\n
\n \n */\n {\n \"id\": \"5UVQy//j\",\n \"block\": \"[[[10,\\\"main\\\"],[14,0,\\\"descadastro\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"descadastro__cartao\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"img\\\"],[14,\\\"src\\\",\\\"/assets/img/logo-principal.png\\\"],[14,\\\"alt\\\",\\\"Plataforma Semente\\\"],[14,0,\\\"descadastro__logo\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"concluido\\\"]],[[[1,\\\" \\\"],[10,1],[14,0,\\\"descadastro__icone icon-check\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"h1\\\"],[14,1,\\\"descadastro-concluido\\\"],[14,0,\\\"descadastro__titulo\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"Pronto, você não vai mais receber estas mensagens\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"descadastro__texto\\\"],[12],[1,\\\"\\\\n Seu e-mail foi retirado da lista de comunicados desta escola. Se mudar de ideia, fale com a escola.\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"descadastro__texto descadastro__texto--suave\\\"],[12],[1,\\\"Já pode fechar esta página.\\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\" \\\"],[10,\\\"h1\\\"],[14,0,\\\"descadastro__titulo\\\"],[12],[1,\\\"Deseja parar de receber mensagens desta escola?\\\"],[13],[1,\\\"\\\\n \\\"],[10,2],[14,0,\\\"descadastro__texto\\\"],[12],[1,\\\"\\\\n Ao confirmar, você deixa de receber os comunicados que a escola envia por e-mail pela Plataforma Semente.\\\\n Seu acesso à plataforma continua o mesmo.\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[41,[30,0,[\\\"erro\\\"]],[[[10,2],[14,0,\\\"descadastro__erro\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,[30,0,[\\\"erro\\\"]]],[13]],[]],null],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"descadastro__acoes\\\"],[12],[1,\\\"\\\\n \\\"],[11,\\\"button\\\"],[24,0,\\\"descadastro__botao\\\"],[16,\\\"disabled\\\",[30,0,[\\\"enviando\\\"]]],[24,4,\\\"button\\\"],[4,[38,8],[\\\"click\\\",[28,[37,9],[[30,0,[\\\"confirmar\\\"]]],null]],null],[12],[1,\\\"\\\\n \\\"],[1,[52,[30,0,[\\\"enviando\\\"]],\\\"Confirmando...\\\",\\\"Sim, parar de receber\\\"]],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],[\\\"main\\\",\\\"div\\\",\\\"img\\\",\\\"if\\\",\\\"span\\\",\\\"h1\\\",\\\"p\\\",\\\"button\\\",\\\"on\\\",\\\"act\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/descadastro.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/templates/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n /*\n {{outlet}}\n */\n {\n \"id\": \"7U2FWq8N\",\n \"block\": \"[[[46,[28,[37,1],null,null],null,null,null]],[],[\\\"component\\\",\\\"-outlet\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/index.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/templates/login\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n /*\n {{#if this.loadComponent}}\n {{login-coreskills \n authenticate=this.authenticate identification=this.identification password=this.password user_email=this.user_email remember=this.remember passwordVisibility=this.passwordVisibility forgotPass=this.forgotPass errorMessage=this.errorMessage success_mail=this.success_mail cancelForgot=this.cancelPass error_forgot=this.error_forgot sendMail=this.sendMail}}\n {{else}}\n {{!-- {{login-plataforma-s \n authenticate=this.authenticate identification=identification \n password=password user_email=user_email remember=remember\n passwordVisibility=this.passwordVisibility forgotPass=this.forgotPass\n errorMessage=errorMessage success_mail=success_mail\n cancelForgot=this.cancelForgot error_forgot=error_forgot\n sendMail=this.sendMail submtirOnEnter=this.submtirOnEnter}} --}}\n \n {{login-plataforma-semente \n authenticate=this.authenticate identification=this.identification authenticating=this.authenticating password=this.password user_email=this.user_email remember=this.remember passwordVisibility=this.passwordVisibility forgotPass=this.forgotPass errorMessage=this.errorMessage success_mail=this.success_mail cancelPass=this.cancelPass error_forgot=this.error_forgot sendMail=this.sendMail}}\n \n \n {{/if}}\n */\n {\n \"id\": \"37tHiX2P\",\n \"block\": \"[[[41,[30,0,[\\\"loadComponent\\\"]],[[[1,\\\" \\\"],[1,[28,[35,1],null,[[\\\"authenticate\\\",\\\"identification\\\",\\\"password\\\",\\\"user_email\\\",\\\"remember\\\",\\\"passwordVisibility\\\",\\\"forgotPass\\\",\\\"errorMessage\\\",\\\"success_mail\\\",\\\"cancelForgot\\\",\\\"error_forgot\\\",\\\"sendMail\\\"],[[30,0,[\\\"authenticate\\\"]],[30,0,[\\\"identification\\\"]],[30,0,[\\\"password\\\"]],[30,0,[\\\"user_email\\\"]],[30,0,[\\\"remember\\\"]],[30,0,[\\\"passwordVisibility\\\"]],[30,0,[\\\"forgotPass\\\"]],[30,0,[\\\"errorMessage\\\"]],[30,0,[\\\"success_mail\\\"]],[30,0,[\\\"cancelPass\\\"]],[30,0,[\\\"error_forgot\\\"]],[30,0,[\\\"sendMail\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"\\\\n \\\"],[1,[28,[35,2],null,[[\\\"authenticate\\\",\\\"identification\\\",\\\"authenticating\\\",\\\"password\\\",\\\"user_email\\\",\\\"remember\\\",\\\"passwordVisibility\\\",\\\"forgotPass\\\",\\\"errorMessage\\\",\\\"success_mail\\\",\\\"cancelPass\\\",\\\"error_forgot\\\",\\\"sendMail\\\"],[[30,0,[\\\"authenticate\\\"]],[30,0,[\\\"identification\\\"]],[30,0,[\\\"authenticating\\\"]],[30,0,[\\\"password\\\"]],[30,0,[\\\"user_email\\\"]],[30,0,[\\\"remember\\\"]],[30,0,[\\\"passwordVisibility\\\"]],[30,0,[\\\"forgotPass\\\"]],[30,0,[\\\"errorMessage\\\"]],[30,0,[\\\"success_mail\\\"]],[30,0,[\\\"cancelPass\\\"]],[30,0,[\\\"error_forgot\\\"]],[30,0,[\\\"sendMail\\\"]]]]]],[1,\\\"\\\\n\\\\n\\\\n\\\"]],[]]]],[],[\\\"if\\\",\\\"login-coreskills\\\",\\\"login-plataforma-semente\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/login.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/templates/maintenance\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n /*\n \n
\n \n \n {{!--
\n

Login

\n \n \n \n \n \n
\n \n \n
\n \n
\n \n \n
\n \n Caps Lock is on\n \n \n \n
\n \n \n \n
\n
\n \n \n \n \n
\n {{#if errorMessage}}\n
\n \n

{{{errorMessage}}}

\n
\n {{/if}}\n \n {{#if success_mail}}\n
\n \n

{{{success_mail}}}

\n
\n {{/if}}\n \n \n
--}}\n
\n \n {{!-- --}}\n */\n {\n \"id\": \"95+/i9pg\",\n \"block\": \"[[[3,\\\" Top content \\\"],[1,\\\"\\\\n\\\"],[11,\\\"form\\\"],[24,0,\\\"login bg--black-blue-print\\\"],[4,[38,1],[\\\"submit\\\",[28,[37,2],[[30,0,[\\\"authenticate\\\"]]],null]],null],[12],[1,\\\"\\\\n\\\"],[3,\\\" Modal de novo layout \\\"],[1,\\\"\\\\n\\\"],[10,\\\"aside\\\"],[14,0,\\\"modal modal--is-show\\\"],[12],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__content modal__content--sm\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"header\\\"],[14,0,\\\"modal__header\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\" \\\"],[10,\\\"svg\\\"],[14,0,\\\"login__logo logo\\\"],[14,\\\"xmlns\\\",\\\"http://www.w3.org/2000/svg\\\",\\\"http://www.w3.org/2000/xmlns/\\\"],[14,\\\"viewBox\\\",\\\"0 0 375 98\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"g\\\"],[14,0,\\\"login__logo-symbol logo__symbol\\\"],[14,1,\\\"plataforma-s__logo\\\"],[14,\\\"transform\\\",\\\"translate(-2006.723 20252.666)\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"g\\\"],[14,1,\\\"symbol\\\"],[14,\\\"transform\\\",\\\"translate(7 19.328)\\\"],[14,\\\"fill\\\",\\\"#f25626\\\"],[12],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,1,\\\"ball-right\\\"],[14,\\\"d\\\",\\\"M215.636,169.246c-.165,0-.333-.009-.5-.025a4.489,4.489,0,0,1-.491-.076c-.161-.032-.321-.071-.479-.12s-.315-.106-.466-.167a4.723,4.723,0,0,1-.445-.211c-.147-.078-.289-.163-.424-.252a4.518,4.518,0,0,1-.4-.3,4.632,4.632,0,0,1-.369-.332c-.117-.117-.227-.241-.333-.37s-.2-.259-.294-.4-.177-.28-.255-.425-.147-.3-.211-.447-.117-.308-.165-.466a4.928,4.928,0,0,1-.121-.479c-.032-.161-.057-.326-.074-.489s-.025-.333-.025-.5.009-.333.025-.5.041-.328.074-.489a4.933,4.933,0,0,1,.121-.479c.048-.159.1-.315.165-.466s.135-.3.211-.448.163-.287.255-.425a4.638,4.638,0,0,1,.294-.4c.105-.128.216-.252.333-.369a4.659,4.659,0,0,1,.369-.333,4.529,4.529,0,0,1,.4-.3c.135-.09.277-.175.424-.253a4.649,4.649,0,0,1,.445-.211c.152-.062.31-.12.466-.168a5.487,5.487,0,0,1,.97-.195,5.126,5.126,0,0,1,.992,0c.163.018.328.041.491.076a4.938,4.938,0,0,1,.48.119c.156.048.312.106.464.168a4.648,4.648,0,0,1,.447.211c.144.078.289.163.425.253a4.916,4.916,0,0,1,.4.3,4.647,4.647,0,0,1,.369.333c.115.117.227.241.333.369s.2.259.294.4a4.811,4.811,0,0,1,.252.425,5.165,5.165,0,0,1,.379.914c.048.156.089.319.122.479s.057.326.073.489.025.333.025.5-.009.33-.025.5-.041.328-.073.489-.074.323-.122.479a4.8,4.8,0,0,1-.167.466,5.2,5.2,0,0,1-.464.872c-.092.138-.191.271-.294.4s-.218.252-.333.37a4.62,4.62,0,0,1-.369.332,4.9,4.9,0,0,1-.4.3c-.135.09-.28.174-.425.252a4.723,4.723,0,0,1-.447.211c-.152.062-.308.119-.464.167s-.319.088-.48.12a4.618,4.618,0,0,1-.491.076C215.967,169.237,215.8,169.246,215.636,169.246Z\\\"],[14,\\\"transform\\\",\\\"translate(1847.669 -20388.035)\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,1,\\\"ball-left\\\"],[14,\\\"d\\\",\\\"M82.048,168.534c-.165,0-.333-.009-.5-.025s-.328-.041-.489-.074a5.133,5.133,0,0,1-.946-.289c-.151-.062-.3-.133-.445-.209s-.289-.163-.427-.255-.271-.191-.4-.294-.253-.218-.369-.333a4.578,4.578,0,0,1-.333-.369,4.415,4.415,0,0,1-.294-.4c-.092-.135-.177-.28-.255-.425s-.147-.3-.211-.447a4.71,4.71,0,0,1-.165-.464c-.048-.158-.09-.319-.122-.479s-.057-.326-.073-.491a4.849,4.849,0,0,1,0-.991c.016-.166.041-.328.073-.491s.074-.321.122-.48a4.664,4.664,0,0,1,.165-.463c.064-.154.135-.3.211-.448s.163-.289.255-.424a4.078,4.078,0,0,1,.294-.4,4.583,4.583,0,0,1,.333-.369c.117-.115.241-.227.369-.333s.262-.2.4-.293a4.892,4.892,0,0,1,.427-.255c.145-.076.294-.147.445-.209a5.062,5.062,0,0,1,.946-.289c.161-.032.326-.057.489-.074a4.833,4.833,0,0,1,.993,0c.163.016.328.042.491.074a4.82,4.82,0,0,1,.477.121,4.593,4.593,0,0,1,.466.168c.152.062.3.133.447.209s.287.163.425.255.271.19.4.293.253.218.367.333.23.241.335.369a4.957,4.957,0,0,1,.294.4c.089.135.177.28.252.424a4.309,4.309,0,0,1,.211.448c.062.151.119.307.167.463s.088.319.122.48.057.326.073.491.025.33.025.5-.009.333-.025.5-.041.328-.075.491a4.879,4.879,0,0,1-.12.479c-.048.156-.106.312-.167.464a4.528,4.528,0,0,1-.211.447c-.078.145-.163.289-.252.425s-.19.271-.294.4-.218.252-.335.369-.241.227-.367.333-.262.2-.4.294-.28.177-.425.255-.3.147-.447.209a4.6,4.6,0,0,1-.466.167,4.8,4.8,0,0,1-.477.121c-.163.032-.328.057-.491.074S82.213,168.534,82.048,168.534Z\\\"],[14,\\\"transform\\\",\\\"translate(1922.723 -20387.637)\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,1,\\\"path-lower\\\"],[14,\\\"d\\\",\\\"M143.548,125.169A22.036,22.036,0,0,0,124.3,141.9l-.719,2.97h.094l-.394,2.951A40.2,40.2,0,0,1,83.438,182.7h-.279l-.376,0v10.1l.306,0h.348a50.3,50.3,0,0,0,49.852-43.64l.572-4.287h.108l.144-.595a11.929,11.929,0,0,1,10.42-9.058l1.81-.178V124.894Z\\\"],[14,\\\"transform\\\",\\\"translate(1919.474 -20368.791)\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,1,\\\"path-middle\\\"],[14,\\\"d\\\",\\\"M145.012,92.847a36.152,36.152,0,0,0-34.927,30.362l-.567,3.492H109.4l-.328,2.024A26.056,26.056,0,0,1,83.9,150.609l-1.119.024v10.1l1.332-.028a36.152,36.152,0,0,0,34.927-30.362l.566-3.492h.115l.328-2.024a26.057,26.057,0,0,1,25.174-21.884l1.119-.023v-10.1Z\\\"],[14,\\\"transform\\\",\\\"translate(1919.474 -20350.77)\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,1,\\\"path-top\\\"],[14,\\\"d\\\",\\\"M146.038,60.769a50.3,50.3,0,0,0-50.2,43.639l-.572,4.287h-.108l-.144.6a11.93,11.93,0,0,1-10.42,9.058l-1.81.177v10.145l2.8-.274a22.036,22.036,0,0,0,19.247-16.731l.719-2.97h-.094l.394-2.951A40.2,40.2,0,0,1,145.69,70.864h.279l.376,0v-10.1Z\\\"],[14,\\\"transform\\\",\\\"translate(1919.474 -20332.762)\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,0,\\\"logo__type\\\"],[14,1,\\\"plataforma_s\\\"],[14,\\\"data-name\\\",\\\"plataforma s\\\"],[14,\\\"d\\\",\\\"M-131.144-27.56a14.047,14.047,0,0,1,6.968,1.742,12.457,12.457,0,0,1,4.888,4.914,14.593,14.593,0,0,1,1.768,7.228,14.7,14.7,0,0,1-1.768,7.28,12.506,12.506,0,0,1-4.862,4.914A14.006,14.006,0,0,1-131.144.26a12.933,12.933,0,0,1-6.006-1.378,11.382,11.382,0,0,1-4.394-4.03V10.088h-3.692v-37.44h3.536v5.408a11.373,11.373,0,0,1,4.394-4.16A12.888,12.888,0,0,1-131.144-27.56Zm-.26,24.544a10.362,10.362,0,0,0,5.2-1.326,9.366,9.366,0,0,0,3.666-3.77,11.479,11.479,0,0,0,1.326-5.564,11.329,11.329,0,0,0-1.326-5.538,9.588,9.588,0,0,0-3.666-3.77,10.206,10.206,0,0,0-5.2-1.352,10.166,10.166,0,0,0-5.226,1.352,9.643,9.643,0,0,0-3.64,3.77,11.329,11.329,0,0,0-1.326,5.538,11.479,11.479,0,0,0,1.326,5.564,9.417,9.417,0,0,0,3.64,3.77A10.321,10.321,0,0,0-131.4-3.016Zm18.824-35.568h3.692V0h-3.692ZM-91.624-27.56q5.356,0,8.216,2.678t2.86,7.93V0h-3.536V-4.264A8.466,8.466,0,0,1-87.75-.936,12.83,12.83,0,0,1-93.5.26a11.251,11.251,0,0,1-7.28-2.184,7.053,7.053,0,0,1-2.7-5.772,6.994,6.994,0,0,1,2.522-5.616q2.522-2.132,8.034-2.132h8.684v-1.664a7.009,7.009,0,0,0-1.976-5.382,8.16,8.16,0,0,0-5.772-1.846,14.673,14.673,0,0,0-4.992.858,12.58,12.58,0,0,0-4.108,2.366l-1.664-2.756A14.756,14.756,0,0,1-97.76-26.6,19.435,19.435,0,0,1-91.624-27.56Zm-1.3,24.908a9.73,9.73,0,0,0,5.356-1.43A8.539,8.539,0,0,0-84.24-8.216v-4.472h-8.58q-7.02,0-7.02,4.888a4.472,4.472,0,0,0,1.82,3.77A8.285,8.285,0,0,0-92.924-2.652Zm34.216.988a6.991,6.991,0,0,1-2.574,1.43,10.368,10.368,0,0,1-3.2.494,8.02,8.02,0,0,1-5.928-2.08A7.946,7.946,0,0,1-72.488-7.7V-24.232h-4.888v-3.12h4.888v-5.98H-68.8v5.98h8.32v3.12H-68.8V-7.9a5.168,5.168,0,0,0,1.222,3.718,4.637,4.637,0,0,0,3.51,1.274,6.792,6.792,0,0,0,2.21-.364,5.494,5.494,0,0,0,1.846-1.04Zm13.676-25.9q5.356,0,8.216,2.678t2.86,7.93V0h-3.536V-4.264A8.466,8.466,0,0,1-41.158-.936,12.83,12.83,0,0,1-46.9.26a11.251,11.251,0,0,1-7.28-2.184,7.053,7.053,0,0,1-2.7-5.772,6.994,6.994,0,0,1,2.522-5.616q2.522-2.132,8.034-2.132h8.684v-1.664a7.009,7.009,0,0,0-1.976-5.382A8.16,8.16,0,0,0-45.4-24.336a14.673,14.673,0,0,0-4.992.858A12.58,12.58,0,0,0-54.5-21.112l-1.664-2.756a14.756,14.756,0,0,1,4.992-2.73A19.435,19.435,0,0,1-45.032-27.56Zm-1.3,24.908a9.73,9.73,0,0,0,5.356-1.43,8.539,8.539,0,0,0,3.328-4.134v-4.472h-8.58q-7.02,0-7.02,4.888a4.472,4.472,0,0,0,1.82,3.77A8.285,8.285,0,0,0-46.332-2.652Zm28.86-33.072a4.726,4.726,0,0,0-3.614,1.3,5.426,5.426,0,0,0-1.222,3.848v3.224h8.424v3.12H-22.2V0H-25.9V-24.232h-4.888v-3.12H-25.9v-3.38a8.065,8.065,0,0,1,2.158-5.928,8.206,8.206,0,0,1,6.11-2.184,10.325,10.325,0,0,1,3.016.442,6.815,6.815,0,0,1,2.444,1.274l-1.248,2.756A6.1,6.1,0,0,0-17.472-35.724ZM-.78.26A14.216,14.216,0,0,1-7.9-1.534,13.083,13.083,0,0,1-12.9-6.5a14.158,14.158,0,0,1-1.82-7.176,14.158,14.158,0,0,1,1.82-7.176A12.9,12.9,0,0,1-7.9-25.792,14.381,14.381,0,0,1-.78-27.56a14.381,14.381,0,0,1,7.124,1.768,12.717,12.717,0,0,1,4.966,4.94A14.319,14.319,0,0,1,13.1-13.676,14.319,14.319,0,0,1,11.31-6.5,12.9,12.9,0,0,1,6.344-1.534,14.216,14.216,0,0,1-.78.26Zm0-3.276A10.321,10.321,0,0,0,4.446-4.342,9.244,9.244,0,0,0,8.06-8.112a11.664,11.664,0,0,0,1.3-5.564,11.664,11.664,0,0,0-1.3-5.564,9.244,9.244,0,0,0-3.614-3.77A10.321,10.321,0,0,0-.78-24.336,10.321,10.321,0,0,0-6.006-23.01a9.417,9.417,0,0,0-3.64,3.77,11.479,11.479,0,0,0-1.326,5.564A11.479,11.479,0,0,0-9.646-8.112a9.417,9.417,0,0,0,3.64,3.77A10.321,10.321,0,0,0-.78-3.016ZM21.58-22a8.947,8.947,0,0,1,3.874-4.16,13.164,13.164,0,0,1,6.37-1.4v3.588l-.884-.052a8.736,8.736,0,0,0-6.76,2.652q-2.444,2.652-2.444,7.436V0H18.044V-27.352H21.58ZM69.992-27.56A10.872,10.872,0,0,1,78.078-24.6q2.938,2.964,2.938,8.736V0H77.324V-15.5q0-4.264-2.054-6.5a7.478,7.478,0,0,0-5.8-2.236,8.715,8.715,0,0,0-6.708,2.626,10.234,10.234,0,0,0-2.444,7.254V0H56.628V-15.5q0-4.264-2.054-6.5a7.545,7.545,0,0,0-5.85-2.236,8.733,8.733,0,0,0-6.682,2.626,10.167,10.167,0,0,0-2.47,7.254V0H35.88V-27.352h3.536v4.992a9.866,9.866,0,0,1,4.056-3.848,12.776,12.776,0,0,1,5.98-1.352A11.7,11.7,0,0,1,55.406-26.1a8.952,8.952,0,0,1,3.77,4.316,10.657,10.657,0,0,1,4.342-4.238A13.383,13.383,0,0,1,69.992-27.56Zm28.028,0q5.356,0,8.216,2.678t2.86,7.93V0H105.56V-4.264a8.466,8.466,0,0,1-3.666,3.328A12.83,12.83,0,0,1,96.148.26a11.251,11.251,0,0,1-7.28-2.184,7.053,7.053,0,0,1-2.7-5.772,6.994,6.994,0,0,1,2.522-5.616q2.522-2.132,8.034-2.132H105.4v-1.664a7.009,7.009,0,0,0-1.976-5.382,8.16,8.16,0,0,0-5.772-1.846,14.673,14.673,0,0,0-4.992.858,12.58,12.58,0,0,0-4.108,2.366l-1.664-2.756a14.756,14.756,0,0,1,4.992-2.73A19.435,19.435,0,0,1,98.02-27.56ZM96.72-2.652a9.73,9.73,0,0,0,5.356-1.43A8.539,8.539,0,0,0,105.4-8.216v-4.472h-8.58q-7.02,0-7.02,4.888a4.472,4.472,0,0,0,1.82,3.77A8.285,8.285,0,0,0,96.72-2.652ZM135.928.416a27.176,27.176,0,0,1-6.812-.858,17.8,17.8,0,0,1-5.3-2.158l2.7-5.824a17.018,17.018,0,0,0,4.524,1.95,18.961,18.961,0,0,0,5.2.754q5.148,0,5.148-2.548a1.8,1.8,0,0,0-1.4-1.716,20.8,20.8,0,0,0-4.316-.884,41.637,41.637,0,0,1-5.668-1.2,8.794,8.794,0,0,1-3.874-2.392,6.8,6.8,0,0,1-1.638-4.888,7.657,7.657,0,0,1,1.534-4.706,9.873,9.873,0,0,1,4.472-3.2,19.1,19.1,0,0,1,6.942-1.144,27.245,27.245,0,0,1,5.9.65,16.5,16.5,0,0,1,4.862,1.794l-2.7,5.772a16.143,16.143,0,0,0-8.06-2.08,8.2,8.2,0,0,0-3.9.728,2.14,2.14,0,0,0-1.3,1.872,1.858,1.858,0,0,0,1.4,1.82,24.855,24.855,0,0,0,4.472.988,47.869,47.869,0,0,1,5.616,1.222,8.437,8.437,0,0,1,3.8,2.366,6.714,6.714,0,0,1,1.612,4.784,7.388,7.388,0,0,1-1.56,4.628A9.958,9.958,0,0,1,143.026-.7,20.271,20.271,0,0,1,135.928.416Z\\\"],[14,\\\"transform\\\",\\\"translate(2230.597 -20166.617)\\\"],[14,\\\"fill\\\",\\\"#333\\\"],[12],[13],[1,\\\"\\\\n \\\"],[10,\\\"path\\\"],[14,0,\\\"logo__type logo__type--on-dark\\\"],[14,1,\\\"plataforma_s--on-dark\\\"],[14,\\\"data-name\\\",\\\"plataforma s\\\"],[14,\\\"d\\\",\\\"M-129.61-27.352a13.5,13.5,0,0,1,6.864,1.768,12.656,12.656,0,0,1,4.81,4.888,14.364,14.364,0,0,1,1.742,7.124,14.511,14.511,0,0,1-1.742,7.15,12.425,12.425,0,0,1-4.81,4.888A13.655,13.655,0,0,1-129.61.208a12.712,12.712,0,0,1-6.5-1.69,11.711,11.711,0,0,1-4.524-4.706V10.088h-2.6V-27.144h2.5v6.4a11.847,11.847,0,0,1,4.55-4.862A12.653,12.653,0,0,1-129.61-27.352Zm-.156,25.22a10.938,10.938,0,0,0,5.616-1.456,10.4,10.4,0,0,0,3.926-4.056,12.1,12.1,0,0,0,1.43-5.928,12.1,12.1,0,0,0-1.43-5.928,10.4,10.4,0,0,0-3.926-4.056,10.938,10.938,0,0,0-5.616-1.456,10.8,10.8,0,0,0-5.59,1.456,10.454,10.454,0,0,0-3.9,4.056,12.1,12.1,0,0,0-1.43,5.928,12.1,12.1,0,0,0,1.43,5.928,10.454,10.454,0,0,0,3.9,4.056A10.8,10.8,0,0,0-129.766-2.132Zm19.032-36.452h2.6V0h-2.6ZM-90.61-27.352q5.044,0,7.748,2.574t2.7,7.566V0h-2.5V-4.836a9.03,9.03,0,0,1-3.8,3.718A12.588,12.588,0,0,1-92.43.208a11.022,11.022,0,0,1-7.15-2.132,6.88,6.88,0,0,1-2.626-5.616,6.931,6.931,0,0,1,2.418-5.486q2.418-2.106,7.722-2.106h9.308v-2.184a7.644,7.644,0,0,0-2.054-5.772,8.335,8.335,0,0,0-6.006-1.976,14.479,14.479,0,0,0-5.174.936,12.981,12.981,0,0,0-4.186,2.5l-1.3-1.872a14.449,14.449,0,0,1,4.888-2.834A17.762,17.762,0,0,1-90.61-27.352ZM-92.066-1.924a10.207,10.207,0,0,0,5.746-1.56,9.486,9.486,0,0,0,3.562-4.524v-5.1h-9.256q-4,0-5.8,1.456a4.876,4.876,0,0,0-1.794,4A5.013,5.013,0,0,0-97.63-3.458,8.89,8.89,0,0,0-92.066-1.924Zm33.488.208a6.535,6.535,0,0,1-2.47,1.43,9.719,9.719,0,0,1-3.094.494,7.327,7.327,0,0,1-5.46-1.95,7.4,7.4,0,0,1-1.924-5.434V-24.908h-4.992v-2.236h4.992v-5.928h2.6v5.928h8.632v2.236h-8.632V-7.436a5.736,5.736,0,0,0,1.274,4.03,4.885,4.885,0,0,0,3.77,1.378A6.034,6.034,0,0,0-59.67-3.536ZM-44.8-27.352q5.044,0,7.748,2.574t2.7,7.566V0h-2.5V-4.836a9.03,9.03,0,0,1-3.8,3.718A12.588,12.588,0,0,1-46.618.208a11.022,11.022,0,0,1-7.15-2.132A6.88,6.88,0,0,1-56.394-7.54a6.931,6.931,0,0,1,2.418-5.486q2.418-2.106,7.722-2.106h9.308v-2.184A7.644,7.644,0,0,0-39-23.088a8.335,8.335,0,0,0-6.006-1.976,14.479,14.479,0,0,0-5.174.936,12.98,12.98,0,0,0-4.186,2.5l-1.3-1.872a14.449,14.449,0,0,1,4.888-2.834A17.762,17.762,0,0,1-44.8-27.352ZM-46.254-1.924a10.207,10.207,0,0,0,5.746-1.56,9.486,9.486,0,0,0,3.562-4.524v-5.1H-46.2q-4,0-5.8,1.456a4.876,4.876,0,0,0-1.794,4,5.013,5.013,0,0,0,1.976,4.186A8.89,8.89,0,0,0-46.254-1.924ZM-18.07-36.556q-5.1,0-5.1,5.46v3.952h8.684v2.236h-8.632V0h-2.6V-24.908h-4.992v-2.236h4.992V-31.3a7.488,7.488,0,0,1,1.976-5.46,7.412,7.412,0,0,1,5.564-2.028,10.067,10.067,0,0,1,2.99.442,5.935,5.935,0,0,1,2.366,1.326l-1.04,1.976A6.034,6.034,0,0,0-18.07-36.556ZM-1.638.208A13.741,13.741,0,0,1-8.58-1.56a12.737,12.737,0,0,1-4.862-4.914,14.235,14.235,0,0,1-1.768-7.1,14.235,14.235,0,0,1,1.768-7.1A12.737,12.737,0,0,1-8.58-25.584a13.741,13.741,0,0,1,6.942-1.768A13.741,13.741,0,0,1,5.3-25.584a12.737,12.737,0,0,1,4.862,4.914,14.235,14.235,0,0,1,1.768,7.1,14.235,14.235,0,0,1-1.768,7.1A12.737,12.737,0,0,1,5.3-1.56,13.741,13.741,0,0,1-1.638.208Zm0-2.34a10.8,10.8,0,0,0,5.59-1.456,10.454,10.454,0,0,0,3.9-4.056,12.1,12.1,0,0,0,1.43-5.928A12.1,12.1,0,0,0,7.852-19.5a10.454,10.454,0,0,0-3.9-4.056,10.8,10.8,0,0,0-5.59-1.456,10.8,10.8,0,0,0-5.59,1.456,10.454,10.454,0,0,0-3.9,4.056,12.1,12.1,0,0,0-1.43,5.928,12.1,12.1,0,0,0,1.43,5.928,10.454,10.454,0,0,0,3.9,4.056A10.8,10.8,0,0,0-1.638-2.132ZM19.89-21.216a9.393,9.393,0,0,1,3.9-4.55,12.349,12.349,0,0,1,6.448-1.586V-24.8l-.624-.052a9.023,9.023,0,0,0-7.072,2.834q-2.548,2.834-2.548,7.878V0h-2.6V-27.144h2.5Zm48.724-6.136a10.556,10.556,0,0,1,7.93,2.964q2.886,2.964,2.886,8.528V0h-2.6V-15.652q0-4.576-2.236-6.968a8.123,8.123,0,0,0-6.24-2.392,9.458,9.458,0,0,0-7.254,2.86,10.807,10.807,0,0,0-2.678,7.7V0h-2.6V-15.652q0-4.576-2.236-6.968a8.123,8.123,0,0,0-6.24-2.392,9.458,9.458,0,0,0-7.254,2.86,10.807,10.807,0,0,0-2.678,7.7V0h-2.6V-27.144h2.5v5.824a10.025,10.025,0,0,1,4.03-4.446,12.276,12.276,0,0,1,6.37-1.586,11.3,11.3,0,0,1,6.266,1.664A9.056,9.056,0,0,1,57.642-20.8a10.583,10.583,0,0,1,4.238-4.784A12.631,12.631,0,0,1,68.614-27.352Zm28.08,0q5.044,0,7.748,2.574t2.7,7.566V0h-2.5V-4.836a9.03,9.03,0,0,1-3.8,3.718A12.588,12.588,0,0,1,94.874.208a11.022,11.022,0,0,1-7.15-2.132A6.88,6.88,0,0,1,85.1-7.54a6.931,6.931,0,0,1,2.418-5.486q2.418-2.106,7.722-2.106h9.308v-2.184a7.644,7.644,0,0,0-2.054-5.772,8.335,8.335,0,0,0-6.006-1.976,14.479,14.479,0,0,0-5.174.936,12.981,12.981,0,0,0-4.186,2.5l-1.3-1.872a14.449,14.449,0,0,1,4.888-2.834A17.762,17.762,0,0,1,96.694-27.352ZM95.238-1.924a10.207,10.207,0,0,0,5.746-1.56,9.486,9.486,0,0,0,3.562-4.524v-5.1H95.29q-4,0-5.8,1.456a4.876,4.876,0,0,0-1.794,4,5.013,5.013,0,0,0,1.976,4.186A8.89,8.89,0,0,0,95.238-1.924ZM134.29.416a27.176,27.176,0,0,1-6.812-.858,17.8,17.8,0,0,1-5.3-2.158l2.7-5.824a17.018,17.018,0,0,0,4.524,1.95,18.961,18.961,0,0,0,5.2.754q5.148,0,5.148-2.548a1.8,1.8,0,0,0-1.4-1.716,20.8,20.8,0,0,0-4.316-.884,41.637,41.637,0,0,1-5.668-1.2,8.794,8.794,0,0,1-3.874-2.392,6.8,6.8,0,0,1-1.638-4.888,7.657,7.657,0,0,1,1.534-4.706,9.873,9.873,0,0,1,4.472-3.2,19.1,19.1,0,0,1,6.942-1.144,27.245,27.245,0,0,1,5.9.65,16.5,16.5,0,0,1,4.862,1.794l-2.7,5.772a16.143,16.143,0,0,0-8.06-2.08,8.2,8.2,0,0,0-3.9.728,2.14,2.14,0,0,0-1.3,1.872,1.858,1.858,0,0,0,1.4,1.82,24.855,24.855,0,0,0,4.472.988,47.869,47.869,0,0,1,5.616,1.222,8.437,8.437,0,0,1,3.8,2.366A6.714,6.714,0,0,1,147.5-8.476a7.388,7.388,0,0,1-1.56,4.628A9.958,9.958,0,0,1,141.388-.7,20.271,20.271,0,0,1,134.29.416Z\\\"],[14,\\\"transform\\\",\\\"translate(2230.597 -20166.617)\\\"],[14,\\\"fill\\\",\\\"#333\\\"],[12],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,\\\"h3\\\"],[14,0,\\\"modal__title m-top--xl\\\"],[12],[1,\\\"Estamos em mudança!\\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__body\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\" \\\"],[10,2],[14,0,\\\"m-bottom--lg\\\"],[12],[1,\\\"A Plataforma S voltará ao seu funcionamento normal em breve. \\\"],[10,\\\"strong\\\"],[12],[1,\\\"Gratos pela compreensão\\\"],[13],[1,\\\".\\\"],[13],[1,\\\"\\\\n\\\\n \\\"],[10,2],[12],[10,\\\"em\\\"],[12],[1,\\\"Equipe Platforma S\\\"],[13],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[13],[1,\\\"\\\\n \\\"],[10,0],[14,0,\\\"modal__overlayer\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"]],[],[\\\"form\\\",\\\"on\\\",\\\"act\\\",\\\"aside\\\",\\\"div\\\",\\\"header\\\",\\\"svg\\\",\\\"g\\\",\\\"path\\\",\\\"h3\\\",\\\"p\\\",\\\"strong\\\",\\\"em\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/maintenance.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/templates/webapp\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n /*\n {{outlet}}\n */\n {\n \"id\": \"oe8Cv1O1\",\n \"block\": \"[[[46,[28,[37,1],null,null],null,null,null]],[],[\\\"component\\\",\\\"-outlet\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/webapp.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/templates/webapp/index\", [\"exports\", \"@ember/template-factory\"], function (_exports, _templateFactory) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/template-factory\"eaimeta@70e063a35619d71f\n var _default = _exports.default = (0, _templateFactory.createTemplateFactory)(\n /*\n {{outlet}}\n */\n {\n \"id\": \"CDroN9n3\",\n \"block\": \"[[[46,[28,[37,1],null,null],null,null,null]],[],[\\\"component\\\",\\\"-outlet\\\"]]\",\n \"moduleName\": \"semente-web-app/templates/webapp/index.hbs\",\n \"isStrictMode\": false\n });\n});","define(\"semente-web-app/transforms/boolean\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _transform.BooleanTransform;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the BooleanTransform. Use `export { BooleanTransform as default } from '@ember-data/serializer/transform';` in app/transforms/boolean.js instead\", false, {\n id: 'ember-data:deprecate-legacy-imports',\n for: 'ember-data',\n until: '6.0',\n since: {\n enabled: '5.2',\n available: '4.13'\n }\n }));\n});","define(\"semente-web-app/transforms/date\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _transform.DateTransform;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the DateTransform. Use `export { DateTransform as default } from '@ember-data/serializer/transform';` in app/transforms/date.js instead\", false, {\n id: 'ember-data:deprecate-legacy-imports',\n for: 'ember-data',\n until: '6.0',\n since: {\n enabled: '5.2',\n available: '4.13'\n }\n }));\n});","define(\"semente-web-app/transforms/number\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _transform.NumberTransform;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the NumberTransform. Use `export { NumberTransform as default } from '@ember-data/serializer/transform';` in app/transforms/number.js instead\", false, {\n id: 'ember-data:deprecate-legacy-imports',\n for: 'ember-data',\n until: '6.0',\n since: {\n enabled: '5.2',\n available: '4.13'\n }\n }));\n});","define(\"semente-web-app/transforms/string\", [\"exports\", \"@ember/debug\", \"@ember-data/serializer/transform\"], function (_exports, _debug, _transform) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"default\", {\n enumerable: true,\n get: function () {\n return _transform.StringTransform;\n }\n });\n 0; //eaimeta@70e063a35619d71f0,\"@ember/debug\",0,\"@ember-data/serializer/transform\"eaimeta@70e063a35619d71f\n (true && !(false) && (0, _debug.deprecate)(\"You are relying on ember-data auto-magically installing the StringTransform. Use `export { StringTransform as default } from '@ember-data/serializer/transform';` in app/transforms/string.js instead\", false, {\n id: 'ember-data:deprecate-legacy-imports',\n for: 'ember-data',\n until: '6.0',\n since: {\n enabled: '5.2',\n available: '4.13'\n }\n }));\n});","define(\"semente-web-app/utils/api-publica\", [\"exports\", \"rsvp\", \"semente-web-app/config/environment\"], function (_exports, _rsvp, _environment) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.mensagemErroPublico = mensagemErroPublico;\n _exports.postPublico = postPublico;\n _exports.urlApi = urlApi;\n 0; //eaimeta@70e063a35619d71f0,\"rsvp\",0,\"semente-web-app/config/environment\"eaimeta@70e063a35619d71f\n // Feature 02 — chamadas anônimas (sem token) das rotas públicas `cadastro-responsavel` e\n // `descadastro/:token`. Doc: feature-02-comunicacao-familias.md (pasta melhorias)\n //\n // JSON simples (camelCase) em {host}/{namespace}/{caminho}. Resolve o corpo (ou null em 204).\n // Rejeita com Error { status (0 = sem conexão), mensagem (texto do back, quando houver), corpo }.\n\n function urlApi(caminho) {\n return _environment.default.APP.host + '/' + _environment.default.APP.namespace + '/' + caminho;\n }\n function lerMensagem(corpo) {\n if (!corpo || typeof corpo !== 'object') return null;\n return corpo.mensagem || corpo.Mensagem || corpo.message || corpo.Message || corpo.error_description || corpo.error || null;\n }\n function postPublico(caminho, dados) {\n return new _rsvp.Promise((resolve, reject) => {\n if (typeof fetch !== 'function') {\n reject(new Error('Seu navegador não é compatível. Atualize-o e tente novamente.'));\n return;\n }\n fetch(urlApi(caminho), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n body: JSON.stringify(dados || {}),\n credentials: 'omit'\n }).then(res => {\n res.text().then(texto => {\n let corpo = null;\n try {\n corpo = texto ? JSON.parse(texto) : null;\n } catch (e) {\n corpo = {\n mensagem: texto\n };\n }\n if (res.ok) {\n resolve(corpo);\n return;\n }\n let e = new Error(lerMensagem(corpo) || 'HTTP ' + res.status);\n e.status = res.status;\n e.mensagem = lerMensagem(corpo);\n e.corpo = corpo;\n reject(e);\n }, () => {\n let e = new Error('HTTP ' + res.status);\n e.status = res.status;\n if (res.ok) resolve(null);else reject(e);\n });\n }, () => {\n let e = new Error('Sem conexão com o servidor.');\n e.status = 0;\n reject(e);\n });\n });\n }\n\n // Mensagem amigável para os erros mais comuns das rotas públicas. `porStatus` sobrescreve o\n // texto genérico de um status; a mensagem do back (quando houver) tem prioridade em 409/422.\n function mensagemErroPublico(err, porStatus) {\n let status = err && err.status;\n let doBack = err && err.mensagem;\n let mapa = porStatus || {};\n if (status === 0) return 'Não foi possível falar com o servidor. Verifique sua conexão e tente novamente.';\n if (status === 429) return 'Muitas tentativas em pouco tempo. Aguarde um minuto e tente novamente.';\n if ((status === 409 || status === 422 || status === 400) && doBack) return doBack;\n if (mapa[status]) return mapa[status];\n if (doBack && status && status < 500) return doBack;\n return 'Algo deu errado do nosso lado. Tente novamente em instantes.';\n }\n});","define(\"semente-web-app/utils/arrays\", [\"exports\", \"@ember/object\", \"@ember/utils\"], function (_exports, _object, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.addObject = addObject;\n _exports.addObjects = addObjects;\n _exports.any = any;\n _exports.clear = clear;\n _exports.compact = compact;\n _exports.filterBy = filterBy;\n _exports.findBy = findBy;\n _exports.first = first;\n _exports.getEach = void 0;\n _exports.insertAt = insertAt;\n _exports.invoke = invoke;\n _exports.isAny = isAny;\n _exports.isEvery = isEvery;\n _exports.last = last;\n _exports.length = length;\n _exports.mapBy = mapBy;\n _exports.objectAt = objectAt;\n _exports.popObject = popObject;\n _exports.pushObject = pushObject;\n _exports.pushObjects = pushObjects;\n _exports.rejectBy = rejectBy;\n _exports.removeAt = removeAt;\n _exports.removeObject = removeObject;\n _exports.removeObjects = removeObjects;\n _exports.reverseObjects = reverseObjects;\n _exports.setEach = setEach;\n _exports.setObjects = setObjects;\n _exports.shiftObject = shiftObject;\n _exports.sortBy = sortBy;\n _exports.toArray = toArray;\n _exports.uniq = uniq;\n _exports.uniqBy = uniqBy;\n _exports.unshiftObject = unshiftObject;\n _exports.without = without;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\",0,\"@ember/utils\"eaimeta@70e063a35619d71f\n // Substitutos das extensões de protótipo de Array (removidas no Ember 6): filterBy, mapBy,\n // sortBy, pushObject etc. Mesma semântica do Ember (`get` em caminhos, `compare` na ordenação).\n // As mutações notificam `[]` e `length`, como o NativeArray fazia, para os templates re-renderizarem.\n // Aceitam arrays nativos, arrays do EmberData (ManyArray/RecordArray) e proxies com `content`.\n\n function unwrap(x) {\n if (x == null) return [];\n if (Array.isArray(x)) return x;\n if (typeof x.toArray === 'function') return x.toArray();\n if (x.content != null) return unwrap(x.content);\n if (typeof x.length === 'number' && typeof x.objectAt === 'function') {\n return Array.from({\n length: x.length\n }, (_, i) => x.objectAt(i));\n }\n return Array.from(x);\n }\n function notify(a) {\n (0, _object.notifyPropertyChange)(a, '[]');\n (0, _object.notifyPropertyChange)(a, 'length');\n }\n\n // Alvo mutavel: relacoes hasMany assincronas chegam como PromiseManyArray (proxy sem push/splice);\n // o ManyArray fica em `.content` e aceita as mutacoes nativas (push, splice...).\n function mutavel(a) {\n if (a == null || Array.isArray(a)) return a;\n if (a.content != null && typeof a.content === 'object') return mutavel(a.content);\n return a;\n }\n\n // ---- leitura -----------------------------------------------------------------------------\n function toArray(x) {\n return unwrap(x).slice();\n }\n function length(x) {\n return unwrap(x).length;\n }\n function first(x) {\n return unwrap(x)[0];\n }\n function last(x) {\n const a = unwrap(x);\n return a[a.length - 1];\n }\n function objectAt(x, i) {\n return unwrap(x)[i];\n }\n function mapBy(x, key) {\n return unwrap(x).map(item => (0, _object.get)(item, key));\n }\n const getEach = _exports.getEach = mapBy;\n function filterBy(x, key, value) {\n const a = unwrap(x);\n return arguments.length > 2 ? a.filter(item => (0, _object.get)(item, key) === value) : a.filter(item => !!(0, _object.get)(item, key));\n }\n function rejectBy(x, key, value) {\n const a = unwrap(x);\n return arguments.length > 2 ? a.filter(item => (0, _object.get)(item, key) !== value) : a.filter(item => !(0, _object.get)(item, key));\n }\n function findBy(x, key, value) {\n const a = unwrap(x);\n return arguments.length > 2 ? a.find(item => (0, _object.get)(item, key) === value) : a.find(item => !!(0, _object.get)(item, key));\n }\n function isAny(x, key, value) {\n const a = unwrap(x);\n return arguments.length > 2 ? a.some(item => (0, _object.get)(item, key) === value) : a.some(item => !!(0, _object.get)(item, key));\n }\n function isEvery(x, key, value) {\n const a = unwrap(x);\n return arguments.length > 2 ? a.every(item => (0, _object.get)(item, key) === value) : a.every(item => !!(0, _object.get)(item, key));\n }\n function any(x, fn, target) {\n return unwrap(x).some(fn, target);\n }\n // Aceita 'chave' ou 'chave:desc' (mesmo formato do macro sort de @ember/object/computed).\n function sortBy(x, ...keys) {\n const defs = keys.map(k => {\n const [prop, dir] = String(k).split(':');\n return [prop, dir === 'desc' ? -1 : 1];\n });\n return unwrap(x).slice().sort((a, b) => {\n for (const [prop, dir] of defs) {\n const c = (0, _utils.compare)((0, _object.get)(a, prop), (0, _object.get)(b, prop));\n if (c) return c * dir;\n }\n return 0;\n });\n }\n function uniq(x) {\n return [...new Set(unwrap(x))];\n }\n function uniqBy(x, key) {\n const seen = new Set();\n return unwrap(x).filter(item => {\n const k = (0, _object.get)(item, key);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n }\n function compact(x) {\n return unwrap(x).filter(item => item != null);\n }\n function without(x, value) {\n const a = unwrap(x);\n return a.includes(value) ? a.filter(item => item !== value) : a;\n }\n function invoke(x, method, ...args) {\n return unwrap(x).map(item => item && typeof item[method] === 'function' ? item[method](...args) : undefined);\n }\n\n // ---- mutação (notificam os templates) ------------------------------------------------------\n function pushObject(a, item) {\n a = mutavel(a);\n a.push(item);\n notify(a);\n return item;\n }\n function pushObjects(a, items) {\n a = mutavel(a);\n a.push(...unwrap(items));\n notify(a);\n return a;\n }\n function unshiftObject(a, item) {\n a = mutavel(a);\n a.unshift(item);\n notify(a);\n return item;\n }\n function addObject(a, item) {\n a = mutavel(a);\n if (!a.includes(item)) {\n a.push(item);\n notify(a);\n }\n return a;\n }\n function addObjects(a, items) {\n a = mutavel(a);\n for (const item of unwrap(items)) if (!a.includes(item)) a.push(item);\n notify(a);\n return a;\n }\n function removeObject(a, item) {\n a = mutavel(a);\n let i = a.indexOf(item);\n while (i >= 0) {\n a.splice(i, 1);\n i = a.indexOf(item);\n }\n notify(a);\n return a;\n }\n function removeObjects(a, items) {\n a = mutavel(a);\n for (const item of unwrap(items)) removeObject(a, item);\n return a;\n }\n function removeAt(a, start, len = 1) {\n a = mutavel(a);\n a.splice(start, len);\n notify(a);\n return a;\n }\n function insertAt(a, idx, item) {\n a = mutavel(a);\n a.splice(idx, 0, item);\n notify(a);\n return a;\n }\n function setObjects(a, items) {\n a = mutavel(a);\n a.splice(0, a.length, ...unwrap(items));\n notify(a);\n return a;\n }\n function clear(a) {\n a = mutavel(a);\n a.splice(0, a.length);\n notify(a);\n return a;\n }\n function popObject(a) {\n a = mutavel(a);\n const v = a.pop();\n notify(a);\n return v;\n }\n function shiftObject(a) {\n const v = a.shift();\n notify(a);\n return v;\n }\n function reverseObjects(a) {\n a.reverse();\n notify(a);\n return a;\n }\n function setEach(x, key, value) {\n for (const item of unwrap(x)) item[key] = value;\n return x;\n }\n});","define(\"semente-web-app/utils/computed-sobrescrevivel\", [\"exports\", \"@ember/object\"], function (_exports, _object) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = sobrescrevivel;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/object\"eaimeta@70e063a35619d71f\n // Ember 6 nao permite `set` em computed sem setter (\"Cannot override the computed property\").\n // O codigo legado faz isso em varios controllers/componentes (ex.: `this.set('isMobile', true)`\n // sobre `isMobile: computed(...)`). No Ember 3 o valor atribuido substituia o computed de vez:\n // depois do set, a propriedade virava um valor comum e nunca mais era recalculada.\n // Este helper reproduz exatamente isso: apos o primeiro set, o getter devolve o valor atribuido\n // (por objeto), ignorando as dependencias.\n const SOBRESCRITOS = new WeakMap();\n function mapaDe(obj) {\n let m = SOBRESCRITOS.get(obj);\n if (!m) {\n m = new Map();\n SOBRESCRITOS.set(obj, m);\n }\n return m;\n }\n function sobrescrevivel(...args) {\n let fn = args.pop();\n return (0, _object.computed)(...args, {\n get(chave) {\n let m = SOBRESCRITOS.get(this);\n if (m && m.has(chave)) return m.get(chave);\n return fn.call(this);\n },\n set(chave, valor) {\n mapaDe(this).set(chave, valor);\n return valor;\n }\n });\n }\n});","define(\"semente-web-app/utils/inflector-rules\", [\"@ember-data/request-utils/string\"], function (_string) {\n \"use strict\";\n\n 0; //eaimeta@70e063a35619d71f0,\"@ember-data/request-utils/string\"eaimeta@70e063a35619d71f\n // Regras de plural/singular em português para o EmberData (tipos do JSON:API e das relações) e\n // para o código da aplicação que usa pluralize/singularize de @ember-data/request-utils/string.\n // Sem a regra, singularize('resposta') vira 'respostum' e o EmberData guarda esse tipo em cache\n // (\"No model was found for 'respostum'\").\n // São registradas no boot (initializers/inflector-rules.js) e também importadas pelo adapter.\n // Registrar a mesma regra de novo é inofensivo.\n const REGRAS_IRREGULARES = [['instituicao', 'instituicoes'], ['secao', 'secoes'], ['quiz', 'quizes'], ['dominio', 'dominios'], ['resposta', 'respostas'], ['questao', 'questoes'], ['material', 'materiais']];\n const INCONTAVEIS = ['acompanhamento-atividade-instituicao'];\n for (const [singular, plural] of REGRAS_IRREGULARES) (0, _string.irregular)(singular, plural);\n for (const palavra of INCONTAVEIS) (0, _string.uncountable)(palavra);\n});","define(\"semente-web-app/utils/json-api-ids\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.normalizarIdsDoPayload = normalizarIdsDoPayload;\n 0; //eaimeta@70e063a35619d71feaimeta@70e063a35619d71f\n // A API devolve ids numericos (data, included e relationships). O EmberData 5 exige ids string\n // (com numero, o identificador fica inconsistente: aviso \"The 'id' for a RecordIdentifier\n // should not be updated\" e registros duplicados). O EmberData 4 fazia essa coercao sozinho.\n // Usado pelo serializer da aplicacao (normalizeResponse) e nos `store.push` manuais.\n // Tambem remove ids repetidos nos hasMany: a API devolve, por exemplo, cada plataforma-ano\n // duas vezes em instituicao.plataforma-anos (uma linha por sistema em\n // InstituicaoPlataformaAnoSistemas). O EmberData 5 avisa (\"Expected all entries in the\n // relationship ... to be unique\") e, no reload seguinte do mesmo registro, estoura em\n // \"Cannot remove a resource that is not present\" ao recalcular o relacionamento.\n function semRepetidos(dados) {\n let vistos = new Set();\n return dados.filter(item => {\n if (!item || typeof item !== 'object') return true;\n let chave = item.type + ':' + item.id;\n if (vistos.has(chave)) return false;\n vistos.add(chave);\n return true;\n });\n }\n function idParaString(recurso) {\n if (!recurso || typeof recurso !== 'object') return;\n if (recurso.id !== undefined && recurso.id !== null) recurso.id = String(recurso.id);\n let relacionamentos = recurso.relationships;\n if (!relacionamentos) return;\n Object.keys(relacionamentos).forEach(nome => {\n let relacionamento = relacionamentos[nome];\n let dados = relacionamento && relacionamento.data;\n if (Array.isArray(dados)) {\n dados.forEach(idParaString);\n relacionamento.data = semRepetidos(dados);\n } else if (dados) {\n idParaString(dados);\n }\n });\n }\n function normalizarIdsDoPayload(payload) {\n if (!payload || typeof payload !== 'object') return payload;\n if (Array.isArray(payload.data)) payload.data.forEach(idParaString);else if (payload.data) idParaString(payload.data);\n if (Array.isArray(payload.included)) payload.included.forEach(idParaString);\n return payload;\n }\n});","define(\"semente-web-app/utils/offline-arquivos\", [\"exports\", \"rsvp\"], function (_exports, _rsvp) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.MENSAGEM_INDISPONIVEL = void 0;\n _exports.instalarCliqueArquivos = instalarCliqueArquivos;\n _exports.nomeDoArquivo = nomeDoArquivo;\n _exports.pareceArquivo = pareceArquivo;\n 0; //eaimeta@70e063a35619d71f0,\"rsvp\"eaimeta@70e063a35619d71f\n // Feature Offline (SESI, fase 2) — abrir/baixar arquivos (conteudo-arquivo, materiais de\n // Conteúdos, biblioteca) SEM conexão.\n //\n // Os links de arquivo são `
` em vários\n // templates (formação secdetails, conteudos/aulas, biblioteca-card, sugestao-aulas…). Em vez de\n // editar cada um, um único handler de clique delegado (fase de captura, no document) é instalado\n // pelo serviço `offline` — e só age quando:\n // - a instituição tem offline habilitado; E\n // - o navegador está offline.\n // Online (ou sem a flag) o clique segue exatamente como hoje.\n //\n // Offline: o handler cancela a navegação (uma aba nova de outra origem abriria vazia), procura a\n // URL nos caches do SW e:\n // - cópia LEGÍVEL (baixada em modo CORS pelo pré-carregamento) -> Blob -> URL `blob:` da própria\n // origem: PDF abre numa aba nova (aberta já no clique para não cair no bloqueio de pop-up);\n // demais tipos são baixados com o nome do arquivo;\n // - só cópia opaca (storage sem CORS para esta origem) ou nada -> aviso na pílula.\n // A ação Ember do link (ex.: downloadFile -> createRecord('download-arquivo')) continua rodando:\n // offline ela falha como hoje, sem afetar o download (o contrato v1 não tem essa operação).\n const RE_EXTENSAO = /\\.(pdf|docx?|pptx?|ppsx?|xlsx?|csv|txt|rtf|odt|ods|odp|zip|rar|7z|mp3|wav|m4a|mp4|mov|png|jpe?g|gif|webp|svg)(\\?|#|$)/i;\n const RE_STORAGE = /^https?:\\/\\/[^/]+\\.blob\\.core\\.windows\\.net\\//i;\n const RE_PDF = /\\.pdf(\\?|#|$)/i;\n const MENSAGEM_INDISPONIVEL = _exports.MENSAGEM_INDISPONIVEL = 'Este arquivo não está disponível offline';\n function pareceArquivo(url) {\n if (!url || !/^https?:\\/\\//i.test(url)) return false;\n return RE_STORAGE.test(url) || RE_EXTENSAO.test(url);\n }\n function nomeDoArquivo(url) {\n try {\n let caminho = new URL(url).pathname;\n let nome = decodeURIComponent(caminho.split('/').filter(Boolean).pop() || '');\n return nome || 'arquivo';\n } catch (e) {\n return 'arquivo';\n }\n }\n function copiaLegivel(url) {\n if (typeof caches === 'undefined') return _rsvp.default.resolve(null);\n return _rsvp.default.resolve(caches.match(url)).then(resp => {\n // Opaca (no-cors) não pode ser lida pela página: só o SW consegue servi-la.\n if (!resp || resp.type === 'opaque' || !resp.ok) return null;\n return resp;\n }).catch(() => null);\n }\n function baixar(objectUrl, nome) {\n let a = document.createElement('a');\n a.href = objectUrl;\n a.download = nome;\n a.rel = 'noopener';\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n\n // `offline`: serviço (habilitado, isOnline, mostrarAvisoArquivo). Devolve a função que desinstala.\n function instalarCliqueArquivos(offline) {\n let handler = ev => {\n if (!offline.get('habilitado')) return;\n let semRede = typeof navigator !== 'undefined' && navigator.onLine === false || !offline.get('isOnline');\n if (!semRede || ev.defaultPrevented) return;\n if (ev.button != null && ev.button !== 0) return;\n let alvo = ev.target && ev.target.closest ? ev.target.closest('a[href]') : null;\n if (!alvo) return;\n let url = alvo.href;\n if (!pareceArquivo(url) || url.indexOf(location.origin) === 0) return;\n ev.preventDefault();\n // Aba aberta ainda no gesto do usuário (depois do await o navegador bloquearia o pop-up).\n let janela = null;\n if (RE_PDF.test(url)) {\n try {\n janela = window.open('', '_blank');\n } catch (e) {\n janela = null;\n }\n }\n copiaLegivel(url).then(resp => {\n if (!resp) {\n if (janela) janela.close();\n offline.mostrarAvisoArquivo(MENSAGEM_INDISPONIVEL);\n return;\n }\n return resp.blob().then(blob => {\n let objectUrl = URL.createObjectURL(blob);\n let ehPdf = /pdf/i.test(blob.type) || RE_PDF.test(url);\n if (janela && ehPdf) {\n janela.location.href = objectUrl;\n } else {\n if (janela) janela.close();\n baixar(objectUrl, nomeDoArquivo(url));\n }\n setTimeout(() => URL.revokeObjectURL(objectUrl), 60000);\n });\n }).catch(e => {\n if (janela) janela.close();\n console.warn('offline: falha ao abrir arquivo do cache', url, e);\n offline.mostrarAvisoArquivo(MENSAGEM_INDISPONIVEL);\n });\n };\n document.addEventListener('click', handler, true);\n return () => document.removeEventListener('click', handler, true);\n }\n});","define(\"semente-web-app/utils/offline-idb\", [\"exports\", \"rsvp\"], function (_exports, _rsvp) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.DB_NOME = void 0;\n _exports.adicionarDescartadas = adicionarDescartadas;\n _exports.gravarEstado = gravarEstado;\n _exports.gravarOperacoes = gravarOperacoes;\n _exports.idbSuportado = idbSuportado;\n _exports.lerEstado = lerEstado;\n _exports.listarDescartadas = listarDescartadas;\n _exports.listarOperacoes = listarOperacoes;\n _exports.removerOperacoes = removerOperacoes;\n 0; //eaimeta@70e063a35619d71f0,\"rsvp\"eaimeta@70e063a35619d71f\n // Feature Offline (SESI) — fase 2: persistência da fila (outbox) e do estado local em IndexedDB.\n //\n // Por que IndexedDB: o versionchecker faz localStorage.clear() na troca de versão e o fluxo de 401\n // da engine também limpa o localStorage; a fila precisa sobreviver a reload, troca de versão e\n // logout. Nada aqui é aberto para instituições sem `offlineHabilitado` (o serviço só chama estas\n // funções com a flag ligada), então para elas o banco nem é criado.\n //\n // Banco `semente-offline` (v1):\n // - operacoes (keyPath `seq`, autoIncrement → ordem de envio; índices `clientOpId` único e\n // `pessoaId`): { seq, clientOpId, tipo, clientTimestamp, dados, pessoaId,\n // status, tentativas, erro, meta }\n // - descartadas (keyPath `id`, autoIncrement; índice `pessoaId`): { pessoaId, op, erro, em }\n // - estado (keyPath `pessoaId`): espelho local por pessoa — ver utils/offline-sync.js\n // (registros tmp, patches, substituicoes, removidos, mapa tmp→real, orfaos).\n const DB_NOME = _exports.DB_NOME = 'semente-offline';\n const DB_VERSAO = 1;\n const S_OPERACOES = 'operacoes';\n const S_DESCARTADAS = 'descartadas';\n const S_ESTADO = 'estado';\n let dbPromise = null;\n function idbSuportado() {\n try {\n return typeof indexedDB !== 'undefined' && indexedDB !== null;\n } catch (e) {\n return false;\n }\n }\n function abrir() {\n if (dbPromise) return dbPromise;\n dbPromise = new _rsvp.default.Promise((resolve, reject) => {\n let req;\n try {\n req = indexedDB.open(DB_NOME, DB_VERSAO);\n } catch (e) {\n reject(e);\n return;\n }\n req.onupgradeneeded = () => {\n let db = req.result;\n if (!db.objectStoreNames.contains(S_OPERACOES)) {\n let s = db.createObjectStore(S_OPERACOES, {\n keyPath: 'seq',\n autoIncrement: true\n });\n s.createIndex('clientOpId', 'clientOpId', {\n unique: true\n });\n s.createIndex('pessoaId', 'pessoaId', {\n unique: false\n });\n }\n if (!db.objectStoreNames.contains(S_DESCARTADAS)) {\n let s = db.createObjectStore(S_DESCARTADAS, {\n keyPath: 'id',\n autoIncrement: true\n });\n s.createIndex('pessoaId', 'pessoaId', {\n unique: false\n });\n }\n if (!db.objectStoreNames.contains(S_ESTADO)) {\n db.createObjectStore(S_ESTADO, {\n keyPath: 'pessoaId'\n });\n }\n };\n req.onsuccess = () => {\n let db = req.result;\n db.onversionchange = () => {\n db.close();\n dbPromise = null;\n };\n resolve(db);\n };\n req.onerror = () => {\n dbPromise = null;\n reject(req.error || new Error('indexeddb-indisponivel'));\n };\n req.onblocked = () => {\n dbPromise = null;\n reject(new Error('indexeddb-bloqueado'));\n };\n });\n return dbPromise;\n }\n\n // Executa `fn(stores)` numa transação e resolve com o valor de `resultado` quando ela conclui\n // (oncomplete = gravado de fato no disco).\n function transacao(nomes, modo, fn) {\n return abrir().then(db => new _rsvp.default.Promise((resolve, reject) => {\n let tx;\n try {\n tx = db.transaction(nomes, modo);\n } catch (e) {\n reject(e);\n return;\n }\n let ctx = {\n resultado: undefined\n };\n let stores = {};\n nomes.forEach(n => {\n stores[n] = tx.objectStore(n);\n });\n try {\n fn(stores, ctx);\n } catch (e) {\n try {\n tx.abort();\n } catch (e2) {/* já abortada */}\n reject(e);\n return;\n }\n tx.oncomplete = () => resolve(ctx.resultado);\n tx.onerror = () => reject(tx.error || new Error('indexeddb-erro'));\n tx.onabort = () => reject(tx.error || new Error('indexeddb-abortada'));\n }));\n }\n function porPessoa(store, pessoaId, ctx, ordenar) {\n let lista = [];\n let req = store.index('pessoaId').openCursor(IDBKeyRange.only(String(pessoaId)));\n req.onsuccess = () => {\n let cursor = req.result;\n if (cursor) {\n lista.push(cursor.value);\n cursor.continue();\n } else {\n if (ordenar) lista.sort((a, b) => a[ordenar] - b[ordenar]);\n ctx.resultado = lista;\n }\n };\n }\n\n // ---------------------------------------------------------------- operações (fila)\n\n function listarOperacoes(pessoaId) {\n return transacao([S_OPERACOES], 'readonly', (s, ctx) => porPessoa(s[S_OPERACOES], pessoaId, ctx, 'seq'));\n }\n\n // Grava operações novas/alteradas e remove outras numa transação só (coalescência atômica).\n // `novas` sem `seq` recebem o seq gerado (autoIncrement). Resolve com as operações gravadas.\n function gravarOperacoes(novas, alteradas, removerSeqs) {\n return transacao([S_OPERACOES], 'readwrite', (s, ctx) => {\n let store = s[S_OPERACOES];\n (removerSeqs || []).forEach(seq => store.delete(seq));\n (alteradas || []).forEach(op => store.put(op));\n (novas || []).forEach(op => {\n let req = store.add(op);\n req.onsuccess = () => {\n op.seq = req.result;\n };\n });\n ctx.resultado = novas || [];\n });\n }\n function removerOperacoes(seqs) {\n if (!seqs || !seqs.length) return _rsvp.default.resolve();\n return gravarOperacoes([], [], seqs);\n }\n\n // ---------------------------------------------------------------- descartadas (erros permanentes)\n\n function adicionarDescartadas(registros) {\n if (!registros || !registros.length) return _rsvp.default.resolve();\n return transacao([S_DESCARTADAS], 'readwrite', s => {\n registros.forEach(r => s[S_DESCARTADAS].add(r));\n });\n }\n function listarDescartadas(pessoaId) {\n return transacao([S_DESCARTADAS], 'readonly', (s, ctx) => porPessoa(s[S_DESCARTADAS], pessoaId, ctx, 'id'));\n }\n\n // ---------------------------------------------------------------- estado local (por pessoa)\n\n function lerEstado(pessoaId) {\n return transacao([S_ESTADO], 'readonly', (s, ctx) => {\n let req = s[S_ESTADO].get(String(pessoaId));\n req.onsuccess = () => {\n ctx.resultado = req.result || null;\n };\n });\n }\n function gravarEstado(estado) {\n return transacao([S_ESTADO], 'readwrite', s => {\n s[S_ESTADO].put(estado);\n });\n }\n});","define(\"semente-web-app/utils/offline-prefetch\", [\"exports\", \"jquery\", \"rsvp\", \"semente-web-app/utils/taxonomia-vigentes\"], function (_exports, _jquery, _rsvp, _taxonomiaVigentes) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.INCLUDE_RELACAO_COMP = _exports.INCLUDE_PLATAFORMA_ANOS_CONTEUDOS = _exports.INCLUDE_PESSOA_MODULOS_INDEX = _exports.INCLUDE_PESSOA_MODLIST = _exports.INCLUDE_PESSOA_LANDING = _exports.INCLUDE_PESSOA_FORMACAO = _exports.INCLUDE_PESSOA_CONTEUDOS_AULAS = _exports.INCLUDE_MODULO_MEDICAO = _exports.INCLUDE_ATIVIDADE_MEDICAO = _exports.BOOT_PESSOAS_INCLUDE = void 0;\n _exports.enumerarImagensEstaticas = enumerarImagensEstaticas;\n _exports.prefetchCompleto = prefetchCompleto;\n _exports.urlsPosSync = urlsPosSync;\n 0; //eaimeta@70e063a35619d71f0,\"jquery\",0,\"rsvp\",0,\"semente-web-app/utils/taxonomia-vigentes\"eaimeta@70e063a35619d71f\n // Feature Offline (SESI) — pré-carregamento automático (decisões 3 revisada e 8: sem botão,\n // todo módulo da pessoa passa pelas enumerações de medição e de EAD).\n // Chamado em segundo plano pelo serviço `offline` (app/services/offline.js#agendarPrefetch).\n //\n // Aquece o cache do SW offline com EXATAMENTE as URLs que um boot a frio (store vazio, sem rede)\n // pede ao navegar pelo módulo de medição ou pelo curso EAD. A chave do cache é a URL, então as\n // URLs abaixo são montadas pelo próprio adapter (buildURL) + jQuery.param (mesmo encoding do\n // ember-data 2.16) — e os includes são CÓPIA LITERAL das rotas.\n //\n // >>> Se mudar um include numa das rotas abaixo, mude aqui também (senão o offline quebra). <<<\n // - routes/conteudos/aulas.js -> INCLUDE_PLATAFORMA_ANOS_CONTEUDOS, INCLUDE_PESSOA_CONTEUDOS_AULAS\n // (conteudos/biblioteca e conteudos/marketing NÃO são aquecidas: desde a V1.1 essas áreas\n // exigem conexão e ficam bloqueadas offline — components/offline-bloqueio + utils/offline-guard.)\n // - routes/application.js (XHR de boot) -> BOOT_PESSOAS_INCLUDE\n // - routes/modulos/index.js -> INCLUDE_PESSOA_MODULOS_INDEX\n // - routes/landing.js -> INCLUDE_PESSOA_LANDING\n // - routes/modulos/modlist.js + modetails.js -> INCLUDE_MODULO_MEDICAO, INCLUDE_PESSOA_MODLIST\n // - routes/modulos/modetails/ativdetails.js -> INCLUDE_ATIVIDADE_MEDICAO\n // - routes/formacao/index.js -> INCLUDE_PESSOA_FORMACAO\n // - routes/modulos/modetails/ativdetails/relatorios.js -> INCLUDE_RELACAO_COMP (findAll relacao-*)\n\n const BOOT_PESSOAS_INCLUDE = _exports.BOOT_PESSOAS_INCLUDE = 'instituicao.instituicao-filhas,modulos,matriculas,ano';\n const INCLUDE_PESSOA_MODULOS_INDEX = _exports.INCLUDE_PESSOA_MODULOS_INDEX = 'modulos,' + 'aplicacao-aulas.aplicacao-questionarios.respostas-comp,' + 'aplicacao-aulas.modulos-sugeridos,' + 'plataforma-anos,' + 'plataforma-turmas,' + 'instituicao.plataforma-anos,' + 'instituicao.pilares,' + 'relatorio-chatbot.competencia';\n const INCLUDE_PESSOA_LANDING = _exports.INCLUDE_PESSOA_LANDING = 'modulos,' + 'plataforma-anos,' + 'plataforma-turmas,' + 'instituicao.plataforma-anos.segmento,' + 'instituicao.plataforma-anos.livros,' + 'instituicao.plataforma-turmas,' + 'instituicao.instituicao-filhas,' + 'instituicao.pilares,' + 'instituicao.calendario';\n const INCLUDE_MODULO_MEDICAO = _exports.INCLUDE_MODULO_MEDICAO = 'atividades.secoes.conteudos.video.estados-video,' + 'atividades.competencias.dominio,' + 'blocos,' + 'limites.competencia.dominio,' + 'limites-dominios.dominio,' + 'atividades.secoes.conteudos.quiz-competencia.questoes-competencia.alternativas-competencia,' + 'atividades.secoes.conteudos.quiz-competencia.competencia.dominio,' + 'atividades.secoes.conteudos.quiz-competencia.questoes-competencia.escalas,' + 'atividades.secoes.conteudos.quiz.questoes.alternativas.respostas,' + 'aplicacao-modulo.aplicacao-atividade';\n const INCLUDE_PESSOA_MODLIST = _exports.INCLUDE_PESSOA_MODLIST = 'aplicacao-aulas.aplicacao-questionarios.respostas-comp,' + 'modulos,' + 'plataforma-anos.segmento,' + 'plataforma-turmas,' + 'instituicao.plataforma-anos.segmento,' + 'instituicao.plataforma-turmas,' + 'matriculas,' + 'instituicao.pilares,' + 'relatorio-chatbot.competencia';\n const INCLUDE_ATIVIDADE_MEDICAO = _exports.INCLUDE_ATIVIDADE_MEDICAO = 'secoes.conteudos,' + 'competencias.dominio';\n\n // routes/modulos/modetails/ativdetails/relatorios.js — findAll('relacao-dominio') e\n // findAll('relacao-comp', { include: 'dominio' }) (fase 2: tela de resultado offline).\n const INCLUDE_RELACAO_COMP = _exports.INCLUDE_RELACAO_COMP = 'dominio';\n const INCLUDE_PESSOA_FORMACAO = _exports.INCLUDE_PESSOA_FORMACAO = 'leituras, ' + 'estado-videos, ' + 'estado-alternativas, ' + 'respostas, ' + 'downloads-arquivos, ' + 'estado-questoes,' + 'acompanhamento-atividades,' + 'instituicao,' + 'instituicao.pilares,' + 'participacoes.aplicacao-modulo.modulos.atividades.secoes.conteudos.html,' + 'participacoes.aplicacao-modulo.modulos.atividades.secoes.conteudos.video.estados-video,' + 'participacoes.aplicacao-modulo.modulos.atividades.secoes.conteudos.conteudo-arquivo,' + 'participacoes.aplicacao-modulo.modulos.atividades.secoes.conteudos.quiz.questoes.alternativas.respostas';\n\n // routes/conteudos/aulas.js — findAll('plataforma-ano', { reload: true, include }) (os dois ramos)\n // e, no ramo de store vazio (F5 direto em /conteudos/aulas), findRecord('pessoa', { include }).\n const INCLUDE_PLATAFORMA_ANOS_CONTEUDOS = _exports.INCLUDE_PLATAFORMA_ANOS_CONTEUDOS = 'segmento,' + 'livros,' + 'aulas.competencias.dominio,' + 'aulas.calendarios,' + 'aulas.plataforma-conteudos.agrupamento';\n const INCLUDE_PESSOA_CONTEUDOS_AULAS = _exports.INCLUDE_PESSOA_CONTEUDOS_AULAS = 'modulos,' + 'plataforma-anos,' + 'plataforma-turmas,' + 'instituicao.plataforma-anos.segmento,' + 'instituicao.plataforma-anos.livros,' + 'instituicao.plataforma-turmas,' + 'instituicao.instituicao-filhas,' + 'instituicao.pilares';\n\n // Relacionamentos async que as telas do fluxo percorrem. Um id referenciado por eles e que NÃO\n // veio em nenhum payload das rotas vira, num boot a frio, um findRecord preguiçoso\n // (GET /s/) — esses são aquecidos também. Chaves = nomes JSON:API do back\n // (Models/ReturnModels, com variações por segurança). Tipos = nome do model Ember.\n const RELACOES_PERCORRIDAS = {\n 'modulo': ['atividades', 'blocos'],\n 'bloco': ['atividades'],\n 'atividade': ['secoes', 'comps', 'competencias', 'bloco'],\n 'secao': ['conteudos'],\n 'conteudo': ['html', 'video', 'quiz', 'quiz-comp', 'quiz-competencia', 'arquivo', 'conteudo-arquivo'],\n 'quiz': ['questoes'],\n 'questao': ['alternativas'],\n 'quiz-comp': ['questoes-comp', 'questoes-competencia', 'comp', 'competencia'],\n 'questao-comp': ['alternativas-comp', 'alternativas-competencia', 'escala', 'comp', 'competencia'],\n 'comp': ['dominio'],\n // (sem 'instituicao-filhas': ver ARVORE_PESSOA — a instituição da pessoa só entra por lá)\n 'instituicao': ['pilares',\n // conteudos/aulas: instituicaoPlataformaAnoSistema.filterBy('sistema.idx') e inst.calendario\n 'instituicao-plataforma-ano-sistema', 'calendario'],\n 'instituicao-plataforma-ano-sistema': ['sistema', 'plataforma-ano'],\n 'plataforma-ano': ['segmento', 'livros', 'aulas'],\n 'plataforma-turma': ['plataforma-ano'],\n // Conteúdos (conteudos/aulas: aula.plataformaConteudos.filterBy('agrupamento.idx'))\n 'aula': ['plataforma-conteudos', 'comps', 'calendarios', 'plataforma-ano'],\n 'plataforma-conteudo': ['agrupamento', 'calendarios']\n };\n\n // A partir da pessoa, só caminhos restritos (árvore explícita; `null` = expansão padrão acima,\n // `{}` = só o registro, sem descer).\n //\n // V1.2 (carga em multi-login): a árvore ficou restrita ao que as telas offline DEREFERENCIAM num\n // boot a frio e que NÃO vem em nenhum payload já aquecido. Tudo do módulo/ano atual (atividades,\n // seções, conteúdos, quizzes, alternativas, respostas, vídeos, htmls, comps) já chega pelos\n // payloads de /modulos/{id}, /atividades/{id} e /pessoas/{id}?include=…; um belongsTo async não\n // carregado em `filterBy('x.y.id')` devolve undefined (não lança) e o registro só é excluído do\n // filtro — que é o resultado correto para registros de anos anteriores. Justificativa por ramo:\n // - instituicao.* : header/landing (pilares) e conteudos/aulas (sistemas por ano,\n // calendário) — ver comentário abaixo.\n // - plataforma-anos.segmento : modlist/landing filtram por `plataformaAno.segmento.idx`.\n // - plataforma-turmas.plataforma-ano.segmento : modlist `turmas.filterBy('plataformaAno.segmento.idx', 2)`.\n // - modulos : só o registro (os payloads completos são as raízes da passada).\n // - aplicacao-aulas.atividade: modlist filtra TODAS as aplicacao-aulas por `atividade.modulo.id`\n // e lê `atividade.bloco` nas que têm sugestões; relatorios/autoper\n // filtram `atividade.modulo.id`. As atividades do módulo atual já\n // vêm no payload; aqui entram só as de anos anteriores (~5 por\n // módulo antigo). O `.modulo` delas NÃO é buscado: não carregado,\n // `atividade.modulo.id` é undefined e a aplicação cai fora do\n // filtro — exatamente o esperado para outro módulo.\n // - aplicacao-questionarios : só o registro (já incluído); `quiz`/`comp` são do módulo atual\n // (payload do módulo) e `atividade` é a mesma da aplicacao-aula.\n // - leituras / respostas / estado-videos / downloads-arquivos : só o registro (já incluídos em\n // /pessoas/{id}?include= da formação); appstate.updateApp compara\n // `leit.html.id`, `r.alternativa.id`, `ev.video.id`,\n // `d.conteudoArquivo.id` com conteúdos dos módulos ATUAIS, cujos\n // html/alternativas/vídeos/arquivos vêm nos payloads dos módulos;\n // para registros de outros anos a comparação dá undefined e segue.\n // Antes (V1.1): `aplicacao-aulas.atividade.modulo`, `aplicacao-aulas.questionarios.{comp,quiz}`,\n // `aplicacao-questionarios.{comp,quiz,atividade.modulo}`, `respostas.alternativa.questao`,\n // `leituras.html`, `estado-videos.video`, `downloads-arquivos.arquivo`, `plataforma-anos` e\n // `plataforma-turmas` com expansão padrão — centenas de GET //{id} por pessoa.\n const ARVORE_PESSOA = {\n // Só o que as telas offline leem da instituição: pilares (landing/header), sistemas por ano e\n // calendário (filtros de conteudos/aulas). NÃO segue `instituicao-filhas`: as filhas diretas já\n // vêm no payload de boot (hasChildren de landing/header) e, em agrupamentos de 3+ níveis\n // (feature 01), seguir a recursão disparava um GET /instituicoes/{id} pesado por neta e\n // consumia o teto de preguiçosos.\n 'instituicao': {\n 'pilares': {},\n 'instituicao-plataforma-ano-sistema': {\n 'sistema': {},\n 'plataforma-ano': {}\n },\n 'calendario': {}\n },\n 'plataforma-anos': {\n 'segmento': {}\n },\n 'plataforma-turmas': {\n 'plataforma-ano': {\n 'segmento': {}\n }\n },\n 'modulos': {},\n 'aplicacao-aulas': {\n 'atividade': {}\n },\n 'aplicacao-questionarios': {},\n 'respostas': {},\n 'leituras': {},\n 'estado-videos': {},\n 'downloads-arquivos': {}\n };\n\n // Teto de GETs \"preguiçosos\" por passada (proteção contra explosão de requests). V1.2: 150 (era\n // 800) — com a árvore restrita, uma pessoa típica fica em menos de 20. Quando o teto aperta, os\n // registros do módulo/ano atual têm prioridade (ver `prioridade` em percorrer()).\n const MAX_PREGUICOSOS = 150;\n\n // Recursos com rota GET /api/v0//{id} na API (RoutePrefix dos controllers do back).\n // Tipos fora desta lista (ex.: quiz-comp, questao-comp, alternativa-comp, bloco) só chegam via\n // include do pai: o GET individual dá 404 no IIS, sem cabeçalho CORS — nem online o app os busca.\n // Ao criar um controller novo no back para um tipo percorrido aqui, inclua o recurso na lista.\n const RECURSOS_COM_ENDPOINT = ['alternativas', 'aplicacao-aulas', 'aplicacao-questionarios', 'arquivos', 'atividades', 'comps', 'conteudos', 'dominios', 'download-arquivos', 'escalas', 'estado-videos', 'htmls', 'instituicoes', 'leituras', 'matriculas', 'modulos', 'pessoas', 'pilars', 'plataforma-anos', 'plataforma-turmas', 'questoes', 'quizes', 'resposta-comps', 'respostas', 'secoes', 'segmentos', 'videos',\n // Conteúdos (conteudos/aulas)\n // 'calendarios' removido em 2026-10-08: a API nao tem GET calendarios/{id} (CalendarioController so lista);\n // os ids chegam como stubs de plataforma-conteudo.calendarios e viravam 404 sem header CORS no console.\n 'agrupamentos', 'aulas', 'instituicao-plataforma-ano-sistemas', 'livros', 'plataforma-conteudos', 'sistemas'];\n\n // Primeiro segmento depois de /api/v0/ na URL montada pelo adapter (ex.: 'quiz-comps').\n function recursoDaUrl(adapter, url) {\n let base = adapter.get('host') + '/' + adapter.get('namespace') + '/';\n let resto = url.indexOf(base) === 0 ? url.slice(base.length) : url;\n return resto.split(/[/?]/)[0];\n }\n const ATRIBUTOS_ARQUIVO = ['url-arquivo', 'second-url-arquivo', 'third-url-arquivo'];\n const ATRIBUTOS_IMAGEM = ['cover-image', 'second-cover-image'];\n function urlFind(adapter, modelName, id, include) {\n let url = adapter.buildURL(modelName, id, null, 'findRecord');\n return include ? url + '?' + _jquery.default.param({\n include: include\n }) : url;\n }\n\n // store.findAll(modelName, { include }) — buildQuery(snapshotRecordArray) só manda `include`.\n function urlFindAll(adapter, modelName, include) {\n let url = adapter.buildURL(modelName, null, null, 'findAll');\n return include ? url + '?' + _jquery.default.param({\n include: include\n }) : url;\n }\n function urlQuery(adapter, modelName, query) {\n let url = adapter.buildURL(modelName, null, null, 'query', query);\n // ember-data ordena as chaves da query (RESTAdapter#sortQueryParams) antes do jQuery.param.\n let ordenada = adapter.sortQueryParams ? adapter.sortQueryParams(query) : query;\n return url + '?' + _jquery.default.param(ordenada);\n }\n\n // Índice (tipo:id -> recurso) de tudo que já veio nos payloads aquecidos.\n function Indice(store) {\n this.store = store;\n this.recursos = {};\n }\n Indice.prototype.tipo = function (tipoPayload) {\n try {\n return this.store.serializerFor('application').modelNameFromPayloadKey(tipoPayload);\n } catch (e) {\n return String(tipoPayload).toLowerCase();\n }\n };\n Indice.prototype.chave = function (tipoPayload, id) {\n return this.tipo(tipoPayload) + ':' + id;\n };\n Indice.prototype.adicionar = function (payload) {\n if (!payload) return;\n let lista = [].concat(payload.data || [], payload.included || []);\n lista.forEach(r => {\n if (!r || !r.type || r.id == null) return;\n let chave = this.chave(r.type, r.id);\n let atual = this.recursos[chave];\n if (!atual) {\n this.recursos[chave] = r;\n return;\n }\n // Mesmo registro em payloads com includes diferentes: une atributos e relacionamentos.\n this.recursos[chave] = {\n type: r.type,\n id: r.id,\n attributes: Object.assign({}, atual.attributes, r.attributes),\n relationships: Object.assign({}, atual.relationships, r.relationships)\n };\n });\n };\n Indice.prototype.get = function (tipoPayload, id) {\n return this.recursos[this.chave(tipoPayload, id)];\n };\n function refsDe(recurso, chaves) {\n let refs = [];\n let rels = recurso.relationships || {};\n chaves.forEach(k => {\n let rel = rels[k];\n if (!rel || !rel.data) return;\n [].concat(rel.data).forEach(d => {\n if (d && d.type && d.id != null) refs.push(d);\n });\n });\n return refs;\n }\n\n // Cópia de components/ativ-card-comp.js#openExplanation (e section-link / modlistdes): troca só os\n // DOIS primeiros espaços por \"_\" (String#replace com string), como o app faz.\n function urlExplicacaoCompetencia(nome) {\n let normalizado = nome.toString().toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').replace(' ', '_').replace(' ', '_');\n return '/assets/img/explicacoes-competencias/' + normalizado + '.png';\n }\n\n // ---------------------------------------------------------------- imagens estáticas (assets)\n // Imagens que só aparecem em telas ainda não visitadas ou só em interação (modais, lightboxes,\n // hover, menus). Enumeração independente do build, lida do que a página REALMENTE carregou:\n // 1. Templates: literais \"/assets/img/...(png|jpg|jpeg|gif|svg|webp)\" do JS da engine\n // (engines-dist/semente-engine/assets/engine*.js — URL real do Resource Timing, então vale\n // com fingerprint). png/jpg não são fingerprintados (ember-cli-build: fingerprint.exclude),\n // svg/gif não estão nas extensões do broccoli-asset-rev → o literal é a URL pedida em prod.\n // 2. CSS: url(...) das regras das folhas de estilo da própria origem (CSSOM, URL já resolvida\n // contra a folha) cujos seletores são de blocos BEM das telas de medição, formação,\n // conteúdos, landing e header. Imagens de login ficam de fora.\n const REGEX_IMG_LITERAL = /\\/assets\\/img\\/[A-Za-z0-9_./%-]+\\.(?:png|jpe?g|gif|svg|webp)/g;\n const REGEX_JS_ENGINE = /\\/engines-dist\\/semente-engine\\/assets\\/engine[^/]*\\.js(\\?|$)/;\n const SELETORES_CSS_FLUXOS = /\\.(trail|course-cover|classes|formacao|aulas|media|header-pilares|header-fundo|footer-fundo|header|landing|new-landing|resultado-individual|laudo-individual|domain-cover|domain|block-des|modal|help|chatbot|loader|alert|warn|progress|quiz|questao|secao|atividade|conteudo|development-class|comp-explanation|report-inst|autoper|self-perception|wifi)[\\w-]*/;\n const MAX_IMAGENS_CSS = 150;\n function literaisDeImagem(texto) {\n let achadas = {};\n (texto.match(REGEX_IMG_LITERAL) || []).forEach(u => {\n achadas[u] = true;\n });\n return Object.keys(achadas);\n }\n function urlsDasRegras(regras, baseHref, saida) {\n Array.prototype.forEach.call(regras || [], regra => {\n if (regra.cssRules && !regra.selectorText) {\n urlsDasRegras(regra.cssRules, baseHref, saida); // @media / @supports\n return;\n }\n if (!regra.selectorText || !SELETORES_CSS_FLUXOS.test(regra.selectorText)) return;\n let css = regra.style && regra.style.cssText;\n if (!css || css.indexOf('url(') === -1) return;\n let re = /url\\(\\s*['\"]?([^'\")]+)['\"]?\\s*\\)/g;\n let m;\n while ((m = re.exec(css)) !== null) {\n if (m[1].indexOf('data:') === 0) continue;\n try {\n let abs = new URL(m[1], baseHref).href;\n if (abs.indexOf(location.origin) === 0 && !/login/i.test(abs)) saida[abs] = true;\n } catch (e) {/* url inválida */}\n }\n });\n }\n function imagensDoCss() {\n let saida = {};\n Array.prototype.forEach.call(document.styleSheets || [], folha => {\n let regras;\n try {\n regras = folha.cssRules;\n } catch (e) {\n return;\n } // folha de outra origem\n urlsDasRegras(regras, folha.href || location.href, saida);\n });\n return Object.keys(saida).slice(0, MAX_IMAGENS_CSS);\n }\n function enumerarImagensEstaticas() {\n let css = [];\n try {\n css = imagensDoCss();\n } catch (e) {\n css = [];\n }\n let scripts = [];\n let add = u => {\n if (u && REGEX_JS_ENGINE.test(u) && scripts.indexOf(u) === -1) scripts.push(u);\n };\n Array.prototype.forEach.call(document.querySelectorAll('script[src]'), el => add(el.src));\n if (window.performance && performance.getEntriesByType) {\n performance.getEntriesByType('resource').forEach(e => add(e.name));\n }\n return _rsvp.default.all(scripts.map(u => fetch(u).then(r => r.ok ? r.text() : '').catch(() => ''))).then(textos => {\n let doJs = [];\n textos.forEach(t => literaisDeImagem(t).forEach(u => {\n if (doJs.indexOf(u) === -1) doJs.push(u);\n }));\n return {\n templates: doJs,\n css: css\n };\n });\n }\n function imagensDoHtml(texto) {\n let urls = [];\n if (typeof texto !== 'string') return urls;\n let re = /]+src\\s*=\\s*[\"']([^\"']+)[\"']/gi;\n let m;\n while ((m = re.exec(texto)) !== null) urls.push(m[1]);\n return urls;\n }\n function urlAbsoluta(url) {\n if (!url || typeof url !== 'string') return null;\n url = url.trim();\n if (/^https?:\\/\\//i.test(url)) return url;\n if (url.indexOf('//') === 0) return location.protocol + url;\n if (url.charAt(0) === '/') return location.origin + url;\n return null;\n }\n\n // Percorre a árvore a partir das raízes; aquece o que faltar (lazy) e coleta imagens/arquivos.\n // Cada item da fila: { type, id, arvore } — arvore undefined/null = expansão padrão.\n function percorrer(offline, adapter, indice, raizes, relatorio) {\n let expandidoPadrao = {};\n let expandidoRestrito = {};\n let falhou = {};\n let fila = raizes.slice();\n let imagens = {};\n let arquivos = {};\n function coletar(recurso) {\n let tipo = indice.tipo(recurso.type);\n let attrs = recurso.attributes || {};\n if (tipo === 'html') imagensDoHtml(attrs.texto).forEach(u => {\n imagens[u] = true;\n });\n if (tipo === 'conteudo-arquivo') ATRIBUTOS_ARQUIVO.forEach(a => {\n if (attrs[a]) arquivos[attrs[a]] = true;\n });\n ATRIBUTOS_IMAGEM.forEach(a => {\n if (attrs[a]) imagens[attrs[a]] = true;\n });\n // Siglas de competência (modlist/ativ-card-comp, section-link, modlistdes): o clique abre\n // /assets/img/explicacoes-competencias/.png — mesma normalização do app.\n if (tipo === 'comp' && attrs.name) imagens[urlExplicacaoCompetencia(attrs.name)] = true;\n // (V1.1: `thumbnail`/`arquivo-url` dos cards da biblioteca e `capa` do marketing não são mais\n // coletados — essas áreas exigem conexão.)\n }\n\n // Prioridade dos preguiçosos quando o teto aperta (menor = primeiro): 0 = alcançado pelas\n // raízes dos módulos/ano atual (expansão padrão); 1 = pela árvore da pessoa; 2 = referenciado\n // por uma aplicacao-aula de ano anterior (`do-ano-atual` false).\n function prioridadeDe(item, recurso) {\n let base = item.prioridade || (item.arvore == null ? 0 : 1);\n let attrs = recurso.attributes || {};\n if (indice.tipo(recurso.type) === 'aplicacao-aula' && attrs['do-ano-atual'] === false) return Math.max(base, 2);\n return base;\n }\n function expandir(item, recurso) {\n let arvore = item.arvore;\n let prioridade = prioridadeDe(item, recurso);\n if (arvore == null) {\n let chaves = RELACOES_PERCORRIDAS[indice.tipo(recurso.type)];\n if (chaves) refsDe(recurso, chaves).forEach(r => fila.push({\n type: r.type,\n id: r.id,\n prioridade: prioridade\n }));\n return;\n }\n Object.keys(arvore).forEach(k => {\n refsDe(recurso, [k]).forEach(r => fila.push({\n type: r.type,\n id: r.id,\n arvore: arvore[k],\n prioridade: prioridade\n }));\n });\n }\n function passo() {\n let faltando = {};\n let pendentes = [];\n while (fila.length) {\n let item = fila.shift();\n let chave = indice.chave(item.type, item.id);\n if (expandidoPadrao[chave] || falhou[chave]) continue;\n let restrito = item.arvore != null;\n if (restrito && expandidoRestrito[chave]) continue;\n let recurso = indice.get(item.type, item.id);\n if (!recurso) {\n // guarda a melhor prioridade com que o registro foi referenciado\n if (!faltando[chave] || (item.prioridade || 0) < (faltando[chave].prioridade || 0)) faltando[chave] = item;\n pendentes.push(item);\n continue;\n }\n if (restrito) expandidoRestrito[chave] = true;else expandidoPadrao[chave] = true;\n coletar(recurso);\n expandir(item, recurso);\n }\n let chaves = Object.keys(faltando);\n if (!chaves.length) return _rsvp.default.resolve();\n\n // Sem endpoint individual no back: não busca (evita 404/erro de CORS no console).\n chaves = chaves.filter(k => {\n let ref = faltando[k];\n let recurso = recursoDaUrl(adapter, urlFind(adapter, indice.tipo(ref.type), ref.id));\n if (RECURSOS_COM_ENDPOINT.indexOf(recurso) > -1) return true;\n falhou[k] = true;\n if (relatorio.semEndpoint.indexOf(recurso) === -1) relatorio.semEndpoint.push(recurso);\n return false;\n });\n if (!chaves.length) return _rsvp.default.resolve();\n\n // V1.2: módulo/ano atual primeiro (sort estável por prioridade; empates mantêm a ordem de descoberta)\n chaves = chaves.map((k, i) => ({\n k: k,\n i: i,\n p: faltando[k].prioridade || 0\n })).sort((a, b) => a.p - b.p || a.i - b.i).map(x => x.k);\n let restantes = Math.max(0, MAX_PREGUICOSOS - relatorio.preguicosos);\n let aBuscar = chaves.slice(0, restantes);\n chaves.slice(restantes).forEach(k => {\n falhou[k] = true;\n });\n if (chaves.length > restantes) {\n relatorio.avisos.push('limite de ' + MAX_PREGUICOSOS + ' registros preguiçosos atingido');\n }\n if (!aBuscar.length) return _rsvp.default.resolve();\n relatorio.preguicosos += aBuscar.length;\n let tarefas = aBuscar.map(k => () => {\n let ref = faltando[k];\n let url = urlFind(adapter, indice.tipo(ref.type), ref.id);\n if (relatorio.feitas[url]) return _rsvp.default.resolve();\n relatorio.feitas[url] = true;\n relatorio.urls.push(url);\n return offline.aquecerApi(url).then(json => indice.adicionar(json));\n });\n return offline.executarEmLotes(tarefas, 4).then(res => {\n res.forEach(r => {\n if (!r.ok) relatorio.falhas.push(String(r.erro && r.erro.message || r.erro));\n });\n aBuscar.forEach(k => {\n let ref = faltando[k];\n if (!indice.get(ref.type, ref.id)) falhou[k] = true;\n });\n // Reprocessa os itens que estavam esperando o download (com a árvore de cada um).\n pendentes.forEach(item => fila.push(item));\n return passo();\n });\n }\n return passo().then(() => ({\n imagens: Object.keys(imagens),\n arquivos: Object.keys(arquivos)\n }));\n }\n function aquecerRecursos(offline, colecao, relatorio) {\n let tarefas = [];\n let vistas = {};\n colecao.imagens.map(urlAbsoluta).filter(Boolean).forEach(u => {\n if (vistas[u]) return;\n vistas[u] = true;\n tarefas.push(() => offline.aquecerRecurso(u, 'imagem'));\n });\n colecao.arquivos.map(urlAbsoluta).filter(Boolean).forEach(u => {\n tarefas.push(() => offline.aquecerRecurso(u, 'arquivo'));\n });\n relatorio.imagens = colecao.imagens.length;\n relatorio.arquivos = colecao.arquivos.length;\n return offline.executarEmLotes(tarefas, 4);\n }\n function novoRelatorio() {\n return {\n urls: [],\n falhas: [],\n avisos: [],\n semEndpoint: [],\n preguicosos: 0,\n imagens: 0,\n arquivos: 0,\n reaproveitados: 0,\n // V1.2: URLs de API servidas do cache (< 7 dias) sem ir à rede\n feitas: {},\n jsonPorUrl: {}\n };\n }\n\n // Aquece uma lista de URLs de API. Resposta HTTP de erro (ex.: endpoint de EAD que não se aplica\n // ao perfil do aluno — decisão 8 manda todo módulo pelos dois fluxos) só vira aviso no relatório;\n // falha de rede ou interrupção (sem httpStatus) aborta a passada, que é retomada na volta da conexão.\n function aquecerEssenciais(offline, urls, indice, relatorio) {\n let resultadoPorUrl = relatorio.jsonPorUrl;\n let novas = urls.filter((url, i) => urls.indexOf(url) === i && !relatorio.feitas[url]);\n novas.forEach(url => {\n relatorio.feitas[url] = true;\n });\n let tarefas = novas.map(url => () => {\n relatorio.urls.push(url);\n return offline.aquecerApi(url).then(json => {\n indice.adicionar(json);\n return json;\n });\n });\n return offline.executarEmLotes(tarefas, 3).then(res => {\n let erros = res.filter(r => !r.ok);\n erros.forEach(r => relatorio.falhas.push(String(r.erro && r.erro.message || r.erro)));\n let fatais = erros.filter(r => !(r.erro && r.erro.httpStatus));\n if (fatais.length) {\n console.warn('offline: pré-carregamento interrompido', relatorio.falhas);\n throw new Error('Não foi possível baixar todos os dados. Verifique a conexão e tente de novo.');\n }\n res.forEach((r, i) => {\n resultadoPorUrl[novas[i]] = r.valor;\n });\n // Mesma ordem de `urls` (as já baixadas nesta passada reaproveitam o JSON anterior).\n return urls.map(url => resultadoPorUrl[url]);\n });\n }\n\n // URLs comuns a qualquer boot a frio da pessoa (entrada da engine, índice de módulos, landing,\n // loading substate e avatar).\n function urlsDeBoot(adapter, pessoaId) {\n let env = {\n host: adapter.get('host'),\n namespace: adapter.get('namespace')\n };\n return [\n // XHR cru de routes/application.js (sem jQuery.param: a string é concatenada como está).\n env.host + '/' + env.namespace + '/pessoas?include=' + BOOT_PESSOAS_INCLUDE, urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_MODULOS_INDEX), urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_LANDING),\n // controllers/modulos/loading.js, controllers/formacao/loading.js, change_uri_avatar\n urlFind(adapter, 'pessoa', pessoaId),\n // Feature 03: GET vinculos (engine services/vinculos.js#_buscar — XHR cru, sem query e SEM\n // `pessoaid`; o back lista pelo usuário do token). Sem ele no cache, um boot offline depois de\n // uma troca de vínculo (que apaga o cache de API) mostraria a escola errada no header e\n // perderia os bloqueios de escola principal. aquecerApi também tira o `pessoaid` desta URL.\n env.host + '/' + env.namespace + '/vinculos'];\n }\n\n // Fase 2 — depois de sincronizar a fila: URLs da pessoa cujo cache ficou desatualizado\n // (aplicacao-aulas/questionarios/respostas agora reais). Reaquecidas por offline-sync.js.\n // instituicaoId (opcional): também reaquece GET taxonomias/vigentes (feature 16). O chamador\n // já trata cada URL como best-effort (.catch), então a falha dela não afeta as demais.\n function urlsPosSync(adapter, pessoaId, instituicaoId) {\n let urls = [urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_MODLIST), urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_FORMACAO), urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_MODULOS_INDEX)];\n if (instituicaoId != null) urls.push((0, _taxonomiaVigentes.urlTaxonomiasVigentes)(instituicaoId));\n return urls;\n }\n\n // Feature 16 (feature-16-taxonomias.md): termos das taxonomias nos cards. BEST-EFFORT — fora de\n // aquecerEssenciais, que abortaria a passada numa falha de rede; qualquer erro (ex.: back ainda\n // sem o endpoint, 403) é ignorado. A URL vem do mesmo helper que o serviço `taxonomia` usa.\n function aquecerTaxonomias(offline, instituicaoId, relatorio) {\n if (instituicaoId == null) return _rsvp.default.resolve();\n let url = (0, _taxonomiaVigentes.urlTaxonomiasVigentes)(instituicaoId);\n if (relatorio.feitas[url]) return _rsvp.default.resolve();\n relatorio.feitas[url] = true;\n relatorio.urls.push(url);\n return _rsvp.default.resolve(offline.aquecerApi(url)).catch(err => {\n relatorio.avisos.push('taxonomias: ' + String(err && err.message || err));\n });\n }\n\n // Pré-carrega, numa passada só, todos os módulos da pessoa + app shell. Decisão 8: \"todo módulo\n // é curso\" — sem classificar por idx, cada módulo passa pelas DUAS enumerações (árvore de\n // medição e payloads da formação/EAD). URLs repetidas entre as enumerações são baixadas uma vez\n // (relatorio.feitas). A concorrência baixa, as pausas e o cancelamento (offline/logout/troca de\n // pessoa) ficam no serviço (executarEmLotes/aquecerApi). Rejeita se algo essencial falhar.\n // opts: { pessoaId, instituicaoId, modulos: [id], aoFase(nome) opcional — para o progresso }\n function prefetchCompleto(store, offline, opts) {\n let adapter = store.adapterFor('application');\n let indice = new Indice(store);\n let relatorio = novoRelatorio();\n let pessoaId = String(opts.pessoaId);\n let modulos = (opts.modulos || []).map(String).filter((id, i, arr) => arr.indexOf(id) === i);\n let fase = typeof opts.aoFase === 'function' ? opts.aoFase : function () {};\n let urlRelatorioGeral = urlQuery(adapter, 'relatorio-detalhado-formacao', {\n reload: true\n });\n let urls = urlsDeBoot(adapter, pessoaId).concat([urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_MODLIST),\n // medição (modlist)\n urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_FORMACAO),\n // EAD (formacao.index)\n urlRelatorioGeral // EAD (formacao.index)\n ]);\n modulos.forEach(id => urls.push(urlFind(adapter, 'modulo', id, INCLUDE_MODULO_MEDICAO)));\n // Fase 2 — tela de resultado (relatorios) ao terminar uma competência/família offline.\n urls.push(urlFindAll(adapter, 'relacao-dominio'));\n urls.push(urlFindAll(adapter, 'relacao-comp', INCLUDE_RELACAO_COMP));\n\n // Conteúdos (menu \"Conteúdos\" do header-geral e entrada direta de alunos em conteudos.aulas):\n // só aulas (os dois ramos da rota). Biblioteca e marketing exigem conexão (V1.1) e não entram.\n let urlPlataformaAnos = urlFindAll(adapter, 'plataforma-ano', INCLUDE_PLATAFORMA_ANOS_CONTEUDOS);\n urls.push(urlPlataformaAnos);\n urls.push(urlFind(adapter, 'pessoa', pessoaId, INCLUDE_PESSOA_CONTEUDOS_AULAS));\n fase('shell');\n return offline.aquecerShell().then(() => {\n fase('essenciais');\n return aquecerEssenciais(offline, urls, indice, relatorio);\n }).then(jsons => aquecerTaxonomias(offline, opts.instituicaoId, relatorio).then(() => jsons)).then(jsons => {\n let extras = [];\n // Medição — ativdetails (findRecord com include) e transitions (findRecord('secao')): no\n // boot a frio o registro já está no store e o ember-data faz background reload.\n modulos.forEach(moduloId => {\n let modulo = indice.get('modulo', moduloId);\n let atividadeRefs = modulo ? refsDe(modulo, ['atividades']) : [];\n atividadeRefs.forEach(ref => {\n extras.push(urlFind(adapter, 'atividade', ref.id, INCLUDE_ATIVIDADE_MEDICAO));\n let ativ = indice.get(ref.type, ref.id);\n if (ativ) refsDe(ativ, ['secoes']).forEach(sec => extras.push(urlFind(adapter, 'secao', sec.id)));\n });\n });\n // EAD — controllers/formacao/index.js#loadDados: 1 query por item do relatório geral.\n let geral = jsons[urls.indexOf(urlRelatorioGeral)];\n let itens = geral && geral.data ? [].concat(geral.data) : [];\n itens.forEach(m => extras.push(urlQuery(adapter, 'relatorio-detalhado-formacao', {\n instituicaoId: String(opts.instituicaoId),\n moduloId: m.id,\n pId: pessoaId\n })));\n fase('extras');\n return aquecerEssenciais(offline, extras, indice, relatorio);\n }).then(() => {\n let raizes = modulos.map(id => ({\n type: 'modulo',\n id: id\n }));\n raizes.push({\n type: 'pessoa',\n id: pessoaId,\n arvore: ARVORE_PESSOA\n });\n // Conteúdos: todos os registros principais da lista de plataforma-anos (conteudos/aulas).\n Object.keys(relatorio.jsonPorUrl).forEach(url => {\n let tipoRaiz = /\\/(plataforma-anos)\\?/.exec(url);\n let json = relatorio.jsonPorUrl[url];\n if (!tipoRaiz || !json || !json.data) return;\n [].concat(json.data).forEach(r => {\n if (r && r.type) raizes.push({\n type: r.type,\n id: String(r.id)\n });\n });\n });\n fase('preguicosos');\n return percorrer(offline, adapter, indice, raizes, relatorio);\n }).then(colecao => enumerarImagensEstaticas().then(estaticas => {\n relatorio.imagensTemplates = estaticas.templates.length;\n relatorio.imagensCss = estaticas.css.length;\n colecao.imagens = colecao.imagens.concat(estaticas.templates, estaticas.css);\n fase('recursos');\n return aquecerRecursos(offline, colecao, relatorio);\n })).then(() => {\n relatorio.reaproveitados = typeof offline.reaproveitadosNaPassada === 'function' ? offline.reaproveitadosNaPassada() : 0;\n return relatorio;\n });\n }\n});","define(\"semente-web-app/utils/offline-sync\", [\"exports\", \"jquery\", \"@ember/runloop\", \"@ember/object/mixin\", \"@ember/string\", \"@ember-data/adapter/error\", \"rsvp\", \"@ember-data/request-utils/string\", \"semente-web-app/config/environment\", \"semente-web-app/utils/offline\", \"semente-web-app/utils/json-api-ids\", \"semente-web-app/utils/arrays\", \"semente-web-app/utils/offline-idb\", \"semente-web-app/utils/offline-prefetch\"], function (_exports, _jquery, _runloop, _mixin, _string, _error, _rsvp, _string2, _environment, _offline, _jsonApiIds, ArrayUtils, _offlineIdb, _offlinePrefetch) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n _exports.erroDeRede = erroDeRede;\n _exports.estadoVazio = estadoVazio;\n _exports.isTmp = isTmp;\n _exports.novoTmp = novoTmp;\n _exports.uuid = uuid;\n 0; //eaimeta@70e063a35619d71f0,\"jquery\",0,\"@ember/runloop\",0,\"@ember/object/mixin\",0,\"@ember/string\",0,\"@ember-data/adapter/error\",0,\"rsvp\",0,\"@ember-data/request-utils/string\",0,\"semente-web-app/config/environment\",0,\"semente-web-app/utils/offline\",0,\"semente-web-app/utils/json-api-ids\",0,\"semente-web-app/utils/arrays\",0,\"semente-web-app/utils/offline-idb\",0,\"semente-web-app/utils/offline-prefetch\"eaimeta@70e063a35619d71f\n // Feature Offline (SESI) — fase 2: fila offline (outbox), espelho local e sincronização com\n // `POST api/v0/offline-sync` (contrato v1, parte B, em melhorias/SESI/feature-09-offline.md).\n //\n // Mixin aplicado ao serviço `offline` (app/services/offline.js). Tudo aqui só age com\n // `habilitado = true`; para as demais instituições nada é aberto, enfileirado ou alterado.\n //\n // Peças:\n // 1. Interceptação (chamada por app/adapters/application.js): createRecord/updateRecord/\n // deleteRecord dos models de OPERACOES_INTERCEPTADAS. A fila entra quando:\n // - o navegador está offline; ou\n // - já há operações pendentes desta pessoa (preserva a ordem: nada \"passa na frente\");\n // - o registro referencia um id temporário (`tmp-…`), que só o /offline-sync resolve;\n // - ou a gravação normal falhou por REDE (sem resposta HTTP: status 0, timeout).\n // Erros HTTP (4xx/5xx) seguem o comportamento atual (a promise rejeita como hoje).\n // Enfileirar = gravar a operação do contrato no IndexedDB e resolver o adapter localmente\n // com um payload JSON:API — Ember Data, UI e appstate.updateApp() seguem normalmente.\n // 2. Espelho local (`estado`, por pessoa, no IndexedDB): registros criados offline (ids tmp),\n // atributos alterados offline em registros reais (patches), conjuntos de respostas que\n // substituem as antigas (substituicoes), registros apagados (removidos) e o mapa tmp→real\n // devolvido pelo servidor. Serve para duas coisas:\n // - boot a frio offline: os registros tmp são empurrados para o store;\n // - overlay (app/serializers/application.js): qualquer payload que chega ao store (rede\n // ou cache do SW, que pode estar desatualizado) é corrigido para refletir o que foi feito\n // offline — os tmp voltam para os hasMany dos pais, patches são reaplicados e respostas\n // substituídas somem.\n // 3. Sincronização: lotes de até 100 operações em ordem; resultado por operação segundo o\n // contrato; 401 → pede login (fila preservada); 403 → para; retry com backoff.\n // 4. Reconciliação (tmp → real): Ember Data 2.16 não troca o id de um registro. Com a fila\n // vazia e online, os registros tmp são descarregados (unloadRecord) e o espelho é limpo; a\n // rota que chamou (modlist/formacao/relatorios) recarrega a pessoa com reload:true e recebe\n // os registros reais. Até lá, os tmp continuam válidos: o servidor resolve `tmp-…` pela\n // tabela OfflineSyncIdMap em qualquer lote futuro.\n /* global Uint8Array */\n // modelName -> operações do adapter interceptadas. Demais models/operações: adapter intocado.\n // download-arquivo fica de fora: o contrato v1 não tem operação para ele (ver MD).\n const OPERACOES_INTERCEPTADAS = {\n 'aplicacao-aula': ['createRecord', 'updateRecord'],\n 'aplicacao-questionario': ['updateRecord'],\n 'resposta-comp': ['createRecord', 'deleteRecord'],\n 'resposta': ['createRecord'],\n 'leitura': ['updateRecord'],\n 'estado-video': ['updateRecord']\n };\n // Ordem de descarte na reconciliação (filhos antes dos pais).\n const TIPOS_TMP = ['resposta-comp', 'aplicacao-questionario', 'aplicacao-aula', 'resposta'];\n // findAll de relatorios.js: sem rede e fora do cache, resolve vazio (só alimentam o payload da IA).\n const FIND_ALL_OPCIONAIS = ['relacao-dominio', 'relacao-comp'];\n // Modelos da medição x EAD (reaquecimento do cache da pessoa depois de gravações online).\n const MODELOS_EAD = ['resposta', 'leitura', 'estado-video'];\n const LOTE_MAX = 100;\n const TIMEOUT_SAVE_MS = 30000;\n const TIMEOUT_SYNC_MS = 60000;\n const BACKOFF_S = [5, 15, 30, 60, 120, 300];\n const SINCRONIZADO_VISIVEL_MS = 5000;\n const REAQUECER_APOS_MS = 60000;\n\n // ---------------------------------------------------------------- utilitários puros\n\n function uuid() {\n let c = typeof crypto !== 'undefined' ? crypto : null;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n let b = new Uint8Array(16);\n if (c && c.getRandomValues) c.getRandomValues(b);else for (let i = 0; i < 16; i++) b[i] = Math.floor(Math.random() * 256);\n b[6] = b[6] & 0x0f | 0x40;\n b[8] = b[8] & 0x3f | 0x80;\n let h = Array.prototype.map.call(b, x => (x + 0x100).toString(16).slice(1)).join('');\n return h.slice(0, 8) + '-' + h.slice(8, 12) + '-' + h.slice(12, 16) + '-' + h.slice(16, 20) + '-' + h.slice(20);\n }\n function novoTmp() {\n return 'tmp-' + uuid();\n }\n function isTmp(id) {\n return typeof id === 'string' && id.indexOf('tmp-') === 0;\n }\n\n // Falha sem resposta HTTP (rede caiu, DNS, CORS de rede, timeout) — só nesses casos a gravação\n // online vira fila. Erro HTTP (4xx/5xx) mantém o comportamento atual.\n function erroDeRede(err) {\n if (!err) return false;\n if (err.offlineTimeout) return true;\n if (err instanceof _error.AbortError || err instanceof _error.TimeoutError) return true;\n let e = err.errors && err.errors[0];\n return !!(e && String(e.status) === '0');\n }\n function chave(tipo, id) {\n return tipo + ':' + id;\n }\n function copia(obj) {\n return obj == null ? obj : JSON.parse(JSON.stringify(obj));\n }\n function agoraSeg() {\n return Math.round(Date.now() / 1000);\n }\n\n // Id para o `dados` do contrato: int quando real, string `tmp-…` quando temporário.\n function idOp(id) {\n if (id == null) return null;\n if (isTmp(id)) return id;\n let n = parseInt(id, 10);\n return isNaN(n) ? String(id) : n;\n }\n function numOuNull(v) {\n if (v == null || v === '') return null;\n let n = Number(v);\n return isNaN(n) ? null : n;\n }\n\n // Recurso normalizado (chaves = nomes do model) -> formato bruto que o JSONAPISerializer\n // normaliza (chaves dasherizadas), usado nas respostas locais do adapter.\n // Os tipos vão PLURALIZADOS, como o back manda: o JSONAPISerializer faz singularize(type), e\n // singularize('resposta') = 'respostum' (regra latina -ta -> -tum do inflector padrão), o que\n // quebra o boot com \"No model was found for 'respostum'\". pluralize -> singularize volta ao\n // nome do model para todos os tipos.\n function tipoBruto(tipo) {\n return tipo ? (0, _string2.pluralize)(tipo) : tipo;\n }\n function relBruta(relacao) {\n if (!relacao || relacao.data == null) return relacao;\n let conv = d => d && d.type ? {\n type: tipoBruto(d.type),\n id: d.id\n } : d;\n return {\n data: Array.isArray(relacao.data) ? relacao.data.map(conv) : conv(relacao.data)\n };\n }\n function paraBruto(r) {\n let bruto = {\n type: tipoBruto(r.type),\n id: r.id,\n attributes: {},\n relationships: {}\n };\n Object.keys(r.attributes || {}).forEach(k => {\n bruto.attributes[(0, _string.dasherize)(k)] = r.attributes[k];\n });\n Object.keys(r.relationships || {}).forEach(k => {\n bruto.relationships[(0, _string.dasherize)(k)] = relBruta(r.relationships[k]);\n });\n return bruto;\n }\n function rel(tipo, id) {\n return {\n data: id == null ? null : {\n type: tipo,\n id: String(id)\n }\n };\n }\n function estadoVazio(pessoaId) {\n return {\n pessoaId: String(pessoaId),\n registros: {},\n // 'tipo:tmp-id' -> recurso normalizado (só belongsTo nos relationships)\n patches: {},\n // 'tipo:id-real' -> atributos alterados offline\n substituicoes: {},\n // 'aqId|questaoCompId' -> [ids de resposta-comp do conjunto atual]\n removidos: {},\n // 'tipo:id-real' -> true (apagados offline)\n mapa: {},\n // 'tmp-…' -> id real (devolvido pelo /offline-sync)\n orfaos: {},\n // 'tmp-…' -> true (criado por operação descartada)\n avisos: {} // atividadeId -> aviso \"resultado pronto\" (família/eixo concluído offline)\n };\n }\n function normalizarEstado(est, pessoaId) {\n let base = estadoVazio(pessoaId);\n if (!est) return base;\n Object.keys(base).forEach(k => {\n if (est[k] != null) base[k] = est[k];\n });\n base.pessoaId = String(pessoaId);\n return base;\n }\n function estadoSemDados(est) {\n if (!est) return true;\n return ['registros', 'patches', 'substituicoes', 'removidos'].every(k => !Object.keys(est[k] || {}).length);\n }\n\n // Ids temporários referenciados por uma operação (para detectar dependência de operação descartada).\n function tmpsReferenciados(op) {\n let achados = [];\n let visitar = v => {\n if (isTmp(v)) achados.push(v);else if (Array.isArray(v)) v.forEach(visitar);else if (v && typeof v === 'object') Object.keys(v).forEach(k => visitar(v[k]));\n };\n let d = op.dados || {};\n Object.keys(d).forEach(k => {\n if (k !== 'clientId' && k !== 'questionarios' && k !== 'respostas') visitar(d[k]);\n });\n return achados;\n }\n\n // Ids temporários CRIADOS por uma operação.\n function tmpsCriados(op) {\n let d = op.dados || {};\n let ids = [];\n if (isTmp(d.clientId)) ids.push(d.clientId);\n (d.questionarios || []).forEach(q => {\n if (isTmp(q.clientId)) ids.push(q.clientId);\n });\n (d.respostas || []).forEach(r => {\n if (isTmp(r.clientId)) ids.push(r.clientId);\n });\n return ids;\n }\n\n // ---------------------------------------------------------------- mixin do serviço\n var _default = _exports.default = _mixin.default.create({\n // Observáveis (pílula offline-status, relatorios.js)\n pendentes: 0,\n // operações na fila da pessoa logada\n sincronizando: false,\n syncEstado: 'inativo',\n // 'inativo' | 'sincronizado' | 'login' | 'bloqueado' | 'erro'\n descartadasRecentes: 0,\n // descartadas (erro permanente) no último ciclo concluído\n avisosResultado: null,\n // [{ atividadeId, nome, hetero, ... }] — mais recente primeiro\n\n init() {\n this._super(...arguments);\n this._ops = [];\n this._estado = null;\n this._pessoaLocal = null;\n this._prontoLocal = null;\n this._emVoo = {};\n this._cadeia = _rsvp.default.resolve();\n this._tentativaBackoff = 0;\n this.set('avisosResultado', []);\n this.on('online', this, function () {\n if (this.get('habilitado') && this._ops.length) this.agendarSync(1500);\n });\n },\n // ---------------------------------------------------------------- carga do espelho local\n\n // Carrega fila + espelho da pessoa (boot, login, selectPessoa). Nunca trava o boot: resolve\n // em no máximo 4 s mesmo se o IndexedDB demorar/falhar.\n prepararLocal(pessoaId) {\n if (!this.get('habilitado') || !(0, _offlineIdb.idbSuportado)()) return _rsvp.default.resolve();\n let id = pessoaId != null ? String(pessoaId) : (0, _offline.pessoaLogadaId)();\n if (!id) return _rsvp.default.resolve();\n if (this._pessoaLocal === id && this._prontoLocal) return this._prontoLocal;\n this._resetLocal();\n this._pessoaLocal = id;\n let carga = _rsvp.default.hash({\n ops: (0, _offlineIdb.listarOperacoes)(id),\n estado: (0, _offlineIdb.lerEstado)(id)\n }).then(r => {\n if (this._pessoaLocal !== id) return;\n this._ops = r.ops || [];\n this._trocarEstado(normalizarEstado(r.estado, id));\n this._atualizarPendentes();\n this._empurrarRegistros();\n if (this._ops.length) this.agendarSync(1000);\n }).catch(e => {\n console.warn('offline: fila local indisponível (IndexedDB)', e);\n });\n this._prontoLocal = _rsvp.default.race([carga, new _rsvp.default.Promise(resolve => setTimeout(resolve, 4000))]);\n return this._prontoLocal;\n },\n // Logout / troca de pessoa: só a memória. O IndexedDB (fila) é preservado de propósito.\n _resetLocal() {\n (0, _runloop.cancel)(this._timerSync);\n (0, _runloop.cancel)(this._timerSincronizado);\n (0, _runloop.cancel)(this._timerReaquecer);\n this._ops = [];\n this._estado = null;\n this._pessoaLocal = null;\n this._prontoLocal = null;\n this._emVoo = {};\n this._indiceCache = null;\n this._tentativaBackoff = 0;\n if (!this.get('isDestroyed')) {\n this.setProperties({\n pendentes: 0,\n syncEstado: 'inativo',\n descartadasRecentes: 0,\n avisosResultado: []\n });\n }\n },\n _trocarEstado(est) {\n this._estado = est;\n this._indiceCache = null;\n this._atualizarAvisos();\n },\n _atualizarAvisos() {\n if (this.get('isDestroyed')) return;\n let avisos = this._estado && this._estado.avisos || {};\n let lista = Object.keys(avisos).map(k => avisos[k]).sort((a, b) => (b.em || 0) - (a.em || 0));\n this.set('avisosResultado', lista);\n },\n _localPronto() {\n return !!(this.get('habilitado') && this._estado && this._pessoaLocal && this._pessoaLocal === (0, _offline.pessoaLogadaId)());\n },\n _atualizarPendentes() {\n if (!this.get('isDestroyed')) this.set('pendentes', this._ops.length);\n },\n // Boot a frio: registros criados offline voltam para o store (sem passar pelo serializer).\n _empurrarRegistros() {\n let est = this._estado;\n let recursos = Object.keys(est.registros).map(k => copia(est.registros[k]));\n if (!recursos.length) return;\n try {\n (0, _runloop.run)(() => this.get('store').push((0, _jsonApiIds.normalizarIdsDoPayload)({\n data: recursos\n })));\n } catch (e) {\n console.warn('offline: falha ao restaurar registros locais', e);\n }\n },\n // Serializa gravações no IndexedDB/estado (ordem de chegada).\n _serial(fn) {\n let p = this._cadeia.then(fn, fn);\n this._cadeia = p.catch(() => {});\n return p;\n },\n // `fn(est)` recebe uma CÓPIA do estado e devolve { novas, alteradas, remover, resposta }.\n // Grava operações + estado e só então troca a memória (falha no disco = nada mudou).\n _transacaoLocal(fn) {\n return this._serial(() => {\n if (!this._estado) throw new Error('offline: fila local não carregada');\n let pessoa = this._pessoaLocal;\n let est = copia(this._estado);\n let plano = fn(est) || {};\n let novas = plano.novas || [];\n let alteradas = plano.alteradas || [];\n let remover = plano.remover || [];\n return (0, _offlineIdb.gravarOperacoes)(novas, alteradas, remover.map(o => o.seq)).then(() => (0, _offlineIdb.gravarEstado)(est)).then(() => {\n // Logout/troca de pessoa durante a gravação: o disco já tem tudo; a memória é de outra pessoa.\n if (this._pessoaLocal !== pessoa) return plano.resposta === undefined ? null : plano.resposta;\n this._trocarEstado(est);\n let seqsRemovidos = remover.map(o => o.seq);\n let trocas = {};\n alteradas.forEach(o => {\n trocas[o.seq] = o;\n });\n this._ops = this._ops.filter(o => seqsRemovidos.indexOf(o.seq) === -1).map(o => trocas[o.seq] || o).concat(novas).sort((a, b) => a.seq - b.seq);\n this._atualizarPendentes();\n if (this.get('isOnline') && this._ops.length) this.agendarSync(800);\n return plano.resposta === undefined ? null : plano.resposta;\n });\n });\n },\n _novaOp(tipo, dados) {\n return {\n clientOpId: uuid(),\n tipo: tipo,\n clientTimestamp: Date.now(),\n dados: dados,\n pessoaId: this._pessoaLocal,\n status: 'pendente',\n tentativas: 0,\n erro: null\n };\n },\n // ---------------------------------------------------------------- interceptação (adapter)\n\n interceptaOperacao(kind, modelName) {\n if (!this.get('habilitado')) return false;\n let ops = OPERACOES_INTERCEPTADAS[modelName];\n return !!(ops && ops.indexOf(kind) > -1);\n },\n _referenciaTmp(snapshot) {\n if (isTmp(snapshot.id)) return true;\n let achou = false;\n snapshot.eachRelationship((nome, meta) => {\n if (meta.kind === 'belongsTo' && isTmp(snapshot.belongsTo(nome, {\n id: true\n }))) achou = true;\n });\n return achou;\n },\n deveEnfileirar(snapshot) {\n if (!this._localPronto()) return false;\n if (typeof navigator !== 'undefined' && navigator.onLine === false) return true;\n if (!this.get('isOnline')) return true;\n if (this._ops.length > 0) return true;\n return this._referenciaTmp(snapshot);\n },\n // Ponto de entrada do adapter para create/update/delete interceptados.\n salvarComFila(kind, store, type, snapshot, enviar) {\n if (this.deveEnfileirar(snapshot)) return this.enfileirar(kind, store, type, snapshot);\n if (!this._localPronto()) return enviar();\n let modelName = type.modelName;\n return this._comTimeout(enviar(), TIMEOUT_SAVE_MS).then(resposta => {\n this._agendarReaquecimento(modelName);\n return resposta;\n }, err => {\n if (erroDeRede(err) && this._localPronto()) {\n console.warn('offline: falha de rede ao salvar ' + modelName + ' — gravado na fila offline');\n return this.enfileirar(kind, store, type, snapshot);\n }\n throw err;\n });\n },\n _comTimeout(promise, ms) {\n return new _rsvp.default.Promise((resolve, reject) => {\n let t = setTimeout(() => {\n let e = new Error('offline-timeout');\n e.offlineTimeout = true;\n reject(e);\n }, ms);\n _rsvp.default.resolve(promise).then(v => {\n clearTimeout(t);\n resolve(v);\n }, e => {\n clearTimeout(t);\n reject(e);\n });\n });\n },\n enfileirar(kind, store, type, snapshot) {\n let modelName = type.modelName;\n let fn;\n if (modelName === 'aplicacao-aula' && kind === 'createRecord') fn = est => this._planoCriarAplicacaoAula(est, store, snapshot);else if (modelName === 'aplicacao-aula') fn = est => this._planoFinalizar(est, 'aplicacao-aula', 'finalizar-aa', 'aplicacaoAulaId', snapshot);else if (modelName === 'aplicacao-questionario') fn = est => this._planoFinalizar(est, 'aplicacao-questionario', 'finalizar-aq', 'aplicacaoQuestionarioId', snapshot);else if (modelName === 'resposta-comp' && kind === 'createRecord') fn = est => this._planoRespostaComp(est, store, snapshot);else if (modelName === 'resposta-comp') fn = est => this._planoApagarRespostaComp(est, snapshot);else if (modelName === 'resposta') fn = est => this._planoResposta(est, snapshot);else if (modelName === 'leitura') fn = est => this._planoLeitura(est, snapshot);else if (modelName === 'estado-video') fn = est => this._planoEstadoVideo(est, snapshot);else return _rsvp.default.reject(new Error('offline: operação não suportada ' + kind + ' ' + modelName));\n return this._transacaoLocal(fn);\n },\n _pendenteLivre(pred) {\n return this._ops.filter(op => !this._emVoo[op.seq] && pred(op));\n },\n _registrarAtributos(est, modelName, id, attrs) {\n let limpos = {};\n Object.keys(attrs || {}).forEach(k => {\n if (attrs[k] !== undefined && k !== 'laudo' && k !== 'laudoPuro') limpos[k] = attrs[k];\n });\n let k = chave(modelName, id);\n if (isTmp(id)) {\n let r = est.registros[k];\n if (r) r.attributes = Object.assign({}, r.attributes, limpos);\n } else {\n est.patches[k] = Object.assign({}, est.patches[k], limpos);\n }\n },\n // criar-aplicacao-aula: o servidor cria os aplicacao-questionario (um por quiz-comp da\n // atividade) — aqui eles nascem locais com ids tmp e vão no `questionarios` da operação.\n _planoCriarAplicacaoAula(est, store, snapshot) {\n let aaId = novoTmp();\n let atividadeId = snapshot.belongsTo('atividade', {\n id: true\n });\n let pessoaId = snapshot.belongsTo('pessoa', {\n id: true\n }) || this._pessoaLocal;\n let isHetero = snapshot.attr('isHeterorrelato') === true || snapshot.attr('isHeterorrelato') === 'true';\n let turmaId = numOuNull(snapshot.attr('turmaAplicadaId'));\n if (!atividadeId) throw new Error('offline: aplicacao-aula sem atividade');\n\n // ano aplicado (relatorios.js usa aplicacaoAula.anoAplicadoId no heterorrelato)\n let anoAplicadoId = null;\n if (isHetero && turmaId != null) {\n let turma = store.peekRecord('plataforma-turma', String(turmaId));\n let anoRef = turma ? turma.belongsTo('plataformaAno').id() : null;\n anoAplicadoId = numOuNull(anoRef);\n }\n let quizzes = this._quizzesDaAtividade(store, atividadeId);\n let agora = agoraSeg();\n let aa = {\n type: 'aplicacao-aula',\n id: aaId,\n attributes: {\n finalizado: false,\n isHeterorrelato: isHetero,\n turmaAplicadaId: turmaId,\n anoAplicadoId: anoAplicadoId,\n doAnoAtual: true,\n dataInscricao: agora,\n faixaEtaria: null\n },\n relationships: {\n atividade: rel('atividade', atividadeId),\n pessoa: rel('pessoa', pessoaId)\n }\n };\n let aqs = quizzes.map(q => ({\n type: 'aplicacao-questionario',\n id: novoTmp(),\n attributes: {\n finalizado: false,\n isHeterorrelato: isHetero,\n dataIniciado: agora,\n faixaEtaria: null\n },\n relationships: {\n aplicacaoAula: rel('aplicacao-aula', aaId),\n atividade: rel('atividade', atividadeId),\n pessoa: rel('pessoa', pessoaId),\n quiz: rel('quiz-comp', q.quizCompId),\n comp: rel('comp', q.compId)\n }\n }));\n est.registros[chave(aa.type, aa.id)] = copia(aa);\n aqs.forEach(q => {\n est.registros[chave(q.type, q.id)] = copia(q);\n });\n let op = this._novaOp('criar-aplicacao-aula', {\n clientId: aaId,\n atividadeId: idOp(atividadeId),\n isHeterorrelato: isHetero,\n turmaAplicadaId: turmaId,\n questionarios: aqs.map(q => ({\n clientId: q.id,\n quizCompId: idOp(q.relationships.quiz.data.id)\n }))\n });\n let dataBruto = paraBruto(aa);\n dataBruto.relationships.questionarios = {\n data: aqs.map(q => ({\n type: tipoBruto(q.type),\n id: q.id\n }))\n };\n return {\n novas: [op],\n resposta: {\n data: dataBruto,\n included: aqs.map(paraBruto)\n }\n };\n },\n // Mesma lista que o back usa: atividade.Secoes -> Conteudos -> ConteudoQuizCompetencia.\n _quizzesDaAtividade(store, atividadeId) {\n let atividade = store.peekRecord('atividade', String(atividadeId));\n // Sem a atividade no store não dá para montar os questionários: a gravação falha como hoje.\n if (!atividade) throw new Error('offline: atividade ' + atividadeId + ' não carregada');\n let lista = [];\n atividade.hasMany('secoes').ids().forEach(secaoId => {\n let secao = store.peekRecord('secao', secaoId);\n if (!secao) return;\n secao.hasMany('conteudos').ids().forEach(conteudoId => {\n let conteudo = store.peekRecord('conteudo', conteudoId);\n let quizId = conteudo ? conteudo.belongsTo('quizComp').id() : null;\n if (!quizId || lista.some(q => q.quizCompId === String(quizId))) return;\n let quiz = store.peekRecord('quiz-comp', quizId);\n lista.push({\n quizCompId: String(quizId),\n compId: quiz ? quiz.belongsTo('comp').id() : null\n });\n });\n });\n return lista;\n },\n // finalizar-aq / finalizar-aa. O contrato só tem \"finalizar\": salvar com finalizado=false\n // (reabrir) cancela uma finalização ainda não enviada; reabrir algo já finalizado no servidor\n // não é sincronizado (limitação registrada no MD).\n _planoFinalizar(est, modelName, tipoOp, campo, snapshot) {\n let id = snapshot.id;\n let attrs = snapshot.attributes();\n let finalizado = attrs.finalizado === true || attrs.finalizado === 'true';\n let resposta = null;\n if (finalizado && attrs.dataFinalizado == null) {\n attrs.dataFinalizado = agoraSeg();\n resposta = {\n data: {\n type: tipoBruto(modelName),\n id: String(id),\n attributes: {\n 'data-finalizado': attrs.dataFinalizado\n }\n }\n };\n }\n this._registrarAtributos(est, modelName, id, attrs);\n let mesmas = this._ops.filter(op => op.tipo === tipoOp && String(op.dados[campo]) === String(id));\n let novas = [];\n let remover = [];\n let atividadeId = modelName === 'aplicacao-aula' ? snapshot.belongsTo('atividade', {\n id: true\n }) : null;\n if (finalizado) {\n if (!mesmas.length) {\n let dados = {};\n dados[campo] = idOp(id);\n novas.push(this._novaOp(tipoOp, dados));\n // Família (autorrelato) / eixo (heterorrelato) concluído com a fila: avisa quando o\n // resultado puder ser aberto (depois do sync + reconciliação).\n if (atividadeId) {\n let aviso = this._montarAvisoResultado(atividadeId, snapshot, id);\n if (aviso) est.avisos[String(atividadeId)] = aviso;\n }\n }\n } else {\n if (atividadeId && est.avisos[String(atividadeId)]) delete est.avisos[String(atividadeId)];\n remover = mesmas.filter(op => !this._emVoo[op.seq]);\n if (!remover.length && !isTmp(id)) {\n console.warn('offline: reabrir ' + modelName + ' ' + id + ' offline não é sincronizado (sem operação no contrato)');\n }\n }\n return {\n novas: novas,\n remover: remover,\n resposta: resposta\n };\n },\n // Mesmos params que modlist.js#goAtividadeC usa para abrir uma atividade 100% concluída:\n // relatorios(moduloId, atividadeId, última seção com show=true). Heterorrelato: o resultado é\n // da turma e a tela de relatorios não tem conteúdo próprio -> o aviso leva ao modlist.\n _montarAvisoResultado(atividadeId, snapshot, aaId) {\n let store = this.get('store');\n let atividade = store.peekRecord('atividade', String(atividadeId));\n if (!atividade) return null;\n let secoes = atividade.hasMany('secoes').ids().map(sid => store.peekRecord('secao', sid)).filter(Boolean).sort((a, b) => (a.get('idx') || 0) - (b.get('idx') || 0));\n let visiveis = secoes.filter(sec => sec.get('show') === true);\n let ultima = (visiveis.length ? visiveis : secoes).slice(-1)[0];\n let nome = null;\n try {\n let quiz = this._quizzesDaAtividade(store, atividadeId)[0];\n let comp = quiz && quiz.compId ? store.peekRecord('comp', quiz.compId) : null;\n let dominioId = comp ? comp.belongsTo('dominio').id() : null;\n let dominio = dominioId ? store.peekRecord('dominio', dominioId) : null;\n nome = dominio ? dominio.get('name') : null;\n } catch (e) {\n nome = null;\n }\n return {\n atividadeId: String(atividadeId),\n moduloId: atividade.belongsTo('modulo').id(),\n secaoId: ultima ? String(ultima.get('id')) : null,\n nome: nome || atividade.get('name') || null,\n hetero: snapshot.attr('isHeterorrelato') === true || snapshot.attr('isHeterorrelato') === 'true',\n turmaId: numOuNull(snapshot.attr('turmaAplicadaId')),\n aaId: String(aaId),\n em: Date.now()\n };\n },\n // Atividade cuja tela de resultado pendente está aberta (relatorios.js): ela se recarrega sozinha\n // ao sincronizar, então o aviso dela não aparece na pílula.\n atividadeEmResultadoPendente: null,\n // Avisos que a pílula pode mostrar: só online, com a fila vazia e fora de um sync.\n avisosProntos() {\n if (!this.get('habilitado') || !this._localPronto()) return [];\n if (!this.get('isOnline') || this._ops.length || this.get('sincronizando')) return [];\n let aberta = this.get('atividadeEmResultadoPendente');\n return (this.get('avisosResultado') || []).filter(a => String(a.atividadeId) !== String(aberta));\n },\n // Clique no \"ver\" da pílula (Douglas, 2026-09-28: o destino é o perfil acumulado `autoper`).\n // Autorrelato (1 ou vários avisos) -> autoper(moduloId) do aviso mais recente de autorrelato;\n // só heterorrelato -> modlist do módulo (o resultado do heterorrelato é da turma, não individual).\n // Reconcilia antes (ids reais). Resolve com { rota, params } para o controller da engine\n // fazer o transitionToRoute.\n abrirAvisoResultado() {\n let avisos = this.avisosProntos();\n if (!avisos.length) return _rsvp.default.resolve(null);\n let auto = avisos.filter(a => !a.hetero && a.moduloId);\n let alvo = auto.length ? auto[0] : avisos[0];\n return this.limparAvisosResultado(avisos.map(a => a.atividadeId)).then(() => this.reconciliar({\n recarregar: true\n })).then(() => auto.length ? {\n rota: 'autoper',\n params: [alvo.moduloId]\n } : {\n rota: 'modulos.modlist',\n params: [alvo.moduloId]\n });\n },\n limparAvisosResultado(atividadeIds) {\n if (!this._localPronto()) return _rsvp.default.resolve();\n let ids = [].concat(atividadeIds || []).map(String);\n let avisos = this._estado.avisos || {};\n if (!ids.some(id => avisos[id])) return _rsvp.default.resolve();\n let pessoa = this._pessoaLocal;\n return this._serial(() => {\n if (this._pessoaLocal !== pessoa || !this._estado) return;\n let est = copia(this._estado);\n ids.forEach(id => {\n delete est.avisos[id];\n });\n return (0, _offlineIdb.gravarEstado)(est).then(() => {\n if (this._pessoaLocal === pessoa) this._trocarEstado(est);\n });\n });\n },\n _questaoDaAlternativa(store, altId) {\n if (altId == null) return null;\n let alt = store.peekRecord('alternativa-comp', String(altId));\n let q = alt ? alt.belongsTo('questaoComp').id() : null;\n return q == null ? null : String(q);\n },\n // resposta-comp: o contrato SUBSTITUI o conjunto de respostas da questão no AQ. O conjunto é\n // montado a partir do store (as outras respostas não apagadas daquela questão + a nova), então\n // a questão de caso (duas respostas positiva true/false) vira uma operação com 2 itens. Operações\n // pendentes anteriores da mesma questão ficam redundantes e são removidas (se não estão em voo).\n _planoRespostaComp(est, store, snapshot) {\n let aqId = snapshot.belongsTo('aplicacaoQuestionario', {\n id: true\n });\n let altId = snapshot.belongsTo('alternativaComp', {\n id: true\n });\n let questaoId = this._questaoDaAlternativa(store, altId);\n if (!aqId || !altId || !questaoId) throw new Error('offline: resposta-comp sem questionário/alternativa carregados');\n let tmpId = novoTmp();\n let nova = {\n type: 'resposta-comp',\n id: tmpId,\n attributes: {\n timestamp: snapshot.attr('timestamp'),\n tempo: snapshot.attr('tempo'),\n sliderValue: snapshot.attr('sliderValue'),\n positiva: snapshot.attr('positiva')\n },\n relationships: {\n alternativaComp: rel('alternativa-comp', altId),\n aplicacaoQuestionario: rel('aplicacao-questionario', aqId)\n }\n };\n let outras = store.peekAll('resposta-comp').filter(r => {\n let id = r.get('id');\n if (!id || r.get('isDeleted') || r.get('isNew')) return false;\n if (String(r.belongsTo('aplicacaoQuestionario').id()) !== String(aqId)) return false;\n return this._questaoDaAlternativa(store, r.belongsTo('alternativaComp').id()) === questaoId;\n });\n let itens = outras.map(r => ({\n clientId: isTmp(r.get('id')) ? r.get('id') : novoTmp(),\n alternativaCompId: idOp(r.belongsTo('alternativaComp').id()),\n sliderValue: numOuNull(r.get('sliderValue')),\n positiva: r.get('positiva') === true,\n tempo: numOuNull(r.get('tempo'))\n }));\n itens.push({\n clientId: tmpId,\n alternativaCompId: idOp(altId),\n sliderValue: numOuNull(nova.attributes.sliderValue),\n positiva: nova.attributes.positiva === true,\n tempo: numOuNull(nova.attributes.tempo)\n });\n itens.forEach(i => {\n if (i.tempo == null) delete i.tempo;\n });\n\n // Espelho: conjunto atual da questão; tmp que saíram do conjunto somem do espelho.\n let idsConjunto = outras.map(r => String(r.get('id'))).concat([tmpId]);\n let chaveSub = String(aqId) + '|' + questaoId;\n (est.substituicoes[chaveSub] || []).forEach(antigo => {\n if (idsConjunto.indexOf(antigo) === -1 && isTmp(antigo)) delete est.registros[chave('resposta-comp', antigo)];\n });\n est.substituicoes[chaveSub] = idsConjunto;\n est.registros[chave(nova.type, nova.id)] = copia(nova);\n let remover = this._pendenteLivre(op => op.tipo === 'resposta-comp' && String(op.dados.aplicacaoQuestionarioId) === String(aqId) && String(op.dados.questaoCompId) === questaoId);\n let op = this._novaOp('resposta-comp', {\n aplicacaoQuestionarioId: idOp(aqId),\n questaoCompId: idOp(questaoId),\n respostas: itens\n });\n return {\n novas: [op],\n remover: remover,\n resposta: {\n data: paraBruto(nova)\n }\n };\n },\n // destroyRecord de resposta-comp (questão de caso respondida de novo): nada vai ao servidor —\n // a próxima operação resposta-comp da questão substitui o conjunto.\n _planoApagarRespostaComp(est, snapshot) {\n let id = snapshot.id;\n if (isTmp(id)) delete est.registros[chave('resposta-comp', id)];else if (id != null) est.removidos[chave('resposta-comp', id)] = true;\n return {\n resposta: null\n };\n },\n _planoResposta(est, snapshot) {\n let altId = snapshot.belongsTo('alternativa', {\n id: true\n });\n if (!altId) throw new Error('offline: resposta sem alternativa');\n let tmpId = novoTmp();\n let nova = {\n type: 'resposta',\n id: tmpId,\n attributes: {\n timestamp: snapshot.attr('timestamp')\n },\n relationships: {\n alternativa: rel('alternativa', altId),\n pessoa: rel('pessoa', snapshot.belongsTo('pessoa', {\n id: true\n }) || this._pessoaLocal)\n }\n };\n est.registros[chave(nova.type, nova.id)] = copia(nova);\n let op = this._novaOp('resposta', {\n clientId: tmpId,\n alternativaId: idOp(altId)\n });\n return {\n novas: [op],\n resposta: {\n data: paraBruto(nova)\n }\n };\n },\n // leitura / estado-video: várias gravações do mesmo registro viram UMA operação (a mais recente,\n // na posição da primeira). estado-video nunca reduz (mesma regra do contrato).\n _planoLeitura(est, snapshot) {\n let id = snapshot.id;\n let dados = {\n leituraId: idOp(id),\n scroll: numOuNull(snapshot.attr('scroll')) || 0\n };\n this._registrarAtributos(est, 'leitura', id, {\n scroll: snapshot.attr('scroll'),\n timestamp: snapshot.attr('timestamp')\n });\n return this._planoCoalescido('leitura', 'leituraId', id, dados);\n },\n _planoEstadoVideo(est, snapshot) {\n let id = snapshot.id;\n let dados = {\n estadoVideoId: idOp(id),\n tempoAssistido: numOuNull(snapshot.attr('tempoAssistido')) || 0,\n ultimoInstante: numOuNull(snapshot.attr('ultimoInstante')),\n completou: snapshot.attr('completou') === true\n };\n this._registrarAtributos(est, 'estado-video', id, {\n iniciou: snapshot.attr('iniciou'),\n ultimoInstante: snapshot.attr('ultimoInstante'),\n tempoAssistido: snapshot.attr('tempoAssistido'),\n completou: snapshot.attr('completou'),\n timestamp: snapshot.attr('timestamp')\n });\n return this._planoCoalescido('estado-video', 'estadoVideoId', id, dados, (antigo, novo) => {\n novo.tempoAssistido = Math.max(antigo.tempoAssistido || 0, novo.tempoAssistido || 0);\n novo.completou = !!(antigo.completou || novo.completou);\n return novo;\n });\n },\n _planoCoalescido(tipo, campo, id, dados, mesclar) {\n let existente = this._pendenteLivre(op => op.tipo === tipo && String(op.dados[campo]) === String(id))[0];\n if (existente) {\n let alterada = copia(existente);\n alterada.dados = mesclar ? mesclar(existente.dados, dados) : dados;\n alterada.clientTimestamp = Date.now();\n // mesmo seq = mesma posição na fila (_transacaoLocal troca o objeto em memória)\n return {\n novas: [],\n alteradas: [alterada],\n remover: [],\n resposta: null\n };\n }\n return {\n novas: [this._novaOp(tipo, dados)],\n resposta: null\n };\n },\n // ---------------------------------------------------------------- leitura (adapter)\n\n // findRecord: id tmp -> sempre local. Tipos da fila sem rede -> cópia do store.\n buscarComFallback(store, type, id, snapshot, enviar) {\n let modelName = type.modelName;\n if (isTmp(id)) {\n let local = this._payloadLocal(store, modelName, id, snapshot);\n return local ? _rsvp.default.resolve(local) : _rsvp.default.reject(new _error.default([{\n status: '404',\n title: 'Registro local não encontrado'\n }]));\n }\n if (!OPERACOES_INTERCEPTADAS[modelName]) return enviar();\n return enviar().catch(err => {\n if (erroDeRede(err) && !!store.peekRecord(modelName, id)) {\n let local = this._payloadLocal(store, modelName, id, snapshot);\n if (local) return local;\n }\n throw err;\n });\n },\n buscarTodosComFallback(modelName, enviar) {\n if (FIND_ALL_OPCIONAIS.indexOf(modelName) === -1) return enviar();\n return enviar().catch(err => {\n if (erroDeRede(err)) return {\n data: []\n };\n throw err;\n });\n },\n _payloadLocal(store, modelName, id, snapshot) {\n let est = this._estado;\n let reg = est && est.registros[chave(modelName, id)];\n if (reg) return {\n data: paraBruto(copia(reg))\n };\n if (snapshot && !!store.peekRecord(modelName, id)) {\n try {\n let bruto = store.serializerFor(modelName).serialize(snapshot, {\n includeId: true\n });\n if (bruto && bruto.data) {\n bruto.data.id = String(id);\n return bruto;\n }\n } catch (e) {/* cai no null */}\n }\n return null;\n },\n // ---------------------------------------------------------------- overlay (serializer)\n\n // Corrige, in place, um documento JSON:API já normalizado antes de ele entrar no store.\n aplicarOverlay(doc) {\n let est = this._estado;\n if (!doc || !this._localPronto() || estadoSemDados(est)) return doc;\n let store = this.get('store');\n let lista = () => (Array.isArray(doc.data) ? doc.data : doc.data ? [doc.data] : []).concat(doc.included || []);\n let noDoc = {};\n lista().forEach(r => {\n if (r && r.type) noDoc[chave(r.type, r.id)] = r;\n });\n let questaoDe = altId => {\n let a = noDoc[chave('alternativa-comp', altId)];\n let q = a && a.relationships && a.relationships.questaoComp;\n if (q && q.data) return String(q.data.id);\n return this._questaoDaAlternativa(store, altId);\n };\n\n // 1. Registros apagados offline e respostas substituídas por um conjunto novo.\n let removidas = {};\n lista().forEach(r => {\n if (!r || !r.type) return;\n let k = chave(r.type, r.id);\n if (est.removidos[k]) {\n removidas[k] = true;\n return;\n }\n if (r.type === 'resposta-comp' && !isTmp(r.id)) {\n let rels = r.relationships || {};\n let aq = rels.aplicacaoQuestionario && rels.aplicacaoQuestionario.data;\n let alt = rels.alternativaComp && rels.alternativaComp.data;\n if (!aq || !alt) return;\n let conjunto = est.substituicoes[String(aq.id) + '|' + questaoDe(alt.id)];\n if (conjunto && conjunto.indexOf(String(r.id)) === -1) removidas[k] = true;\n }\n });\n let fica = r => !removidas[chave(r.type, r.id)];\n if (Array.isArray(doc.data)) doc.data = doc.data.filter(fica);\n if (doc.included) doc.included = doc.included.filter(fica);\n\n // 2. Patches e filhos locais nos hasMany dos pais.\n let indice = this._indiceOverlay();\n let incluir = {};\n lista().forEach(r => {\n let k = chave(r.type, r.id);\n let patch = est.patches[k];\n if (patch) r.attributes = Object.assign({}, r.attributes, patch);\n let rels = r.relationships;\n if (!rels) return;\n let filhosDoPai = indice[k] || {};\n Object.keys(rels).forEach(nome => {\n let relacao = rels[nome];\n if (!relacao || !Array.isArray(relacao.data)) return;\n relacao.data = relacao.data.filter(d => !removidas[chave(d.type, d.id)] && !est.removidos[chave(d.type, d.id)]);\n (filhosDoPai[nome] || []).forEach(f => {\n let tem = id => relacao.data.some(d => d.type === f.type && String(d.id) === String(id));\n if (tem(f.id)) return;\n // Já sincronizado e o payload já traz o registro real: não duplica.\n let real = est.mapa[f.id];\n if (real != null && tem(real)) return;\n relacao.data.push({\n type: f.type,\n id: f.id\n });\n incluir[chave(f.type, f.id)] = true;\n });\n });\n });\n\n // 3. Registros tmp referenciados que ainda não estão no store (ex.: boot a frio).\n Object.keys(incluir).forEach(k => {\n let r = est.registros[k];\n if (!r || noDoc[k] || !!store.peekRecord(r.type, r.id)) return;\n doc.included = doc.included || [];\n doc.included.push(copia(r));\n });\n return doc;\n },\n // pai ('tipo:id') -> { chaveHasMany: [{type, id}] } a partir dos belongsTo dos registros tmp.\n _indiceOverlay() {\n if (this._indiceCache) return this._indiceCache;\n let store = this.get('store');\n let est = this._estado;\n let indice = {};\n Object.keys(est.registros).forEach(k => {\n let r = est.registros[k];\n let modelClass;\n try {\n modelClass = store.modelFor(r.type);\n } catch (e) {\n return;\n }\n Object.keys(r.relationships || {}).forEach(nome => {\n let d = r.relationships[nome] && r.relationships[nome].data;\n if (!d || Array.isArray(d)) return;\n let inversa = null;\n try {\n inversa = modelClass.inverseFor(nome, store);\n } catch (e) {\n inversa = null;\n }\n if (!inversa || inversa.kind !== 'hasMany') return;\n let pai = chave(d.type, d.id);\n indice[pai] = indice[pai] || {};\n indice[pai][inversa.name] = indice[pai][inversa.name] || [];\n indice[pai][inversa.name].push({\n type: r.type,\n id: r.id\n });\n });\n });\n this._indiceCache = indice;\n return indice;\n },\n // ---------------------------------------------------------------- estado para as telas\n\n // relatorios.js: resultado da família fica pendente (decisão 2) enquanto offline, com fila\n // pendente ou enquanto a aplicacao-aula ainda é local (tmp — a IA precisa do id real).\n resultadoPendente(aplicacaoAulaId) {\n if (!this.get('habilitado')) return false;\n if (!this.get('isOnline') || typeof navigator !== 'undefined' && navigator.onLine === false) return true;\n if (this._ops.length > 0 || this.get('sincronizando')) return true;\n return isTmp(aplicacaoAulaId);\n },\n // ---------------------------------------------------------------- sincronização\n\n agendarSync(ms) {\n if (!this.get('habilitado')) return;\n (0, _runloop.cancel)(this._timerSync);\n this._timerSync = (0, _runloop.later)(this, this.sincronizar, ms || 0);\n },\n sincronizar() {\n if (!this.get('habilitado') || this._sincronizandoAgora) return _rsvp.default.resolve();\n if (!this._localPronto() || !this._ops.length) return _rsvp.default.resolve();\n if (!this.get('isOnline') || typeof navigator !== 'undefined' && navigator.onLine === false) return _rsvp.default.resolve();\n if (!this.get('session.isAuthenticated')) return _rsvp.default.resolve();\n if (this.get('syncEstado') === 'login') return _rsvp.default.resolve();\n let pessoaId = this._pessoaLocal;\n this._sincronizandoAgora = true;\n this._descartadasNoCiclo = 0;\n (0, _runloop.cancel)(this._timerSincronizado);\n this.setProperties({\n sincronizando: true,\n syncEstado: 'inativo'\n });\n return this._cicloSync(pessoaId, 0).then(res => {\n if (this._pessoaLocal !== pessoaId) return;\n this.set('descartadasRecentes', this._descartadasNoCiclo);\n if (!this._ops.length) {\n this._tentativaBackoff = 0;\n this.set('syncEstado', 'sincronizado');\n this._timerSincronizado = (0, _runloop.later)(this, function () {\n if (this.get('syncEstado') === 'sincronizado') this.set('syncEstado', 'inativo');\n }, this._descartadasNoCiclo ? SINCRONIZADO_VISIVEL_MS * 2 : SINCRONIZADO_VISIVEL_MS);\n this.trigger('sincronizado');\n this._aquecerPosSync();\n return;\n }\n if (res && (res.status === '401' || res.status === '403')) return;\n if (res && res.status === '400') this.set('syncEstado', 'erro');\n this._agendarRetry();\n }).catch(e => {\n console.warn('offline: falha na sincronização', e);\n this._agendarRetry();\n }).finally(() => {\n this._sincronizandoAgora = false;\n if (!this.get('isDestroyed')) this.set('sincronizando', false);\n });\n },\n _agendarRetry() {\n if (!this._ops.length) return;\n let s = BACKOFF_S[Math.min(this._tentativaBackoff, BACKOFF_S.length - 1)];\n this._tentativaBackoff++;\n this.agendarSync(s * 1000);\n },\n _cicloSync(pessoaId, voltas) {\n if (pessoaId !== this._pessoaLocal || (0, _offline.pessoaLogadaId)() !== pessoaId) return _rsvp.default.resolve({\n status: 'troca-pessoa'\n });\n return this._descartarDependentesDeOrfaos().then(() => {\n let lote = this._ops.slice(0, LOTE_MAX);\n if (!lote.length) return {\n status: 'vazio'\n };\n lote.forEach(op => {\n this._emVoo[op.seq] = true;\n });\n return this._postSync(lote, pessoaId).then(resp => this._processarResposta(lote, resp, pessoaId), err => ({\n status: 'rede',\n erro: err\n })).finally(() => lote.forEach(op => {\n delete this._emVoo[op.seq];\n })).then(res => {\n if (res.continuar && this._ops.length && voltas < 50) return this._cicloSync(pessoaId, voltas + 1);\n return res;\n });\n });\n },\n _postSync(lote, pessoaId) {\n let url = _environment.default.APP.host + '/' + _environment.default.APP.namespace + '/offline-sync';\n let token = this.get('session.data.authenticated.access_token');\n let corpo = JSON.stringify({\n operacoes: lote.map(op => ({\n clientOpId: op.clientOpId,\n tipo: op.tipo,\n clientTimestamp: op.clientTimestamp,\n dados: op.dados\n }))\n });\n let controle = typeof AbortController !== 'undefined' ? new AbortController() : null;\n let timer = setTimeout(() => {\n if (controle) controle.abort();\n }, TIMEOUT_SYNC_MS);\n return _rsvp.default.resolve(fetch(url, {\n method: 'POST',\n credentials: 'omit',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'pessoaid': String(pessoaId),\n 'Authorization': 'Bearer ' + token\n },\n body: corpo,\n signal: controle ? controle.signal : undefined\n })).then(response => response.text().then(texto => {\n let json = null;\n try {\n json = texto ? JSON.parse(texto) : null;\n } catch (e) {\n json = null;\n }\n return {\n status: response.status,\n json: json\n };\n })).finally(() => clearTimeout(timer));\n },\n _processarResposta(lote, resp, pessoaId) {\n if (resp.status === 401) {\n this._exigirLogin();\n return {\n status: '401'\n };\n }\n if (resp.status === 403) {\n console.warn('offline: sincronização recusada (403)', resp.json);\n this.set('syncEstado', 'bloqueado');\n return {\n status: '403'\n };\n }\n if (resp.status === 400) {\n console.error('offline: lote recusado pelo servidor (400)', resp.json, lote);\n return {\n status: '400'\n };\n }\n if (resp.status !== 200 || !resp.json || !Array.isArray(resp.json.resultados)) {\n return {\n status: 'http',\n codigo: resp.status\n };\n }\n let porId = {};\n resp.json.resultados.forEach(r => {\n if (r && r.clientOpId) porId[String(r.clientOpId).toLowerCase()] = r;\n });\n return this._serial(() => {\n if (this._pessoaLocal !== pessoaId || !this._estado) return {\n status: 'troca-pessoa'\n };\n let est = copia(this._estado);\n let remover = [];\n let alteradas = [];\n let descartadas = [];\n let parou = false;\n let progresso = 0;\n lote.forEach(op => {\n let r = porId[String(op.clientOpId).toLowerCase()];\n if (!r || parou) return;\n if (r.status === 'ok' || r.status === 'duplicada') {\n let ids = r.ids || {};\n Object.keys(ids).forEach(tmp => {\n est.mapa[tmp] = ids[tmp];\n });\n remover.push(op);\n progresso++;\n } else if (r.status === 'erro') {\n let erro = r.erro || {};\n let orfa = erro.codigo === 'referencia-invalida' && tmpsReferenciados(op).some(t => est.orfaos[t]);\n if (erro.permanente === true || orfa) {\n console.warn('offline: operação descartada (erro permanente)', op.tipo, erro, op.dados);\n descartadas.push({\n pessoaId: pessoaId,\n op: copia(op),\n erro: erro,\n em: Date.now()\n });\n tmpsCriados(op).forEach(t => {\n est.orfaos[t] = true;\n });\n if (op.tipo === 'finalizar-aa') {\n Object.keys(est.avisos || {}).forEach(k => {\n if (String(est.avisos[k].aaId) === String(op.dados.aplicacaoAulaId)) delete est.avisos[k];\n });\n }\n remover.push(op);\n progresso++;\n } else {\n console.warn('offline: operação com erro temporário — nova tentativa mais tarde', op.tipo, erro);\n let alterada = copia(op);\n alterada.tentativas = (op.tentativas || 0) + 1;\n alterada.erro = erro;\n alteradas.push(alterada);\n parou = true;\n }\n }\n // 'nao-processada': fica na fila (vai no próximo lote)\n });\n return (0, _offlineIdb.adicionarDescartadas)(descartadas).then(() => (0, _offlineIdb.gravarOperacoes)([], alteradas, remover.map(o => o.seq))).then(() => (0, _offlineIdb.gravarEstado)(est)).then(() => {\n if (this._pessoaLocal !== pessoaId) return {\n status: 'troca-pessoa'\n };\n this._trocarEstado(est);\n let fora = remover.map(o => o.seq);\n let trocas = {};\n alteradas.forEach(o => {\n trocas[o.seq] = o;\n });\n this._ops = this._ops.filter(o => fora.indexOf(o.seq) === -1).map(o => trocas[o.seq] || o);\n this._descartadasNoCiclo += descartadas.length;\n this._atualizarPendentes();\n return {\n status: parou ? 'erro-temporario' : 'ok',\n continuar: !parou && progresso > 0\n };\n });\n });\n },\n // Operações que dependem de um tmp criado por operação descartada nunca vão passar\n // (referencia-invalida é temporário no contrato): descarta antes de enviar.\n _descartarDependentesDeOrfaos() {\n let est = this._estado;\n if (!est || !Object.keys(est.orfaos).length) return _rsvp.default.resolve();\n let dependentes = this._pendenteLivre(op => tmpsReferenciados(op).some(t => est.orfaos[t]));\n if (!dependentes.length) return _rsvp.default.resolve();\n let pessoa = this._pessoaLocal;\n return this._serial(() => {\n if (this._pessoaLocal !== pessoa || !this._estado) return;\n let novoEst = copia(this._estado);\n dependentes.forEach(op => tmpsCriados(op).forEach(t => {\n novoEst.orfaos[t] = true;\n }));\n let registros = dependentes.map(op => ({\n pessoaId: op.pessoaId,\n op: copia(op),\n erro: {\n codigo: 'dependencia-descartada',\n permanente: true\n },\n em: Date.now()\n }));\n console.warn('offline: operações descartadas por dependerem de operação descartada', dependentes);\n return (0, _offlineIdb.adicionarDescartadas)(registros).then(() => (0, _offlineIdb.gravarOperacoes)([], [], dependentes.map(o => o.seq))).then(() => (0, _offlineIdb.gravarEstado)(novoEst)).then(() => {\n if (this._pessoaLocal !== pessoa) return;\n this._trocarEstado(novoEst);\n let fora = dependentes.map(o => o.seq);\n this._ops = this._ops.filter(o => fora.indexOf(o.seq) === -1);\n this._descartadasNoCiclo = (this._descartadasNoCiclo || 0) + registros.length;\n this._atualizarPendentes();\n });\n });\n },\n // 401 no sync: token expirado (decisão 4, sem refresh). A fila fica no IndexedDB; o fluxo de\n // login existente (mesmo da engine: localStorage.clear + session.invalidate) é disparado depois\n // de a pílula avisar. Após o login da MESMA pessoa, prepararLocal() recarrega a fila e sincroniza.\n // Decisão 11: é uma saída por expiração — limparAoSair preserva cache e chaves (services/offline.js).\n _exigirLogin() {\n this.pedirLoginPorExpiracao();\n },\n // ---------------------------------------------------------------- cache e reconciliação\n\n // Depois de sincronizar, o cache do SW ainda tem as respostas antigas da pessoa: reaquece as\n // URLs da pessoa (modlist, formacao, índice de módulos) para um boot offline futuro já ver os\n // registros reais.\n _aquecerPosSync() {\n if (!this.get('habilitado') || typeof caches === 'undefined' || !this._pessoaLocal) return _rsvp.default.resolve();\n let adapter = this.get('store').adapterFor('application');\n // Feature 16: instituição da pessoa (para GET taxonomias/vigentes); sem o registro, fica de fora\n let pessoa = this.get('store').peekRecord('pessoa', this._pessoaLocal);\n let instituicaoId = pessoa ? pessoa.belongsTo('instituicao').id() : null;\n let urls = (0, _offlinePrefetch.urlsPosSync)(adapter, this._pessoaLocal, instituicaoId);\n return urls.reduce((p, url) => p.then(() => this.aquecerApi(url, {\n avulso: true\n }).catch(() => {})), _rsvp.default.resolve());\n },\n // Gravação online bem-sucedida: o cache do SW fica desatualizado até a próxima leitura da\n // pessoa; reaquece (debounce de 60 s) só a URL do fluxo afetado.\n _agendarReaquecimento(modelName) {\n if (!this.get('habilitado') || typeof caches === 'undefined') return;\n this._reaquecerEad = this._reaquecerEad || MODELOS_EAD.indexOf(modelName) > -1;\n this._reaquecerMedicao = this._reaquecerMedicao || MODELOS_EAD.indexOf(modelName) === -1;\n (0, _runloop.cancel)(this._timerReaquecer);\n this._timerReaquecer = (0, _runloop.later)(this, function () {\n let pessoaId = this._pessoaLocal;\n if (!pessoaId || !this.get('isOnline') || this._ops.length) return;\n let adapter = this.get('store').adapterFor('application');\n let url = inc => adapter.buildURL('pessoa', pessoaId, null, 'findRecord') + '?' + _jquery.default.param({\n include: inc\n });\n let urls = [];\n if (this._reaquecerMedicao) urls.push(url(_offlinePrefetch.INCLUDE_PESSOA_MODLIST));\n if (this._reaquecerEad) urls.push(url(_offlinePrefetch.INCLUDE_PESSOA_FORMACAO));\n this._reaquecerEad = false;\n this._reaquecerMedicao = false;\n urls.reduce((p, u) => p.then(() => this.aquecerApi(u, {\n avulso: true\n }).catch(() => {})), _rsvp.default.resolve());\n }, REAQUECER_APOS_MS);\n },\n // tmp → real (ver cabeçalho). Só com a fila vazia e online. Chamado no model() de modlist e\n // formacao (que em seguida recarregam a pessoa com reload:true) e por relatorios.js\n // (`recarregar: true`) quando a sincronização termina com a tela aberta.\n reconciliar(opts) {\n if (!this.get('habilitado') || !this._localPronto()) return _rsvp.default.resolve(false);\n if (!this.get('isOnline') || this._ops.length || this._sincronizandoAgora) return _rsvp.default.resolve(false);\n let store = this.get('store');\n let temTmp = TIPOS_TMP.some(t => ArrayUtils.any(store.peekAll(t), r => isTmp(r.get('id'))));\n if (!temTmp && estadoSemDados(this._estado)) return _rsvp.default.resolve(false);\n let pessoaId = this._pessoaLocal;\n return this._serial(() => {\n if (this._ops.length || this._pessoaLocal !== pessoaId) return false;\n (0, _runloop.run)(() => {\n TIPOS_TMP.forEach(t => {\n store.peekAll(t).filter(r => isTmp(r.get('id'))).forEach(r => {\n try {\n r.unloadRecord();\n } catch (e) {/* já descarregado */}\n });\n });\n });\n let limpo = estadoVazio(pessoaId);\n // Os avisos de \"resultado pronto\" sobrevivem à reconciliação (é justamente depois dela que\n // o resultado pode ser aberto com os ids reais).\n limpo.avisos = copia(this._estado.avisos || {});\n return (0, _offlineIdb.gravarEstado)(limpo).then(() => {\n this._trocarEstado(limpo);\n return true;\n });\n }).then(ok => {\n if (!ok || !(opts && opts.recarregar)) return ok;\n return store.findRecord('pessoa', pessoaId, {\n reload: true,\n include: _offlinePrefetch.INCLUDE_PESSOA_MODLIST\n }).then(() => true, () => true);\n }).catch(e => {\n console.warn('offline: falha na reconciliação', e);\n return false;\n });\n }\n });\n});","define(\"semente-web-app/utils/offline-videos\", [\"exports\", \"@ember/runloop\", \"@ember/object/mixin\", \"rsvp\", \"semente-web-app/config/environment\", \"semente-web-app/utils/offline\"], function (_exports, _runloop, _mixin, _rsvp, _environment, _offline) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n 0; //eaimeta@70e063a35619d71f0,\"@ember/runloop\",0,\"@ember/object/mixin\",0,\"rsvp\",0,\"semente-web-app/config/environment\",0,\"semente-web-app/utils/offline\"eaimeta@70e063a35619d71f\n // Feature Offline (SESI) — fase 3: vídeos do Vimeo disponíveis offline.\n //\n // Mixin aplicado ao serviço `offline` (app/services/offline.js). Só age com `habilitado = true`.\n // O download é SEMPRE uma escolha explícita da pessoa (controle \"Tornar disponível offline\",\n // utils/offline-video-controles.js da engine, junto de todo player do Vimeo) — o pré-carregamento automático nunca baixa vídeo.\n //\n // Fluxo do download (baixarVideoOffline):\n // 1. `GET /api/v0/videos/{videoId}/download` (contrato v1, parte C) com os mesmos headers do\n // adapter → `{ videoId, url, altura, tamanhoBytes, expiraEm }`. O link expira: é pedido na hora.\n // 2. `navigator.storage.estimate()`: recusa com mensagem clara se não houver espaço.\n // 3. `fetch(url, { mode: 'cors', credentials: 'omit' })` DIRETO no CDN do Vimeo (decisão: sem proxy\n // no back). Falha de CORS/rede → \"O Vimeo não permitiu o download deste vídeo\".\n // 4. O corpo é lido em streaming (ReadableStream reader) para mostrar o progresso (Content-Length\n // ou `tamanhoBytes`) e gravado DIRETO no Cache Storage `semente-offline-videos`, chave sintética\n // da própria origem `/__offline-video/`. Um segundo registro `/__offline-video//meta`\n // (JSON: tamanho, altura, data) só é gravado depois do vídeo completo — é ele que diz \"baixado\".\n //\n // Por que Cache Storage e não IndexedDB:\n // - aceita um Response em streaming: o MP4 vai para o disco à medida que chega, sem montar o\n // arquivo inteiro em memória (IndexedDB exige o Blob completo antes do put);\n // - `cache.match(chave).blob()` devolve um Blob apoiado em disco, que vira `URL.createObjectURL`\n // para o