Perf
diff --git a/manimlib/animation/indication.py b/manimlib/animation/indication.py
index 0c425b7f43..1ff261596e 100644
--- a/manimlib/animation/indication.py
+++ b/manimlib/animation/indication.py
@@ -9,6 +9,7 @@
 from manimlib.animation.creation import ShowCreation
 from manimlib.animation.creation import ShowPartial
 from manimlib.animation.fading import FadeOut
+from manimlib.animation.fading import FadeIn
 from manimlib.animation.transform import Transform
 from manimlib.mobject.types.vectorized_mobject import VMobject
 from manimlib.mobject.geometry import Circle
@@ -21,6 +22,8 @@
 from manimlib.utils.config_ops import digest_config
 from manimlib.utils.rate_functions import there_and_back
 from manimlib.utils.rate_functions import wiggle
+from manimlib.utils.rate_functions import smooth
+from manimlib.utils.rate_functions import squish_rate_func
 
 
 class FocusOn(Transform):
@@ -361,3 +364,22 @@ class TurnInsideOut(Transform):
 
     def create_target(self):
         return self.mobject.copy().reverse_points()
+
+
+class FlashyFadeIn(AnimationGroup):
+    CONFIG = {
+        "fade_lag": 0,
+    }
+
+    def __init__(self, vmobject, stroke_width=2, **kwargs):
+        digest_config(self, kwargs)
+        outline = vmobject.copy()
+        outline.set_fill(opacity=0)
+        outline.set_stroke(width=stroke_width, opacity=1)
+
+        rate_func = kwargs.get("rate_func", smooth)
+        super().__init__(
+            FadeIn(vmobject, rate_func=squish_rate_func(rate_func, self.fade_lag, 1)),
+            VShowPassingFlash(outline, time_width=1),
+            **kwargs
+        )
diff --git a/manimlib/mobject/svg/svg_mobject.py b/manimlib/mobject/svg/svg_mobject.py
index 5af3367938..2fd3ce2f83 100644
--- a/manimlib/mobject/svg/svg_mobject.py
+++ b/manimlib/mobject/svg/svg_mobject.py
@@ -88,10 +88,10 @@ def get_mobjects_from(self, element):
         elif element.tagName == 'style':
             pass  # TODO, handle style
         elif element.tagName in ['g', 'svg', 'symbol']:
-            result += it.chain(*[
+            result += it.chain(*(
                 self.get_mobjects_from(child)
                 for child in element.childNodes
-            ])
+            ))
         elif element.tagName == 'path':
             result.append(self.path_string_to_mobject(
                 element.getAttribute('d')
@@ -341,6 +341,8 @@ def init_points(self):
 
         if os.path.exists(points_filepath) and os.path.exists(tris_filepath):
             self.set_points(np.load(points_filepath))
+            self.triangulation = np.load(tris_filepath)
+            self.needs_new_triangulation = False
         else:
             self.relative_point = np.array(ORIGIN)
             for command, coord_string in self.get_commands_and_coord_strings():
@@ -356,6 +358,7 @@ def init_points(self):
             self.stretch(-1, 1, about_point=ORIGIN)
             # Save to a file for future use
             np.save(points_filepath, self.get_points())
+            np.save(tris_filepath, self.get_triangulation())
 
     def get_commands_and_coord_strings(self):
         all_commands = list(self.get_command_to_function_map().keys())
diff --git a/manimlib/utils/space_ops.py b/manimlib/utils/space_ops.py
index b2aa46c150..742716424f 100644
--- a/manimlib/utils/space_ops.py
+++ b/manimlib/utils/space_ops.py
@@ -1,5 +1,7 @@
 import numpy as np
 import itertools as it
+import operator as op
+from functools import reduce
 import math
 from mapbox_earcut import triangulate_float32 as earcut
 
@@ -376,8 +378,8 @@ def ring_area(ring_id):
 
     # Points at the same position may cause problems
     for i in rings:
-        verts[i[0]] += (verts[i[1]]-verts[i[0]]) * 1e-6
-        verts[i[-1]] += (verts[i[-2]]-verts[i[-1]]) * 1e-6
+        verts[i[0]] += (verts[i[1]] - verts[i[0]]) * 1e-6
+        verts[i[-1]] += (verts[i[-2]] - verts[i[-1]]) * 1e-6
 
     # First, we should know which rings are directly contained in it for each ring
 
@@ -393,9 +395,11 @@ def ring_area(ring_id):
 
     def is_in_fast(ring_a, ring_b):
         # Whether a is in b
-        return (left[ring_b] <= left[ring_a] <= right[ring_a] <= right[ring_b] and
-                bottom[ring_b] <= bottom[ring_a] <= top[ring_a] <= top[ring_b] and
-                is_in(verts[rings[ring_a][0]], ring_b))
+        return reduce(op.and_, (
+            left[ring_b] <= left[ring_a] <= right[ring_a] <= right[ring_b],
+            bottom[ring_b] <= bottom[ring_a] <= top[ring_a] <= top[ring_b],
+            is_in(verts[rings[ring_a][0]], ring_b)
+        ))
 
     chilren = [[] for i in rings]
     for idx, i in enumerate(rings_sorted):

Small fix addressing why Tex/Text were slower than expected (plus one or two other minor changes)