diff --git a/.eslintrc.json b/.eslintrc.json
index 20bb36b..ef6d32e 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -40,7 +40,6 @@
         "no-use-before-define": "off",
         "strict": "off",
         "lines-around-directive": "off",
-        "no-shadow": "off",
         "no-restricted-globals": "off",
         "default-case": "off",
         "nonblock-statement-body-position": "off",
diff --git a/player/js/animation/AnimationManager.js b/player/js/animation/AnimationManager.js
index 4aa9055..c6d980c 100644
--- a/player/js/animation/AnimationManager.js
+++ b/player/js/animation/AnimationManager.js
@@ -41,9 +41,9 @@
   }
 
   function getRegisteredAnimations() {
-    var i, len = registeredAnimations.length;
+    var i, lenAnims = registeredAnimations.length;
     var animations = [];
-    for (i = 0; i < len; i += 1) {
+    for (i = 0; i < lenAnims; i += 1) {
       animations.push(registeredAnimations[i].animation);
     }
     return animations;
@@ -150,14 +150,14 @@
   function searchAnimations(animationData, standalone, renderer) {
     var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')),
       [].slice.call(document.getElementsByClassName('bodymovin')));
-    var i, len = animElements.length;
-    for (i = 0; i < len; i += 1) {
+    var i, lenAnims = animElements.length;
+    for (i = 0; i < lenAnims; i += 1) {
       if (renderer) {
         animElements[i].setAttribute('data-bm-type', renderer);
       }
       registerAnimation(animElements[i], animationData);
     }
-    if (standalone && len === 0) {
+    if (standalone && lenAnims === 0) {
       if (!renderer) {
         renderer = 'svg';
       }
diff --git a/player/js/animation/AnimationManagerWorkerOverride.js b/player/js/animation/AnimationManagerWorkerOverride.js
index a2c05ed..60c0260 100644
--- a/player/js/animation/AnimationManagerWorkerOverride.js
+++ b/player/js/animation/AnimationManagerWorkerOverride.js
@@ -41,9 +41,9 @@
   }
 
   function getRegisteredAnimations() {
-    var i, len = registeredAnimations.length;
+    var i, lenAnims = registeredAnimations.length;
     var animations = [];
-    for (i = 0; i < len; i += 1) {
+    for (i = 0; i < lenAnims; i += 1) {
       animations.push(registeredAnimations[i].animation);
     }
     return animations;
diff --git a/player/js/module_worker.js b/player/js/module_worker.js
index cb01edc..c186eba 100644
--- a/player/js/module_worker.js
+++ b/player/js/module_worker.js
@@ -1,7 +1,7 @@
 var lottiejs = (function (window) {
   'use strict';
   /* <%= contents %> */
-  var lottiejs = {};
+  var lottiejsLibrary = {};
 
   var _isFrozen = false;
 
@@ -32,28 +32,28 @@
     }
   }
 
-  lottiejs.play = animationManager.play;
-  lottiejs.pause = animationManager.pause;
-  lottiejs.togglePause = animationManager.togglePause;
-  lottiejs.setSpeed = animationManager.setSpeed;
-  lottiejs.setDirection = animationManager.setDirection;
-  lottiejs.stop = animationManager.stop;
-  lottiejs.registerAnimation = animationManager.registerAnimation;
-  lottiejs.loadAnimation = loadAnimation;
-  lottiejs.resize = animationManager.resize;
-  lottiejs.goToAndStop = animationManager.goToAndStop;
-  lottiejs.destroy = animationManager.destroy;
-  lottiejs.setQuality = setQuality;
-  lottiejs.freeze = animationManager.freeze;
-  lottiejs.unfreeze = animationManager.unfreeze;
+  lottiejsLibrary.play = animationManager.play;
+  lottiejsLibrary.pause = animationManager.pause;
+  lottiejsLibrary.togglePause = animationManager.togglePause;
+  lottiejsLibrary.setSpeed = animationManager.setSpeed;
+  lottiejsLibrary.setDirection = animationManager.setDirection;
+  lottiejsLibrary.stop = animationManager.stop;
+  lottiejsLibrary.registerAnimation = animationManager.registerAnimation;
+  lottiejsLibrary.loadAnimation = loadAnimation;
+  lottiejsLibrary.resize = animationManager.resize;
+  lottiejsLibrary.goToAndStop = animationManager.goToAndStop;
+  lottiejsLibrary.destroy = animationManager.destroy;
+  lottiejsLibrary.setQuality = setQuality;
+  lottiejsLibrary.freeze = animationManager.freeze;
+  lottiejsLibrary.unfreeze = animationManager.unfreeze;
   lottie.setVolume = animationManager.setVolume;
   lottie.mute = animationManager.mute;
   lottie.unmute = animationManager.unmute;
-  lottiejs.getRegisteredAnimations = animationManager.getRegisteredAnimations;
-  lottiejs.version = '[[BM_VERSION]]';
+  lottiejsLibrary.getRegisteredAnimations = animationManager.getRegisteredAnimations;
+  lottiejsLibrary.version = '[[BM_VERSION]]';
 
   var renderer = '';
-  return lottiejs;
+  return lottiejsLibrary;
 }({}));
 
 var animations = [];
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index ac14582..2f63cda 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -256,7 +256,7 @@
   var checkShapes = (function () {
     var minimumVersion = [4, 4, 18];
 
-    function completeShapes(arr) {
+    function completeClosingShapes(arr) {
       var i, len = arr.length;
       var j, jLen;
       var hasPaths = false;
@@ -277,7 +277,7 @@
           }
           hasPaths = true;
         } else if (arr[i].ty == 'gr') {
-          completeShapes(arr[i].it);
+          completeClosingShapes(arr[i].it);
         }
       }
     }
@@ -308,7 +308,7 @@
           }
         }
         if (layerData.ty === 4) {
-          completeShapes(layerData.shapes);
+          completeClosingShapes(layerData.shapes);
         }
       }
     }
diff --git a/player/js/utils/expressions/ExpressionManager.js b/player/js/utils/expressions/ExpressionManager.js
index b30dbb4..7c131d3 100644
--- a/player/js/utils/expressions/ExpressionManager.js
+++ b/player/js/utils/expressions/ExpressionManager.js
@@ -377,26 +377,26 @@
     var active = !this.data || this.data.hd !== true;
 
     var wiggle = function wiggle(freq, amp) {
-      var i, j, len = this.pv.length ? this.pv.length : 1;
-      var addedAmps = createTypedArray('float32', len);
+      var iWiggle, j, lenWiggle = this.pv.length ? this.pv.length : 1;
+      var addedAmps = createTypedArray('float32', lenWiggle);
       freq = 5;
       var iterations = Math.floor(time * freq);
-      i = 0;
+      iWiggle = 0;
       j = 0;
-      while (i < iterations) {
+      while (iWiggle < iterations) {
         // var rnd = BMMath.random();
-        for (j = 0; j < len; j += 1) {
+        for (j = 0; j < lenWiggle; j += 1) {
           addedAmps[j] += -amp + amp * 2 * BMMath.random();
           // addedAmps[j] += -amp + amp*2*rnd;
         }
-        i += 1;
+        iWiggle += 1;
       }
       // var rnd2 = BMMath.random();
       var periods = time * freq;
       var perc = periods - Math.floor(periods);
-      var arr = createTypedArray('float32', len);
-      if (len > 1) {
-        for (j = 0; j < len; j += 1) {
+      var arr = createTypedArray('float32', lenWiggle);
+      if (lenWiggle > 1) {
+        for (j = 0; j < lenWiggle; j += 1) {
           arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp * 2 * BMMath.random()) * perc;
           // arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc;
           // arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc);
@@ -468,10 +468,10 @@
       t = t > 1 ? 1 : t < 0 ? 0 : t;
       var mult = fn(t);
       if ($bm_isInstanceOfArray(val1)) {
-        var i, len = val1.length;
-        var arr = createTypedArray('float32', len);
-        for (i = 0; i < len; i += 1) {
-          arr[i] = (val2[i] - val1[i]) * mult + val1[i];
+        var iKey, lenKey = val1.length;
+        var arr = createTypedArray('float32', lenKey);
+        for (iKey = 0; iKey < lenKey; iKey += 1) {
+          arr[iKey] = (val2[iKey] - val1[iKey]) * mult + val1[iKey];
         }
         return arr;
       } else {
@@ -480,7 +480,7 @@
     }
 
     function nearestKey(time) {
-      var i, len = data.k.length, index, keyTime;
+      var iKey, lenKey = data.k.length, index, keyTime;
       if (!data.k.length || typeof (data.k[0]) === 'number') {
         index = 0;
         keyTime = 0;
@@ -491,52 +491,52 @@
           index = 1;
           keyTime = data.k[0].t;
         } else {
-          for (i = 0; i < len - 1; i += 1) {
-            if (time === data.k[i].t) {
-              index = i + 1;
-              keyTime = data.k[i].t;
+          for (iKey = 0; iKey < lenKey - 1; iKey += 1) {
+            if (time === data.k[iKey].t) {
+              index = iKey + 1;
+              keyTime = data.k[iKey].t;
               break;
-            } else if (time > data.k[i].t && time < data.k[i + 1].t) {
-              if (time - data.k[i].t > data.k[i + 1].t - time) {
-                index = i + 2;
-                keyTime = data.k[i + 1].t;
+            } else if (time > data.k[iKey].t && time < data.k[iKey + 1].t) {
+              if (time - data.k[iKey].t > data.k[iKey + 1].t - time) {
+                index = iKey + 2;
+                keyTime = data.k[iKey + 1].t;
               } else {
-                index = i + 1;
-                keyTime = data.k[i].t;
+                index = iKey + 1;
+                keyTime = data.k[iKey].t;
               }
               break;
             }
           }
           if (index === -1) {
-            index = i + 1;
-            keyTime = data.k[i].t;
+            index = iKey + 1;
+            keyTime = data.k[iKey].t;
           }
         }
       }
-      var ob = {};
-      ob.index = index;
-      ob.time = keyTime / elem.comp.globalData.frameRate;
-      return ob;
+      var obKey = {};
+      obKey.index = index;
+      obKey.time = keyTime / elem.comp.globalData.frameRate;
+      return obKey;
     }
 
     function key(ind) {
-      var ob, i, len;
+      var obKey, iKey, lenKey;
       if (!data.k.length || typeof (data.k[0]) === 'number') {
         throw new Error('The property has no keyframe at index ' + ind);
       }
       ind -= 1;
-      ob = {
+      obKey = {
         time: data.k[ind].t / elem.comp.globalData.frameRate,
         value: [],
       };
       var arr = data.k[ind].hasOwnProperty('s') ? data.k[ind].s : data.k[ind - 1].e;
 
-      len = arr.length;
-      for (i = 0; i < len; i += 1) {
-        ob[i] = arr[i];
-        ob.value[i] = arr[i];
+      lenKey = arr.length;
+      for (iKey = 0; iKey < lenKey; iKey += 1) {
+        obKey[iKey] = arr[iKey];
+        obKey.value[iKey] = arr[iKey];
       }
-      return ob;
+      return obKey;
     }
 
     function framesToTime(frames, fps) {
diff --git a/player/js/utils/expressions/TextSelectorPropertyDecorator.js b/player/js/utils/expressions/TextSelectorPropertyDecorator.js
index de9f4ef..952fe45 100644
--- a/player/js/utils/expressions/TextSelectorPropertyDecorator.js
+++ b/player/js/utils/expressions/TextSelectorPropertyDecorator.js
@@ -7,7 +7,7 @@
       return this.v;
     }
 
-    return function TextExpressionSelectorProp(elem, data) {
+    return function TextExpressionSelectorPropFactory(elem, data) {
       this.pv = 1;
       this.comp = elem.comp;
       this.elem = elem;
@@ -33,7 +33,7 @@
   var propertyGetTextProp = TextSelectorProp.getTextSelectorProp;
   TextSelectorProp.getTextSelectorProp = function (elem, data, arr) {
     if (data.t === 1) {
-      return new TextExpressionSelectorProp(elem, data, arr);
+      return new TextExpressionSelectorPropFactory(elem, data, arr);
     } else {
       return propertyGetTextProp(elem, data, arr);
     }
diff --git a/player/js/utils/helpers/arrays.js b/player/js/utils/helpers/arrays.js
index 6efa9cd..108fee2 100644
--- a/player/js/utils/helpers/arrays.js
+++ b/player/js/utils/helpers/arrays.js
@@ -15,7 +15,7 @@
     }
     return arr;
   }
-  function createTypedArray(type, len) {
+  function createTypedArrayFactory(type, len) {
     if (type === 'float32') {
       return new Float32Array(len);
     } else if (type === 'int16') {
@@ -26,7 +26,7 @@
     return createRegularArray(type, len);
   }
   if (typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {
-    return createTypedArray;
+    return createTypedArrayFactory;
   } else {
     return createRegularArray;
   }
diff --git a/player/js/utils/imagePreloader.js b/player/js/utils/imagePreloader.js
index f2ef9b3..35ce2d1 100644
--- a/player/js/utils/imagePreloader.js
+++ b/player/js/utils/imagePreloader.js
@@ -134,7 +134,7 @@
     }
   }
 
-  function ImagePreloader(type) {
+  function ImagePreloaderFactory(type) {
     this._imageLoaded = imageLoaded.bind(this);
     this.testImageLoaded = testImageLoaded.bind(this);
     this.assetsPath = '';
@@ -145,7 +145,7 @@
     this.images = [];
   }
 
-  ImagePreloader.prototype = {
+  ImagePreloaderFactory.prototype = {
     loadAssets: loadAssets,
     setAssetsPath: setAssetsPath,
     setPath: setPath,
@@ -158,5 +158,5 @@
     setCacheType: setCacheType,
   };
 
-  return ImagePreloader;
+  return ImagePreloaderFactory;
 }());
diff --git a/player/js/utils/shapes/ShapeProperty.js b/player/js/utils/shapes/ShapeProperty.js
index 0f946dc..7e77ad0 100644
--- a/player/js/utils/shapes/ShapeProperty.js
+++ b/player/js/utils/shapes/ShapeProperty.js
@@ -198,7 +198,7 @@
   var EllShapeProperty = (function () {
     var cPoint = roundCorner;
 
-    function EllShapeProperty(elem, data) {
+    function EllShapePropertyFactory(elem, data) {
       /* this.v = {
                 v: createSizedArray(4),
                 i: createSizedArray(4),
@@ -225,7 +225,7 @@
       }
     }
 
-    EllShapeProperty.prototype = {
+    EllShapePropertyFactory.prototype = {
       reset: resetShape,
       getValue: function () {
         if (this.elem.globalData.frameId === this.frameId) {
@@ -269,13 +269,13 @@
       },
     };
 
-    extendPrototype([DynamicPropertyContainer], EllShapeProperty);
+    extendPrototype([DynamicPropertyContainer], EllShapePropertyFactory);
 
-    return EllShapeProperty;
+    return EllShapePropertyFactory;
   }());
 
   var StarShapeProperty = (function () {
-    function StarShapeProperty(elem, data) {
+    function StarShapePropertyFactory(elem, data) {
       this.v = shape_pool.newElement();
       this.v.setPathData(true, 0);
       this.elem = elem;
@@ -307,7 +307,7 @@
       }
     }
 
-    StarShapeProperty.prototype = {
+    StarShapePropertyFactory.prototype = {
       reset: resetShape,
       getValue: function () {
         if (this.elem.globalData.frameId === this.frameId) {
@@ -381,13 +381,13 @@
       },
 
     };
-    extendPrototype([DynamicPropertyContainer], StarShapeProperty);
+    extendPrototype([DynamicPropertyContainer], StarShapePropertyFactory);
 
-    return StarShapeProperty;
+    return StarShapePropertyFactory;
   }());
 
   var RectShapeProperty = (function () {
-    function RectShapeProperty(elem, data) {
+    function RectShapePropertyFactory(elem, data) {
       this.v = shape_pool.newElement();
       this.v.c = true;
       this.localShapeCollection = shapeCollection_pool.newShapeCollection();
@@ -409,7 +409,7 @@
       }
     }
 
-    RectShapeProperty.prototype = {
+    RectShapePropertyFactory.prototype = {
       convertRectToPath: function () {
         var p0 = this.p.v[0], p1 = this.p.v[1], v0 = this.s.v[0] / 2, v1 = this.s.v[1] / 2;
         var round = bm_min(v0, v1, this.r.v);
@@ -459,9 +459,9 @@
       },
       reset: resetShape,
     };
-    extendPrototype([DynamicPropertyContainer], RectShapeProperty);
+    extendPrototype([DynamicPropertyContainer], RectShapePropertyFactory);
 
-    return RectShapeProperty;
+    return RectShapePropertyFactory;
   }());
 
   function getShapeProp(elem, data, type) {
diff --git a/player/js/utils/text/TextSelectorProperty.js b/player/js/utils/text/TextSelectorProperty.js
index 23da845..b465143 100644
--- a/player/js/utils/text/TextSelectorProperty.js
+++ b/player/js/utils/text/TextSelectorProperty.js
@@ -3,7 +3,7 @@
   var min = Math.min;
   var floor = Math.floor;
 
-  function TextSelectorProp(elem, data) {
+  function TextSelectorPropFactory(elem, data) {
     this._currentTextLength = -1;
     this.k = false;
     this.data = data;
@@ -27,7 +27,7 @@
     }
   }
 
-  TextSelectorProp.prototype = {
+  TextSelectorPropFactory.prototype = {
     getMult: function (ind) {
       if (this._currentTextLength !== this.elem.textProperty.currentData.l.length) {
         this.getValue();
@@ -133,10 +133,10 @@
       this.finalE = e;
     },
   };
-  extendPrototype([DynamicPropertyContainer], TextSelectorProp);
+  extendPrototype([DynamicPropertyContainer], TextSelectorPropFactory);
 
   function getTextSelectorProp(elem, data, arr) {
-    return new TextSelectorProp(elem, data, arr);
+    return new TextSelectorPropFactory(elem, data, arr);
   }
 
   return {
