[skottie] Add support for ADBE Pro Levels2 effect

Similar to existing ADBE Easy Levels2, but provides separate mapping
controls per channel.

Change-Id: Ibc58c58e1e8cb8793d6eb819998c1804ccbbf859
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268936
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/modules/skottie/src/effects/Effects.cpp b/modules/skottie/src/effects/Effects.cpp
index 54c7b69..fe16c3d 100644
--- a/modules/skottie/src/effects/Effects.cpp
+++ b/modules/skottie/src/effects/Effects.cpp
@@ -27,13 +27,14 @@
         EffectBuilderT fBuilder;
     } gBuilderInfo[] = {
         { "ADBE Drop Shadow"    , &EffectBuilder::attachDropShadowEffect     },
-        { "ADBE Easy Levels2"   , &EffectBuilder::attachLevelsEffect         },
+        { "ADBE Easy Levels2"   , &EffectBuilder::attachEasyLevelsEffect     },
         { "ADBE Fill"           , &EffectBuilder::attachFillEffect           },
         { "ADBE Gaussian Blur 2", &EffectBuilder::attachGaussianBlurEffect   },
         { "ADBE Geometry2"      , &EffectBuilder::attachTransformEffect      },
         { "ADBE HUE SATURATION" , &EffectBuilder::attachHueSaturationEffect  },
         { "ADBE Invert"         , &EffectBuilder::attachInvertEffect         },
         { "ADBE Linear Wipe"    , &EffectBuilder::attachLinearWipeEffect     },
+        { "ADBE Pro Levels2"    , &EffectBuilder::attachProLevelsEffect      },
         { "ADBE Radial Wipe"    , &EffectBuilder::attachRadialWipeEffect     },
         { "ADBE Ramp"           , &EffectBuilder::attachGradientEffect       },
         { "ADBE Shift Channels" , &EffectBuilder::attachShiftChannelsEffect  },
diff --git a/modules/skottie/src/effects/Effects.h b/modules/skottie/src/effects/Effects.h
index 244a8fa..a823309 100644
--- a/modules/skottie/src/effects/Effects.h
+++ b/modules/skottie/src/effects/Effects.h
@@ -46,12 +46,14 @@
                                                        sk_sp<sksg::RenderNode>) const;
     sk_sp<sksg::RenderNode> attachInvertEffect        (const skjson::ArrayValue&,
                                                        sk_sp<sksg::RenderNode>) const;
-    sk_sp<sksg::RenderNode> attachLevelsEffect        (const skjson::ArrayValue&,
+    sk_sp<sksg::RenderNode> attachEasyLevelsEffect    (const skjson::ArrayValue&,
                                                        sk_sp<sksg::RenderNode>) const;
     sk_sp<sksg::RenderNode> attachLinearWipeEffect    (const skjson::ArrayValue&,
                                                        sk_sp<sksg::RenderNode>) const;
     sk_sp<sksg::RenderNode> attachMotionTileEffect    (const skjson::ArrayValue&,
                                                        sk_sp<sksg::RenderNode>) const;
+    sk_sp<sksg::RenderNode> attachProLevelsEffect     (const skjson::ArrayValue&,
+                                                       sk_sp<sksg::RenderNode>) const;
     sk_sp<sksg::RenderNode> attachRadialWipeEffect    (const skjson::ArrayValue&,
                                                        sk_sp<sksg::RenderNode>) const;
     sk_sp<sksg::RenderNode> attachTintEffect          (const skjson::ArrayValue&,
diff --git a/modules/skottie/src/effects/LevelsEffect.cpp b/modules/skottie/src/effects/LevelsEffect.cpp
index c44e1a4..45d6aa1 100644
--- a/modules/skottie/src/effects/LevelsEffect.cpp
+++ b/modules/skottie/src/effects/LevelsEffect.cpp
@@ -8,105 +8,58 @@
 #include "modules/skottie/src/effects/Effects.h"
 
 #include "include/effects/SkTableColorFilter.h"
-#include "modules/skottie/src/Animator.h"
+#include "modules/skottie/src/Adapter.h"
 #include "modules/skottie/src/SkottieValue.h"
 #include "modules/sksg/include/SkSGColorFilter.h"
 #include "src/utils/SkJSON.h"
 
+#include <array>
 #include <cmath>
 
 namespace skottie {
 namespace internal {
 
-// Levels color correction effect.
-//
-// Maps the selected channels from [inBlack...inWhite] to [outBlack, outWhite],
-// based on a gamma exponent.
-//
-// For [i0..i1] -> [o0..o1]:
-//
-//   c' = o0 + (o1 - o0) * ((c - i0) / (i1 - i0)) ^ G
-//
-// The output is optionally clipped to the output range.
-//
-// In/out intervals are clampped to [0..1].  Inversion is allowed.
-
 namespace  {
 
-class LevelsEffectAdapter final : public AnimatablePropertyContainer {
-public:
-    static sk_sp<LevelsEffectAdapter> Make(const skjson::ArrayValue& jprops,
-                                           sk_sp<sksg::RenderNode> layer,
-                                           const AnimationBuilder* abuilder) {
-        return sk_sp<LevelsEffectAdapter>(new LevelsEffectAdapter(jprops,
-                                                                  std::move(layer),
-                                                                  abuilder));
-    }
+struct ClipInfo {
+    ScalarValue fClipBlack = 1, // 1: clip, 2/3: don't clip
+                fClipWhite = 1; // ^
+};
 
-    sk_sp<sksg::RenderNode> node() const { return fEffect; }
+struct ChannelMapper {
+    ScalarValue fInBlack  = 0,
+                fInWhite  = 1,
+                fOutBlack = 0,
+                fOutWhite = 1,
+                fGamma    = 1;
 
-private:
-    LevelsEffectAdapter(const skjson::ArrayValue& jprops,
-                        sk_sp<sksg::RenderNode> layer,
-                        const AnimationBuilder* abuilder)
-        : fEffect(sksg::ExternalColorFilter::Make(std::move(layer))) {
-        enum : size_t {
-            kChannel_Index        = 0,
-            // ???                = 1,
-            kInputBlack_Index     = 2,
-            kInputWhite_Index     = 3,
-            kGamma_Index          = 4,
-            kOutputBlack_Index    = 5,
-            kOutputWhite_Index    = 6,
-            kClipToOutBlack_Index = 7,
-            kClipToOutWhite_Index = 8,
-        };
-
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops,     kChannel_Index), &fChannel );
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops,  kInputBlack_Index), &fInBlack );
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops,  kInputWhite_Index), &fInWhite );
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops,       kGamma_Index), &fGamma   );
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops, kOutputBlack_Index), &fOutBlack);
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops, kOutputWhite_Index), &fOutWhite);
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops, kClipToOutBlack_Index),
-                   &fClipBlack);
-        this->bind(*abuilder, EffectBuilder::GetPropValue(jprops, kClipToOutWhite_Index),
-                   &fClipWhite);
-    }
-
-    void onSync() override {
-        enum LottieChannel {
-            kRGB_Channel = 1,
-              kR_Channel = 2,
-              kG_Channel = 3,
-              kB_Channel = 4,
-              kA_Channel = 5,
-        };
-
-        const auto channel = SkScalarTruncToInt(fChannel);
-        if (channel < kRGB_Channel || channel > kA_Channel) {
-            fEffect->setColorFilter(nullptr);
-            return;
-        }
-
-        auto in_0 = SkTPin(fInBlack,  0.0f, 1.0f),
-             in_1 = SkTPin(fInWhite,  0.0f, 1.0f),
-            out_0 = SkTPin(fOutBlack, 0.0f, 1.0f),
-            out_1 = SkTPin(fOutWhite, 0.0f, 1.0f),
+    const uint8_t* build_lut(std::array<uint8_t, 256>& lut_storage,
+                             const ClipInfo& clip_info) const {
+        auto in_0 = fInBlack,
+             in_1 = fInWhite,
+            out_0 = fOutBlack,
+            out_1 = fOutWhite,
                 g = sk_ieee_float_divide(1, std::max(fGamma, 0.0f));
 
         float clip[] = {0, 1};
         const auto kLottieDoClip = 1;
-        if (SkScalarTruncToInt(fClipBlack) == kLottieDoClip) {
+        if (SkScalarTruncToInt(clip_info.fClipBlack) == kLottieDoClip) {
             const auto idx = fOutBlack <= fOutWhite ? 0 : 1;
-            clip[idx] = out_0;
+            clip[idx] = SkTPin(out_0, 0.0f, 1.0f);
         }
-        if (SkScalarTruncToInt(fClipWhite) == kLottieDoClip) {
+        if (SkScalarTruncToInt(clip_info.fClipWhite) == kLottieDoClip) {
             const auto idx = fOutBlack <= fOutWhite ? 1 : 0;
-            clip[idx] = out_1;
+            clip[idx] = SkTPin(out_1, 0.0f, 1.0f);
         }
         SkASSERT(clip[0] <= clip[1]);
 
+        if (SkScalarNearlyEqual(in_0, out_0) &&
+            SkScalarNearlyEqual(in_1, out_1) &&
+            SkScalarNearlyEqual(g, 1)) {
+            // no-op
+            return nullptr;
+        }
+
         auto dIn  =  in_1 -  in_0,
              dOut = out_1 - out_0;
 
@@ -126,48 +79,231 @@
             SkASSERT(!SkScalarNearlyZero(dIn));
         }
 
-        uint8_t lut[256];
-
         auto t =      -in_0 / dIn,
             dT = 1 / 255.0f / dIn;
 
-        // TODO: is linear gamma common-enough to warrant a fast path?
         for (size_t i = 0; i < 256; ++i) {
             const auto out = out_0 + dOut * std::pow(std::max(t, 0.0f), g);
             SkASSERT(!SkScalarIsNaN(out));
 
-            lut[i] = static_cast<uint8_t>(std::round(SkTPin(out, clip[0], clip[1]) * 255));
+            lut_storage[i] = static_cast<uint8_t>(std::round(SkTPin(out, clip[0], clip[1]) * 255));
 
             t += dT;
         }
 
-        fEffect->setColorFilter(SkTableColorFilter::MakeARGB(
-            channel == kA_Channel                            ? lut : nullptr,
-            channel == kR_Channel || channel == kRGB_Channel ? lut : nullptr,
-            channel == kG_Channel || channel == kRGB_Channel ? lut : nullptr,
-            channel == kB_Channel || channel == kRGB_Channel ? lut : nullptr
+        return lut_storage.data();
+    }
+};
+
+// ADBE Easy Levels2 color correction effect.
+//
+// Maps the selected channel(s) from [inBlack...inWhite] to [outBlack, outWhite],
+// based on a gamma exponent.
+//
+// For [i0..i1] -> [o0..o1]:
+//
+//   c' = o0 + (o1 - o0) * ((c - i0) / (i1 - i0)) ^ G
+//
+// The output is optionally clipped to the output range.
+//
+// In/out intervals are clampped to [0..1].  Inversion is allowed.
+
+class EasyLevelsEffectAdapter final : public DiscardableAdapterBase<EasyLevelsEffectAdapter,
+                                                                    sksg::ExternalColorFilter> {
+public:
+    EasyLevelsEffectAdapter(const skjson::ArrayValue& jprops,
+                            sk_sp<sksg::RenderNode> layer,
+                            const AnimationBuilder* abuilder)
+        : INHERITED(sksg::ExternalColorFilter::Make(std::move(layer))) {
+        enum : size_t {
+                   kChannel_Index = 0,
+                   // kHist_Index = 1,
+                   kInBlack_Index = 2,
+                   kInWhite_Index = 3,
+                     kGamma_Index = 4,
+                  kOutBlack_Index = 5,
+                  kOutWhite_Index = 6,
+            kClipToOutBlack_Index = 7,
+            kClipToOutWhite_Index = 8,
+        };
+
+        EffectBinder(jprops, *abuilder, this)
+            .bind(       kChannel_Index, fChannel  )
+            .bind(       kInBlack_Index, fMapper.fInBlack )
+            .bind(       kInWhite_Index, fMapper.fInWhite )
+            .bind(         kGamma_Index, fMapper.fGamma   )
+            .bind(      kOutBlack_Index, fMapper.fOutBlack)
+            .bind(      kOutWhite_Index, fMapper.fOutWhite)
+            .bind(kClipToOutBlack_Index, fClip.fClipBlack )
+            .bind(kClipToOutWhite_Index, fClip.fClipWhite );
+    }
+
+private:
+    void onSync() override {
+        enum LottieChannel {
+            kRGB_Channel = 1,
+              kR_Channel = 2,
+              kG_Channel = 3,
+              kB_Channel = 4,
+              kA_Channel = 5,
+        };
+
+        const auto channel = SkScalarTruncToInt(fChannel);
+        std::array<uint8_t, 256> lut;
+        if (channel < kRGB_Channel || channel > kA_Channel || !fMapper.build_lut(lut, fClip)) {
+            this->node()->setColorFilter(nullptr);
+            return;
+        }
+
+        this->node()->setColorFilter(SkTableColorFilter::MakeARGB(
+            channel == kA_Channel                            ? lut.data() : nullptr,
+            channel == kR_Channel || channel == kRGB_Channel ? lut.data() : nullptr,
+            channel == kG_Channel || channel == kRGB_Channel ? lut.data() : nullptr,
+            channel == kB_Channel || channel == kRGB_Channel ? lut.data() : nullptr
         ));
     }
 
-    const sk_sp<sksg::ExternalColorFilter> fEffect;
+    ChannelMapper fMapper;
+    ClipInfo      fClip;
+    ScalarValue   fChannel   = 1; // 1: RGB, 2: R, 3: G, 4: B, 5: A
 
-    ScalarValue fChannel   = 1, // 1: RGB, 2: R, 3: G, 4: B, 5: A
-                fInBlack   = 0,
-                fInWhite   = 1,
-                fOutBlack  = 0,
-                fOutWhite  = 1,
-                fGamma     = 1,
-                fClipBlack = 1, // 1: clip, 2,3: don't clip
-                fClipWhite = 1; // ^
+    using INHERITED = DiscardableAdapterBase<EasyLevelsEffectAdapter, sksg::ExternalColorFilter>;
+};
+
+// ADBE Pro Levels2 color correction effect.
+//
+// Similar to ADBE Easy Levels2, but offers separate controls for each channel.
+
+class ProLevelsEffectAdapter final : public DiscardableAdapterBase<ProLevelsEffectAdapter,
+                                                                   sksg::ExternalColorFilter> {
+public:
+    ProLevelsEffectAdapter(const skjson::ArrayValue& jprops,
+                           sk_sp<sksg::RenderNode> layer,
+                           const AnimationBuilder* abuilder)
+        : INHERITED(sksg::ExternalColorFilter::Make(std::move(layer))) {
+        enum : size_t {
+            //    kHistChan_Index =  0,
+            //        kHist_Index =  1,
+            //    kRGBBegin_Index =  2,
+                kRGBInBlack_Index =  3,
+                kRGBInWhite_Index =  4,
+                  kRGBGamma_Index =  5,
+               kRGBOutBlack_Index =  6,
+               kRGBOutWhite_Index =  7,
+            //      kRGBEnd_Index =  8,
+            //      kRBegin_Index =  9,
+                  kRInBlack_Index = 10,
+                  kRInWhite_Index = 11,
+                    kRGamma_Index = 12,
+                 kROutBlack_Index = 13,
+                 kROutWhite_Index = 14,
+            //        kREnd_Index = 15,
+            //      kGBegin_Index = 16,
+                  kGInBlack_Index = 17,
+                  kGInWhite_Index = 18,
+                    kGGamma_Index = 19,
+                 kGOutBlack_Index = 20,
+                 kGOutWhite_Index = 21,
+            //        kGEnd_Index = 22,
+            //      kBBegin_Index = 23,
+                  kBInBlack_Index = 24,
+                  kBInWhite_Index = 25,
+                    kBGamma_Index = 26,
+                 kBOutBlack_Index = 27,
+                 kBOutWhite_Index = 28,
+            //        kBEnd_Index = 29,
+            //      kABegin_Index = 30,
+                  kAInBlack_Index = 31,
+                  kAInWhite_Index = 32,
+                    kAGamma_Index = 33,
+                 kAOutBlack_Index = 34,
+                 kAOutWhite_Index = 35,
+            //        kAEnd_Index = 36,
+            kClipToOutBlack_Index = 37,
+            kClipToOutWhite_Index = 38,
+        };
+
+        EffectBinder(jprops, *abuilder, this)
+            .bind( kRGBInBlack_Index, fRGBMapper.fInBlack )
+            .bind( kRGBInWhite_Index, fRGBMapper.fInWhite )
+            .bind(   kRGBGamma_Index, fRGBMapper.fGamma   )
+            .bind(kRGBOutBlack_Index, fRGBMapper.fOutBlack)
+            .bind(kRGBOutWhite_Index, fRGBMapper.fOutWhite)
+
+            .bind( kRInBlack_Index, fRMapper.fInBlack )
+            .bind( kRInWhite_Index, fRMapper.fInWhite )
+            .bind(   kRGamma_Index, fRMapper.fGamma   )
+            .bind(kROutBlack_Index, fRMapper.fOutBlack)
+            .bind(kROutWhite_Index, fRMapper.fOutWhite)
+
+            .bind( kGInBlack_Index, fGMapper.fInBlack )
+            .bind( kGInWhite_Index, fGMapper.fInWhite )
+            .bind(   kGGamma_Index, fGMapper.fGamma   )
+            .bind(kGOutBlack_Index, fGMapper.fOutBlack)
+            .bind(kGOutWhite_Index, fGMapper.fOutWhite)
+
+            .bind( kBInBlack_Index, fBMapper.fInBlack )
+            .bind( kBInWhite_Index, fBMapper.fInWhite )
+            .bind(   kBGamma_Index, fBMapper.fGamma   )
+            .bind(kBOutBlack_Index, fBMapper.fOutBlack)
+            .bind(kBOutWhite_Index, fBMapper.fOutWhite)
+
+            .bind( kAInBlack_Index, fAMapper.fInBlack )
+            .bind( kAInWhite_Index, fAMapper.fInWhite )
+            .bind(   kAGamma_Index, fAMapper.fGamma   )
+            .bind(kAOutBlack_Index, fAMapper.fOutBlack)
+            .bind(kAOutWhite_Index, fAMapper.fOutWhite);
+    }
+
+private:
+    void onSync() override {
+        std::array<uint8_t, 256> a_lut_storage,
+                                 r_lut_storage,
+                                 g_lut_storage,
+                                 b_lut_storage;
+
+        auto cf = SkTableColorFilter::MakeARGB(fAMapper.build_lut(a_lut_storage, fClip),
+                                               fRMapper.build_lut(r_lut_storage, fClip),
+                                               fGMapper.build_lut(g_lut_storage, fClip),
+                                               fBMapper.build_lut(b_lut_storage, fClip));
+
+        // The RGB mapper composes outside individual channel mappers.
+        if (const auto* rgb_lut = fRGBMapper.build_lut(a_lut_storage, fClip)) {
+            cf = SkColorFilters::Compose(SkTableColorFilter::MakeARGB(nullptr,
+                                                                      rgb_lut,
+                                                                      rgb_lut,
+                                                                      rgb_lut),
+                                         std::move(cf));
+        }
+
+        this->node()->setColorFilter(std::move(cf));
+    }
+
+    ChannelMapper fRGBMapper,
+                  fRMapper,
+                  fGMapper,
+                  fBMapper,
+                  fAMapper;
+
+    ClipInfo      fClip;
+
+    using INHERITED = DiscardableAdapterBase<ProLevelsEffectAdapter, sksg::ExternalColorFilter>;
 };
 
 } // anonymous ns
 
-sk_sp<sksg::RenderNode> EffectBuilder::attachLevelsEffect(const skjson::ArrayValue& jprops,
-                                                          sk_sp<sksg::RenderNode> layer) const {
-    return fBuilder->attachDiscardableAdapter<LevelsEffectAdapter>(jprops,
-                                                                   std::move(layer),
-                                                                   fBuilder);
+sk_sp<sksg::RenderNode> EffectBuilder::attachEasyLevelsEffect(const skjson::ArrayValue& jprops,
+                                                              sk_sp<sksg::RenderNode> layer) const {
+    return fBuilder->attachDiscardableAdapter<EasyLevelsEffectAdapter>(jprops,
+                                                                       std::move(layer),
+                                                                       fBuilder);
+}
+
+sk_sp<sksg::RenderNode> EffectBuilder::attachProLevelsEffect(const skjson::ArrayValue& jprops,
+                                                             sk_sp<sksg::RenderNode> layer) const {
+    return fBuilder->attachDiscardableAdapter<ProLevelsEffectAdapter>(jprops,
+                                                                      std::move(layer),
+                                                                      fBuilder);
 }
 
 } // namespace internal
diff --git a/resources/skottie/skottie-prolevels-effect.json b/resources/skottie/skottie-prolevels-effect.json
new file mode 100644
index 0000000..14ff574
--- /dev/null
+++ b/resources/skottie/skottie-prolevels-effect.json
@@ -0,0 +1 @@
+{"v":"5.6.3","fr":60,"ip":0,"op":601,"w":500,"h":500,"nm":"prolevels","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[100,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0,1,0.250980407,1],"ix":4},"o":{"a":0,"k":75,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":600,"s":[360]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":50,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":162,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.250980407,0,1],"ix":4},"o":{"a":0,"k":75,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":600,"s":[720]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[175,175],"ix":2},"p":{"a":0,"k":[-90,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0,1,1],"ix":4},"o":{"a":0,"k":75,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":600,"s":[-360]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":601,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"rgb w/ invert","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[83,83,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[2.008]},{"t":600,"s":[-1]}],"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[2.008]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[-1]},{"t":600,"s":[2.008]}],"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":0,"k":1,"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"rgb + compose","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,83,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":0.502,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.502]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":600,"s":[0.502]}],"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":150,"s":[0]},{"t":300,"s":[1]}],"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":450,"s":[0]},{"t":600,"s":[1]}],"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"gamma + compose","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[417,83,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[3]},{"t":600,"s":[0]}],"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":3,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":0.5,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":0,"k":1,"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1.5,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"r","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[83,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[1]},{"t":600,"s":[0]}],"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":600,"s":[1]}],"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[0]}],"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[1]}],"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":0,"k":1,"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"g","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[1]},{"t":600,"s":[0]}],"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":600,"s":[1]}],"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[0]}],"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[1]}],"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"b","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[417,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":0,"k":1,"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[1]},{"t":600,"s":[0]}],"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":600,"s":[1]}],"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[0]}],"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[1]}],"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"a","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[83,417,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":0,"k":1,"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[1]},{"t":600,"s":[0]}],"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0]},{"t":600,"s":[1]}],"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":1,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[0]}],"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.502]},{"t":600,"s":[1]}],"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"a/gamma","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,417,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":0,"k":0,"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":0,"k":1,"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[1.5]},{"t":600,"s":[0]}],"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"chaos","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[417,417,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"ef":[{"ty":24,"nm":"Levels (Individual Controls)","np":41,"mn":"ADBE Pro Levels2","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel:","mn":"ADBE Pro Levels2-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0003","ix":3,"v":0},{"ty":0,"nm":"Input Black","mn":"ADBE Pro Levels2-0004","ix":4,"v":{"a":0,"k":-0.251,"ix":4}},{"ty":0,"nm":"Input White","mn":"ADBE Pro Levels2-0005","ix":5,"v":{"a":0,"k":0.753,"ix":5}},{"ty":0,"nm":"Gamma","mn":"ADBE Pro Levels2-0006","ix":6,"v":{"a":0,"k":0.44,"ix":6}},{"ty":0,"nm":"Output Black","mn":"ADBE Pro Levels2-0007","ix":7,"v":{"a":0,"k":0.23,"ix":7}},{"ty":0,"nm":"Output White","mn":"ADBE Pro Levels2-0008","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"RGB","mn":"ADBE Pro Levels2-0009","ix":9,"v":0},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0010","ix":10,"v":0},{"ty":0,"nm":"Red Input Black","mn":"ADBE Pro Levels2-0011","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":0,"nm":"Red Input White","mn":"ADBE Pro Levels2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":0,"nm":"Red Gamma","mn":"ADBE Pro Levels2-0013","ix":13,"v":{"a":0,"k":1,"ix":13}},{"ty":0,"nm":"Red Output Black","mn":"ADBE Pro Levels2-0014","ix":14,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":301,"s":[2.008]},{"t":600,"s":[0]}],"ix":14}},{"ty":0,"nm":"Red Output White","mn":"ADBE Pro Levels2-0015","ix":15,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":301,"s":[-1]},{"t":600,"s":[1]}],"ix":15}},{"ty":6,"nm":"Red","mn":"ADBE Pro Levels2-0016","ix":16,"v":0},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0017","ix":17,"v":0},{"ty":0,"nm":"Green Input Black","mn":"ADBE Pro Levels2-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Green Input White","mn":"ADBE Pro Levels2-0019","ix":19,"v":{"a":0,"k":1,"ix":19}},{"ty":0,"nm":"Green Gamma","mn":"ADBE Pro Levels2-0020","ix":20,"v":{"a":0,"k":1,"ix":20}},{"ty":0,"nm":"Green Output Black","mn":"ADBE Pro Levels2-0021","ix":21,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":301,"s":[0.753]},{"t":600,"s":[0]}],"ix":21}},{"ty":0,"nm":"Green Output White","mn":"ADBE Pro Levels2-0022","ix":22,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":301,"s":[0.753]},{"t":600,"s":[1]}],"ix":22}},{"ty":6,"nm":"Green","mn":"ADBE Pro Levels2-0023","ix":23,"v":0},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0024","ix":24,"v":0},{"ty":0,"nm":"Blue Input Black","mn":"ADBE Pro Levels2-0025","ix":25,"v":{"a":0,"k":0,"ix":25}},{"ty":0,"nm":"Blue Input White","mn":"ADBE Pro Levels2-0026","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":0,"nm":"Blue Gamma","mn":"ADBE Pro Levels2-0027","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":0,"nm":"Blue Output Black","mn":"ADBE Pro Levels2-0028","ix":28,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.251]},{"t":600,"s":[0]}],"ix":28}},{"ty":0,"nm":"Blue Output White","mn":"ADBE Pro Levels2-0029","ix":29,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.251]},{"t":600,"s":[1]}],"ix":29}},{"ty":6,"nm":"Blue","mn":"ADBE Pro Levels2-0030","ix":30,"v":0},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0031","ix":31,"v":0},{"ty":0,"nm":"Alpha Input Black","mn":"ADBE Pro Levels2-0032","ix":32,"v":{"a":0,"k":0,"ix":32}},{"ty":0,"nm":"Alpha Input White","mn":"ADBE Pro Levels2-0033","ix":33,"v":{"a":0,"k":1,"ix":33}},{"ty":0,"nm":"Alpha Gamma","mn":"ADBE Pro Levels2-0034","ix":34,"v":{"a":0,"k":3,"ix":34}},{"ty":0,"nm":"Alpha Output Black","mn":"ADBE Pro Levels2-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":0,"nm":"Alpha Output White","mn":"ADBE Pro Levels2-0036","ix":36,"v":{"a":0,"k":1,"ix":36}},{"ty":6,"nm":"Alpha","mn":"ADBE Pro Levels2-0037","ix":37,"v":0},{"ty":7,"nm":"Clip To Output Black","mn":"ADBE Pro Levels2-0038","ix":38,"v":{"a":0,"k":3,"ix":38}},{"ty":7,"nm":"Clip To Output White","mn":"ADBE Pro Levels2-0039","ix":39,"v":{"a":0,"k":3,"ix":39}}]}],"w":500,"h":500,"ip":0,"op":601,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":1,"nm":"White Solid 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":500,"sh":500,"sc":"#ffffff","ip":0,"op":601,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp
index 9921971..0a5412f 100644
--- a/src/effects/SkTableColorFilter.cpp
+++ b/src/effects/SkTableColorFilter.cpp
@@ -452,6 +452,10 @@
                                                   const uint8_t tableR[256],
                                                   const uint8_t tableG[256],
                                                   const uint8_t tableB[256]) {
+    if (!tableA && !tableR && !tableG && !tableB) {
+        return nullptr;
+    }
+
     return sk_make_sp<SkTable_ColorFilter>(tableA, tableR, tableG, tableB);
 }