diff --git a/public/main.js b/public/main.js
index d851088a01aa59cbb23c9065cb6b4f74fa5dd61c..4742f2f35b6d4bf2e6bcef98668a8fb547bac7fb 100644
--- a/public/main.js
+++ b/public/main.js
@@ -1,10 +1,19 @@
+const cores = navigator.hardwareConcurrency;
+
+addEventsListeners(document.querySelectorAll("#salt, #pass"),"change keyup",updateEstimate);
+updateEstimate();
+function updateEstimate(){
+	const idSecList = multiLineString2cleanArray(document.getElementById("salt").value);
+	const passList = multiLineString2cleanArray(document.getElementById("pass").value);
+	document.getElementById("combi").innerHTML = idSecList.length*passList.length;
+	document.getElementById("temps").innerHTML = (idSecList.length*passList.length)+"s";
+}
 document.getElementById("compute").addEventListener("click",e=>{
 	const pub = document.getElementById("pubkey").value.trim();
 	const pubRaw = Base58.decode(pub);
-	const idSecList = document.getElementById("salt").value.split("\n").map(str=>str.trim());
-	const passList = document.getElementById("pass").value.split("\n").map(str=>str.trim());
-	document.getElementById("combi").innerHTML = idSecList.length*passList.length;
-	document.getElementById("temps").innerHTML = (idSecList.length*passList.length)+"s";
+	const idSecList = multiLineString2cleanArray(document.getElementById("salt").value);
+	const passList = multiLineString2cleanArray(document.getElementById("pass").value);
+	updateEstimate();
 	document.getElementById("percent").innerHTML = "0%";
 
 	for(let idSec of idSecList){
@@ -50,3 +59,11 @@ async function crypt(password, salt){
 	});
 
 }
+function addEventsListeners(triggerNodes,events,functions){
+	if(!triggerNodes.length) triggerNodes = [triggerNodes];
+	if(typeof events !== "object") events = events.split(" ");
+	if(typeof functions !== "object") functions = [functions];
+	console.log(triggerNodes[0].addEventListener, events, functions);
+	for(let n of triggerNodes) events.forEach(e=> functions.forEach(f=>n.addEventListener(e,f)));
+}
+function multiLineString2cleanArray(rawStr){ return rawStr.split("\n").map(str=>str.trim()).filter(str=>str !== ""); }