diff --git a/.eslintrc.json b/.eslintrc.json
index a8c5099..49565b4 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -25,7 +25,6 @@
         "vars-on-top": "off",
         "comma-dangle": "off",
         "key-spacing": "off",
-        "space-in-parens": "off",
         "no-continue": "off",
         "no-plusplus": "off",
         "semi": "off",
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 62c69c2..72d39d9 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -75,7 +75,7 @@
     this.configAnimation(params.animationData);
   } else if(params.path) {
 
-    if( params.path.lastIndexOf('\\') !== -1) {
+    if(params.path.lastIndexOf('\\') !== -1) {
       this.path = params.path.substr(0, params.path.lastIndexOf('\\') + 1);
     } else {
       this.path = params.path.substr(0, params.path.lastIndexOf('/') + 1);
diff --git a/player/js/animation/AnimationManager.js b/player/js/animation/AnimationManager.js
index 528d8fe..978cc07 100644
--- a/player/js/animation/AnimationManager.js
+++ b/player/js/animation/AnimationManager.js
@@ -29,7 +29,7 @@
     }
     var i = 0;
     while(i < len) {
-      if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null ) {
+      if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null) {
         return registeredAnimations[i].animation;
       }
       i += 1;
diff --git a/player/js/animation/AnimationManagerWorkerOverride.js b/player/js/animation/AnimationManagerWorkerOverride.js
index b2501ba..58445af 100644
--- a/player/js/animation/AnimationManagerWorkerOverride.js
+++ b/player/js/animation/AnimationManagerWorkerOverride.js
@@ -29,7 +29,7 @@
     }
     var i = 0;
     while(i < len) {
-      if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null ) {
+      if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null) {
         return registeredAnimations[i].animation;
       }
       i += 1;
diff --git a/player/js/elements/CompElement.js b/player/js/elements/CompElement.js
index 7dbd0cf..abfe08a 100644
--- a/player/js/elements/CompElement.js
+++ b/player/js/elements/CompElement.js
@@ -51,7 +51,7 @@
     this.checkLayers(this.renderedFrame);
   }
   // This iteration needs to be backwards because of how expressions connect between each other
-  for( i = len - 1; i >= 0; i -= 1 ) {
+  for(i = len - 1; i >= 0; i -= 1) {
     if(this.completeLayers || this.elements[i]) {
       this.elements[i].prepareFrame(this.renderedFrame - this.layers[i].st);
       if(this.elements[i]._mdf) {
@@ -63,7 +63,7 @@
 
 ICompElement.prototype.renderInnerContent = function () {
   var i, len = this.layers.length;
-  for( i = 0; i < len; i += 1 ) {
+  for(i = 0; i < len; i += 1) {
     if(this.completeLayers || this.elements[i]) {
       this.elements[i].renderFrame();
     }
@@ -80,7 +80,7 @@
 
 ICompElement.prototype.destroyElements = function () {
   var i, len = this.layers.length;
-  for( i = 0; i < len; i += 1 ) {
+  for(i = 0; i < len; i += 1) {
     if(this.elements[i]) {
       this.elements[i].destroy();
     }
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index 14677a7..e924402 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -62,7 +62,7 @@
       matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]), 0, 0);
       break;
     case 2:
-      matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber] ) / 2, 0, 0);
+      matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]) / 2, 0, 0);
       break;
   }
   matrixHelper.translate(xPos, yPos, 0);
diff --git a/player/js/elements/canvasElements/CVCompElement.js b/player/js/elements/canvasElements/CVCompElement.js
index c423dd5..397a40a 100644
--- a/player/js/elements/canvasElements/CVCompElement.js
+++ b/player/js/elements/canvasElements/CVCompElement.js
@@ -19,7 +19,7 @@
   ctx.lineTo(0, 0);
   ctx.clip();
   var i, len = this.layers.length;
-  for( i = len - 1; i >= 0; i -= 1 ) {
+  for(i = len - 1; i >= 0; i -= 1) {
     if(this.completeLayers || this.elements[i]) {
       this.elements[i].renderFrame();
     }
@@ -28,7 +28,7 @@
 
 CVCompElement.prototype.destroy = function () {
   var i, len = this.layers.length;
-  for( i = len - 1; i >= 0; i -= 1 ) {
+  for(i = len - 1; i >= 0; i -= 1) {
     if(this.elements[i]) {
       this.elements[i].destroy();
     }
diff --git a/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js b/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
index c9017da..f8827ab 100644
--- a/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
+++ b/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
@@ -34,7 +34,7 @@
     gfill.appendChild(stop);
     stops.push(stop);
   }
-  pathElement.setAttribute( data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + locationHref + '#' + gradientId + ')');
+  pathElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + locationHref + '#' + gradientId + ')');
     
   this.gf = gfill;
   this.cst = stops;
@@ -44,7 +44,7 @@
   if(this.g._hasOpacity && !this.g._collapsable) {
     var stop, j, jLen;
     var mask = createNS('mask');
-    var maskElement = createNS( 'path');
+    var maskElement = createNS('path');
     mask.appendChild(maskElement);
     var opacityId = createElementID();
     var maskId = createElementID();
@@ -61,7 +61,7 @@
       opFill.appendChild(stop);
       stops.push(stop);
     }
-    maskElement.setAttribute( data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + locationHref + '#' + opacityId + ')');
+    maskElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + locationHref + '#' + opacityId + ')');
     this.of = opFill;
     this.ms = mask;
     this.ost = stops;
diff --git a/player/js/elements/htmlElements/HCameraElement.js b/player/js/elements/htmlElements/HCameraElement.js
index d25e357..d5df0d3 100644
--- a/player/js/elements/htmlElements/HCameraElement.js
+++ b/player/js/elements/htmlElements/HCameraElement.js
@@ -95,9 +95,9 @@
       var mag = Math.sqrt(Math.pow(diffVector[0], 2) + Math.pow(diffVector[1], 2) + Math.pow(diffVector[2], 2));
       // var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));
       var lookDir = [diffVector[0] / mag, diffVector[1] / mag, diffVector[2] / mag];
-      var lookLengthOnXZ = Math.sqrt( lookDir[2] * lookDir[2] + lookDir[0] * lookDir[0] );
-      var m_rotationX = (Math.atan2( lookDir[1], lookLengthOnXZ ));
-      var m_rotationY = (Math.atan2( lookDir[0], -lookDir[2]));
+      var lookLengthOnXZ = Math.sqrt(lookDir[2] * lookDir[2] + lookDir[0] * lookDir[0]);
+      var m_rotationX = (Math.atan2(lookDir[1], lookLengthOnXZ));
+      var m_rotationY = (Math.atan2(lookDir[0], -lookDir[2]));
       this.mat.rotateY(m_rotationY).rotateX(-m_rotationX);
 
     }
diff --git a/player/js/elements/svgElements/SVGBaseElement.js b/player/js/elements/svgElements/SVGBaseElement.js
index ecad712..38c990a 100644
--- a/player/js/elements/svgElements/SVGBaseElement.js
+++ b/player/js/elements/svgElements/SVGBaseElement.js
@@ -97,7 +97,7 @@
     }
     // Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped
     if (this.data.ty === 0 && !this.data.hd) {
-      var cp = createNS( 'clipPath');
+      var cp = createNS('clipPath');
       var pt = createNS('path');
       pt.setAttribute('d', 'M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');
       var clipId = createElementID();
diff --git a/player/js/elements/svgElements/SVGShapeElement.js b/player/js/elements/svgElements/SVGShapeElement.js
index c3afb29..e1c5215 100644
--- a/player/js/elements/svgElements/SVGShapeElement.js
+++ b/player/js/elements/svgElements/SVGShapeElement.js
@@ -181,7 +181,7 @@
 SVGShapeElement.prototype.reloadShapes = function () {
   this._isFirstFrame = true;
   var i, len = this.itemsData.length;
-  for( i = 0; i < len; i += 1) {
+  for(i = 0; i < len; i += 1) {
     this.prevViewData[i] = this.itemsData[i];
   }
   this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.layerElement, 0, [], true);
diff --git a/player/js/elements/svgElements/SVGTextElement.js b/player/js/elements/svgElements/SVGTextElement.js
index 9883618..bfb9f8a 100644
--- a/player/js/elements/svgElements/SVGTextElement.js
+++ b/player/js/elements/svgElements/SVGTextElement.js
@@ -80,7 +80,7 @@
     var textContent = this.buildTextContents(documentData.finalText);
     len = textContent.length;
     yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0;
-    for ( i = 0; i < len; i += 1) {
+    for (i = 0; i < len; i += 1) {
       tSpan = this.textSpans[i] || createNS('tspan');
       tSpan.textContent = textContent[i];
       tSpan.setAttribute('x', 0);
diff --git a/player/js/mask.js b/player/js/mask.js
index 76c12f0..c9e84a3 100644
--- a/player/js/mask.js
+++ b/player/js/mask.js
@@ -25,7 +25,7 @@
     }
 
     if((properties[i].mode == 's' || properties[i].mode == 'i') && count === 0) {
-      rect = createNS( 'rect');
+      rect = createNS('rect');
       rect.setAttribute('fill', '#ffffff');
       rect.setAttribute('width', this.element.comp.data.w || 0);
       rect.setAttribute('height', this.element.comp.data.h || 0);
@@ -34,7 +34,7 @@
       rect = null;
     }
 
-    path = createNS( 'path');
+    path = createNS('path');
     if(properties[i].mode == 'n') {
       // TODO move this to a factory or to a constructor
       this.viewData[i] = {
@@ -115,7 +115,7 @@
     }
   }
 
-  this.maskElement = createNS( maskType);
+  this.maskElement = createNS(maskType);
 
   len = currentMasks.length;
   for(i = 0; i < len; i += 1) {
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index cfe5837..906000c 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -182,7 +182,7 @@
   if(this.animationItem.wrapper && this.animationItem.container) {
     elementWidth = this.animationItem.wrapper.offsetWidth;
     elementHeight = this.animationItem.wrapper.offsetHeight;
-    this.animationItem.container.setAttribute('width', elementWidth * this.renderConfig.dpr );
+    this.animationItem.container.setAttribute('width', elementWidth * this.renderConfig.dpr);
     this.animationItem.container.setAttribute('height', elementHeight * this.renderConfig.dpr);
   }else{
     elementWidth = this.canvasContext.canvas.width * this.renderConfig.dpr;
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index ec132af..be69299 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -23,7 +23,7 @@
   if (ariaLabel) {
     this.svgElement.setAttribute('aria-labelledby', ariaLabel)
   }
-  var defs = createNS( 'defs');
+  var defs = createNS('defs');
   this.svgElement.appendChild(defs);
   var maskElement = createNS('g');
   this.svgElement.appendChild(maskElement);
@@ -122,7 +122,7 @@
   this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;
   this.data = animData;
 
-  var maskElement = createNS( 'clipPath');
+  var maskElement = createNS('clipPath');
   var rect = createNS('rect');
   rect.setAttribute('width', animData.w);
   rect.setAttribute('height', animData.h);
diff --git a/player/js/utils/FontManager.js b/player/js/utils/FontManager.js
index d17a1a5..538b517 100644
--- a/player/js/utils/FontManager.js
+++ b/player/js/utils/FontManager.js
@@ -230,7 +230,7 @@
 
   function getCharData(char, style, font) {
     var i = 0, len = this.chars.length;
-    while( i < len) {
+    while(i < len) {
       if(this.chars[i].ch === char && this.chars[i].style === style && this.chars[i].fFamily === font) {
 
         return this.chars[i];
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index 7968ca0..4649182 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -147,7 +147,7 @@
                   fnc = keyData.__fnct;
                 }
               }
-              perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime ));
+              perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime));
             }
           }
 
diff --git a/player/js/utils/expressions/CompInterface.js b/player/js/utils/expressions/CompInterface.js
index 43e7d10..db3f67f 100644
--- a/player/js/utils/expressions/CompInterface.js
+++ b/player/js/utils/expressions/CompInterface.js
@@ -2,7 +2,7 @@
   return function (comp) {
     function _thisLayerFunction(name) {
       var i = 0, len = comp.layers.length;
-      while ( i < len) {
+      while (i < len) {
         if (comp.layers[i].nm === name || comp.layers[i].ind === name) {
           return comp.elements[i].layerInterface;
         }
diff --git a/player/js/utils/expressions/ExpressionManager.js b/player/js/utils/expressions/ExpressionManager.js
index 0430f30..6ac0d7e 100644
--- a/player/js/utils/expressions/ExpressionManager.js
+++ b/player/js/utils/expressions/ExpressionManager.js
@@ -15,7 +15,7 @@
 
   function $bm_neg(a) {
     var tOfA = typeof a;
-    if(tOfA === 'number' || tOfA === 'boolean'  || a instanceof Number ) {
+    if(tOfA === 'number' || tOfA === 'boolean'  || a instanceof Number) {
       return -a;
     }
     if($bm_isInstanceOfArray(a)) {
@@ -84,7 +84,7 @@
       }
       return a - b;
     }
-    if( $bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {
+    if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {
       a = a.slice(0);
       a[0] = a[0] - b;
       return a;
diff --git a/player/js/utils/shapes/MouseModifier.js b/player/js/utils/shapes/MouseModifier.js
index a389b58..9be17cc 100644
--- a/player/js/utils/shapes/MouseModifier.js
+++ b/player/js/utils/shapes/MouseModifier.js
@@ -35,7 +35,7 @@
 
     x = mouseCoords[0] - positions.v[i][0];
     y = mouseCoords[1] - positions.v[i][1];
-    var distance = Math.sqrt( (x * x) + (y * y) );
+    var distance = Math.sqrt((x * x) + (y * y));
     positions.distV[i] += (distance - positions.distV[i]) * this.data.dc;
 
     positions.v[i][0] = Math.cos(theta) * Math.max(0, this.data.maxDist - positions.distV[i]) / 2 + (path.v[i][0]);
@@ -49,7 +49,7 @@
 
     x = mouseCoords[0] - positions.o[i][0];
     y = mouseCoords[1] - positions.o[i][1];
-    var distance = Math.sqrt( (x * x) + (y * y) );
+    var distance = Math.sqrt((x * x) + (y * y));
     positions.distO[i] += (distance - positions.distO[i]) * this.data.dc;
 
     positions.o[i][0] = Math.cos(theta) * Math.max(0, this.data.maxDist - positions.distO[i]) / 2 + (path.o[i][0]);
@@ -63,7 +63,7 @@
 
     x = mouseCoords[0] - positions.i[i][0];
     y = mouseCoords[1] - positions.i[i][1];
-    var distance = Math.sqrt( (x * x) + (y * y) );
+    var distance = Math.sqrt((x * x) + (y * y));
     positions.distI[i] += (distance - positions.distI[i]) * this.data.dc;
 
     positions.i[i][0] = Math.cos(theta) * Math.max(0, this.data.maxDist - positions.distI[i]) / 2 + (path.i[i][0]);
diff --git a/player/js/utils/text/TextAnimatorProperty.js b/player/js/utils/text/TextAnimatorProperty.js
index cfd5b7e..f45f691 100644
--- a/player/js/utils/text/TextAnimatorProperty.js
+++ b/player/js/utils/text/TextAnimatorProperty.js
@@ -189,7 +189,7 @@
   }
   //
 
-  for( i = 0; i < len; i += 1) {
+  for(i = 0; i < len; i += 1) {
 
     matrixHelper.reset();
     elemOpacity = 1;
