diff --git a/js/build_page.js b/js/build_page.js
index 9a533f0..32e0286 100644
--- a/js/build_page.js
+++ b/js/build_page.js
@@ -17,15 +17,15 @@
 };
 
 function fillInSummary() {
-  var begins = new Date(parseInt(final_JSON.class.begins)*1000);
-  var ends = new Date(parseInt(final_JSON.class.ends)*1000);
+    var begins = new Date(parseInt(final_JSON.class.begins)*1000);
+    var ends = new Date(parseInt(final_JSON.class.ends)*1000);
 
-  document.getElementById('subject-final').textContent = final_JSON.class.friendly_name || final_JSON.class.calendar_name;
-  document.getElementById('classroom-final').textContent = final_JSON.class.room;
-  document.getElementById('date-final').textContent = begins.toLocaleDateString();
-  document.getElementById('time-final').textContent = formatDate(begins) + ' - ' + formatDate(ends);
-  document.getElementById('letter-final').textContent = final_JSON.letter;
-  document.getElementById('number-final').textContent = final_JSON.number;
+    document.getElementById('subject-final').textContent = final_JSON.class.friendly_name || final_JSON.class.calendar_name;
+    document.getElementById('classroom-final').textContent = final_JSON.class.room;
+    document.getElementById('date-final').textContent = begins.toLocaleDateString();
+    document.getElementById('time-final').textContent = formatDate(begins) + ' - ' + formatDate(ends);
+    document.getElementById('letter-final').textContent = final_JSON.letter;
+    document.getElementById('number-final').textContent = final_JSON.number;
 }
 
 function clickButton(element) {
@@ -74,102 +74,102 @@
 var api_url;
 
 window.addEventListener('load', _ => {
-// Check if user is signed in
-if (localStorage.getItem('devMode') == 'true') {
-  var banner = document.getElementById('dev-mode');
-  banner.addEventListener('click', _ => {
-    localStorage.devMode = 'false';
-    location.reload();
-  });
-  banner.classList.remove('hidden');
-  api_url = localStorage.getItem('apiUrl') || 'https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/'
-} else {
-  api_url = "https://covid-tracability-backend-prod.sandbox.avm99963.com/api/v1/";
-}
-fetch(api_url + "isSignedIn", {
-  "mode": "cors",
-  "credentials": "include"
-})
-    .then(response => response.json())
-    .then(data => {
-        if (!data.payload.signedIn) {
-            console.log("Not signed in!");
-            fetch(api_url + "getAuthUrl", {
-              "mode": "cors",
-              "credentials": "include"
-            })
-                .then(response => response.json())
-                .then(data => {
-                    // TODO: redirect here
-                    // location.href = data.payload.url;
-                    console.warn('Log in here: ', data.payload.url);
-                });
-        }
-    });
+    // Check if user is signed in
+    if (localStorage.getItem('devMode') == 'true') {
+        var banner = document.getElementById('dev-mode');
+        banner.addEventListener('click', _ => {
+            localStorage.devMode = 'false';
+            location.reload();
+        });
+        banner.classList.remove('hidden');
+        api_url = localStorage.getItem('apiUrl') || 'https://covid-tracability-backend-dev.sandbox.avm99963.com/api/v1/'
+    } else {
+        api_url = "https://covid-tracability-backend-prod.sandbox.avm99963.com/api/v1/";
+    }
+    fetch(api_url + "isSignedIn", {
+        "mode": "cors",
+        "credentials": "include"
+    })
+        .then(response => response.json())
+        .then(data => {
+            if (!data.payload.signedIn) {
+                console.log("Not signed in!");
+                fetch(api_url + "getAuthUrl", {
+                    "mode": "cors",
+                    "credentials": "include"
+                })
+                    .then(response => response.json())
+                    .then(data => {
+                        // TODO: redirect here
+                        // location.href = data.payload.url;
+                        console.warn('Log in here: ', data.payload.url);
+                    });
+            }
+        });
 
-fetch(api_url + "getCurrentClasses", {
-  "mode": "cors",
-  "credentials": "include"
-})
-    .then(response => response.json())
-    .then(data => {
-        if (data.payload.classes.length == 0) {
-            document.getElementById('no-subjects').classList.remove('hidden');
-        } else {
-            document.getElementById('fme-maps-container').classList.remove('hidden');
-        }
-
-        for (var [i, classe] of data.payload.classes.entries()) {
-            var hora_inici = formatDate(new Date(parseInt(classe.begins)*1000));
-            var hora_final = formatDate(new Date(parseInt(classe.ends)*1000));
-            
-            var classeDiv = document.createElement('div');
-            classeDiv.classList.add('message', 'complex-button');
-            classeDiv.id = 'subject-' + classe.subject_id + '-' + classe.room;
-            classeDiv.setAttribute('data-class', JSON.stringify(classe));
-
-            var header = document.createElement('div');
-            header.classList.add('message-header');
-            header.textContent = classe.friendly_name || classe.calendar_name;
-
-            var body = document.createElement('div');
-            body.classList.add('message-body');
-
-            var div1 = document.createElement('div');
-            var span = document.createElement('span');
-            span.textContent = classe.room;
-
-            if (i > 0 && data.payload.classes[i-1].calendar_name == classe.calendar_name) {
-                div1.classList.add('has-text-danger', 'has-text-weight-bold');
-            } else if (i < data.payload.classes.length - 1 && data.payload.classes[i+1].calendar_name == classe.calendar_name) {
-                div1.classList.add('has-text-danger', 'has-text-weight-bold');
+    fetch(api_url + "getCurrentClasses", {
+        "mode": "cors",
+        "credentials": "include"
+    })
+        .then(response => response.json())
+        .then(data => {
+            if (data.payload.classes.length == 0) {
+                document.getElementById('no-subjects').classList.remove('hidden');
+            } else {
+                document.getElementById('fme-maps-container').classList.remove('hidden');
             }
 
-            div1.textContent = 'Aula ';
-            div1.appendChild(span);
+            for (var [i, classe] of data.payload.classes.entries()) {
+                var hora_inici = formatDate(new Date(parseInt(classe.begins)*1000));
+                var hora_final = formatDate(new Date(parseInt(classe.ends)*1000));
 
-            var div2 = document.createElement('div');
-            div2.textContent = hora_inici + ' - ' + hora_final;
+                var classeDiv = document.createElement('div');
+                classeDiv.classList.add('message', 'complex-button');
+                classeDiv.id = 'subject-' + classe.subject_id + '-' + classe.room;
+                classeDiv.setAttribute('data-class', JSON.stringify(classe));
 
-            body.appendChild(div1);
-            body.appendChild(div2);
+                var header = document.createElement('div');
+                header.classList.add('message-header');
+                header.textContent = classe.friendly_name || classe.calendar_name;
 
-            classeDiv.appendChild(header);
-            classeDiv.appendChild(body);
+                var body = document.createElement('div');
+                body.classList.add('message-body');
 
-            document.getElementById("subject-container").appendChild(classeDiv);
-        }
+                var div1 = document.createElement('div');
+                var span = document.createElement('span');
+                span.textContent = classe.room;
 
-        var elements = document.getElementsByClassName("button");
-        Array.from(elements).forEach(function(element) {
-            element.addEventListener('click', clickButton);
-            element.parent = element.parentNode.id;
+                if (i > 0 && data.payload.classes[i-1].calendar_name == classe.calendar_name) {
+                    div1.classList.add('has-text-danger', 'has-text-weight-bold');
+                } else if (i < data.payload.classes.length - 1 && data.payload.classes[i+1].calendar_name == classe.calendar_name) {
+                    div1.classList.add('has-text-danger', 'has-text-weight-bold');
+                }
+
+                div1.textContent = 'Aula ';
+                div1.appendChild(span);
+
+                var div2 = document.createElement('div');
+                div2.textContent = hora_inici + ' - ' + hora_final;
+
+                body.appendChild(div1);
+                body.appendChild(div2);
+
+                classeDiv.appendChild(header);
+                classeDiv.appendChild(body);
+
+                document.getElementById("subject-container").appendChild(classeDiv);
+            }
+
+            var elements = document.getElementsByClassName("button");
+            Array.from(elements).forEach(function(element) {
+                element.addEventListener('click', clickButton);
+                element.parent = element.parentNode.id;
+            });
+            var elements = document.getElementsByClassName("complex-button");
+            Array.from(elements).forEach(function(element) {
+                element.addEventListener('click', clickButton);
+                element.parent = element.parentNode.id;
+            });
         });
-        var elements = document.getElementsByClassName("complex-button");
-        Array.from(elements).forEach(function(element) {
-            element.addEventListener('click', clickButton);
-            element.parent = element.parentNode.id;
-        });
-    });
 });
 
