├── .gitattributes
├── src
├── Blazor.Lottie.Player
│ ├── _Imports.razor
│ ├── wwwroot
│ │ ├── Nuget.png
│ │ ├── loadLottieWeb.js
│ │ ├── lottiePlayerModule.js
│ │ └── loading.json
│ ├── Component
│ │ ├── LottiePlayer.razor
│ │ ├── LottiePlaybackOptions.cs
│ │ ├── LottiePlayerModule.cs
│ │ └── LottiePlayer.razor.cs
│ ├── Enums
│ │ ├── LottieAnimationDirection.cs
│ │ ├── LottieAnimationType.cs
│ │ └── LottieAnimationQuality.cs
│ ├── EventArgs
│ │ ├── LottiePlayerLoadedEventArgs.cs
│ │ └── LottiePlayerEventFrameArgs.cs
│ ├── Extensions
│ │ ├── Identifier.cs
│ │ └── EnumExtensions.cs
│ ├── Blazor.Lottie.Player.csproj
│ ├── Configuration
│ │ └── LottieAnimationOptions.cs
│ └── Player-API-Documentation.txt
├── Blazor.Lottie.Player.Docs.WASM
│ ├── wwwroot
│ │ ├── MudX_Transparent_Logo.ico
│ │ ├── MudX_Transparent_Logo.png
│ │ ├── index.html
│ │ ├── css
│ │ │ └── app.css
│ │ └── lottie
│ │ │ ├── BunBun.json
│ │ │ └── newAnimation.json
│ ├── Layout
│ │ └── MainLayout.razor
│ ├── App.razor
│ ├── _Imports.razor
│ ├── Program.cs
│ ├── Blazor.Lottie.Player.Docs.WASM.csproj
│ ├── Properties
│ │ └── launchSettings.json
│ └── Pages
│ │ └── Home.razor
├── Readme.txt
└── Blazor.Lottie.Player.sln
├── tests
├── README.md
└── Blazor.Lottie.Player.UnitTests
│ ├── BunitTest.cs
│ ├── Blazor.Lottie.Player.UnitTests.csproj
│ ├── LottieModuleTests.cs
│ └── LottieTests.cs
├── docs
└── README.md
├── LICENSE
├── README.md
├── .editorconfig
└── .gitignore
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Force this repository to use Windows line endings
2 | * text=auto
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNetCore.Components.Web
2 |
--------------------------------------------------------------------------------
/tests/README.md:
--------------------------------------------------------------------------------
1 | # Tests
2 | Unit, integration, acceptance, etc tests should go here. Preferred framework is xUnit.
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/wwwroot/Nuget.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MudXtra/LottiePlayer/HEAD/src/Blazor.Lottie.Player/wwwroot/Nuget.png
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # Documentation
2 | Any documentation relevant to the project should be included here. General info can go in this README, but adding extra files is acceptable.
3 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/MudX_Transparent_Logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MudXtra/LottiePlayer/HEAD/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/MudX_Transparent_Logo.ico
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/MudX_Transparent_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MudXtra/LottiePlayer/HEAD/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/MudX_Transparent_Logo.png
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/Layout/MainLayout.razor:
--------------------------------------------------------------------------------
1 | @inherits LayoutComponentBase
2 |
3 | @using MudBlazor
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | @Body
12 |
--------------------------------------------------------------------------------
/src/Readme.txt:
--------------------------------------------------------------------------------
1 | First Update the Version in csproj file.
2 | Set Mode to Release.
3 | Manually run right click, pack, then upload the .nupkg file to NuGet.org.
4 | Push changes to Github repository.
5 | When Nuget package is updated, update the MudX.
6 | Set Mode back to Debug.
7 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Component/LottiePlayer.razor:
--------------------------------------------------------------------------------
1 | @namespace Blazor.Lottie.Player
2 | @inherits ComponentBase
3 |
4 |
5 | @if (_failMessage != null)
6 | {
7 | @_failMessage
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Enums/LottieAnimationDirection.cs:
--------------------------------------------------------------------------------
1 | namespace Blazor.Lottie.Player;
2 | ///
3 | /// Specifies the playback direction for a Lottie animation.
4 | ///
5 | public enum LottieAnimationDirection
6 | {
7 | ///
8 | /// Represents the forward direction an animation will play.
9 | ///
10 | Forward = 1,
11 | ///
12 | /// Represents the reverse direction an animation will play.
13 | ///
14 | Reverse = -1,
15 | }
16 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/App.razor:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Not found
8 |
9 | Sorry, there's nothing at this address.
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/_Imports.razor:
--------------------------------------------------------------------------------
1 | @using System.Net.Http
2 | @using System.Net.Http.Json
3 | @using Microsoft.AspNetCore.Components.Forms
4 | @using Microsoft.AspNetCore.Components.Routing
5 | @using Microsoft.AspNetCore.Components.Web
6 | @using Microsoft.AspNetCore.Components.Web.Virtualization
7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http
8 | @using Microsoft.JSInterop
9 | @using Blazor.Lottie.Player.Docs.WASM
10 | @using Blazor.Lottie.Player.Docs.WASM.Layout
11 |
12 | @using Blazor.Lottie.Player
13 | @using MudBlazor
14 | @using MudX
15 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/Program.cs:
--------------------------------------------------------------------------------
1 | using Blazor.Lottie.Player.Docs.WASM;
2 | using Microsoft.AspNetCore.Components.Web;
3 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
4 | using MudBlazor.Services;
5 |
6 | var builder = WebAssemblyHostBuilder.CreateDefault(args);
7 | builder.RootComponents.Add("#app");
8 | builder.RootComponents.Add("head::after");
9 |
10 | builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
11 |
12 | builder.Services.AddMudServices();
13 |
14 | await builder.Build().RunAsync();
15 |
--------------------------------------------------------------------------------
/tests/Blazor.Lottie.Player.UnitTests/BunitTest.cs:
--------------------------------------------------------------------------------
1 | using Bunit;
2 |
3 | namespace Blazor.Lottie.Player.UnitTests;
4 | public abstract class BunitTest
5 | {
6 | protected Bunit.TestContext Context { get; private set; } = null!;
7 |
8 | [SetUp]
9 | public virtual void Setup()
10 | {
11 | Context = new Bunit.TestContext();
12 | //Context.Services.; // This is where you add services if needed
13 | Context.JSInterop.Mode = JSRuntimeMode.Loose; // Use Loose mode for JS Interop
14 | }
15 |
16 | [TearDown]
17 | public virtual void TearDown()
18 | {
19 | Context.Dispose();
20 | Context = null!;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/EventArgs/LottiePlayerLoadedEventArgs.cs:
--------------------------------------------------------------------------------
1 | namespace Blazor.Lottie.Player;
2 | ///
3 | /// Event arguments for the Lottie player loaded event.
4 | ///
5 | public record LottiePlayerLoadedEventArgs
6 | {
7 | ///
8 | /// Gets the ID of the Lottie player element.
9 | ///
10 | public string ElementId { get; init; } = default!;
11 |
12 | ///
13 | /// Gets the current frame of the animation as a zero-based index.
14 | ///
15 | public double CurrentFrame { get; init; }
16 |
17 | ///
18 | /// Gets the total number of frames processed.
19 | ///
20 | public double TotalFrames { get; init; }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Extensions/Identifier.cs:
--------------------------------------------------------------------------------
1 | namespace Blazor.Lottie.Player.Extensions;
2 | internal class Identifier
3 | {
4 | private const string _chars = "abcdefghijklmnopqrstuvwxyz0123456789";
5 | private const int _charsLength = 35;
6 | private const int _randomStringLength = 8;
7 |
8 | public static string Create(ReadOnlySpan prefix)
9 | {
10 | Span identifierSpan = stackalloc char[prefix.Length + _randomStringLength];
11 | prefix.CopyTo(identifierSpan);
12 | for (var i = 0; i < _randomStringLength; i++)
13 | {
14 | var index = Random.Shared.Next(_charsLength);
15 | identifierSpan[prefix.Length + i] = _chars[index];
16 | }
17 | return identifierSpan.ToString();
18 | }
19 |
20 | public static string Create() => Create("mudxtra-");
21 | }
22 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/Blazor.Lottie.Player.Docs.WASM.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net9.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/EventArgs/LottiePlayerEventFrameArgs.cs:
--------------------------------------------------------------------------------
1 | namespace Blazor.Lottie.Player;
2 | ///
3 | /// Event arguments for the Lottie player loaded event.
4 | ///
5 | public record LottiePlayerEventFrameArgs
6 | {
7 | ///
8 | /// Gets the ID of the event.
9 | ///
10 | public string Type { get; init; } = "enterFrame";
11 |
12 | ///
13 | /// Gets the current frame of the animation as a zero-based index.
14 | ///
15 | public double CurrentTime { get; init; }
16 |
17 | ///
18 | /// Gets the total number of frames to be processed.
19 | ///
20 | public double TotalTime { get; init; }
21 |
22 | ///
23 | /// The current direction of the Lottie animation playback.
24 | ///
25 | public LottieAnimationDirection Direction { get; init; } = LottieAnimationDirection.Forward;
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/launchsettings.json",
3 | "profiles": {
4 | "http": {
5 | "commandName": "Project",
6 | "dotnetRunMessages": true,
7 | "launchBrowser": true,
8 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
9 | "applicationUrl": "http://localhost:5266",
10 | "environmentVariables": {
11 | "ASPNETCORE_ENVIRONMENT": "Development"
12 | }
13 | },
14 | "https": {
15 | "commandName": "Project",
16 | "dotnetRunMessages": true,
17 | "launchBrowser": true,
18 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
19 | "applicationUrl": "https://localhost:7190;http://localhost:5266",
20 | "environmentVariables": {
21 | "ASPNETCORE_ENVIRONMENT": "Development"
22 | }
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Bell County, TX
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Enums/LottieAnimationType.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 |
3 | namespace Blazor.Lottie.Player
4 | {
5 | ///
6 | /// Specifies the type of Lottie animation to render.
7 | ///
8 | public enum LottieAnimationType
9 | {
10 | ///
11 | /// Creates clean SVG elements with proper viewBox handling.
12 | ///
13 | /// Best feature support and general purpose.
14 | [Description("svg")]
15 | Svg,
16 |
17 | ///
18 | /// Uses 2D context, clears canvas each frame, handles sizing automatically.
19 | ///
20 | /// Performance option for complex animations, typically better for full screen or
21 | /// large animations.
22 | [Description("canvas")]
23 | Canvas,
24 |
25 | ///
26 | /// Creates HTML elements with CSS transforms.
27 | ///
28 | /// Optional, generally slower with limited support for complex animations.
29 | [Description("html")]
30 | Html
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Blazor Lottie Player Documentation
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
Blazor Lottie Player
21 |
22 |
23 |
24 | An unhandled error has occurred.
25 |
Reload
26 |
🗙
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Extensions/EnumExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 | using System.Reflection;
3 |
4 | namespace Blazor.Lottie.Player;
5 | ///
6 | /// Provides extension methods for working with enumeration types.
7 | ///
8 | /// This class includes methods that enhance the functionality of enums, such as retrieving
9 | /// custom descriptions defined by the .
10 | internal static class EnumExtensions
11 | {
12 | ///
13 | /// Retrieves the description associated with an enumeration value.
14 | ///
15 | /// This method is useful for obtaining human-readable descriptions of enumeration
16 | /// values when the is used to provide metadata for the
17 | /// values.
18 | public static string ToDescription(this Enum value)
19 | {
20 | if (value == null)
21 | return string.Empty;
22 |
23 | var field = value.GetType().GetField(value.ToString());
24 | if (field == null)
25 | return value.ToString();
26 |
27 | var attribute = field.GetCustomAttribute();
28 | return attribute?.Description ?? value.ToString();
29 | }
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Enums/LottieAnimationQuality.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 |
3 | namespace Blazor.Lottie.Player;
4 |
5 | ///
6 | /// Specifies the rendering quality level for Lottie animations.
7 | ///
8 | ///
9 | /// Quality affects the precision of curve calculations and overall visual fidelity.
10 | /// Higher quality settings provide smoother curves and better visual accuracy but
11 | /// require more computational resources.
12 | ///
13 | public enum LottieAnimationQuality
14 | {
15 | ///
16 | /// Low quality rendering with basic curve precision.
17 | ///
18 | ///
19 | /// Fastest performance with reduced visual fidelity. Best for simple animations
20 | /// or when performance is critical (mobile devices, multiple simultaneous animations).
21 | ///
22 | [Description("low")]
23 | Low,
24 |
25 | ///
26 | /// Medium quality rendering with balanced precision and performance.
27 | ///
28 | ///
29 | /// Good balance between visual quality and performance. Suitable for most
30 | /// general-purpose animations and typical web applications.
31 | ///
32 | [Description("medium")]
33 | Medium,
34 |
35 | ///
36 | /// High quality rendering with maximum curve precision and visual fidelity.
37 | ///
38 | ///
39 | /// Best visual quality with smooth, precise curves. Use for detailed animations
40 | /// where visual perfection is important. May impact performance on lower-end devices.
41 | ///
42 | [Description("high")]
43 | High
44 | }
45 |
--------------------------------------------------------------------------------
/tests/Blazor.Lottie.Player.UnitTests/Blazor.Lottie.Player.UnitTests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net9.0
5 | latest
6 | enable
7 | enable
8 | false
9 | Blazor.Lottie.Player.UnitTests
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | all
19 | runtime; build; native; contentfiles; analyzers; buildtransitive
20 |
21 |
22 | all
23 | runtime; build; native; contentfiles; analyzers; buildtransitive
24 |
25 |
26 |
27 |
28 |
29 | all
30 | runtime; build; native; contentfiles; analyzers; buildtransitive
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/wwwroot/loadLottieWeb.js:
--------------------------------------------------------------------------------
1 | export async function initialize(source) {
2 | try {
3 | if (window.lottie && typeof window.lottie === "object") {
4 | // Lottie is already loaded
5 | return true;
6 | }
7 | await injectJsLibrary(source);
8 | if (window.lottie && typeof window.lottie === "object") {
9 | return true;
10 | }
11 | return false;
12 | }
13 | catch (error) {
14 | console.error("Error initializing Lottie Web:", error);
15 | return false;
16 | }
17 | }
18 |
19 | export async function injectJsLibrary(source) {
20 | return new Promise((resolve, reject) => {
21 | if (document.querySelector("script[data-bodymovinjs]")) {
22 | // Already loaded
23 | if (window.lottie) {
24 | return resolve();
25 | }
26 | return waitForLottie(resolve, reject);
27 | }
28 | // Check if lottie is already available globally
29 | if (window.lottie) {
30 | return resolve();
31 | }
32 | const script = document.createElement("script");
33 | script.setAttribute("data-bodymovinjs", "true");
34 | script.type = "text/javascript";
35 | script.src = source;
36 |
37 | script.onload = () => waitForLottie(resolve, reject);
38 | script.onerror = () => reject(new Error(`Failed to load ${source}`));
39 |
40 | document.head.appendChild(script);
41 | });
42 | }
43 |
44 | function waitForLottie(resolve, reject) {
45 | const start = Date.now();
46 | const timeout = 1000;
47 | const interval = 25;
48 |
49 | function check() {
50 | if (window.lottie && typeof window.lottie === "object") {
51 | resolve();
52 | } else if (Date.now() - start >= timeout) {
53 | console.error(`Lottie did not become available within ${timeout}ms, continuing load.`);
54 | resolve();
55 | } else {
56 | setTimeout(check, interval);
57 | }
58 | }
59 | check();
60 | }
61 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.14.36221.1
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blazor.Lottie.Player", "Blazor.Lottie.Player\Blazor.Lottie.Player.csproj", "{A256F3B7-5BA4-4CE4-80B8-B86B1240315B}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blazor.Lottie.Player.Docs.WASM", "Blazor.Lottie.Player.Docs.WASM\Blazor.Lottie.Player.Docs.WASM.csproj", "{E701A428-9E74-4876-9752-703495976F01}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blazor.Lottie.Player.UnitTests", "..\tests\Blazor.Lottie.Player.UnitTests\Blazor.Lottie.Player.UnitTests.csproj", "{31B59C97-E241-4555-B733-17DAD6362AAF}"
11 | EndProject
12 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
13 | ProjectSection(SolutionItems) = preProject
14 | ..\.editorconfig = ..\.editorconfig
15 | ..\README.md = ..\README.md
16 | Readme.txt = Readme.txt
17 | EndProjectSection
18 | EndProject
19 | Global
20 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
21 | Debug|Any CPU = Debug|Any CPU
22 | Release|Any CPU = Release|Any CPU
23 | EndGlobalSection
24 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
25 | {A256F3B7-5BA4-4CE4-80B8-B86B1240315B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
26 | {A256F3B7-5BA4-4CE4-80B8-B86B1240315B}.Debug|Any CPU.Build.0 = Debug|Any CPU
27 | {A256F3B7-5BA4-4CE4-80B8-B86B1240315B}.Release|Any CPU.ActiveCfg = Release|Any CPU
28 | {A256F3B7-5BA4-4CE4-80B8-B86B1240315B}.Release|Any CPU.Build.0 = Release|Any CPU
29 | {E701A428-9E74-4876-9752-703495976F01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
30 | {E701A428-9E74-4876-9752-703495976F01}.Debug|Any CPU.Build.0 = Debug|Any CPU
31 | {E701A428-9E74-4876-9752-703495976F01}.Release|Any CPU.ActiveCfg = Release|Any CPU
32 | {E701A428-9E74-4876-9752-703495976F01}.Release|Any CPU.Build.0 = Release|Any CPU
33 | {31B59C97-E241-4555-B733-17DAD6362AAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
34 | {31B59C97-E241-4555-B733-17DAD6362AAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
35 | {31B59C97-E241-4555-B733-17DAD6362AAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
36 | {31B59C97-E241-4555-B733-17DAD6362AAF}.Release|Any CPU.Build.0 = Release|Any CPU
37 | EndGlobalSection
38 | GlobalSection(SolutionProperties) = preSolution
39 | HideSolutionNode = FALSE
40 | EndGlobalSection
41 | GlobalSection(ExtensibilityGlobals) = postSolution
42 | SolutionGuid = {DB1F496D-F870-424A-8DFC-9E8F30D4F08F}
43 | EndGlobalSection
44 | EndGlobal
45 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://github.com/sponsors/versile2)
2 |
3 | # Blazor Lottie Player
4 |
5 | Blazor Lottie Player makes it easy to integrate high-quality Lottie animations into your Blazor applications.
6 |
7 | ## 🚀 Getting Started
8 |
9 | ### 1. Install the NuGet Package
10 |
11 | Add [Blazor.Lottie.Player](https://mudx.org/docs/lottie) to your project via NuGet.
12 |
13 | ### 2. Choose How to Use the Component
14 |
15 | There are two ways to use Blazor Lottie Player:
16 |
17 | #### a. Using the Built-in Component
18 |
19 | - Add `@using Blazor.Lottie.Player` to your `_Imports.razor` file.
20 | - Use the `` component in your Razor files, setting the `Src` parameter to your Lottie animation JSON file.
21 | - The player will size itself to fill its parent container. Use CSS to control its width and height as needed.
22 |
23 | #### b. Using the Module Programmatically (Advanced)
24 |
25 | - Add `@using Blazor.Lottie.Player` to your `_Imports.razor` file.
26 | - Include the Lottie Web library (The LottiePlayer component loads it from the below CDN):
27 |
28 | ```html
29 |
30 | ```
31 |
32 | - Instantiate and use the `LottiePlayer` class in your code-behind or component logic:
33 |
34 | ```csharp
35 | var player = new LottiePlayerModule(IJSRuntime, ElementReference);
36 | await player.InitializeAsync(LottiePlaybackOptions);
37 | // Optional Commands
38 | await player.PlayAsync();
39 | await player.PauseAsync();
40 | await player.StopAsync();
41 | await player.GoToAndPlay(double frame, true);
42 | await player.GoToAndStop(double frame, true);
43 | await player.SetSpeedAsync(double speed, true);
44 | await player.SetDirectionAsync(LottieDirection.Forward);
45 | // Subscribe to Events
46 | player.OnAnimationLoaded += (args) => { /* Handle Animation Loaded */ };
47 | player.OnDOMLoaded += (args) => { /* Handle DOM Loaded */ };
48 | player.OnAnimationComplete += () => { /* Handle Animation Complete */ };
49 | player.OnEnterFrame += (args) => { /* Handle Enter Frame */ };
50 | player.OnComplete += () => { /* Handle Complete */ };
51 | player.OnLoopComplete += () => { /* Handle Loop Complete */ };
52 | ```
53 |
54 | ### 3. Read the Docs
55 |
56 | Visit the [Blazor Lottie Player documentation](https://mudx.org/docs/lottie) for detailed usage instructions, examples, and API reference.
57 |
58 | ### 4. Get Help, Support, or Contribute
59 |
60 | If you need help, want to report an issue, or would like to support or contribute to the project, please visit the [GitHub repository](https://github.com/MudXtra/LottiePlayer) for more information.
61 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Component/LottiePlaybackOptions.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Blazor.Lottie.Player;
3 | ///
4 | /// Configuration options for Lottie animation playback and rendering.
5 | ///
6 | public class LottiePlaybackOptions
7 | {
8 | ///
9 | /// The source or path to the lottie animation JSON file.
10 | ///
11 | ///
12 | /// This can be a URL or a local path relative to the web root. e.g. "./_content/Blazor.Lottie.Player/loading.json"
13 | /// or "https://example.com/path/to/animation.json".
14 | ///
15 | public string Path { get; set; } = "./_content/Blazor.Lottie.Player/loading.json";
16 |
17 | ///
18 | /// Gets or sets whether the animation should start playing automatically.
19 | ///
20 | /// Default is true.
21 | public bool AutoPlay { get; set; } = true;
22 |
23 | ///
24 | /// Gets or sets the type of Lottie animation to render.
25 | ///
26 | /// Default is SVG for best feature support.
27 | public string Renderer { get; set; } = LottieAnimationType.Svg.ToDescription();
28 |
29 | ///
30 | /// Gets or sets the loop behavior for the animation.
31 | ///
32 | ///
33 | /// Can be true (infinite loop), false (no loop), or a positive integer
34 | /// for a specific number of loops.
35 | ///
36 | public object Loop { get; set; } = true;
37 |
38 | ///
39 | /// Gets or sets the playback direction.
40 | ///
41 | /// 1 for forward, -1 for reverse. Default is 1.
42 | public int Direction { get; set; } = (int)LottieAnimationDirection.Forward;
43 |
44 | ///
45 | /// Gets or sets the playback speed multiplier.
46 | ///
47 | /// 1.0 is normal speed, 2.0 is double speed, 0.5 is half speed. Default is 1.0.
48 | public double Speed { get; set; } = 1.0;
49 |
50 | ///
51 | /// Gets or sets whether to enable smooth frame interpolation for high refresh rate displays.
52 | ///
53 | /// Default is true for smooth animations.
54 | public bool SetSubFrame { get; set; } = true;
55 |
56 | ///
57 | /// Gets or sets the rendering quality level.
58 | ///
59 | /// Default is High.
60 | public string Quality { get; set; } = LottieAnimationQuality.High.ToDescription();
61 |
62 | ///
63 | /// Whether to enable the enterFrame event.
64 | ///
65 | ///
66 | /// If CurrentFrameChangedFunc is null this should be false.
67 | ///
68 | public bool EnterFrameEvent { get; set; } = false;
69 | }
70 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Blazor.Lottie.Player.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0;net9.0
5 | enable
6 | enable
7 | 1.0.5
8 |
9 |
10 |
11 | Blazor.Lottie.Player
12 | Blazor.Lottie.Player
13 | MIT
14 | Nuget.png
15 | MudXtra
16 | Versile and Contributors
17 | Copyright 2025 MudXtra
18 | Blazor, Component, Blazor Components, Blazor Library, Lottie, Lottie Player, Lottie Animations
19 | A component wrapper to display Lottie Animations in Blazor.
20 | https://mudx.org/docs/lottieplayer
21 | README.md
22 | https://github.com/MudXtra/LottiePlayer
23 | git
24 |
25 |
26 |
27 | true
28 | true
29 | true
30 | snupkg
31 |
32 |
33 |
34 | true
35 | False
36 | true
37 | false
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | True
51 | \
52 |
53 |
54 | True
55 | \
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Configuration/LottieAnimationOptions.cs:
--------------------------------------------------------------------------------
1 | namespace Blazor.Lottie.Player;
2 |
3 | ///
4 | /// Represents the advanced configuration options for rendering Lottie animations.
5 | ///
6 | public class LottieAnimationOptions
7 | {
8 | ///
9 | /// Gets or sets the URL of the Lottie JavaScript library used for rendering Lottie animations.
10 | ///
11 | public string LottieSourceJs { get; set; } = "https://cdnjs.cloudflare.com/ajax/libs/lottie-web/5.13.0/lottie.min.js";
12 |
13 | ///
14 | /// Gets or sets the quality level of the Lottie animation rendering. This is a global setting.
15 | ///
16 | /// Defaults to . Higher quality levels may
17 | /// result in smoother animations but could increase resource usage.
18 | public LottieAnimationQuality AnimationQuality { get; set; } = LottieAnimationQuality.High;
19 |
20 | ///
21 | /// Gets or sets whether to enable smooth frame interpolation for high refresh rate displays.
22 | ///
23 | ///
24 | /// When true (default), the animation will interpolate between keyframes to create
25 | /// smooth motion that adapts to your display's refresh rate (60Hz, 120Hz, etc.).
26 | /// When false , the animation will only update on the original After Effects keyframes,
27 | /// which may appear choppy on high refresh displays but offers better performance and
28 | /// pixel-perfect reproduction of the original animation timing.
29 | ///
30 | public bool SmoothFrameInterpolation { get; set; } = true;
31 |
32 | ///
33 | /// Determines whether the specified object is equal to the current instance.
34 | ///
35 | /// Two instances are considered equal if they have the same , , and values.
37 | /// The object to compare with the current instance.
38 | /// if the specified object is equal to the current instance; otherwise, .
40 | public override bool Equals(object? obj)
41 | {
42 | if (ReferenceEquals(this, obj))
43 | return true;
44 | if (obj is not LottieAnimationOptions other)
45 | return false;
46 |
47 | return string.Equals(LottieSourceJs, other.LottieSourceJs, StringComparison.Ordinal)
48 | && AnimationQuality == other.AnimationQuality
49 | && SmoothFrameInterpolation == other.SmoothFrameInterpolation;
50 | }
51 |
52 | ///
53 | /// Returns a hash code for the current object.
54 | ///
55 | /// The hash code is computed based on the values of the , , and properties. This ensures that objects
57 | /// with the same property values produce the same hash code.
58 | /// An integer hash code that represents the current object.
59 | public override int GetHashCode()
60 | {
61 | return HashCode.Combine(
62 | LottieSourceJs != null ? StringComparer.Ordinal.GetHashCode(LottieSourceJs) : 0,
63 | AnimationQuality,
64 | SmoothFrameInterpolation
65 | );
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/css/app.css:
--------------------------------------------------------------------------------
1 | .valid.modified:not([type=checkbox]) {
2 | outline: 1px solid #26b050;
3 | }
4 |
5 | .invalid {
6 | outline: 1px solid red;
7 | }
8 |
9 | .validation-message {
10 | color: red;
11 | }
12 |
13 | #blazor-error-ui {
14 | color-scheme: light only;
15 | background: lightyellow;
16 | bottom: 0;
17 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
18 | box-sizing: border-box;
19 | display: none;
20 | left: 0;
21 | padding: 0.6rem 1.25rem 0.7rem 1.25rem;
22 | position: fixed;
23 | width: 100%;
24 | z-index: 1000;
25 | }
26 |
27 | #blazor-error-ui .dismiss {
28 | cursor: pointer;
29 | position: absolute;
30 | right: 0.75rem;
31 | top: 0.5rem;
32 | }
33 |
34 | .blazor-error-boundary {
35 | background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
36 | padding: 1rem 1rem 1rem 3.7rem;
37 | color: white;
38 | }
39 |
40 | .blazor-error-boundary::after {
41 | content: "An error has occurred."
42 | }
43 |
44 | .loading-progress {
45 | position: relative;
46 | display: block;
47 | width: 8rem;
48 | height: 8rem;
49 | margin: 20vh auto 1rem auto;
50 | }
51 |
52 | .loading-progress circle {
53 | fill: none;
54 | stroke: #e0e0e0;
55 | stroke-width: 0.6rem;
56 | transform-origin: 50% 50%;
57 | transform: rotate(-90deg);
58 | }
59 |
60 | .loading-progress circle:last-child {
61 | stroke: #1b6ec2;
62 | stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
63 | transition: stroke-dasharray 0.05s ease-in-out;
64 | }
65 |
66 | .loading-progress-text {
67 | position: absolute;
68 | text-align: center;
69 | font-weight: bold;
70 | inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
71 | }
72 |
73 | .loading-progress-text:after {
74 | content: var(--blazor-load-percentage-text, "Loading");
75 | }
76 |
77 | code {
78 | color: #c02d76;
79 | }
80 |
81 | .form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
82 | color: var(--bs-secondary-color);
83 | text-align: end;
84 | }
85 |
86 | .form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
87 | text-align: start;
88 | }
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Player-API-Documentation.txt:
--------------------------------------------------------------------------------
1 | https://airbnb.io/lottie/#/web
2 | ** Lottie BodyMovin Version 5.13.0 **
3 | Getting Started
4 |
5 | Bodymovin can render Lottie JSON files on the web.
6 |
7 | First, get the bodymovin player javascript library. It is statically hosted at https://cdnjs.com/libraries/bodymovin or you can get the javascript directly by clicking Get Player in the bodymovin plugin.
8 |
9 |
10 |
11 |
12 |
13 | Bodymovin is also available on npm and bower.
14 |
15 | Then playing the animation is as simple as:
16 |
17 | var animation = bodymovin.loadAnimation({
18 | container: document.getElementById('lottie'), // Required
19 | path: 'data.json', // Required
20 | renderer: 'svg/canvas/html', // Required
21 | loop: true, // Optional
22 | autoplay: true, // Optional
23 | name: "Hello World", // Name for future reference. Optional.
24 | })
25 |
26 | HTML player installation
27 | Static URL
28 |
29 | Or you can use the script file from here: https://cdnjs.com/libraries/lottie-web
30 |
31 | Usage
32 |
33 | Call lottie.loadAnimation() to start an animation. It takes an object as a unique param with:
34 |
35 | animationData: an Object with the exported animation data.
36 | path: the relative path to the animation object. (animationData and path are mutually exclusive)
37 | loop: true / false / number
38 | autoplay: true / false it will start playing as soon as it is ready
39 | name: animation name for future reference
40 | renderer: 'svg' / 'canvas' / 'html' to set the renderer
41 | container: the dom element on which to render the animation
42 |
43 | It returns the animation instance you can control with play, pause, setSpeed, etc.
44 |
45 | lottie.loadAnimation({
46 | container: element, // the dom element that will contain the animation
47 | renderer: 'svg',
48 | loop: true,
49 | autoplay: true,
50 | path: 'data.json' // the path to the animation json
51 | });
52 |
53 | Usage
54 |
55 | animation instances have these main methods:
56 |
57 | anim.play()
58 | anim.stop()
59 | anim.pause()
60 | anim.setLocationHref(locationHref) -- one param usually pass as location.href. Its useful when you experience mask issue in safari where your url does not have # symbol.
61 | anim.setSpeed(speed) -- one param speed (1 is normal speed)
62 | anim.goToAndStop(value, isFrame) first param is a numeric value. second param is a boolean that defines time or frames for first param
63 | anim.goToAndPlay(value, isFrame) first param is a numeric value. second param is a boolean that defines time or frames for first param
64 | anim.setDirection(direction) -- one param direction (1 is normal direction.)
65 | anim.playSegments(segments, forceFlag) -- first param is a single array or multiple arrays of two values each(fromFrame,toFrame), second param is a boolean for forcing the new segment right away
66 | anim.setSubframe(flag) -- If false, it will respect the original AE fps. If true, it will update as much as possible. (true by default
67 | anim.destroy()
68 |
69 | lottie has 8 main methods:
70 |
71 | lottie.play() -- with 1 optional parameter name to target a specific animation
72 | lottie.stop() -- with 1 optional parameter name to target a specific animation
73 | lottie.setSpeed() -- first param speed (1 is normal speed) -- with 1 optional parameter name to target a specific animation
74 | lottie.setDirection() -- first param direction (1 is normal direction.) -- with 1 optional parameter name to target a specific animation
75 | lottie.searchAnimations() -- looks for elements with class "lottie"
76 | lottie.loadAnimation() -- Explained above. returns an animation instance to control individually.
77 | lottie.destroy() -- To destroy and release resources. The DOM element will be emptied.
78 | lottie.registerAnimation() -- you can register an element directly with registerAnimation. It must have the "data-animation-path" attribute pointing at the data.json url
79 | lottie.setQuality() -- default 'high', set 'high','medium','low', or a number > 1 to improve player performance. In some animations as low as 2 won't show any difference.
80 |
81 | Events
82 |
83 | onComplete
84 | onLoopComplete
85 | onEnterFrame
86 | onSegmentStart
87 |
88 | you can also use addEventListener with the following events:
89 |
90 | complete
91 | loopComplete
92 | enterFrame
93 | segmentStart
94 | config_ready (when initial config is done)
95 | data_ready (when all parts of the animation have been loaded)
96 | DOMLoaded (when elements have been added to the DOM)
97 | destroy
98 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | end_of_line = crlf
6 | charset = utf-8
7 | indent_size = 4
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 | csharp_using_directive_placement = outside_namespace:silent
11 | csharp_prefer_simple_using_statement = true:suggestion
12 | csharp_prefer_braces = true:silent
13 | csharp_style_namespace_declarations = file_scoped:silent
14 | csharp_style_prefer_method_group_conversion = true:silent
15 | csharp_style_prefer_top_level_statements = true:silent
16 | csharp_style_prefer_primary_constructors = true:suggestion
17 | csharp_prefer_system_threading_lock = true:suggestion
18 | csharp_style_expression_bodied_methods = false:silent
19 | csharp_style_expression_bodied_constructors = false:silent
20 | csharp_style_expression_bodied_operators = false:silent
21 | csharp_style_expression_bodied_properties = true:silent
22 | csharp_style_expression_bodied_indexers = true:silent
23 | csharp_style_expression_bodied_accessors = true:silent
24 | csharp_style_expression_bodied_lambdas = true:silent
25 | csharp_style_expression_bodied_local_functions = false:silent
26 | csharp_indent_labels = one_less_than_current
27 |
28 | [*.json]
29 | indent_style = space
30 | end_of_line = crlf
31 | charset = utf-8
32 | indent_size = 2
33 |
34 | [*.{yml,yaml}]
35 | indent_style = space
36 | end_of_line = crlf
37 | charset = utf-8
38 | indent_size = 2
39 |
40 | [*.md]
41 | trim_trailing_whitespace = false
42 | insert_final_newline = false
43 |
44 | [*.{cs,vb}]
45 | #### Naming styles ####
46 |
47 | # Naming rules
48 |
49 | dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
50 | dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
51 | dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
52 |
53 | dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
54 | dotnet_naming_rule.types_should_be_pascal_case.symbols = types
55 | dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
56 |
57 | dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
58 | dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
59 | dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
60 | dotnet_diagnostic.IDE0130.severity = none
61 |
62 | # Symbol specifications
63 |
64 | dotnet_naming_symbols.interface.applicable_kinds = interface
65 | dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
66 | dotnet_naming_symbols.interface.required_modifiers =
67 |
68 | dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
69 | dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
70 | dotnet_naming_symbols.types.required_modifiers =
71 |
72 | dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
73 | dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
74 | dotnet_naming_symbols.non_field_members.required_modifiers =
75 |
76 | # Naming styles
77 |
78 | dotnet_naming_style.begins_with_i.required_prefix = I
79 | dotnet_naming_style.begins_with_i.required_suffix =
80 | dotnet_naming_style.begins_with_i.word_separator =
81 | dotnet_naming_style.begins_with_i.capitalization = pascal_case
82 |
83 | dotnet_naming_style.pascal_case.required_prefix =
84 | dotnet_naming_style.pascal_case.required_suffix =
85 | dotnet_naming_style.pascal_case.word_separator =
86 | dotnet_naming_style.pascal_case.capitalization = pascal_case
87 |
88 | dotnet_naming_style.pascal_case.required_prefix =
89 | dotnet_naming_style.pascal_case.required_suffix =
90 | dotnet_naming_style.pascal_case.word_separator =
91 | dotnet_naming_style.pascal_case.capitalization = pascal_case
92 | dotnet_style_coalesce_expression = true:suggestion
93 | dotnet_style_null_propagation = true:suggestion
94 | dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
95 | dotnet_style_prefer_auto_properties = true:silent
96 | dotnet_style_object_initializer = true:suggestion
97 | dotnet_style_collection_initializer = true:suggestion
98 | dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
99 | dotnet_style_prefer_conditional_expression_over_assignment = true:silent
100 | dotnet_style_prefer_conditional_expression_over_return = true:silent
101 | dotnet_style_explicit_tuple_names = true:suggestion
102 | dotnet_style_prefer_inferred_tuple_names = true:suggestion
103 | dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
104 | dotnet_style_prefer_compound_assignment = true:suggestion
105 | dotnet_style_operator_placement_when_wrapping = beginning_of_line
106 | tab_width = 4
107 | dotnet_style_prefer_simplified_interpolation = true:suggestion
108 | dotnet_style_namespace_match_folder = true:suggestion
109 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/wwwroot/lottiePlayerModule.js:
--------------------------------------------------------------------------------
1 |
2 | export function initialize(dotNetRef, elementRef, options) {
3 | const animation = lottie.loadAnimation({
4 | container: elementRef,
5 | renderer: options.renderer,
6 | loop: options.loop,
7 | autoplay: false,
8 | path: options.path
9 | });
10 | let success = animation !== null && animation !== undefined;
11 | if (!success) {
12 | console.error("Failed to load Lottie animation. Check the path and options.");
13 | return null;
14 | }
15 |
16 | // Set up options
17 | success = setOptions(animation, options);
18 | if (!success) {
19 | console.error("Failed to set options for Lottie animation.");
20 | return null;
21 | }
22 | // Set up event listeners
23 | success = addEvents(animation, dotNetRef, options, elementRef);
24 | if (!success) {
25 | console.error("Failed to add event listeners for Lottie animation.");
26 | return null;
27 | }
28 | // start playing the animation if autoplay is true
29 | if (options.autoPlay) {
30 | // If autoplay is true, play the animation immediately
31 | animation.play();
32 | }
33 | return animation; // Return animation if successful
34 | }
35 |
36 | function setOptions(animation, options) {
37 | if (animation && options) {
38 | // Apply various options
39 | if (options.speed !== undefined && options.speed !== 1.0) animation.setSpeed(options.speed);
40 | if (options.direction !== undefined && options.direction !== 1) animation.setDirection(options.direction);
41 | if (options.setSubFrame !== true) animation.setSubframe(false);
42 | if (options.quality !== undefined && options.quality !== 'high') lottie.setQuality(options.quality);
43 | return true;
44 | }
45 | return false;
46 | }
47 |
48 | function addEvents(animation, dotNetAdapter, options, elementRef) {
49 | if (animation && dotNetAdapter && options && elementRef) {
50 | animation.addEventListener('data_ready', () => {
51 | // Add event listeners
52 | const eventArgs = {
53 | elementId: elementRef.id,
54 | currentFrame: animation.currentFrame,
55 | totalFrames: animation.totalFrames
56 | };
57 | invokeDotNetMethodAsync(dotNetAdapter, "AnimationReadyEvent", eventArgs);
58 | });
59 | animation.addEventListener('DOMLoaded', () => {
60 | // Add event listeners
61 | const eventArgs = {
62 | elementId: elementRef.id,
63 | currentFrame: animation.currentFrame,
64 | totalFrames: animation.totalFrames
65 | };
66 | invokeDotNetMethodAsync(dotNetAdapter, "DOMLoadedEvent", eventArgs);
67 | });
68 | animation.addEventListener('complete', () => {
69 | invokeDotNetMethodAsync(dotNetAdapter, 'CompleteEvent');
70 | });
71 | animation.addEventListener('loopComplete', () => {
72 | invokeDotNetMethodAsync(dotNetAdapter, 'LoopCompleteEvent');
73 | });
74 | if (options.enterFrameEvent) {
75 | animation.addEventListener('enterFrame', (e) => {
76 | invokeDotNetMethodAsync(dotNetAdapter, 'EnterFrameEvent', e);
77 | });
78 | }
79 | return true;
80 | }
81 | return false;
82 | }
83 |
84 | function invokeDotNetMethodAsync(dotNetAdapter, methodName, ...args) {
85 | return dotNetAdapter.invokeMethodAsync(methodName, ...args)
86 | .catch((reason) => {
87 | console.error(reason);
88 | });
89 | }
90 |
91 | export function play(animation) {
92 | if (animation) {
93 | animation.play();
94 | } else {
95 | console.error("Animation instance is null or undefined.");
96 | }
97 | }
98 |
99 | export function stop(animation) {
100 | if (animation) {
101 | animation.stop();
102 | } else {
103 | console.error("Animation instance is null or undefined.");
104 | }
105 | }
106 |
107 | export function pause(animation) {
108 | if (animation) {
109 | animation.pause();
110 | } else {
111 | console.error("Animation instance is null or undefined.");
112 | }
113 | }
114 |
115 | export function goToAndStop(animation, frame, isFrame) {
116 | if (animation) {
117 | if (isFrame) {
118 | animation.goToAndStop(frame, true);
119 | } else {
120 | animation.goToAndStop(animation.totalFrames * frame, true);
121 | }
122 | } else {
123 | console.error("Animation instance is null or undefined.");
124 | }
125 | }
126 |
127 | export function goToAndPlay(animation, frame, isFrame) {
128 | if (animation) {
129 | if (isFrame) {
130 | animation.goToAndPlay(frame, true);
131 | } else {
132 | animation.goToAndPlay(animation.totalFrames * frame, true);
133 | }
134 | } else {
135 | console.error("Animation instance is null or undefined.");
136 | }
137 | }
138 |
139 | export function setDirection(animation, direction) {
140 | if (animation && (direction === 1 || direction === -1)) {
141 | animation.setDirection(direction);
142 | } else {
143 | console.error("Invalid animation instance or direction value. Direction must be 1 or -1.");
144 | }
145 | }
146 |
147 | export function setSpeed(animation, speed) {
148 | if (animation && speed > 0) {
149 | animation.setSpeed(speed);
150 | } else {
151 | console.error("Invalid animation instance or speed value. Speed must be greater than 0.");
152 | }
153 | }
154 |
155 | export function destroy(animation) {
156 | if (animation) {
157 | animation.destroy();
158 | } else {
159 | console.error("Animation instance is null or undefined.");
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/tests/Blazor.Lottie.Player.UnitTests/LottieModuleTests.cs:
--------------------------------------------------------------------------------
1 | using AwesomeAssertions;
2 | using Bunit;
3 | using Moq;
4 |
5 | namespace Blazor.Lottie.Player.UnitTests;
6 | public class LottieModuleTests : BunitTest
7 | {
8 | [SetUp]
9 | public override void Setup()
10 | {
11 | base.Setup();
12 |
13 | // Setup the import call to return a mock module
14 | var moduleMock = Context.JSInterop.SetupModule("./_content/Blazor.Lottie.Player/loadLottieWeb.js");
15 | // Setup the initialize call to return true
16 | moduleMock.Setup("initialize", _ => true).SetResult(true);
17 |
18 | var lottieModuleMock = Context.JSInterop.SetupModule("./_content/Blazor.Lottie.Player/lottiePlayerModule.js");
19 | lottieModuleMock.Setup("initialize", _ => true).SetResult(true);
20 |
21 | lottieModuleMock.Setup("play", _ => true).SetResult(true);
22 | lottieModuleMock.Setup("pause", _ => true).SetResult(true);
23 | lottieModuleMock.Setup("stop", _ => true).SetResult(true);
24 | lottieModuleMock.Setup("destroy", _ => true).SetResult(true);
25 | lottieModuleMock.Setup("setSpeed", _ => true).SetResult(true);
26 | lottieModuleMock.Setup("setDirection", _ => true).SetResult(true);
27 | }
28 |
29 | [Test]
30 | public void LottiePlayerModule_Initialization()
31 | {
32 | var comp = Context.RenderComponent(parameters => parameters
33 | .Add(p => p.Src, "https://example.com/lottie.json")
34 | );
35 |
36 | var lottieModule = comp.Instance.LottiePlayerModule;
37 | lottieModule.Should().NotBeNull();
38 |
39 | lottieModule._lottieAnimationRef.Should().NotBeNull();
40 |
41 | // after init, jsruntime, elementref, and dotnetobjectref should be setup
42 | lottieModule._js.Should().NotBeNull();
43 | lottieModule._elementRef.Should().NotBeNull();
44 | lottieModule._dotNetReference.Should().NotBeNull();
45 | lottieModule._isDisposing.Should().BeFalse();
46 |
47 | // verify element ref
48 | lottieModule._elementRef.Should().NotBeNull();
49 | }
50 |
51 | [Test]
52 | public void LottiePlayerModule_Events()
53 | {
54 | var comp = Context.RenderComponent(parameters => parameters
55 | .Add(p => p.Src, "https://example.com/lottie.json")
56 | );
57 |
58 | var lottieModule = comp.Instance.LottiePlayerModule;
59 | lottieModule.Should().NotBeNull();
60 |
61 | var loadedEventArgs = new LottiePlayerLoadedEventArgs
62 | {
63 | ElementId = comp.Instance.ElementId,
64 | CurrentFrame = 0.0,
65 | TotalFrames = 100.0,
66 | };
67 |
68 | var eventTriggered = false;
69 | lottieModule.OnDOMLoaded += (sender, args) => eventTriggered = true;
70 | comp.InvokeAsync(() => lottieModule.DOMLoadedEvent(loadedEventArgs));
71 | eventTriggered.Should().BeTrue();
72 |
73 | eventTriggered = false;
74 | lottieModule.OnAnimationReady += (sender, args) => eventTriggered = true;
75 | comp.InvokeAsync(() => lottieModule.AnimationReadyEvent(loadedEventArgs));
76 | eventTriggered.Should().BeTrue();
77 |
78 | eventTriggered = false;
79 | lottieModule.OnEnterFrame += (sender, args) => eventTriggered = true;
80 | comp.InvokeAsync(() => lottieModule.EnterFrameEvent(new LottiePlayerEventFrameArgs() { CurrentTime = 23.7 }));
81 | eventTriggered.Should().BeTrue();
82 |
83 | eventTriggered = false;
84 | lottieModule.OnComplete += (sender, args) => eventTriggered = true;
85 | comp.InvokeAsync(() => lottieModule.CompleteEvent());
86 | eventTriggered.Should().BeTrue();
87 |
88 | eventTriggered = false;
89 | lottieModule.OnLoopComplete += (sender, args) => eventTriggered = true;
90 | comp.InvokeAsync(() => lottieModule.LoopCompleteEvent());
91 | eventTriggered.Should().BeTrue();
92 | }
93 |
94 | [Test]
95 | public async Task LottiePlayerModule_Actions()
96 | {
97 | var comp = Context.RenderComponent(parameters => parameters
98 | .Add(p => p.Src, "https://example.com/lottie.json")
99 | .Add(p => p.AutoPlay, false)
100 | );
101 |
102 | var lottieModule = comp.Instance.LottiePlayerModule;
103 | lottieModule.Should().NotBeNull();
104 |
105 | // Test play
106 | await lottieModule.PlayAsync();
107 | Context.JSInterop.VerifyInvoke("play");
108 |
109 | // Test pause
110 | await lottieModule.PauseAsync();
111 | Context.JSInterop.VerifyInvoke("pause");
112 |
113 | // Test stop
114 | await lottieModule.StopAsync();
115 | Context.JSInterop.VerifyInvoke("stop");
116 |
117 | // Test set speed
118 | await lottieModule.SetSpeedAsync(1.5);
119 | Context.JSInterop.VerifyInvoke("setSpeed");
120 |
121 | // Test set direction
122 | await lottieModule.SetDirectionAsync(LottieAnimationDirection.Forward);
123 | Context.JSInterop.VerifyInvoke("setDirection");
124 | }
125 |
126 | [Test]
127 | public async Task LottiePlayerModule_Dispose()
128 | {
129 | var comp = Context.RenderComponent(parameters => parameters
130 | .Add(p => p.Src, "https://example.com/lottie.json")
131 | .Add(p => p.AutoPlay, false)
132 | );
133 | var lottieModule = comp.Instance.LottiePlayerModule;
134 | lottieModule.Should().NotBeNull();
135 | // Dispose the module
136 | await lottieModule.DisposeAsync();
137 | lottieModule._isDisposing.Should().BeTrue();
138 | lottieModule._lottieAnimationRef.Should().BeNull();
139 |
140 | // test CanExecute returns false after dispose
141 | lottieModule.CanExecute.Should().BeFalse();
142 | var eventTriggered = false;
143 |
144 | // test actions can't execute after dispose
145 | await lottieModule.PlayAsync();
146 | Context.JSInterop.VerifyNotInvoke("play");
147 | await lottieModule.PauseAsync();
148 | Context.JSInterop.VerifyNotInvoke("pause");
149 | await lottieModule.StopAsync();
150 | Context.JSInterop.VerifyNotInvoke("stop");
151 | await lottieModule.SetSpeedAsync(1.5);
152 | Context.JSInterop.VerifyNotInvoke("setSpeed");
153 | await lottieModule.SetDirectionAsync(LottieAnimationDirection.Forward);
154 | Context.JSInterop.VerifyNotInvoke("setDirection");
155 |
156 | // test events can't trigger after dispose
157 | lottieModule.OnDOMLoaded += (sender, args) => eventTriggered = true;
158 | await lottieModule.DOMLoadedEvent(It.IsAny());
159 | eventTriggered.Should().BeFalse();
160 | lottieModule.OnAnimationReady += (sender, args) => eventTriggered = true;
161 | await lottieModule.AnimationReadyEvent(It.IsAny());
162 | eventTriggered.Should().BeFalse();
163 | lottieModule.OnEnterFrame += (sender, args) => eventTriggered = true;
164 | await lottieModule.EnterFrameEvent(new LottiePlayerEventFrameArgs());
165 | eventTriggered.Should().BeFalse();
166 | lottieModule.OnComplete += (sender, args) => eventTriggered = true;
167 | await lottieModule.CompleteEvent();
168 | eventTriggered.Should().BeFalse();
169 | lottieModule.OnLoopComplete += (sender, args) => eventTriggered = true;
170 | await lottieModule.LoopCompleteEvent();
171 | eventTriggered.Should().BeFalse();
172 |
173 | Context.JSInterop.VerifyInvoke("destroy");
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/Pages/Home.razor:
--------------------------------------------------------------------------------
1 | @page "/"
2 | @inject ISnackbar Snackbar
3 |
4 | Blazor Lottie Player Documentation
5 |
6 | Blazor Lottie Player
7 |
8 | Welcome to the Blazor Lottie Player Documentation.
9 |
10 | This is a simple Blazor WebAssembly application that demonstrates how to use the
11 | Blazor Lottie Player component. The Lottie Player component allows you to easily
12 | integrate Lottie animations into your Blazor applications without regard to what
13 | UI components you might be using.
14 |
15 | To get started, you can check out
16 |
17 | Copyright @@ 2025 MudXtra
18 |
19 |
20 |
21 | Example 1: Basic Controls
22 |
23 |
24 |
25 |
26 | Play
27 | Pause
28 | Stop
29 |
30 |
31 |
32 |
33 |
34 | Example 2: Autoplay, Loop, and Speed
35 |
36 |
41 |
42 |
43 |
44 |
45 | await _lottiePlayer2!.SetSpeedAsync(_speed2))" Min="0.1" Max="3" Step="0.1" Style="width:150px;" />
46 | Speed: @_speed2.ToString("0.0")x
47 |
48 |
49 |
50 |
51 |
52 | Example 3: Direction Control
53 |
54 |
57 |
58 |
59 |
60 | Forward
61 | Reverse
62 |
63 | Frame: @_lottiePlayer3?.CurrentAnimationFrame of @_lottiePlayer3!.TotalAnimationFrames
64 | Set Direction
65 |
66 |
67 |
68 |
69 |
70 | Example 4: Responsive Sizing
71 |
72 |
74 |
75 |
76 | Size: @_size4 px
77 |
78 |
79 |
80 |
81 | Example 5: Disabled State
82 |
83 |
86 |
87 |
88 |
89 | @foreach (var lottie in _lottieList.OrderBy(x => x.Name))
90 | {
91 | @lottie.Name
92 | }
93 |
94 |
95 |
96 | Add
97 |
98 |
99 |
100 | @code {
101 | private List _lottieList = [];
102 |
103 | // Example 1
104 | LottiePlayer? _lottiePlayer1;
105 | int _lottie1Sel = 1;
106 |
107 | // Example 2
108 | LottiePlayer? _lottiePlayer2;
109 | bool _autoplay2 = true;
110 | bool _loop2 = true;
111 | double _speed2 = 1.0;
112 | int _lottie2Sel = 2;
113 |
114 | // Example 3
115 | LottiePlayer? _lottiePlayer3;
116 | int _direction3 = 1;
117 | int _lottie3Sel = 3;
118 |
119 | // Example 4
120 | LottiePlayer? _lottiePlayer4;
121 | int _size4 = 300;
122 | string _size4px => $"{_size4}px";
123 | string _lottieName = string.Empty;
124 | string _lottieSrc = string.Empty;
125 | LottieAnimationList _lottieAnim = default!;
126 |
127 | // Legacy example
128 | LottiePlayer? _lottiePlayer;
129 | int _lottie5Sel = 0;
130 |
131 | protected override void OnInitialized()
132 | {
133 | _lottieList.Add(new LottieAnimationList() { Name = "Hand Loading", Src = "https://lottie.host/99ab6923-62d6-4030-aeb0-282d33242f3e/Z1CzIUWU18.json" });
134 | _lottieList.Add(new LottieAnimationList() { Name = "Gift Box", Src = "./lottie/newAnimation.json" });
135 | _lottieList.Add(new LottieAnimationList() { Name = "Lego Loading", Src = "https://lottie.host/694149cc-b526-4803-acff-522c384f3319/UM1M0cO0TD.json" });
136 | _lottieList.Add(new LottieAnimationList() { Name = "Handshake", Src = "https://lottie.host/382bbcd7-e7b1-4a30-90cd-884a9c7c3bb1/F7I9nPKEr1.json" });
137 | _lottieList.Add(new LottieAnimationList() { Name = "HotDog Loading", Src = "./lottie/BunBun.json" });
138 | _lottieList.Add(new LottieAnimationList() { Name = "Hand Loading JSON", Src = "./lottie/loading.json" });
139 | _lottieAnim = _lottieList[4];
140 | }
141 |
142 | private void AddLottie(MouseEventArgs args)
143 | {
144 | if (!string.IsNullOrWhiteSpace(_lottieName) && !string.IsNullOrWhiteSpace(_lottieSrc))
145 | {
146 | _lottieList.Add(new LottieAnimationList() { Name = _lottieName, Src = _lottieSrc });
147 | _lottieName = string.Empty;
148 | _lottieSrc = string.Empty;
149 | Snackbar.Add("Lottie animation added successfully!", Severity.Success);
150 | }
151 | else
152 | {
153 | Snackbar.Add("Please provide both name and source URL for the Lottie animation.", Severity.Error);
154 | }
155 | }
156 |
157 | private void LottiePlayer_OnCurrentFrameChanged(LottiePlayerEventFrameArgs e)
158 | {
159 | if (e.CurrentTime > 99999999)
160 | {
161 | Snackbar.Add("Current time exceeds the maximum limit.", Severity.Warning);
162 | }
163 | }
164 | }
165 |
166 | @code {
167 | public class LottieAnimationList
168 | {
169 | public string Name { get; set; } = string.Empty;
170 | public string Src { get; set; } = string.Empty;
171 | public override string ToString()
172 | {
173 | return $"{Name}";
174 | }
175 | }
176 | }
177 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Ww][Ii][Nn]32/
27 | [Aa][Rr][Mm]/
28 | [Aa][Rr][Mm]64/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Ll]og/
33 | [Ll]ogs/
34 |
35 | # Visual Studio 2015/2017 cache/options directory
36 | .vs/
37 | # Uncomment if you have tasks that create the project's static files in wwwroot
38 | #wwwroot/
39 |
40 | # Visual Studio 2017 auto generated files
41 | Generated\ Files/
42 |
43 | # MSTest test Results
44 | [Tt]est[Rr]esult*/
45 | [Bb]uild[Ll]og.*
46 |
47 | # NUnit
48 | *.VisualState.xml
49 | TestResult.xml
50 | nunit-*.xml
51 |
52 | # Build Results of an ATL Project
53 | [Dd]ebugPS/
54 | [Rr]eleasePS/
55 | dlldata.c
56 |
57 | # Benchmark Results
58 | BenchmarkDotNet.Artifacts/
59 |
60 | # .NET Core
61 | project.lock.json
62 | project.fragment.lock.json
63 | artifacts/
64 |
65 | # ASP.NET Scaffolding
66 | ScaffoldingReadMe.txt
67 |
68 | # StyleCop
69 | StyleCopReport.xml
70 |
71 | # Files built by Visual Studio
72 | *_i.c
73 | *_p.c
74 | *_h.h
75 | *.ilk
76 | *.meta
77 | *.obj
78 | *.iobj
79 | *.pch
80 | *.pdb
81 | *.ipdb
82 | *.pgc
83 | *.pgd
84 | *.rsp
85 | *.sbr
86 | *.tlb
87 | *.tli
88 | *.tlh
89 | *.tmp
90 | *.tmp_proj
91 | *_wpftmp.csproj
92 | *.log
93 | *.tlog
94 | *.vspscc
95 | *.vssscc
96 | .builds
97 | *.pidb
98 | *.svclog
99 | *.scc
100 |
101 | # Chutzpah Test files
102 | _Chutzpah*
103 |
104 | # Visual C++ cache files
105 | ipch/
106 | *.aps
107 | *.ncb
108 | *.opendb
109 | *.opensdf
110 | *.sdf
111 | *.cachefile
112 | *.VC.db
113 | *.VC.VC.opendb
114 |
115 | # Visual Studio profiler
116 | *.psess
117 | *.vsp
118 | *.vspx
119 | *.sap
120 |
121 | # Visual Studio Trace Files
122 | *.e2e
123 |
124 | # TFS 2012 Local Workspace
125 | $tf/
126 |
127 | # Guidance Automation Toolkit
128 | *.gpState
129 |
130 | # ReSharper is a .NET coding add-in
131 | _ReSharper*/
132 | *.[Rr]e[Ss]harper
133 | *.DotSettings.user
134 |
135 | # TeamCity is a build add-in
136 | _TeamCity*
137 |
138 | # DotCover is a Code Coverage Tool
139 | *.dotCover
140 |
141 | # AxoCover is a Code Coverage Tool
142 | .axoCover/*
143 | !.axoCover/settings.json
144 |
145 | # Coverlet is a free, cross platform Code Coverage Tool
146 | coverage*.json
147 | coverage*.xml
148 | coverage*.info
149 |
150 | # Visual Studio code coverage results
151 | *.coverage
152 | *.coveragexml
153 |
154 | # NCrunch
155 | _NCrunch_*
156 | .*crunch*.local.xml
157 | nCrunchTemp_*
158 |
159 | # MightyMoose
160 | *.mm.*
161 | AutoTest.Net/
162 |
163 | # Web workbench (sass)
164 | .sass-cache/
165 |
166 | # Installshield output folder
167 | [Ee]xpress/
168 |
169 | # DocProject is a documentation generator add-in
170 | DocProject/buildhelp/
171 | DocProject/Help/*.HxT
172 | DocProject/Help/*.HxC
173 | DocProject/Help/*.hhc
174 | DocProject/Help/*.hhk
175 | DocProject/Help/*.hhp
176 | DocProject/Help/Html2
177 | DocProject/Help/html
178 |
179 | # Click-Once directory
180 | publish/
181 |
182 | # Publish Web Output
183 | *.[Pp]ublish.xml
184 | *.azurePubxml
185 | # Note: Comment the next line if you want to checkin your web deploy settings,
186 | # but database connection strings (with potential passwords) will be unencrypted
187 | *.pubxml
188 | *.publishproj
189 |
190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
191 | # checkin your Azure Web App publish settings, but sensitive information contained
192 | # in these scripts will be unencrypted
193 | PublishScripts/
194 |
195 | # NuGet Packages
196 | *.nupkg
197 | # NuGet Symbol Packages
198 | *.snupkg
199 | # The packages folder can be ignored because of Package Restore
200 | **/[Pp]ackages/*
201 | # except build/, which is used as an MSBuild target.
202 | !**/[Pp]ackages/build/
203 | # Uncomment if necessary however generally it will be regenerated when needed
204 | #!**/[Pp]ackages/repositories.config
205 | # NuGet v3's project.json files produces more ignorable files
206 | *.nuget.props
207 | *.nuget.targets
208 |
209 | # Microsoft Azure Build Output
210 | csx/
211 | *.build.csdef
212 |
213 | # Microsoft Azure Emulator
214 | ecf/
215 | rcf/
216 |
217 | # Windows Store app package directories and files
218 | AppPackages/
219 | BundleArtifacts/
220 | Package.StoreAssociation.xml
221 | _pkginfo.txt
222 | *.appx
223 | *.appxbundle
224 | *.appxupload
225 |
226 | # Visual Studio cache files
227 | # files ending in .cache can be ignored
228 | *.[Cc]ache
229 | # but keep track of directories ending in .cache
230 | !?*.[Cc]ache/
231 |
232 | # Others
233 | ClientBin/
234 | ~$*
235 | *~
236 | *.dbmdl
237 | *.dbproj.schemaview
238 | *.jfm
239 | *.pfx
240 | *.publishsettings
241 | orleans.codegen.cs
242 |
243 | # Including strong name files can present a security risk
244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
245 | #*.snk
246 |
247 | # Since there are multiple workflows, uncomment next line to ignore bower_components
248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
249 | #bower_components/
250 |
251 | # RIA/Silverlight projects
252 | Generated_Code/
253 |
254 | # Backup & report files from converting an old project file
255 | # to a newer Visual Studio version. Backup files are not needed,
256 | # because we have git ;-)
257 | _UpgradeReport_Files/
258 | Backup*/
259 | UpgradeLog*.XML
260 | UpgradeLog*.htm
261 | ServiceFabricBackup/
262 | *.rptproj.bak
263 |
264 | # SQL Server files
265 | *.mdf
266 | *.ldf
267 | *.ndf
268 |
269 | # Business Intelligence projects
270 | *.rdl.data
271 | *.bim.layout
272 | *.bim_*.settings
273 | *.rptproj.rsuser
274 | *- [Bb]ackup.rdl
275 | *- [Bb]ackup ([0-9]).rdl
276 | *- [Bb]ackup ([0-9][0-9]).rdl
277 |
278 | # Microsoft Fakes
279 | FakesAssemblies/
280 |
281 | # GhostDoc plugin setting file
282 | *.GhostDoc.xml
283 |
284 | # Node.js Tools for Visual Studio
285 | .ntvs_analysis.dat
286 | node_modules/
287 |
288 | # Visual Studio 6 build log
289 | *.plg
290 |
291 | # Visual Studio 6 workspace options file
292 | *.opt
293 |
294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
295 | *.vbw
296 |
297 | # Visual Studio 6 auto-generated project file (contains which files were open etc.)
298 | *.vbp
299 |
300 | # Visual Studio 6 workspace and project file (working project files containing files to include in project)
301 | *.dsw
302 | *.dsp
303 |
304 | # Visual Studio 6 technical files
305 | *.ncb
306 | *.aps
307 |
308 | # Visual Studio LightSwitch build output
309 | **/*.HTMLClient/GeneratedArtifacts
310 | **/*.DesktopClient/GeneratedArtifacts
311 | **/*.DesktopClient/ModelManifest.xml
312 | **/*.Server/GeneratedArtifacts
313 | **/*.Server/ModelManifest.xml
314 | _Pvt_Extensions
315 |
316 | # Paket dependency manager
317 | .paket/paket.exe
318 | paket-files/
319 |
320 | # FAKE - F# Make
321 | .fake/
322 |
323 | # CodeRush personal settings
324 | .cr/personal
325 |
326 | # Python Tools for Visual Studio (PTVS)
327 | __pycache__/
328 | *.pyc
329 |
330 | # Cake - Uncomment if you are using it
331 | # tools/**
332 | # !tools/packages.config
333 |
334 | # Tabs Studio
335 | *.tss
336 |
337 | # Telerik's JustMock configuration file
338 | *.jmconfig
339 |
340 | # BizTalk build output
341 | *.btp.cs
342 | *.btm.cs
343 | *.odx.cs
344 | *.xsd.cs
345 |
346 | # OpenCover UI analysis results
347 | OpenCover/
348 |
349 | # Azure Stream Analytics local run output
350 | ASALocalRun/
351 |
352 | # MSBuild Binary and Structured Log
353 | *.binlog
354 |
355 | # NVidia Nsight GPU debugger configuration file
356 | *.nvuser
357 |
358 | # MFractors (Xamarin productivity tool) working folder
359 | .mfractor/
360 |
361 | # Local History for Visual Studio
362 | .localhistory/
363 |
364 | # Visual Studio History (VSHistory) files
365 | .vshistory/
366 |
367 | # BeatPulse healthcheck temp database
368 | healthchecksdb
369 |
370 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
371 | MigrationBackup/
372 |
373 | # Ionide (cross platform F# VS Code tools) working folder
374 | .ionide/
375 |
376 | # Fody - auto-generated XML schema
377 | FodyWeavers.xsd
378 |
379 | # VS Code files for those working on multiple tools
380 | .vscode/*
381 | !.vscode/settings.json
382 | !.vscode/tasks.json
383 | !.vscode/launch.json
384 | !.vscode/extensions.json
385 | *.code-workspace
386 |
387 | # Local History for Visual Studio Code
388 | .history/
389 |
390 | # Windows Installer files from build outputs
391 | *.cab
392 | *.msi
393 | *.msix
394 | *.msm
395 | *.msp
396 |
397 | # JetBrains Rider
398 | *.sln.iml
399 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/lottie/BunBun.json:
--------------------------------------------------------------------------------
1 | {"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":181,"w":1000,"h":1000,"nm":"Group 6","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"zig zag/Group 6 Outlines 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[287.528,279.089,0],"ix":2},"a":{"a":0,"k":[201,182,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-16.836,16.283],[-16.834,16.281],[-16.835,16.281],[-16.837,16.283],[-16.837,16.284],[-16.837,16.285],[-16.837,16.284],[-16.84,16.286],[-16.839,16.286]],"o":[[16.837,-16.283],[16.835,-16.282],[16.835,-16.281],[16.836,-16.284],[16.837,-16.283],[16.838,-16.284],[16.838,-16.283],[16.84,-16.286],[16.839,-16.285],[0,0]],"v":[[-158.483,139.365],[-110.906,121.175],[-91.142,74.236],[-43.569,56.05],[-23.799,9.106],[23.777,-9.085],[43.548,-56.03],[91.126,-74.221],[110.902,-121.17],[158.483,-139.365]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.879,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[200.681,181.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":101,"s":[0]},{"t":129,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"sausage Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.899},"o":{"x":0.333,"y":0},"t":35,"s":[-94.241,1083.395,0],"to":[75.107,-73.726,0],"ti":[-156.414,153.538,0]},{"i":{"x":0,"y":0.533},"o":{"x":0.167,"y":0.668},"t":58,"s":[545.34,447.783,0],"to":[39.458,-38.732,0],"ti":[16.759,-16.662,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.515},"t":78,"s":[482.032,511.557,0],"to":[-3.788,3.767,0],"ti":[-1.958,1.556,0]},{"t":97,"s":[493.78,502.22,0]}],"ix":2},"a":{"a":0,"k":[283.309,283.309,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[19.23,19.23],[-19.211,19.221],[0,0],[-19.23,-19.231],[19.211,-19.222]],"o":[[-19.231,19.23],[-19.211,-19.221],[0,0],[19.23,-19.231],[19.211,19.22],[0,0]],"v":[[-152.266,221.881],[-221.9,221.881],[-221.9,152.267],[152.267,-221.88],[221.9,-221.88],[221.9,-152.265]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.879,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.352999997606,0.277999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[283.308,283.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"zig zag/Group 6 Outlines","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[287.528,279.089,0],"ix":2},"a":{"a":0,"k":[201,182,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-16.836,16.283],[-16.834,16.281],[-16.835,16.281],[-16.837,16.283],[-16.837,16.284],[-16.837,16.285],[-16.837,16.284],[-16.84,16.286],[-16.839,16.286]],"o":[[16.837,-16.283],[16.835,-16.282],[16.835,-16.281],[16.836,-16.284],[16.837,-16.283],[16.838,-16.284],[16.838,-16.283],[16.84,-16.286],[16.839,-16.285],[0,0]],"v":[[-158.483,139.365],[-110.906,121.175],[-91.142,74.236],[-43.569,56.05],[-23.799,9.106],[23.777,-9.085],[43.548,-56.03],[91.126,-74.221],[110.902,-121.17],[158.483,-139.365]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.879,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[200.681,181.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"sausage Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.869,"y":1},"o":{"x":1,"y":0},"t":10,"s":[493.78,502.22,0],"to":[102.647,-100.896,0],"ti":[-102.647,100.896,0]},{"t":35,"s":[1109.663,-103.156,0]}],"ix":2},"a":{"a":0,"k":[283.309,283.309,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[19.23,19.23],[-19.211,19.221],[0,0],[-19.23,-19.231],[19.211,-19.222]],"o":[[-19.231,19.23],[-19.211,-19.221],[0,0],[19.23,-19.231],[19.211,19.22],[0,0]],"v":[[-152.266,221.881],[-221.9,221.881],[-221.9,152.267],[152.267,-221.88],[221.9,-221.88],[221.9,-152.265]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.879,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.352999997606,0.277999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[283.308,283.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"sausage","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[68,108],[0,0],[0,0],[0,0],[64,49]],"o":[[-15.047,-23.898],[0,0],[0,0],[0,0],[-41.319,-31.635]],"v":[[79,745],[6,788],[-76,1086],[248,1052],[251,917]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[-44.823,-30.774],[-16,-22],[0,0],[0,0],[0,0]],"o":[[0,0],[67,46],[12.9,17.737],[0,0],[0,0],[0,0]],"v":[[776,-65],[761,89],[905,228],[990,201],[1149,184],[1192,-52]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"w":1000,"h":1000,"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"bun Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":51,"s":[495.78,504.22,0],"to":[2.833,-2.833,0],"ti":[-0.833,0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[512.78,487.22,0],"to":[0.833,-0.833,0],"ti":[2.833,-2.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":75,"s":[500.78,499.22,0],"to":[-2.833,2.833,0],"ti":[0.833,-0.833,0]},{"t":85,"s":[495.78,504.22,0]}],"ix":2},"a":{"a":0,"k":[283.309,283.309,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-19.212,19.23],[0,0],[19.212,19.22],[0,0]],"o":[[0,0],[19.23,19.23],[0,0],[19.212,-19.23],[0,0],[0,0]],"v":[[-217.598,129.445],[-175.805,170.497],[-106.189,170.497],[170.516,-106.172],[170.516,-175.794],[136.283,-209.918]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.879,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[334.692,334.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[19.229,-19.231],[0,0],[-19.211,-19.221],[0,0]],"o":[[0,0],[-19.212,-19.231],[0,0],[-19.23,19.231],[0,0],[0,0]],"v":[[239.409,-107.256],[175.804,-170.497],[106.19,-170.497],[-170.498,106.171],[-170.516,175.794],[-116.445,229.598]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":16.879,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[231.925,231.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[19.229,-19.231],[0,0],[-19.211,-19.221],[0,0],[-19.211,19.231],[0,0],[19.211,19.22]],"o":[[-19.212,-19.231],[0,0],[-19.23,19.231],[0,0],[19.23,19.231],[0,0],[19.211,-19.231],[0,0]],"v":[[124.421,-221.881],[54.807,-221.881],[-221.881,54.787],[-221.9,124.411],[-124.42,221.88],[-54.807,221.88],[221.9,-54.788],[221.9,-124.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.666999966491,0.255000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[283.309,283.309],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"bg Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[485.516,485.516,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-268.005,0],[0,-268.005],[268.005,0],[0,268.005]],"o":[[268.005,0],[0,268.005],[-268.005,0],[0,-268.005]],"v":[[0,-485.266],[485.266,0],[0,485.266],[-485.266,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.411999990426,0.885999971278,0.616000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[485.516,485.516],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Component/LottiePlayerModule.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Components;
2 | using Microsoft.JSInterop;
3 |
4 | namespace Blazor.Lottie.Player;
5 | ///
6 | /// Provides functionality to control and manage a Lottie animation player in a Blazor application.
7 | ///
8 | ///
9 | /// This class interacts with a JavaScript module to initialize, play, pause, and stop Lottie animations
10 | /// within a specified HTML element. It also implements asynchronous disposal to clean up resources.
11 | /// WARNING: This class does not load lottie javascript files, you must load those yourself or use the component.
12 | ///
13 | public class LottiePlayerModule : IAsyncDisposable
14 | {
15 | internal readonly IJSRuntime _js;
16 | internal IJSObjectReference? _lottieAnimationRef;
17 | internal readonly ElementReference _elementRef;
18 | internal DotNetObjectReference? _dotNetReference;
19 | internal bool _isDisposing;
20 |
21 | ///
22 | /// Indicates whether the module can execute javascript based on its current state.
23 | ///
24 | internal bool CanExecute => !(_isDisposing || _js is null || _lottieAnimationRef is null);
25 |
26 | ///
27 | /// The constructor for the LottiePlayerModule class.
28 | ///
29 | /// An active IJSRuntime
30 | /// The reference to the HTML element that the Lottie animation will be rendered in.
31 | public LottiePlayerModule(IJSRuntime js, ElementReference elementRef)
32 | {
33 | _dotNetReference = DotNetObjectReference.Create(this);
34 | _js = js;
35 | _elementRef = elementRef;
36 | }
37 |
38 | ///
39 | /// The current time/frame as reported back after EventFrame events.
40 | ///
41 | public double CurrentFrame { get; private set; } = 0.0;
42 |
43 | ///
44 | /// The total number of frames in the animation as returned by AnimationReady
45 | ///
46 | public double TotalFrames { get; private set; } = 0.0;
47 |
48 | ///
49 | /// Initializes the Lottie player with the specified playback options.
50 | ///
51 | /// This method imports the required JavaScript module and invokes the initialization logic for
52 | /// the Lottie player. It also ensures that the instance is not disposing and that the JavaScript runtime is available before
53 | /// loading the module.
54 | /// The playback options to configure the Lottie player.
55 | /// if the initialization is successful; otherwise, .
56 | public async Task InitializeAsync(LottiePlaybackOptions lottiePlaybackOptions)
57 | {
58 | if (_isDisposing || _js is null) return false;
59 | var _module = await _js.InvokeAsync("import", "./_content/Blazor.Lottie.Player/lottiePlayerModule.js");
60 | _lottieAnimationRef = await _module!.InvokeAsync("initialize", _dotNetReference, _elementRef, lottiePlaybackOptions);
61 | if (lottiePlaybackOptions.AutoPlay)
62 | {
63 | await PlayAsync();
64 | }
65 | return _lottieAnimationRef != null;
66 | }
67 |
68 | #region Actions
69 |
70 | ///
71 | /// Plays the Lottie animation.
72 | ///
73 | public ValueTask PlayAsync()
74 | {
75 | if (!CanExecute) return ValueTask.CompletedTask;
76 | return _lottieAnimationRef!.InvokeVoidAsync("play");
77 | }
78 |
79 | ///
80 | /// Pauses the currently playing Lottie animation.
81 | ///
82 | public ValueTask PauseAsync()
83 | {
84 | if (!CanExecute) return ValueTask.CompletedTask;
85 | return _lottieAnimationRef!.InvokeVoidAsync("pause");
86 | }
87 |
88 | ///
89 | /// Stops the currently playing Lottie animation.
90 | ///
91 | public ValueTask StopAsync()
92 | {
93 | if (!CanExecute) return ValueTask.CompletedTask;
94 | return _lottieAnimationRef!.InvokeVoidAsync("stop");
95 | }
96 |
97 | ///
98 | /// Moves the animation to the specified frame and starts playback from that point.
99 | ///
100 | /// The frame number to move the animation to. Must be a non-negative value.
101 | /// A boolean value indicating whether to force the animation to move to the specified frame even if it is already
102 | /// playing. to force the action; otherwise, .
103 | public ValueTask GoToAndPlay(double frame, bool force = false)
104 | {
105 | if (!CanExecute) return ValueTask.CompletedTask;
106 | return _lottieAnimationRef!.InvokeVoidAsync("goToAndPlay", frame, force);
107 | }
108 |
109 | ///
110 | /// Moves the animation to the specified frame and stops playback at that point.
111 | ///
112 | /// The frame number to move the animation to. Must be a non-negative value.
113 | /// A boolean value indicating whether to force the animation to move to the specified frame even if it is already
114 | /// playing. to force the action; otherwise, .
115 | public ValueTask GoToAndStop(double frame, bool force = false)
116 | {
117 | if (!CanExecute) return ValueTask.CompletedTask;
118 | return _lottieAnimationRef!.InvokeVoidAsync("goToAndStop", frame, force);
119 | }
120 |
121 | ///
122 | /// Asynchronously sets the speed for the associated animation. 1 is normal speed, 2 is double speed, 0.5 is half speed, etc.
123 | ///
124 | /// The speed value to set. Must be a non-negative number.
125 | public ValueTask SetSpeedAsync(double speed)
126 | {
127 | if (!CanExecute || speed < 0) return ValueTask.CompletedTask;
128 | return _lottieAnimationRef!.InvokeVoidAsync("setSpeed", speed);
129 | }
130 |
131 | ///
132 | /// Asynchronously sets the playback direction for the associated animation.
133 | ///
134 | /// The direction to play the animation. It can be forward or backward.
135 | public ValueTask SetDirectionAsync(LottieAnimationDirection direction)
136 | {
137 | if (!CanExecute) return ValueTask.CompletedTask;
138 | var dir = (int)direction;
139 | return _lottieAnimationRef!.InvokeVoidAsync("setDirection", dir);
140 | }
141 |
142 | ///
143 | /// Executes javascript directly from the Lottie animation reference. So you can call any method that is available on the Lottie animation object.
144 | ///
145 | ///
146 | ///
147 | ///
148 | public ValueTask ExecuteActionAsync(string action, params object?[]? args)
149 | {
150 | if (!CanExecute) return ValueTask.CompletedTask;
151 | return _lottieAnimationRef!.InvokeVoidAsync(action, args);
152 | }
153 |
154 | #endregion
155 |
156 | #region Events
157 |
158 | ///
159 | /// Triggers when the Lottie animation is ready to be played and loaded by the DOM.
160 | ///
161 | public event EventHandler? OnAnimationReady;
162 |
163 | ///
164 | /// Triggers when the Lottie animation has fully loaded in the DOM.
165 | ///
166 | public event EventHandler? OnDOMLoaded;
167 |
168 | ///
169 | /// Triggers when the Lottie animation enters a new frame.
170 | ///
171 | public event EventHandler? OnEnterFrame;
172 |
173 | ///
174 | /// Triggers when the Lottie animation completes playing.
175 | ///
176 | ///
177 | /// If an animation is set to loop indefinitely, this event will not be triggered.
178 | ///
179 | public event EventHandler? OnComplete;
180 |
181 | ///
182 | /// Triggers when the Lottie animation completes a loop.
183 | ///
184 | public event EventHandler? OnLoopComplete;
185 |
186 | ///
187 | /// Invokes the event when the animation is ready. (DOMLoaded)
188 | ///
189 | [JSInvokable]
190 | public Task AnimationReadyEvent(LottiePlayerLoadedEventArgs args)
191 | {
192 | if (!CanExecute) return Task.CompletedTask;
193 | TotalFrames = args.TotalFrames;
194 | OnAnimationReady?.Invoke(this, args);
195 | return Task.CompletedTask;
196 | }
197 |
198 | ///
199 | /// Invokes the event when the DOM is fully loaded with the Lottie animation.
200 | ///
201 | ///
202 | [JSInvokable]
203 | public Task DOMLoadedEvent(LottiePlayerLoadedEventArgs args)
204 | {
205 | if (!CanExecute) return Task.CompletedTask;
206 |
207 | OnDOMLoaded?.Invoke(this, args);
208 | return Task.CompletedTask;
209 | }
210 |
211 | ///
212 | /// Invokes the event when the animation completes.
213 | ///
214 | ///
215 | /// This event is triggered when the animation has finished playing all frames and loops, if applicable. If it's set to loop
216 | /// indefinitely, this event will never be triggered.
217 | ///
218 | [JSInvokable]
219 | public Task CompleteEvent()
220 | {
221 | if (!CanExecute) return Task.CompletedTask;
222 |
223 | OnComplete?.Invoke(this, true);
224 | return Task.CompletedTask;
225 | }
226 |
227 | ///
228 | /// Invokes the event when a loop completes.
229 | ///
230 | [JSInvokable]
231 | public Task LoopCompleteEvent()
232 | {
233 | if (!CanExecute) return Task.CompletedTask;
234 |
235 | OnLoopComplete?.Invoke(this, true);
236 | return Task.CompletedTask;
237 | }
238 |
239 | ///
240 | /// Invokes the event with the specified arguments.
241 | ///
242 | [JSInvokable]
243 | public Task EnterFrameEvent(LottiePlayerEventFrameArgs args)
244 | {
245 | if (!CanExecute) return Task.CompletedTask;
246 | CurrentFrame = args.CurrentTime;
247 | OnEnterFrame?.Invoke(this, args);
248 | return Task.CompletedTask;
249 | }
250 |
251 | #endregion
252 |
253 | ///
254 | /// Disposes the Lottie player module and cleans up resources.
255 | ///
256 | public async ValueTask DisposeAsync()
257 | {
258 | _isDisposing = true;
259 | if (_lottieAnimationRef is not null)
260 | {
261 | try
262 | {
263 | await _lottieAnimationRef.InvokeVoidAsync("destroy");
264 | }
265 | catch (JSException)
266 | {
267 | // Ignore JS exceptions during dispose, as the module may already be disposed.
268 | }
269 | await _lottieAnimationRef.DisposeAsync();
270 | _lottieAnimationRef = null;
271 | }
272 | if (_dotNetReference is not null)
273 | {
274 | _dotNetReference.Dispose();
275 | _dotNetReference = null;
276 | }
277 | GC.SuppressFinalize(this);
278 | }
279 | }
280 |
--------------------------------------------------------------------------------
/tests/Blazor.Lottie.Player.UnitTests/LottieTests.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using AwesomeAssertions;
3 | using Bunit;
4 | using Microsoft.JSInterop;
5 | using Moq;
6 |
7 | namespace Blazor.Lottie.Player.UnitTests
8 | {
9 | [TestFixture]
10 | public class LottieTests : BunitTest
11 | {
12 | private const string LottieSrc = "https://raw.githubusercontent.com/MudXtra/LottiePlayer/refs/heads/main/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/lottie/newAnimation.json";
13 |
14 | [SetUp]
15 | public override void Setup()
16 | {
17 | base.Setup();
18 |
19 | // Setup the import call to return a mock module
20 | var moduleMock = Context.JSInterop.SetupModule("./_content/Blazor.Lottie.Player/loadLottieWeb.js");
21 | // Setup the initialize call to return true
22 | moduleMock.Setup("initialize", _ => true).SetResult(true);
23 |
24 | var lottieModuleMock = Context.JSInterop.SetupModule("./_content/Blazor.Lottie.Player/lottiePlayerModule.js");
25 | var animationModuleMock = new Mock();
26 | lottieModuleMock.SetupVoid("initialize");
27 |
28 | lottieModuleMock.Setup("play", _ => true).SetResult(true);
29 | lottieModuleMock.Setup("pause", _ => true).SetResult(true);
30 | lottieModuleMock.Setup("stop", _ => true).SetResult(true);
31 | lottieModuleMock.Setup("destroy", _ => true).SetResult(true);
32 | lottieModuleMock.Setup("setSpeed", _ => true).SetResult(true);
33 | lottieModuleMock.Setup("setDirection", _ => true).SetResult(true);
34 | }
35 |
36 | [Test]
37 | public async Task LottieComponentRendersCorrectly()
38 | {
39 | // Arrange
40 | var comp = Context.RenderComponent(parameters => parameters
41 | .Add(p => p.Src, LottieSrc)
42 | .Add(p => p.Class, "test-class")
43 | .Add(p => p.Style, "width: 100%; height: 100%;")
44 | );
45 | // Act
46 | var element = comp.Find($"#{comp.Instance.ElementId}");
47 | element.Should().NotBeNull();
48 |
49 | // Assert Defaults
50 | comp.Instance.AutoPlay.Should().BeTrue();
51 | comp.Instance.Loop.Should().BeTrue();
52 | comp.Instance.LoopCount.Should().Be(0);
53 | comp.Instance.AnimationType.Should().Be(LottieAnimationType.Svg);
54 | comp.Instance.AnimationSpeed.Should().Be(1.0);
55 | comp.Instance.AnimationDirection.Should().Be(LottieAnimationDirection.Forward);
56 | var options = comp.Instance.AnimationOptions;
57 | options.Should().NotBeNull();
58 | options.LottieSourceJs.Should().Be("https://cdnjs.cloudflare.com/ajax/libs/lottie-web/5.13.0/lottie.min.js");
59 | options.AnimationQuality.Should().Be(LottieAnimationQuality.High);
60 | options.SmoothFrameInterpolation.Should().BeTrue();
61 |
62 | // get and invoke private void HandleAnimationReady(object? sender, LottiePlayerLoadedEventArgs args)
63 | var method = typeof(LottiePlayer).GetMethod("HandleAnimationReady", BindingFlags.NonPublic | BindingFlags.Instance);
64 | method.Should().NotBeNull();
65 | // Invoke the method with a mock LottiePlayerLoadedEventArgs
66 | var args = new LottiePlayerLoadedEventArgs
67 | {
68 | ElementId = comp.Instance.ElementId,
69 | CurrentFrame = 0.0,
70 | TotalFrames = 100.0,
71 | };
72 | await comp.InvokeAsync(() => method.Invoke(comp.Instance, [this, args]));
73 |
74 | comp.Instance.IsAnimationLoaded.Should().BeTrue();
75 | comp.Instance.IsAnimationPaused.Should().Be(!comp.Instance.AutoPlay);
76 | comp.Instance.CurrentAnimationFrame.Should().Be(0.0);
77 | }
78 |
79 | [Test]
80 | public void LottiePlayer_RendersUserAttributes()
81 | {
82 | var comp = Context.RenderComponent(parameters => parameters
83 | .Add(p => p.Src, "https://example.com/lottie.json")
84 | );
85 | var element = comp.Find($"#{comp.Instance.ElementId}");
86 |
87 | // Check default attributes
88 | element.HasAttribute("data-test").Should().BeFalse();
89 | element.GetAttribute("role").Should().Be("animation");
90 | element.GetAttribute("aria-label").Should().Be("Lottie Animation");
91 |
92 | comp.SetParametersAndRender(parameters => parameters
93 | .Add(p => p.UserAttributes, new Dictionary
94 | {
95 | { "data-test", "abc" },
96 | { "aria-label", "lottie" }
97 | })
98 | );
99 |
100 | element = comp.Find($"#{comp.Instance.ElementId}");
101 |
102 | element.HasAttribute("data-test").Should().BeTrue();
103 | element.GetAttribute("data-test").Should().Be("abc");
104 | element.GetAttribute("aria-label").Should().Be("lottie");
105 | element.GetAttribute("role").Should().Be("animation");
106 | }
107 |
108 | [Test]
109 | public void LottiePlayer_ClassnameAndStylename_NullOrWhitespace()
110 | {
111 | var comp = Context.RenderComponent(parameters => parameters
112 | .Add(p => p.Src, "https://example.com/lottie.json")
113 | .Add(p => p.Class, null)
114 | .Add(p => p.Style, " ")
115 | );
116 | var element = comp.Find($"#{comp.Instance.ElementId}");
117 | element.ClassList.Should().Contain("blazor-lottie-player");
118 | element.GetAttribute("style").Should().BeNullOrWhiteSpace();
119 | }
120 |
121 | [Test]
122 | public void LottiePlayer_PublicMethods_ThrowIfModuleNull()
123 | {
124 | var comp = Context.RenderComponent(parameters => parameters
125 | .Add(p => p.Src, "https://example.com/lottie.json")
126 | );
127 | // Simulate module disposal
128 | comp.Instance.LottiePlayerModule.Should().NotBeNull();
129 | comp.InvokeAsync(() => comp.Instance.DisposeAsync());
130 | comp.Instance.LottiePlayerModule.Should().BeNull();
131 |
132 | Assert.ThrowsAsync(async () => await comp.Instance.PlayAnimationAsync());
133 | Assert.ThrowsAsync(async () => await comp.Instance.PauseAnimationAsync());
134 | Assert.ThrowsAsync(async () => await comp.Instance.StopAnimationAsync());
135 | Assert.ThrowsAsync(async () => await comp.Instance.SetSpeedAsync(1.0));
136 | Assert.ThrowsAsync(async () => await comp.Instance.SetDirectionAsync(LottieAnimationDirection.Forward));
137 | }
138 |
139 | [Test]
140 | public void LottiePlayer_ThrowsIfJsModuleFailsToLoad()
141 | {
142 | var moduleMock = Context.JSInterop.SetupModule("./_content/Blazor.Lottie.Player/loadLottieWeb.js");
143 | moduleMock.Setup("initialize", _ => false);
144 |
145 | var ex = Assert.Throws(() =>
146 | Context.RenderComponent(parameters => parameters
147 | .Add(p => p.Src, "https://example.com/lottie.json")
148 | )
149 | );
150 | ex.Message.Should().Contain("Failed to initialize Lottie Web Player Module");
151 | }
152 |
153 |
154 |
155 | [Test]
156 | public void LottiePlayer_InitShouldReinitReasonably()
157 | {
158 | var comp = Context.RenderComponent(parameters => parameters
159 | .Add(p => p.Src, LottieSrc)
160 | );
161 |
162 | var field = typeof(LottiePlayer).GetField("_initCount", BindingFlags.NonPublic | BindingFlags.Instance);
163 | field.Should().NotBeNull();
164 | var initCount = (int)field.GetValue(comp.Instance)!;
165 | initCount.Should().Be(1);
166 |
167 | // Changing these parameters should not reinitialize
168 | comp.SetParametersAndRender(parameters => parameters
169 | .Add(p => p.Class, "test-class")
170 | .Add(p => p.Style, "width: 100%; height: 100%;")
171 | .Add(p => p.UserAttributes, new Dictionary
172 | {
173 | { "data-test", "test-value" }
174 | })
175 | );
176 | initCount = (int)field.GetValue(comp.Instance)!;
177 | initCount.Should().Be(1);
178 |
179 | // Change any of these parameters should reinitialize but only once per parameter submission
180 | comp.SetParametersAndRender(parameters => parameters
181 | .Add(p => p.Src, "https://assets2.lottiefiles.com/packages/lf20_8j3q1k.json")
182 | .Add(p => p.AutoPlay, false)
183 | .Add(p => p.Loop, false)
184 | .Add(p => p.LoopCount, 5)
185 | .Add(p => p.AnimationType, LottieAnimationType.Canvas)
186 | .Add(p => p.AnimationSpeed, 0.5)
187 | .Add(p => p.AnimationDirection, LottieAnimationDirection.Reverse)
188 | );
189 | initCount = (int)field.GetValue(comp.Instance)!;
190 | initCount.Should().Be(2);
191 |
192 | // Change a single parameter on the list should reinitialize
193 | comp.SetParametersAndRender(parameters => parameters
194 | .Add(p => p.AnimationType, LottieAnimationType.Html)
195 | );
196 | initCount = (int)field.GetValue(comp.Instance)!;
197 | initCount.Should().Be(3);
198 |
199 | var options = new LottieAnimationOptions
200 | {
201 | AnimationQuality = LottieAnimationQuality.Medium
202 | };
203 | comp.Instance.AnimationOptions.Should().NotBe(options.AnimationQuality);
204 |
205 | // Change a options class should reinitialize
206 | comp.SetParametersAndRender(parameters => parameters
207 | .Add(p => p.AnimationOptions, options)
208 | );
209 | initCount = (int)field.GetValue(comp.Instance)!;
210 | initCount.Should().Be(4);
211 | }
212 |
213 | [Test]
214 | public async Task LottiePlayer_PublicMethods()
215 | {
216 | var comp = Context.RenderComponent(parameters => parameters
217 | .Add(p => p.Src, LottieSrc)
218 | );
219 | // Check public methods
220 | comp.Instance.AutoPlay.Should().BeTrue();
221 | comp.Instance.IsAnimationLoaded.Should().BeTrue();
222 | comp.Instance.IsAnimationPaused.Should().BeFalse();
223 |
224 | await comp.InvokeAsync(async () => await comp.Instance.PauseAnimationAsync());
225 | comp.Instance.IsAnimationPaused.Should().BeTrue();
226 |
227 | await comp.InvokeAsync(async () => await comp.Instance.PlayAnimationAsync());
228 | comp.Instance.IsAnimationPaused.Should().BeFalse();
229 |
230 | await comp.InvokeAsync(async () => await comp.Instance.SetSpeedAsync(2.0));
231 |
232 | await comp.InvokeAsync(async () => await comp.Instance.SetDirectionAsync(LottieAnimationDirection.Reverse));
233 |
234 | await comp.InvokeAsync(async () => await comp.Instance.StopAnimationAsync());
235 | comp.Instance.IsAnimationPaused.Should().BeFalse();
236 | comp.Instance.IsAnimationStopped.Should().BeTrue();
237 | }
238 |
239 | [Test]
240 | public void LottiePlayer_Events()
241 | {
242 | bool handledom = false,
243 | handleenterframe = false,
244 | handlecomplete = false,
245 | handleloopcomplete = false,
246 | handleanimationready = false;
247 |
248 | var comp = Context.RenderComponent(parameters => parameters
249 | .Add(p => p.Src, LottieSrc)
250 | .Add(p => p.DOMLoaded, (() => handledom = true))
251 | .Add(p => p.AnimationReady, () => handleenterframe = true)
252 | .Add(p => p.AnimationCompleted, (isLooping) => handlecomplete = true)
253 | .Add(p => p.AnimationLoopCompleted, (isLooping) => handleloopcomplete = true)
254 | .Add(p => p.CurrentFrameChanged, (args) => handleanimationready = true)
255 | );
256 | // invoke the methods that invoke the events
257 | var domloadedMethod = typeof(LottiePlayer).GetMethod("HandleDOMLoaded", BindingFlags.NonPublic | BindingFlags.Instance);
258 | comp.InvokeAsync(() => domloadedMethod!.Invoke(comp.Instance, [this, new LottiePlayerLoadedEventArgs()]));
259 | var animationReadyMethod = typeof(LottiePlayer).GetMethod("HandleAnimationReady", BindingFlags.NonPublic | BindingFlags.Instance);
260 | comp.InvokeAsync(() => animationReadyMethod!.Invoke(comp.Instance, [this, new LottiePlayerLoadedEventArgs()]));
261 | var animationCompletedMethod = typeof(LottiePlayer).GetMethod("HandleAnimationCompleted", BindingFlags.NonPublic | BindingFlags.Instance);
262 | comp.InvokeAsync(() => animationCompletedMethod!.Invoke(comp.Instance, [this, true]));
263 | var loopCompleteMethod = typeof(LottiePlayer).GetMethod("HandleAnimationLoopCompleted", BindingFlags.NonPublic | BindingFlags.Instance);
264 | comp.InvokeAsync(() => loopCompleteMethod!.Invoke(comp.Instance, [this, true]));
265 | var currentFrameChangedMethod = typeof(LottiePlayer).GetMethod("HandleCurrentFrameChanged", BindingFlags.NonPublic | BindingFlags.Instance);
266 | comp.InvokeAsync(() => currentFrameChangedMethod!.Invoke(comp.Instance, [this, new LottiePlayerEventFrameArgs()]));
267 |
268 | // Check event invocations
269 | handledom.Should().BeTrue();
270 | handleenterframe.Should().BeTrue();
271 | handlecomplete.Should().BeTrue();
272 | handleloopcomplete.Should().BeTrue();
273 | handleanimationready.Should().BeTrue();
274 | }
275 |
276 | #pragma warning disable CS8619
277 | private static IEnumerable CurrentFrameChangeFuncCases()
278 | {
279 | yield return new object[] { (Func)(frame => frame % 10 == 0), 10 };
280 | yield return new object?[] { null, 5 };
281 | }
282 | #pragma warning restore CS8619
283 |
284 | [Test, TestCaseSource(nameof(CurrentFrameChangeFuncCases))]
285 | public void Lottie_CurrentFrameChanged(object? funcObj, int maxFrames)
286 | {
287 | var currentFrameChangeFunc = funcObj as Func;
288 | var frameChangedCount = 0;
289 |
290 | var comp = Context.RenderComponent(parameters => parameters
291 | .Add(p => p.Src, "https://assets2.lottiefiles.com/packages/lf20_8j3q1k.json")
292 | .Add(p => p.CurrentFrameChangeFunc, currentFrameChangeFunc)
293 | .Add(p => p.CurrentFrameChanged, (Action)(args =>
294 | {
295 | frameChangedCount++;
296 | }))
297 | );
298 |
299 | if (currentFrameChangeFunc != null)
300 | {
301 | for (int frame = 0; frame < maxFrames; frame++)
302 | {
303 | if (currentFrameChangeFunc(frame))
304 | {
305 | // Your logic here
306 | }
307 | }
308 | }
309 | }
310 |
311 | [Test]
312 | public void LottiePlayer_CurrentFrameChangeFunc_False_DoesNotInvokeEvent()
313 | {
314 | bool eventInvoked = false;
315 | var comp = Context.RenderComponent(parameters => parameters
316 | .Add(p => p.Src, "https://example.com/lottie.json")
317 | .Add(p => p.CurrentFrameChangeFunc, (Func)(_ => false))
318 | .Add(p => p.CurrentFrameChanged, (Action)(_ => eventInvoked = true))
319 | );
320 | // Use reflection to invoke the private handler
321 | var method = typeof(LottiePlayer).GetMethod("HandleCurrentFrameChanged", BindingFlags.NonPublic | BindingFlags.Instance);
322 | method!.Invoke(comp.Instance, [null, new LottiePlayerEventFrameArgs { CurrentTime = 42.0 }]);
323 | eventInvoked.Should().BeFalse();
324 | }
325 |
326 | [Test]
327 | public async Task LottiePlayer_DisposeAsync_Idempotent()
328 | {
329 | var comp = Context.RenderComponent(parameters => parameters
330 | .Add(p => p.Src, "https://example.com/lottie.json")
331 | );
332 | await comp.Instance.DisposeAsync();
333 | // Should not throw or double-dispose
334 | await comp.Instance.DisposeAsync();
335 | }
336 |
337 | [Test]
338 | public async Task LottiePlayer_InitCount_AfterDisposeAndReinit()
339 | {
340 | var comp = Context.RenderComponent(parameters => parameters
341 | .Add(p => p.Src, "https://example.com/lottie.json")
342 | );
343 | var field = typeof(LottiePlayer).GetField("_initCount", BindingFlags.NonPublic | BindingFlags.Instance);
344 | int initCount = (int)field!.GetValue(comp.Instance)!;
345 | await comp.Instance.DisposeAsync();
346 | // Re-initialize by changing a key parameter
347 | comp.SetParametersAndRender(p => p.Add(x => x.Src, "https://example.com/other.json"));
348 | int newInitCount = (int)field.GetValue(comp.Instance)!;
349 | newInitCount.Should().Be(initCount + 1);
350 | }
351 | }
352 | }
353 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/Component/LottiePlayer.razor.cs:
--------------------------------------------------------------------------------
1 | using Blazor.Lottie.Player.Extensions;
2 | using Microsoft.AspNetCore.Components;
3 | using Microsoft.JSInterop;
4 |
5 | namespace Blazor.Lottie.Player;
6 | ///
7 | /// A Blazor component for rendering and controlling Lottie animations using BodyMovin.
8 | ///
9 | /// The component provides a flexible way to integrate Lottie animations into
10 | /// Blazor applications. It supports various customization options, including animation source, playback settings, and
11 | /// event callbacks for animation lifecycle events.
12 | public partial class LottiePlayer : ComponentBase, IAsyncDisposable
13 | {
14 | #region Private Variables
15 |
16 | private ElementReference ElementRef { get; set; } = default!;
17 | ///
18 | /// Represents the unique identifier for a Lottie element's surrounding div.
19 | ///
20 | public readonly string ElementId = Identifier.Create("lottie-");
21 | private string? _failMessage = null;
22 | private bool _lottieLoaded = false;
23 | ///
24 | /// The module used to control Lottie Player functionality.
25 | ///
26 | public LottiePlayerModule? LottiePlayerModule { get; private set; }
27 | private int _initCount = 0;
28 |
29 | ///
30 | /// The class list for the surrounding div, which includes the base class and the Blazor Lottie Player class.
31 | ///
32 | protected string Classname
33 | => string.IsNullOrWhiteSpace(Class)
34 | ? "blazor-lottie-player"
35 | : $"blazor-lottie-player {Class}";
36 |
37 | ///
38 | /// The style string for the surrounding div, which includes the base style and any user-defined styles.
39 | ///
40 | protected string? Stylename
41 | => string.IsNullOrWhiteSpace(Style) ? null : Style;
42 |
43 |
44 | ///
45 | /// Returns the merged user attributes with sensible defaults, allowing user overrides.
46 | ///
47 | protected IReadOnlyDictionary MergedUserAttributes
48 | {
49 | get
50 | {
51 | var dict = UserAttributes != null
52 | ? new Dictionary(UserAttributes)
53 | : [];
54 |
55 | dict.TryAdd("aria-label", "Lottie Animation");
56 | dict.TryAdd("role", "animation");
57 | return dict;
58 | }
59 | }
60 |
61 | #endregion
62 |
63 | #region Injected Services
64 |
65 | [Inject]
66 | private IJSRuntime JSRuntime { get; set; } = default!;
67 |
68 | #endregion
69 |
70 | #region Parameters
71 |
72 | ///
73 | /// The CSS class name(s) to apply to the container.
74 | ///
75 | [Parameter]
76 | public string? Class { get; set; }
77 |
78 | ///
79 | /// The inline CSS styles to apply to the component.
80 | ///
81 | [Parameter]
82 | public string? Style { get; set; }
83 |
84 | ///
85 | /// Sets a collection of user-defined HTML attributes represented as key-value pairs.
86 | ///
87 | ///
88 | /// This property is typically used to provide additional HTML attributes during
89 | /// rendering such as ARIA accessibility tags, data attributes, or any other custom
90 | /// HTML attributes that you want to apply to the component.
91 | ///
92 | [Parameter(CaptureUnmatchedValues = true)]
93 | public Dictionary? UserAttributes { get; set; }
94 |
95 | ///
96 | /// Gets or sets the source or relative URL for the component's content.
97 | ///
98 | ///
99 | /// *Required* e.g.
100 | /// Src="https://mudxtra.github.io/LottiePlayer/newAnimation.json "
101 | /// Src="./wwwroot/lottie/newAnimation.json "
102 | ///
103 | [Parameter, EditorRequired]
104 | public string Src { get; set; } = default!;
105 |
106 | ///
107 | /// A value indicating whether the media should automatically start playing when loaded. If set to
108 | /// false , the media will not start playing until AnimationPaused is set to false.
109 | ///
110 | [Parameter]
111 | public bool AutoPlay { get; set; } = true;
112 |
113 | ///
114 | /// Gets or sets whether the animation should loop.
115 | ///
116 | [Parameter]
117 | public bool Loop { get; set; } = true;
118 |
119 | ///
120 | /// Gets or sets the number of times a loop should occur. Requires to be true.
121 | ///
122 | ///
123 | /// Default is 0 (infinite loop).
124 | ///
125 | [Parameter]
126 | public int LoopCount { get; set; } = 0;
127 |
128 | ///
129 | /// Gets or sets the type of animation to be used for rendering the Lottie animation.
130 | ///
131 | ///
132 | /// Defaults to .
133 | ///
134 | [Parameter]
135 | public LottieAnimationType AnimationType { get; set; } = LottieAnimationType.Svg;
136 |
137 | ///
138 | /// Gets or sets the direction in which the Lottie animation plays.
139 | ///
140 | ///
141 | /// Defaults to .
142 | /// Changing this property after initialization will not change the playback direction of the animation, use
143 | ///
144 | [Parameter]
145 | public LottieAnimationDirection AnimationDirection { get; set; } = LottieAnimationDirection.Forward;
146 |
147 | ///
148 | /// Gets or sets the speed of the animation.
149 | ///
150 | ///
151 | /// Defaults to 1.0 (normal speed).
152 | /// Changing this property after initialization will not change the speed of the animation, use
153 | ///
154 | [Parameter]
155 | public double AnimationSpeed { get; set; } = 1.0;
156 |
157 | ///
158 | /// Called when the current frame changes, with custom filtering logic
159 | ///
160 | ///
161 | /// The function receives the current frame number and should return true if the event should be raised.
162 | /// This allows for custom throttling logic (e.g., only every 10th frame, only on specific frames, etc.)
163 | /// Warning: Frame updates could happen as frequently as 30-60 times per second.
164 | /// Defaults to null . is only raised if something is attached to the handler.
165 | /// Example: frame => frame % 10 == 0 will raise the event every 10th frame.
166 | ///
167 | [Parameter] public Func? CurrentFrameChangeFunc { get; set; }
168 |
169 | ///
170 | /// Called when the current frame changes (only when returns true)
171 | ///
172 | [Parameter] public EventCallback CurrentFrameChanged { get; set; }
173 |
174 | ///
175 | /// Called when the Lottie player is initialized and the DOM is ready.
176 | ///
177 | [Parameter]
178 | public EventCallback DOMLoaded { get; set; }
179 |
180 | ///
181 | /// Called when the animation is fully loaded and ready for playback.
182 | ///
183 | [Parameter]
184 | public EventCallback AnimationReady { get; set; }
185 |
186 | ///
187 | /// Called when the animation completes.
188 | ///
189 | [Parameter]
190 | public EventCallback AnimationCompleted { get; set; }
191 |
192 | ///
193 | /// Called when an animation loop completes.
194 | ///
195 | [Parameter]
196 | public EventCallback AnimationLoopCompleted { get; set; }
197 |
198 | ///
199 | /// Additional Less Used Animation Options.
200 | ///
201 | /// Refer to for defaults.
202 | [Parameter]
203 | public LottieAnimationOptions AnimationOptions { get; set; } = new();
204 |
205 | #endregion
206 |
207 | #region Component Public Properties
208 |
209 | ///
210 | /// The total number of frames in the animation. This is set when the animation is loaded and ready for playback.
211 | ///
212 | public double TotalAnimationFrames => LottiePlayerModule?.TotalFrames ?? 0.0;
213 |
214 | ///
215 | /// Gets the current animation frame as a double-precision value. This is updated during playback by the EventCallback of CurrentFrameChanged.
216 | ///
217 | public double CurrentAnimationFrame => LottiePlayerModule?.CurrentFrame ?? 0.0;
218 |
219 | ///
220 | /// Gets a value indicating whether the animation has been loaded and is ready for playback.
221 | ///
222 | public bool IsAnimationLoaded { get; private set; } = false;
223 |
224 | ///
225 | /// Gets a value indicating whether the animation is paused.
226 | ///
227 | public bool IsAnimationPaused { get; private set; } = false;
228 |
229 | ///
230 | /// Gets a value indicating whether the animation is stopped.
231 | ///
232 | public bool IsAnimationStopped { get; private set; } = true;
233 | #endregion
234 |
235 | #region Public Methods
236 |
237 | ///
238 | /// If the animation is not already playing, this method will start playing the animation.
239 | ///
240 | /// Should not be called before OnAfterRenderAsync.
241 | /// if the animation was successfully started; otherwise, .
242 | ///
243 | public async ValueTask PlayAnimationAsync()
244 | {
245 | if (LottiePlayerModule == null)
246 | {
247 | throw new InvalidOperationException("Lottie Player Module failed.");
248 | }
249 |
250 | if (IsAnimationStopped)
251 | {
252 | // If the animation is stopped, we need to reset the frame to 0 before playing
253 | await LottiePlayerModule.GoToAndPlay(0.0, true);
254 | IsAnimationStopped = false;
255 | }
256 |
257 | IsAnimationPaused = false;
258 | await LottiePlayerModule.PlayAsync();
259 | }
260 |
261 | ///
262 | /// Pauses the currently playing animation in the Lottie player.
263 | ///
264 | /// Should not be called before OnAfterRenderAsync.
265 | /// if the animation was successfully paused; otherwise, .
266 | ///
267 | public async ValueTask PauseAnimationAsync()
268 | {
269 | if (LottiePlayerModule == null)
270 | {
271 | throw new InvalidOperationException("Lottie Player Module failed.");
272 | }
273 | if (IsAnimationStopped)
274 | {
275 | await LottiePlayerModule.GoToAndStop(0.0, true);
276 | IsAnimationStopped = false;
277 | }
278 | IsAnimationPaused = true;
279 | await LottiePlayerModule.PauseAsync();
280 | }
281 |
282 | ///
283 | /// Stops the currently playing animation asynchronously.
284 | ///
285 | /// This method halts the animation playback if an animation is currently running. The method
286 | /// returns a boolean indicating whether the operation was successful.
287 | /// if the animation was successfully stopped; otherwise, .
288 | /// Thrown if the Lottie Player Module is not initialized.
289 | public ValueTask StopAnimationAsync()
290 | {
291 | if (LottiePlayerModule == null)
292 | {
293 | throw new InvalidOperationException("Lottie Player Module failed.");
294 | }
295 | IsAnimationPaused = false;
296 | IsAnimationStopped = true;
297 | return LottiePlayerModule.StopAsync();
298 | }
299 |
300 | ///
301 | /// Asynchronously sets the playback speed for the Lottie animation.
302 | ///
303 | /// The desired playback speed. Must be a positive value, where 1.0 represents normal speed.
304 | /// Thrown if the Lottie Player Module is not initialized.
305 | public ValueTask SetSpeedAsync(double speed)
306 | {
307 | if (LottiePlayerModule == null)
308 | {
309 | throw new InvalidOperationException("Lottie Player Module failed.");
310 | }
311 | return LottiePlayerModule.SetSpeedAsync(speed);
312 | }
313 |
314 | ///
315 | /// Sets the playback direction of the Lottie animation asynchronously.
316 | ///
317 | /// The desired playback direction of the animation. Must be a valid value.
318 | /// Thrown if the Lottie Player Module is not initialized.
319 | public ValueTask SetDirectionAsync(LottieAnimationDirection direction)
320 | {
321 | if (LottiePlayerModule == null)
322 | {
323 | throw new InvalidOperationException("Lottie Player Module failed.");
324 | }
325 | return LottiePlayerModule.SetDirectionAsync(direction);
326 | }
327 |
328 | #endregion
329 |
330 | #region Events
331 |
332 | private void HandleDOMLoaded(object? sender, LottiePlayerLoadedEventArgs args)
333 | {
334 | IsAnimationLoaded = true;
335 | DOMLoaded.InvokeAsync(args);
336 | StateHasChanged();
337 | }
338 |
339 | private void HandleAnimationReady(object? sender, LottiePlayerLoadedEventArgs args)
340 | {
341 | IsAnimationLoaded = true;
342 | AnimationReady.InvokeAsync(args);
343 | StateHasChanged();
344 | }
345 |
346 | private void HandleAnimationCompleted(object? sender, bool completed)
347 | {
348 | AnimationCompleted.InvokeAsync();
349 | }
350 |
351 | private void HandleAnimationLoopCompleted(object? sender, bool completed)
352 | {
353 | AnimationLoopCompleted.InvokeAsync();
354 | }
355 |
356 | private void HandleCurrentFrameChanged(object? sender, LottiePlayerEventFrameArgs args)
357 | {
358 | if (CurrentFrameChangeFunc == null || CurrentFrameChangeFunc.Invoke(args.CurrentTime))
359 | {
360 | CurrentFrameChanged.InvokeAsync(args);
361 | }
362 | }
363 |
364 | #endregion
365 |
366 | ///
367 | /// Disposes the LottiePlayer Module if it exists, cleaning up resources and references. Then re-initializes it with
368 | /// any updated options.
369 | ///
370 | ///
371 | private async Task InitializeLottieModule()
372 | {
373 | // dispose the existing module if it exists
374 | if (LottiePlayerModule != null && _initCount > 0)
375 | {
376 | // cancel event handlers to prevent memory leaks
377 | EventSubscription(false);
378 |
379 | await LottiePlayerModule.DisposeAsync();
380 | LottiePlayerModule = null;
381 | IsAnimationLoaded = false;
382 | IsAnimationPaused = false;
383 | }
384 | // initialize the new module with the current parameters
385 | LottiePlayerModule = new LottiePlayerModule(JSRuntime, ElementRef);
386 | var lottiePlaybackOptions = new LottiePlaybackOptions
387 | {
388 | AutoPlay = AutoPlay,
389 | Path = Src,
390 | Renderer = AnimationType.ToDescription(),
391 | Loop = Loop ? (object)(LoopCount > 0 ? LoopCount : true) : false,
392 | Direction = (int)AnimationDirection,
393 | Speed = AnimationSpeed,
394 | SetSubFrame = AnimationOptions.SmoothFrameInterpolation,
395 | Quality = AnimationOptions.AnimationQuality.ToDescription(),
396 | EnterFrameEvent = CurrentFrameChanged.HasDelegate,
397 | };
398 | IsAnimationLoaded = await LottiePlayerModule.InitializeAsync(lottiePlaybackOptions);
399 | if (!IsAnimationLoaded)
400 | {
401 | throw new InvalidOperationException("Failed to initialize Lottie Animation");
402 | }
403 | // redraw the screen to reflect the changes
404 | _initCount++;
405 | IsAnimationPaused = !lottiePlaybackOptions.AutoPlay;
406 |
407 | // setup events
408 | EventSubscription(true);
409 |
410 | StateHasChanged();
411 | }
412 |
413 | private void EventSubscription(bool subscribe)
414 | {
415 | if (LottiePlayerModule == null) return;
416 | if (subscribe)
417 | {
418 | LottiePlayerModule.OnDOMLoaded += HandleDOMLoaded;
419 | LottiePlayerModule.OnAnimationReady += HandleAnimationReady;
420 | LottiePlayerModule.OnComplete += HandleAnimationCompleted;
421 | LottiePlayerModule.OnLoopComplete += HandleAnimationLoopCompleted;
422 | LottiePlayerModule.OnEnterFrame += HandleCurrentFrameChanged;
423 | }
424 | else
425 | {
426 | LottiePlayerModule.OnDOMLoaded -= HandleDOMLoaded;
427 | LottiePlayerModule.OnAnimationReady -= HandleAnimationReady;
428 | LottiePlayerModule.OnComplete -= HandleAnimationCompleted;
429 | LottiePlayerModule.OnLoopComplete -= HandleAnimationLoopCompleted;
430 | LottiePlayerModule.OnEnterFrame -= HandleCurrentFrameChanged;
431 | }
432 | }
433 |
434 | #region Compoinent Lifecycle
435 |
436 | ///
437 | /// OnAfterRenderAsync override
438 | ///
439 | protected override async Task OnAfterRenderAsync(bool firstRender)
440 | {
441 | if (firstRender || !_lottieLoaded)
442 | {
443 | // load the Lottie Web Player JS from CDN
444 | var initModule = await JSRuntime.InvokeAsync("import", "./_content/Blazor.Lottie.Player/loadLottieWeb.js");
445 | // if cdn failed on 2nd try let's swap to local copy
446 | var initJs = firstRender ? AnimationOptions.LottieSourceJs : "./_content/Blazor.Lottie.Player/lottie.min.js";
447 | _lottieLoaded = await initModule.InvokeAsync("initialize", initJs);
448 | if (!_lottieLoaded)
449 | {
450 | StateHasChanged();
451 | return;
452 | }
453 | await InitializeLottieModule();
454 | }
455 | }
456 |
457 | ///
458 | /// Override the SetParametersAsync method to handle component parameters.
459 | ///
460 | /// The parameters submitted with the component
461 | public override Task SetParametersAsync(ParameterView parameters)
462 | {
463 | var reInitialize = false;
464 |
465 | var oldSrc = Src;
466 | var oldAutoPlay = AutoPlay;
467 | var oldLoop = Loop;
468 | var oldLoopCount = LoopCount;
469 | var oldType = AnimationType;
470 | var oldOptions = AnimationOptions;
471 |
472 | // Apply the parameters to the component
473 | parameters.SetParameterProperties(this);
474 |
475 | // check if Src returns is json
476 | if (string.IsNullOrWhiteSpace(Src) || !Src.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
477 | {
478 | _failMessage = "Src must be a valid JSON file path ending with .json";
479 |
480 | }
481 |
482 | // Check if any key parameters changed
483 | if (AutoPlay != oldAutoPlay ||
484 | Loop != oldLoop ||
485 | !Equals(AnimationType, oldType) ||
486 | !Equals(AnimationOptions, oldOptions) ||
487 | Src != oldSrc ||
488 | LoopCount != oldLoopCount)
489 | {
490 | reInitialize = true;
491 | }
492 |
493 | if (reInitialize && _initCount > 0)
494 | {
495 | return InitializeLottieModule();
496 | }
497 | return base.SetParametersAsync(parameters);
498 | }
499 |
500 | ///
501 | /// Disposes the LottiePlayer component asynchronously, cleaning up resources and references.
502 | ///
503 | ///
504 | public async ValueTask DisposeAsync()
505 | {
506 | if (LottiePlayerModule != null)
507 | {
508 | // cancel event handlers to prevent memory leaks
509 | EventSubscription(false);
510 |
511 | await LottiePlayerModule.DisposeAsync();
512 | LottiePlayerModule = null;
513 | }
514 |
515 | GC.SuppressFinalize(this);
516 | }
517 |
518 | #endregion
519 | }
520 |
521 |
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player.Docs.WASM/wwwroot/lottie/newAnimation.json:
--------------------------------------------------------------------------------
1 | {"v":"4.9.0","fr":30,"ip":0,"op":38,"w":315,"h":280,"nm":"new","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"bodyband Konturen","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[157.5,129,0]},"a":{"a":0,"k":[157.5,140,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":9,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.5,52],[14.5,52],[14.5,52.25],[-14.5,52.25]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.5,-41],[14.5,-41],[14.5,52.25],[-14.5,52.25]],"c":true}]},{"t":19.111328125}]},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.871,0.702,0.271,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[160.5,184],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"topband Konturen","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[157.5,140,0]},"a":{"a":0,"k":[157.5,140,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":16.777,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.5,-14.5],[14.5,-14.5],[15.036,-14.207],[-13.964,-14.207]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.5,-14.5],[14.5,-14.5],[14.5,14.5],[-14.5,14.5]],"c":true}]},{"t":23}]},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.831,0.396,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[160.5,128.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"body Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5.432,"s":[-13],"e":[17.85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.111,"s":[17.85],"e":[0]},{"t":16.2958984375}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[162.125,247.599,0],"e":[162.125,145.599,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":8.148,"s":[162.125,145.599,0],"e":[162.125,236.099,0],"to":[0,0,0],"ti":[0,0,0]},{"t":16.2958984375}]},"a":{"a":0,"k":[162.125,225.099,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[-3.228,0],[0,0],[-2.75,0.062]],"o":[[0,0],[0,0],[4.75,-0.188],[0,0],[3.228,0],[0,0]],"v":[[56.25,46.5],[-54.75,46.5],[-55,46.688],[-49.658,46.5],[49.658,46.5],[56,46.688]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[-3.228,0],[0,0],[0,3.21]],"o":[[0,0],[0,0],[0,3.21],[0,0],[3.228,0],[0,0]],"v":[[55.5,-46.5],[-55.5,-46.5],[-55.5,40.688],[-49.658,46.5],[49.658,46.5],[55.5,40.688]],"c":true}]},{"t":3.7041015625}]},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.008,0.588,0.847,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[161.5,178.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"top Konturen","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3.704,"s":[0],"e":[100]},{"t":4.4443359375}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8.148,"s":[10],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14.074,"s":[-23],"e":[0]},{"t":20}]},"p":{"a":1,"k":[{"i":{"x":0.937,"y":0.946},"o":{"x":0.167,"y":0.167},"n":"0p937_0p946_0p167_0p167","t":0,"s":[160,177.5,0],"e":[150,34.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.097,"y":0},"o":{"x":0.084,"y":0.101},"n":"0p097_0_0p084_0p101","t":10.37,"s":[150,34.5,0],"e":[161,128.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":20}]},"a":{"a":0,"k":[161,128.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[0,0,100],"e":[58.621,58.621,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":10.37,"s":[58.621,58.621,100],"e":[100,100,100]},{"t":20}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.219,0],[0,0],[0,-3.204],[0,0],[-3.219,0],[0,0],[0,3.204],[0,0]],"o":[[0,0],[-3.219,0],[0,0],[0,3.204],[0,0],[3.219,0],[0,0],[0,-3.204]],"v":[[61.174,-14.5],[-61.174,-14.5],[-67,-8.7],[-67,8.7],[-61.174,14.5],[61.174,14.5],[67,8.7],[67,-8.7]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.012,0.663,0.957,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[161,128.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"schleife/new Konturen","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[161,115,0]},"a":{"a":0,"k":[161,115,0]},"s":{"a":1,"k":[{"i":{"x":[0.029,0.029,0.833],"y":[1.656,1.656,-15.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p029_1p656_0p167_0p167","0p029_1p656_0p167_0p167","0p833_-15p667_0p167_16p667"],"t":23,"s":[0,0,100],"e":[100,100,100]},{"t":34}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.059,0],[1.667,-0.428],[-0.598,-1.849],[-1.278,0],[0,-4.797],[4.835,0],[0,0],[-8.693,2.139],[0.541,1.87],[3.006,-6.366],[4.932,3.716],[1.157,-1.595],[-1.586,-3.998],[0,0],[0,4.796],[-4.834,0],[-2.606,-1.934],[-1.272,1.478],[5.256,0],[0,-7.995],[-8.058,0],[0,0],[0,0],[0,7.995]],"o":[[-1.91,0],[0.541,1.87],[1.145,-0.282],[4.835,0],[0,4.796],[0,0],[2.097,-5.318],[-0.598,-1.849],[-9.385,2.413],[-2.071,-4.386],[-1.272,1.478],[5.152,3.823],[0,0],[-4.834,0],[0,-4.797],[3.679,0],[1.157,-1.595],[-3.498,-2.637],[-8.058,0],[0,7.995],[0,0],[0,0],[8.059,0],[0,-7.995]],"v":[[23.385,-14.5],[18.024,-13.831],[19.756,-8.259],[23.385,-8.7],[32.155,0],[23.385,8.7],[4.075,8.7],[19.756,-8.259],[18.024,-13.831],[0,3.422],[-10.322,-10.065],[-13.987,-5.478],[-4.083,8.7],[-23.385,8.7],[-32.154,0],[-23.385,-8.7],[-13.987,-5.478],[-10.322,-10.065],[-23.385,-14.5],[-38,0],[-23.385,14.5],[0,14.5],[23.385,14.5],[38,0]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.831,0.396,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[161,100.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"shadow Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[162,236,0]},"a":{"a":0,"k":[162,225,0]},"s":{"a":1,"k":[{"i":{"x":[0.115,0.115,0.833],"y":[1,1,-5.19]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p115_1_0p167_0p167","0p115_1_0p167_0p167","0p833_-5p19_0p167_16p667"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"t":13}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.02,0],[0,-3.313],[53.02,0],[0,3.313]],"o":[[53.02,0],[0,3.313],[-53.02,0],[0,-3.313]],"v":[[0,-6],[96,0],[0,6],[-96,0]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.945,0.945,0.945,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[162,225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ebene 12 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9,"s":[262],"e":[0]},{"t":29}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.359},"o":{"x":0.167,"y":0.167},"n":"0_0p359_0p167_0p167","t":9,"s":[157.5,140,0],"e":[95.449,44.997,0],"to":[0,0,0],"ti":[0,0,0]},{"t":29}]},"a":{"a":0,"k":[95.449,44.997,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":9,"s":[0,0,100],"e":[100,100,100]},{"t":29}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.18,-3.777],[2.178,-3.775],[4.359,0.001],[2.181,3.777],[-2.18,3.775],[-4.359,-0.001]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.012,0.663,0.957,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[95.449,44.997],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ebene 13 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[-63],"e":[0]},{"t":23}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.564},"o":{"x":0.167,"y":0.167},"n":"0_0p564_0p167_0p167","t":3,"s":[157.5,140,0],"e":[248.067,112.75,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23}]},"a":{"a":0,"k":[248.067,112.75,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":3,"s":[0,0,100],"e":[100,100,100]},{"t":23}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.53,-6.63],[4.974,-4.639],[6.505,1.99],[1.532,6.63],[-4.972,4.64],[-6.505,-1.989]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.012,0.663,0.957,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[248.067,112.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Ebene 14 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-200],"e":[0]},{"t":20}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.477},"o":{"x":0.167,"y":0.167},"n":"0_0p477_0p167_0p167","t":0,"s":[157.5,140,0],"e":[268.728,57.196,0],"to":[0,0,0],"ti":[0,0,0]},{"t":20}]},"a":{"a":0,"k":[120.728,247.196,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"t":20}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-2.376,-3.394],[2.799,1.018],[-2.799,3.394]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.149,0.784,0.333,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[120.728,247.196],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Ebene 15 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[134],"e":[0]},{"t":28}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.547},"o":{"x":0.167,"y":0.167},"n":"0_0p547_0p167_0p167","t":8,"s":[157.5,140,0],"e":[61.63,139.445,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28}]},"a":{"a":0,"k":[61.63,139.445,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":8,"s":[0,0,100],"e":[100,100,100]},{"t":28}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.37,-5.433],[4.286,5.433],[-4.37,1.022]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.149,0.784,0.333,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[61.63,139.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Ebene 16 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[74],"e":[0]},{"t":25}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.387},"o":{"x":0.167,"y":0.167},"n":"0_0p387_0p167_0p167","t":5,"s":[157.5,140,0],"e":[183.561,32.661,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25}]},"a":{"a":0,"k":[183.561,32.661,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":5,"s":[0,0,100],"e":[100,100,100]},{"t":25}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.146,0],[0,-2.147],[2.146,0],[0,2.147]],"o":[[2.146,0],[0,2.147],[-2.146,0],[0,-2.147]],"v":[[-0.001,-3.888],[3.886,0],[-0.001,3.888],[-3.887,0]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.039,0.314,0.392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[183.561,32.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Ebene 17 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[29],"e":[0]},{"t":32}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.463},"o":{"x":0.167,"y":0.167},"n":"0_0p463_0p167_0p167","t":12,"s":[157.5,140,0],"e":[44.65,36.558,0],"to":[0,0,0],"ti":[0,0,0]},{"t":32}]},"a":{"a":0,"k":[214.65,244.558,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":12,"s":[0,0,100],"e":[100,100,100]},{"t":32}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.22,0],[0,-3.222],[3.22,0],[0,3.221]],"o":[[3.22,0],[0,3.221],[-3.22,0],[0,-3.222]],"v":[[0,-5.832],[5.829,0],[0,5.832],[-5.829,0]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.039,0.314,0.392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"nm":"Kontur 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[214.65,244.558],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Ebene 18 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[168],"e":[0]},{"t":23}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.243},"o":{"x":0.167,"y":0.167},"n":"0_0p243_0p167_0p167","t":3,"s":[157.5,140,0],"e":[294.925,112.226,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23}]},"a":{"a":0,"k":[62.925,234.226,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":3,"s":[0,0,100],"e":[100,100,100]},{"t":23}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.209,0.131],[0,0],[0,0],[0.174,-0.142],[0,0],[0,0],[-0.093,-0.228],[0,0],[0,0],[-0.247,0.014],[0,0],[0,0],[-0.059,0.236],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.012,-0.223],[0,0],[0,0],[-0.238,-0.069],[0,0],[0,0],[-0.135,0.201],[0,0],[0,0],[0.155,0.19],[0,0],[0,0],[0.232,-0.083]],"v":[[2.206,-0.077],[1.1,-0.771],[1.036,-2.051],[0.544,-2.269],[-0.45,-1.461],[-1.706,-1.819],[-2.062,-1.431],[-1.568,-0.237],[-2.281,0.82],[-2.008,1.278],[-0.711,1.208],[0.105,2.221],[0.628,2.116],[0.938,0.878],[2.156,0.446]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[62.916,234.223],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Ebene 19 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[-209],"e":[0]},{"t":28}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.25},"o":{"x":0.167,"y":0.167},"n":"0_0p25_0p167_0p167","t":8,"s":[157.5,140,0],"e":[35.721,103.978,0],"to":[0,0,0],"ti":[0,0,0]},{"t":28}]},"a":{"a":0,"k":[35.721,103.978,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":8,"s":[0,0,100],"e":[100,100,100]},{"t":28}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.209,0.131],[0,0],[0,0],[0.174,-0.141],[0,0],[0,0],[-0.094,-0.227],[0,0],[0,0],[-0.247,0.014],[0,0],[0,0],[-0.059,0.237],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.012,-0.224],[0,0],[0,0],[-0.238,-0.068],[0,0],[0,0],[-0.135,0.2],[0,0],[0,0],[0.155,0.191],[0,0],[0,0],[0.231,-0.083]],"v":[[2.206,-0.078],[1.1,-0.771],[1.036,-2.051],[0.544,-2.27],[-0.45,-1.461],[-1.706,-1.82],[-2.062,-1.432],[-1.568,-0.238],[-2.281,0.82],[-2.008,1.278],[-0.711,1.207],[0.105,2.22],[0.628,2.115],[0.938,0.878],[2.156,0.446]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[35.712,103.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Ebene 20 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":7,"s":[275],"e":[0]},{"t":27}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.09},"o":{"x":0.167,"y":0.167},"n":"0_0p09_0p167_0p167","t":7,"s":[157.5,140,0],"e":[261.12,26.218,0],"to":[0,0,0],"ti":[0,0,0]},{"t":27}]},"a":{"a":0,"k":[261.12,26.218,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":7,"s":[0,0,100],"e":[100,100,100]},{"t":27}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.21,0.131],[0,0],[0,0],[0.174,-0.141],[0,0],[0,0],[-0.093,-0.228],[0,0],[0,0],[-0.247,0.014],[0,0],[0,0],[-0.059,0.236],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.011,-0.223],[0,0],[0,0],[-0.238,-0.068],[0,0],[0,0],[-0.135,0.2],[0,0],[0,0],[0.155,0.19],[0,0],[0,0],[0.232,-0.082]],"v":[[2.206,-0.078],[1.099,-0.771],[1.034,-2.052],[0.543,-2.27],[-0.45,-1.461],[-1.707,-1.82],[-2.062,-1.432],[-1.568,-0.238],[-2.281,0.82],[-2.009,1.278],[-0.711,1.207],[0.105,2.22],[0.628,2.115],[0.937,0.878],[2.155,0.445]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[261.111,26.215],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Ebene 21 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[132.9],"e":[0]},{"t":23}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.326},"o":{"x":0.167,"y":0.167},"n":"0_0p326_0p167_0p167","t":3,"s":[157.5,140,0],"e":[268.337,196.938,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23}]},"a":{"a":0,"k":[252.337,213.938,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":3,"s":[0,0,100],"e":[100,100,100]},{"t":23}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.411,0.258],[0,0],[0,0],[0.34,-0.276],[0,0],[0,0],[-0.184,-0.446],[0,0],[0,0],[-0.483,0.027],[0,0],[0,0],[-0.116,0.463],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.022,-0.439],[0,0],[0,0],[-0.466,-0.133],[0,0],[0,0],[-0.265,0.392],[0,0],[0,0],[0.302,0.373],[0,0],[0,0],[0.454,-0.162]],"v":[[4.322,-0.152],[2.152,-1.51],[2.027,-4.017],[1.065,-4.447],[-0.882,-2.861],[-3.344,-3.565],[-4.038,-2.804],[-3.072,-0.465],[-4.468,1.607],[-3.935,2.505],[-1.392,2.366],[0.207,4.35],[1.231,4.145],[1.837,1.72],[4.222,0.874]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[252.32,213.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Ebene 22 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[-266],"e":[0]},{"t":33}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.337},"o":{"x":0.167,"y":0.167},"n":"0_0p337_0p167_0p167","t":13,"s":[157.5,140,0],"e":[133.395,26.515,0],"to":[0,0,0],"ti":[0,0,0]},{"t":33}]},"a":{"a":0,"k":[133.395,26.515,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":13,"s":[0,0,100],"e":[100,100,100]},{"t":33}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.411,0.258],[0,0],[0,0],[0.34,-0.277],[0,0],[0,0],[-0.183,-0.446],[0,0],[0,0],[-0.484,0.026],[0,0],[0,0],[-0.116,0.462],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.022,-0.438],[0,0],[0,0],[-0.466,-0.133],[0,0],[0,0],[-0.264,0.392],[0,0],[0,0],[0.302,0.373],[0,0],[0,0],[0.454,-0.162]],"v":[[4.322,-0.152],[2.152,-1.511],[2.027,-4.018],[1.065,-4.446],[-0.882,-2.861],[-3.344,-3.565],[-4.039,-2.804],[-3.072,-0.466],[-4.469,1.607],[-3.935,2.505],[-1.392,2.366],[0.207,4.35],[1.231,4.145],[1.837,1.72],[4.222,0.874]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[133.378,26.508],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Ebene 23 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[399],"e":[0]},{"t":25}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.478},"o":{"x":0.167,"y":0.167},"n":"0_0p478_0p167_0p167","t":5,"s":[157.5,140,0],"e":[257.258,159.497,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25}]},"a":{"a":0,"k":[257.258,159.497,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":5,"s":[0,0,100],"e":[100,100,100]},{"t":25}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.721,-0.604],[0,0],[0,0],[-0.306,-0.794],[0,0],[0,0],[-0.932,0.071],[0,0],[0,0],[-0.241,0.908],[0,0],[0,0],[0.783,0.491],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.821,-0.221],[0,0],[0,0],[-0.524,0.78],[0,0],[0,0],[0.566,0.723],[0,0],[0,0],[0.869,-0.333],[0,0],[0,0],[-0.027,-0.935]],"v":[[2.281,-8.697],[-1.528,-5.509],[-6.23,-6.781],[-7.598,-5.261],[-5.84,-0.719],[-8.615,3.403],[-7.627,5.141],[-2.732,4.758],[0.255,8.578],[2.232,8.133],[3.5,3.356],[8.121,1.595],[8.357,-0.417],[4.245,-2.989],[4.113,-7.897]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[257.231,159.483],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Ebene 24 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11,"s":[-212],"e":[0]},{"t":31}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.748},"o":{"x":0.167,"y":0.167},"n":"0_0p748_0p167_0p167","t":11,"s":[157.5,140,0],"e":[97.064,84.204,0],"to":[0,0,0],"ti":[0,0,0]},{"t":31}]},"a":{"a":0,"k":[97.064,84.204,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":11,"s":[0,0,100],"e":[100,100,100]},{"t":31}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.675,-0.565],[0,0],[0,0],[-0.287,-0.743],[0,0],[0,0],[-0.872,0.067],[0,0],[0,0],[-0.226,0.849],[0,0],[0,0],[0.734,0.459],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.77,-0.208],[0,0],[0,0],[-0.491,0.73],[0,0],[0,0],[0.53,0.677],[0,0],[0,0],[0.814,-0.312],[0,0],[0,0],[-0.026,-0.875]],"v":[[2.135,-8.142],[-1.43,-5.157],[-5.831,-6.348],[-7.113,-4.926],[-5.467,-0.674],[-8.064,3.186],[-7.141,4.812],[-2.557,4.454],[0.239,8.029],[2.09,7.613],[3.277,3.141],[7.602,1.493],[7.822,-0.391],[3.974,-2.799],[3.851,-7.393]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[97.039,84.191],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Ebene 25 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[-256],"e":[0]},{"t":23}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.718},"o":{"x":0.167,"y":0.167},"n":"0_0p718_0p167_0p167","t":3,"s":[157.5,140,0],"e":[78.559,168.874,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23}]},"a":{"a":0,"k":[78.559,168.874,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":3,"s":[0,0,100],"e":[100,100,100]},{"t":23}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.516,-0.432],[0,0],[0,0],[-0.219,-0.569],[0,0],[0,0],[-0.668,0.051],[0,0],[0,0],[-0.173,0.65],[0,0],[0,0],[0.562,0.351],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.588,-0.159],[0,0],[0,0],[-0.376,0.559],[0,0],[0,0],[0.405,0.518],[0,0],[0,0],[0.623,-0.239],[0,0],[0,0],[-0.02,-0.669]],"v":[[1.633,-6.229],[-1.096,-3.945],[-4.463,-4.856],[-5.442,-3.768],[-4.183,-0.516],[-6.17,2.436],[-5.463,3.681],[-1.958,3.407],[0.182,6.143],[1.598,5.824],[2.507,2.403],[5.814,1.142],[5.984,-0.299],[3.04,-2.141],[2.945,-5.656]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[78.54,168.865],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Ebene 26 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[50],"e":[18]},{"t":37}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.897},"o":{"x":0.167,"y":0.167},"n":"0_0p897_0p167_0p167","t":17,"s":[157.5,140,0],"e":[155.771,214.44,0],"to":[0,0,0],"ti":[0,0,0]},{"t":37}]},"a":{"a":0,"k":[155.771,214.44,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.008,1.008,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,15.952]},"n":["0p042_1p008_0p167_0p167","0p042_1p008_0p167_0p167","0p833_-26p778_0p167_15p952"],"t":17,"s":[0,0,100],"e":[67,67,100]},{"t":37}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.312,-0.183],[0,0],[0,0],[0.227,-1.177],[0,0],[0,0],[-1.168,-0.61],[0,0],[0,0],[-0.967,0.904],[0,0],[0,0],[0.57,1.171],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.816,-0.879],[0,0],[0,0],[-1.21,0.541],[0,0],[0,0],[0.137,1.287],[0,0],[0,0],[1.289,0.251],[0,0],[0,0],[0.665,-1.137]],"v":[[10.542,-8.02],[3.609,-7.053],[-1.06,-12.084],[-3.829,-11.291],[-5.121,-4.55],[-11.514,-1.696],[-11.632,1.119],[-5.496,4.318],[-4.779,11.114],[-2.084,12.058],[2.999,7.295],[9.835,8.642],[11.62,6.414],[8.627,0.269],[12.136,-5.695]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[155.828,214.455],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Ebene 27 Konturen","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11,"s":[-239],"e":[0]},{"t":31}]},"p":{"a":1,"k":[{"i":{"x":0,"y":0.5},"o":{"x":0.167,"y":0.167},"n":"0_0p5_0p167_0p167","t":11,"s":[157.5,140,0],"e":[219.606,61.933,0],"to":[0,0,0],"ti":[0,0,0]},{"t":31}]},"a":{"a":0,"k":[219.606,61.933,0]},"s":{"a":1,"k":[{"i":{"x":[0.042,0.042,0.833],"y":[1.006,1.006,-26.778]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"n":["0p042_1p006_0p167_0p167","0p042_1p006_0p167_0p167","0p833_-26p778_0p167_16p667"],"t":11,"s":[0,0,100],"e":[100,100,100]},{"t":31}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.946,-0.131],[0,0],[0,0],[0.163,-0.849],[0,0],[0,0],[-0.842,-0.44],[0,0],[0,0],[-0.697,0.652],[0,0],[0,0],[0.411,0.845],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.588,-0.633],[0,0],[0,0],[-0.872,0.39],[0,0],[0,0],[0.099,0.928],[0,0],[0,0],[0.929,0.181],[0,0],[0,0],[0.479,-0.819]],"v":[[7.601,-5.783],[2.602,-5.086],[-0.764,-8.713],[-2.76,-8.141],[-3.693,-3.281],[-8.301,-1.223],[-8.387,0.807],[-3.962,3.114],[-3.445,8.013],[-1.503,8.694],[2.163,5.259],[7.09,6.23],[8.378,4.624],[6.219,0.195],[8.749,-4.107]],"c":true}},"nm":"Pfad 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.729,0.031,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fläche 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[219.647,61.944],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformieren"}],"nm":"Gruppe 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0}]}
--------------------------------------------------------------------------------
/src/Blazor.Lottie.Player/wwwroot/loading.json:
--------------------------------------------------------------------------------
1 | {"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.21","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":43,"w":512,"h":512,"nm":"Loading Animation Bored Hand","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"LOADING Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.892,367,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-33.44,0],[-33.44,-3.04],[-39.767,-3.04],[-39.767,-13.566],[-43.301,-13.566],[-43.301,0]],"c":true},"ix":2},"nm":"L","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":0,"s":[0,0],"to":[0,-0.569],"ti":[0,1.578]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":5,"s":[0,-3.686],"to":[0,-2.122],"ti":[0,-0.614]},{"t":9.34765625,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"L","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.166,-1.304],[-2.078,0],[-1.216,1.368],[0,2.04],[1.165,1.305],[2.077,0],[1.216,-1.368],[0,-2.039]],"o":[[1.216,1.368],[2.077,0],[1.165,-1.304],[0,-2.039],[-1.216,-1.368],[-2.078,0],[-1.166,1.305],[0,2.04]],"v":[[-30.457,-1.767],[-25.517,0.285],[-20.577,-1.767],[-18.829,-6.783],[-20.577,-11.799],[-25.517,-13.851],[-30.457,-11.799],[-32.205,-6.783]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.482,0.722],[-1.064,0],[-0.558,-0.836],[0,-1.127],[0.481,-0.722],[1.064,0],[0.557,0.836],[0,1.128]],"o":[[0.557,-0.836],[1.064,0],[0.481,0.722],[0,1.128],[-0.558,0.836],[-1.064,0],[-0.482,-0.722],[0,-1.127]],"v":[[-27.949,-9.557],[-25.517,-10.811],[-23.085,-9.557],[-22.363,-6.783],[-23.085,-4.009],[-25.517,-2.755],[-27.949,-4.009],[-28.671,-6.783]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":5,"s":[0,0],"to":[0,-0.525],"ti":[0,1.447]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":11,"s":[0,-3.326],"to":[0,-2.226],"ti":[0,-0.554]},{"t":14.95703125,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"O","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-11.419,-9.804],[-9.918,-5.054],[-12.996,-5.054],[-11.457,-9.804]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-14.668,0],[-13.813,-2.432],[-9.082,-2.432],[-8.246,0],[-4.56,0],[-9.633,-13.566],[-13.224,-13.566],[-18.297,0]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":11,"s":[0,0],"to":[0,-0.552],"ti":[0,1.53]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":16,"s":[0,-3.55],"to":[0,-2.163],"ti":[0,-0.592]},{"t":20.564453125,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"A","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.172,1.178],[0,2.204],[1.178,1.191],[2.077,0],[0,0],[0,0]],"o":[[2.09,0],[1.171,-1.178],[0,-2.102],[-1.178,-1.19],[0,0],[0,0],[0,0]],"v":[[2.299,0],[7.192,-1.767],[8.949,-6.84],[7.182,-11.78],[2.299,-13.566],[-3.534,-13.566],[-3.534,0]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-2.444],[0.576,-0.595],[1.342,0],[0,0],[0,0]],"o":[[2.495,0],[0,1.356],[-0.577,0.596],[0,0],[0,0],[0,0]],"v":[[1.672,-10.526],[5.415,-6.859],[4.551,-3.933],[1.672,-3.04],[0,-3.04],[0,-10.526]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":16,"s":[0,0],"to":[0,-0.512],"ti":[0,1.404]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":22,"s":[0,-3.212],"to":[0,-2.255],"ti":[0,-0.535]},{"t":26.173828125,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"D","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.421,0],[14.421,-13.566],[10.887,-13.566],[10.887,0]],"c":true},"ix":2},"nm":"I","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":22,"s":[0,0],"to":[0,-0.537],"ti":[0,1.483]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":28,"s":[0,-3.423],"to":[0,-2.199],"ti":[0,-0.57]},{"t":31.783203125,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"I","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.159,0],[20.159,-8.455],[24.892,0],[28.538,0],[28.538,-13.566],[25.213,-13.566],[25.213,-5.206],[20.479,-13.566],[16.834,-13.566],[16.834,0]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":28,"s":[0,0],"to":[0,-0.565],"ti":[0,1.569]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":33,"s":[0,-3.659],"to":[0,-2.13],"ti":[0,-0.61]},{"t":37.390625,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"N","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.557,-0.373],[0.861,0],[0.557,0.836],[0,1.128],[-0.482,0.722],[-1.064,0],[-0.507,-0.335],[-0.051,-0.57],[0,0],[1.266,0.887],[1.545,0],[1.247,-1.349],[0,-2.014],[-1.229,-1.33],[-2.014,0],[-0.836,1.178],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.102,0.621],[-0.558,0.374],[-1.064,0],[-0.482,-0.722],[0,-1.127],[0.557,-0.836],[0.722,0],[0.506,0.336],[0,0],[-0.152,-1.596],[-1.128,-0.785],[-2.014,0],[-1.248,1.349],[0,2.014],[1.266,1.368],[1.684,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.772,-7.429],[37.772,-4.807],[40.242,-4.807],[39.254,-3.316],[37.126,-2.755],[34.694,-4.009],[33.972,-6.783],[34.694,-9.557],[37.126,-10.811],[38.969,-10.307],[39.805,-8.949],[43.339,-8.949],[41.211,-12.673],[37.202,-13.851],[32.309,-11.827],[30.438,-6.783],[32.281,-1.767],[37.202,0.285],[40.983,-1.482],[41.192,0],[43.472,0],[43.472,-7.429]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":33,"s":[0,0],"to":[0,-0.522],"ti":[0,1.438]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":39,"s":[0,-3.302],"to":[0,-2.232],"ti":[0,-0.55]},{"t":43,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"G","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Index_finger","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-130.75],[17,-130.25],[6.75,-118],[8,-67.75],[22.25,-57.75],[38.75,-68],[40.5,-116.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-133.122],[17,-132.622],[6.75,-120.372],[8.279,-69.564],[22.529,-59.564],[39.029,-69.814],[40.5,-118.622]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-129.599],[17,-129.099],[6.75,-116.849],[8.512,-65.576],[22.762,-55.576],[39.262,-65.826],[40.5,-115.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[9.5,3.948],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-1.278,4.408],[0.25,0.25]],"o":[[-7.971,-3.312],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[3.727,-12.849],[-0.25,-0.25]],"v":[[30,-72.948],[15.5,-73.948],[5.25,-61.698],[30.523,35.599],[44.773,45.599],[61.273,35.349],[45.5,-45.948]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[9.5,3.948],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-1.278,4.408],[0.25,0.25]],"o":[[-7.971,-3.312],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[3.727,-12.849],[-0.25,-0.25]],"v":[[30,-72.948],[15.5,-73.948],[5.25,-61.698],[30.523,35.599],[44.773,45.599],[61.273,35.349],[45.5,-45.948]],"c":true}]},{"t":43,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-130.75],[17,-130.25],[6.75,-118],[8,-67.75],[22.25,-57.75],[38.75,-68],[40.5,-116.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607877731,0,0.454901993275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":0,"k":0,"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":"Shape 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[9.888,1.745],[0,0],[-3.25,-11.25],[1.637,-12.477],[-1.239,-0.169],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[3.492,12.089],[-0.826,6.293],[5.5,0.75],[2.25,-4],[-0.25,-0.25]],"v":[[30,-130.75],[17,-130.25],[29,-118.25],[29.75,-75.25],[26.75,-58.5],[38.75,-68],[40.5,-116.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[9.888,1.745],[0,0],[-3.25,-11.25],[1.637,-12.477],[-1.239,-0.169],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[3.492,12.089],[-0.826,6.293],[5.5,0.75],[2.25,-4],[-0.25,-0.25]],"v":[[29.75,-133],[16.75,-132.5],[28.75,-120.5],[29.5,-77.5],[26.5,-60.75],[38.5,-70.25],[40.25,-118.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[9.888,1.745],[0,0],[-3.25,-11.25],[1.637,-12.477],[-1.239,-0.169],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[3.492,12.089],[-0.826,6.293],[5.5,0.75],[2.25,-4],[-0.25,-0.25]],"v":[[30,-128.75],[17,-128.25],[29,-116.25],[29.75,-73.25],[26.75,-56.5],[38.75,-66],[40.5,-114.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[9.888,1.745],[0,0],[-3.25,-11.25],[-0.75,-13.25],[-1.235,-0.19],[-0.744,4.529],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[3.492,12.089],[0.359,6.336],[3.25,0.5],[2.75,-16.75],[-0.25,-0.25]],"v":[[28,-73.75],[13,-73.25],[29.5,-59.75],[52.75,28],[52.25,44],[61.75,35.25],[43.75,-52.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[9.888,1.745],[0,0],[-3.25,-11.25],[-0.75,-13.25],[-1.235,-0.19],[-0.744,4.529],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[3.492,12.089],[0.359,6.336],[3.25,0.5],[2.75,-16.75],[-0.25,-0.25]],"v":[[28,-73.75],[13,-73.25],[29.5,-59.75],[52.75,28],[52.25,44],[61.75,35.25],[43.75,-52.25]],"c":true}]},{"t":43,"s":[{"i":[[9.888,1.745],[0,0],[-3.25,-11.25],[1.637,-12.477],[-1.239,-0.169],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[3.492,12.089],[-0.826,6.293],[5.5,0.75],[2.25,-4],[-0.25,-0.25]],"v":[[30,-130.75],[17,-130.25],[29,-118.25],[29.75,-75.25],[26.75,-58.5],[38.75,-68],[40.5,-116.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.050980392156862744,0.4627450980392157,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-130.75],[17,-130.25],[6.75,-118],[8,-67.75],[22.25,-57.75],[38.75,-68],[40.5,-116.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-133.122],[17,-132.622],[6.75,-120.372],[8.279,-69.564],[22.529,-59.564],[39.029,-69.814],[40.5,-118.622]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-129.599],[17,-129.099],[6.75,-116.849],[8.512,-65.576],[22.762,-55.576],[39.262,-65.826],[40.5,-115.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[9.5,3.948],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-1.278,4.408],[0.25,0.25]],"o":[[-7.971,-3.312],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[3.727,-12.849],[-0.25,-0.25]],"v":[[30,-72.948],[15.5,-73.948],[5.25,-61.698],[30.523,35.599],[44.773,45.599],[61.273,35.349],[45.5,-45.948]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[9.5,3.948],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-1.278,4.408],[0.25,0.25]],"o":[[-7.971,-3.312],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[3.727,-12.849],[-0.25,-0.25]],"v":[[30,-72.948],[15.5,-73.948],[5.25,-61.698],[30.523,35.599],[44.773,45.599],[61.273,35.349],[45.5,-45.948]],"c":true}]},{"t":43,"s":[{"i":[[9.888,1.745],[0,0],[1.5,-10.5],[-3.25,-6.75],[-10.75,-1],[-2.25,4],[0.25,0.25]],"o":[[-8.5,-1.5],[0,0],[-1.5,10.5],[3.25,6.75],[10.75,1],[2.25,-4],[-0.25,-0.25]],"v":[[30,-130.75],[17,-130.25],[6.75,-118],[8,-67.75],[22.25,-57.75],[38.75,-68],[40.5,-116.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Middle_finger","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[9.375,-1.616],[0,0],[-1.75,-10.75],[-1.25,-4.25],[-8.75,-0.5],[1,13],[3,5]],"o":[[-7.25,1.25],[0,0],[1.75,10.75],[1.25,4.25],[8.75,0.5],[-1,-13],[-3,-5]],"v":[[-24.5,-140.75],[-36,-130.75],[-35.5,-117.5],[-28,-74.5],[-15,-61],[5.5,-75.25],[-5.25,-132.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[9.375,-1.616],[0,0],[-1.75,-10.75],[-1.25,-4.25],[-8.75,-0.5],[1,13],[3,5]],"o":[[-7.25,1.25],[0,0],[1.75,10.75],[1.25,4.25],[8.75,0.5],[-1,-13],[-3,-5]],"v":[[-23.25,-115.75],[-34.75,-105.75],[-34.25,-92.5],[-20.5,-34.5],[-7.5,-21],[13,-35.25],[-4,-107.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[11.347,-1.939],[0,0],[-1.576,-9.505],[-1.513,-5.149],[-10.587,-0.606],[4.501,20.379],[3.63,6.058]],"o":[[-14.136,2.416],[0,0],[2.159,13.018],[1.512,5.149],[10.587,0.606],[-3.407,-15.426],[-3.63,-6.058]],"v":[[-19.572,-73.033],[-33.863,-59.542],[-32.383,-43.737],[-11.62,23.537],[5.985,48.019],[25.79,24.003],[1.47,-60.859]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[11.347,-1.939],[0,0],[-1.576,-9.505],[-1.513,-5.149],[-10.587,-0.606],[4.501,20.379],[3.63,6.058]],"o":[[-14.136,2.416],[0,0],[2.159,13.018],[1.512,5.149],[10.587,0.606],[-3.407,-15.426],[-3.63,-6.058]],"v":[[-19.572,-73.033],[-33.863,-59.542],[-32.383,-43.737],[-11.62,23.537],[5.985,48.019],[25.79,24.003],[1.47,-60.859]],"c":true}]},{"t":43,"s":[{"i":[[9.375,-1.616],[0,0],[-1.75,-10.75],[-1.25,-4.25],[-8.75,-0.5],[1,13],[3,5]],"o":[[-7.25,1.25],[0,0],[1.75,10.75],[1.25,4.25],[8.75,0.5],[-1,-13],[-3,-5]],"v":[[-24.5,-140.75],[-36,-130.75],[-35.5,-117.5],[-28,-74.5],[-15,-61],[5.5,-75.25],[-5.25,-132.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607877731,0,0.454901993275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.916,-1.008],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"Shape 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[6.983,-0.66],[-3.834,-11.242],[-1.839,-8.422],[-0.584,-7.242],[-3.51,0.965],[0.266,4.988],[8.051,17.579]],"o":[[-9.334,0.883],[3.796,11.131],[2.338,10.709],[1.03,12.774],[4.816,-1.324],[-1.031,-19.307],[-2.921,-6.377]],"v":[[-24.5,-140.75],[-14.25,-125.75],[-8.75,-101.375],[-4,-74.5],[-1.875,-62.75],[5.5,-75.25],[-5.25,-132.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[-2.412,-1.507],[-2.855,-11.53],[-1.839,-8.422],[-0.584,-7.242],[-3.612,0.453],[0.266,4.988],[6.572,18.184]],"o":[[6.416,4.008],[2.416,9.758],[2.338,10.709],[1.03,12.774],[6.416,-0.805],[-1.031,-19.307],[-4.334,-11.992]],"v":[[-23,-114.75],[-6.25,-84.5],[-0.75,-60.125],[4,-33.25],[2.375,-21.25],[13.5,-34],[-3.75,-106.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[-2.412,-1.507],[-2.855,-11.53],[-1.839,-8.422],[-0.584,-7.242],[-3.612,0.453],[0.266,4.988],[6.572,18.184]],"o":[[6.416,4.008],[2.416,9.758],[2.338,10.709],[1.03,12.774],[6.416,-0.805],[-1.031,-19.307],[-4.334,-11.992]],"v":[[-22,-72.5],[-2.75,-41.75],[5,-15.125],[16,34],[14.375,46],[25.5,33.25],[-0.25,-63.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[-2.412,-1.507],[-2.855,-11.53],[-1.839,-8.422],[-0.584,-7.242],[-3.612,0.453],[0.266,4.988],[6.572,18.184]],"o":[[6.416,4.008],[2.416,9.758],[2.338,10.709],[1.03,12.774],[6.416,-0.805],[-1.031,-19.307],[-4.334,-11.992]],"v":[[-22,-72.5],[-2.75,-41.75],[5,-15.125],[16,34],[14.375,46],[25.5,33.25],[-0.25,-63.5]],"c":true}]},{"t":43,"s":[{"i":[[6.983,-0.66],[-3.834,-11.242],[-1.839,-8.422],[-0.584,-7.242],[-3.51,0.965],[0.266,4.988],[8.051,17.579]],"o":[[-9.334,0.883],[3.796,11.131],[2.338,10.709],[1.03,12.774],[4.816,-1.324],[-1.031,-19.307],[-2.921,-6.377]],"v":[[-24.5,-140.75],[-14.25,-125.75],[-8.75,-101.375],[-4,-74.5],[-1.875,-62.75],[5.5,-75.25],[-5.25,-132.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.050980392156862744,0.4627450980392157,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.916,-1.008],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"Shape 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[9.375,-1.616],[0,0],[-1.75,-10.75],[-1.25,-4.25],[-8.75,-0.5],[1,13],[3,5]],"o":[[-7.25,1.25],[0,0],[1.75,10.75],[1.25,4.25],[8.75,0.5],[-1,-13],[-3,-5]],"v":[[-24.5,-140.75],[-36,-130.75],[-35.5,-117.5],[-28,-74.5],[-15,-61],[5.5,-75.25],[-5.25,-132.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[9.375,-1.616],[0,0],[-1.75,-10.75],[-1.25,-4.25],[-8.75,-0.5],[1,13],[3,5]],"o":[[-7.25,1.25],[0,0],[1.75,10.75],[1.25,4.25],[8.75,0.5],[-1,-13],[-3,-5]],"v":[[-23.25,-115.75],[-34.75,-105.75],[-34.25,-92.5],[-20.5,-34.5],[-7.5,-21],[13,-35.25],[-4,-107.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[11.347,-1.939],[0,0],[-1.576,-9.505],[-1.513,-5.149],[-10.587,-0.606],[4.501,20.379],[3.63,6.058]],"o":[[-14.136,2.416],[0,0],[2.159,13.018],[1.512,5.149],[10.587,0.606],[-3.407,-15.426],[-3.63,-6.058]],"v":[[-19.572,-73.033],[-33.863,-59.542],[-32.383,-43.737],[-11.62,23.537],[5.985,48.019],[25.79,24.003],[1.47,-60.859]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[11.347,-1.939],[0,0],[-1.576,-9.505],[-1.513,-5.149],[-10.587,-0.606],[4.501,20.379],[3.63,6.058]],"o":[[-14.136,2.416],[0,0],[2.159,13.018],[1.512,5.149],[10.587,0.606],[-3.407,-15.426],[-3.63,-6.058]],"v":[[-19.572,-73.033],[-33.863,-59.542],[-32.383,-43.737],[-11.62,23.537],[5.985,48.019],[25.79,24.003],[1.47,-60.859]],"c":true}]},{"t":43,"s":[{"i":[[9.375,-1.616],[0,0],[-1.75,-10.75],[-1.25,-4.25],[-8.75,-0.5],[1,13],[3,5]],"o":[[-7.25,1.25],[0,0],[1.75,10.75],[1.25,4.25],[8.75,0.5],[-1,-13],[-3,-5]],"v":[[-24.5,-140.75],[-36,-130.75],[-35.5,-117.5],[-28,-74.5],[-15,-61],[5.5,-75.25],[-5.25,-132.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.916,-1.008],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Ring_finger","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[10,1],[0.392,-5.492],[-3.5,-9.25],[-7.75,-2.75],[4.636,19.412],[1,3.5]],"o":[[-10,-1],[-0.5,7],[6.128,16.195],[7.75,2.75],[-4,-16.75],[-1,-3.5]],"v":[[-55.5,-105],[-75.5,-93],[-71.5,-73.5],[-50,-28.5],[-26.75,-48],[-39.75,-87]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[11.181,1.09],[0.439,-5.987],[-3.913,-10.085],[-12.321,-5.496],[6.183,21.764],[1.118,3.816]],"o":[[-11.181,-1.09],[-0.559,7.632],[6.851,17.656],[9.694,4.324],[-5.138,-18.086],[-1.118,-3.816]],"v":[[-51.579,-63.91],[-73.941,-50.826],[-69.469,-29.566],[-34.429,44.746],[-12.683,21.736],[-33.969,-44.285]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[11.181,1.09],[0.439,-5.987],[-3.913,-10.085],[-12.321,-5.496],[6.183,21.764],[1.118,3.816]],"o":[[-11.181,-1.09],[-0.559,7.632],[6.851,17.656],[9.694,4.324],[-5.138,-18.086],[-1.118,-3.816]],"v":[[-51.579,-63.91],[-73.941,-50.826],[-69.469,-29.566],[-34.429,44.746],[-12.683,21.736],[-33.969,-44.285]],"c":true}]},{"t":36,"s":[{"i":[[10,1],[0.392,-5.492],[-3.5,-9.25],[-7.75,-2.75],[4.636,19.412],[1,3.5]],"o":[[-10,-1],[-0.5,7],[6.128,16.195],[7.75,2.75],[-4,-16.75],[-1,-3.5]],"v":[[-55.5,-105],[-75.5,-93],[-71.5,-73.5],[-50,-28.5],[-26.75,-48],[-39.75,-87]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607877731,0,0.454901993275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":0,"k":0,"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":"Shape 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[10.047,0.251],[-3.5,-2.25],[-3.5,-9.25],[5.75,-8.625],[4,14.875],[1,3.5]],"o":[[-5,-0.125],[10.073,6.476],[6.128,16.195],[-1.746,2.619],[-4.472,-16.63],[-1,-3.5]],"v":[[-55.5,-105],[-63.375,-102.125],[-47,-75.5],[-39.25,-28.625],[-26.75,-48],[-39.75,-87]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[10.047,0.251],[-3.811,-1.67],[-4.52,-8.796],[5.75,-8.625],[1.619,9.628],[1,3.5]],"o":[[-5,-0.125],[11.125,4.875],[9.25,18],[-1.746,2.619],[-4.75,-28.25],[-1,-3.5]],"v":[[-52.5,-63.75],[-60.375,-60.875],[-43.25,-40.25],[-22.75,43.625],[-11.5,30.25],[-36,-51.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[10.047,0.251],[-3.811,-1.67],[-4.52,-8.796],[5.75,-8.625],[1.619,9.628],[1,3.5]],"o":[[-5,-0.125],[11.125,4.875],[9.25,18],[-1.746,2.619],[-4.75,-28.25],[-1,-3.5]],"v":[[-52.5,-63.75],[-60.375,-60.875],[-43.25,-40.25],[-22.75,43.625],[-11.5,30.25],[-36,-51.75]],"c":true}]},{"t":36,"s":[{"i":[[10.047,0.251],[-3.5,-2.25],[-3.5,-9.25],[5.75,-8.625],[4,14.875],[1,3.5]],"o":[[-5,-0.125],[10.073,6.476],[6.128,16.195],[-1.746,2.619],[-4.472,-16.63],[-1,-3.5]],"v":[[-55.5,-105],[-63.375,-102.125],[-47,-75.5],[-39.25,-28.625],[-26.75,-48],[-39.75,-87]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.050980392156862744,0.4627450980392157,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[10,1],[0.392,-5.492],[-3.5,-9.25],[-7.75,-2.75],[4.636,19.412],[1,3.5]],"o":[[-10,-1],[-0.5,7],[6.128,16.195],[7.75,2.75],[-4,-16.75],[-1,-3.5]],"v":[[-55.5,-105],[-75.5,-93],[-71.5,-73.5],[-50,-28.5],[-26.75,-48],[-39.75,-87]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[11.181,1.09],[0.439,-5.987],[-3.913,-10.085],[-12.321,-5.496],[6.183,21.764],[1.118,3.816]],"o":[[-11.181,-1.09],[-0.559,7.632],[6.851,17.656],[9.694,4.324],[-5.138,-18.086],[-1.118,-3.816]],"v":[[-51.579,-63.91],[-73.941,-50.826],[-69.469,-29.566],[-34.429,44.746],[-12.683,21.736],[-33.969,-44.285]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[11.181,1.09],[0.439,-5.987],[-3.913,-10.085],[-12.321,-5.496],[6.183,21.764],[1.118,3.816]],"o":[[-11.181,-1.09],[-0.559,7.632],[6.851,17.656],[9.694,4.324],[-5.138,-18.086],[-1.118,-3.816]],"v":[[-51.579,-63.91],[-73.941,-50.826],[-69.469,-29.566],[-34.429,44.746],[-12.683,21.736],[-33.969,-44.285]],"c":true}]},{"t":36,"s":[{"i":[[10,1],[0.392,-5.492],[-3.5,-9.25],[-7.75,-2.75],[4.636,19.412],[1,3.5]],"o":[[-10,-1],[-0.5,7],[6.128,16.195],[7.75,2.75],[-4,-16.75],[-1,-3.5]],"v":[[-55.5,-105],[-75.5,-93],[-71.5,-73.5],[-50,-28.5],[-26.75,-48],[-39.75,-87]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"little_finger","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[8.75,-4.25],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-6.59,4.43],[-0.318,6.593],[4.5,12.75]],"o":[[0,0],[-8.75,4.25],[-1.75,2.75],[1.75,7],[4.264,5.288],[3.069,-2.063],[0,-0.5],[0.25,0.5]],"v":[[-67.375,-49.125],[-86.75,-54.75],[-98.25,-44.5],[-99.25,-25],[-83.5,9.5],[-62.097,14.598],[-56.5,2],[-66.75,-32.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[7.796,-3.39],[1.75,-2.75],[-1.35,-7.088],[-2.25,-5],[-14.172,1.542],[1.375,10.625],[14.25,29.75]],"o":[[0,0],[-8.625,3.75],[-1.75,2.75],[3,15.75],[6.765,15.033],[4.691,-0.51],[0,-0.5],[0.25,0.5]],"v":[[-70.375,-33.875],[-85.5,-37.25],[-96.75,-27],[-97.75,-7.5],[-86.75,21.75],[-56.328,49.583],[-48.875,31.5],[-63.75,-12.75]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[7.796,-3.39],[1.75,-2.75],[-1.35,-7.088],[-2.25,-5],[-14.172,1.542],[1.375,10.625],[14.25,29.75]],"o":[[0,0],[-8.625,3.75],[-1.75,2.75],[3,15.75],[6.765,15.033],[4.691,-0.51],[0,-0.5],[0.25,0.5]],"v":[[-70.375,-33.875],[-85.5,-37.25],[-96.75,-27],[-97.75,-7.5],[-86.75,21.75],[-56.328,49.583],[-48.875,31.5],[-63.75,-12.75]],"c":false}]},{"t":43,"s":[{"i":[[0,0],[8.75,-4.25],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-6.59,4.43],[-0.318,6.593],[4.5,12.75]],"o":[[0,0],[-8.75,4.25],[-1.75,2.75],[1.75,7],[4.264,5.288],[3.069,-2.063],[0,-0.5],[0.25,0.5]],"v":[[-67.375,-49.125],[-86.75,-54.75],[-98.25,-44.5],[-99.25,-25],[-83.5,9.5],[-62.097,14.598],[-56.5,2],[-66.75,-32.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607877731,0,0.454901993275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":0,"k":0,"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":"Shape 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[4,1.5],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-1.028,3.652],[0.778,4.964],[2.806,7.435]],"o":[[0,0],[-3.511,-1.317],[-1.75,2.75],[1.75,7],[4.264,5.288],[1.126,-4.002],[-1.832,-11.695],[0,0]],"v":[[-66.375,-48.625],[-75.25,-53.5],[-82.75,-46.5],[-83.75,-26.75],[-66.125,7.375],[-57.472,10.348],[-57.125,-1.625],[-65.625,-35.625]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[4,1.5],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-1.028,3.652],[0.778,4.964],[2.806,7.435]],"o":[[0,0],[-3.511,-1.317],[-1.75,2.75],[1.75,7],[4.264,5.288],[1.126,-4.002],[-1.832,-11.695],[0,0]],"v":[[-66.375,-30.125],[-73.5,-35],[-81,-28],[-82,-8.25],[-58.875,40.875],[-50.222,43.848],[-49.875,31.875],[-65.625,-17.125]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[4,1.5],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-1.028,3.652],[0.778,4.964],[2.806,7.435]],"o":[[0,0],[-3.511,-1.317],[-1.75,2.75],[1.75,7],[4.264,5.288],[1.126,-4.002],[-1.832,-11.695],[0,0]],"v":[[-66.375,-30.125],[-73.5,-35],[-81,-28],[-82,-8.25],[-58.875,40.875],[-50.222,43.848],[-49.875,31.875],[-65.625,-17.125]],"c":false}]},{"t":43,"s":[{"i":[[0,0],[4,1.5],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-1.028,3.652],[0.778,4.964],[2.806,7.435]],"o":[[0,0],[-3.511,-1.317],[-1.75,2.75],[1.75,7],[4.264,5.288],[1.126,-4.002],[-1.832,-11.695],[0,0]],"v":[[-66.375,-48.625],[-75.25,-53.5],[-82.75,-46.5],[-83.75,-26.75],[-66.125,7.375],[-57.472,10.348],[-57.125,-1.625],[-65.625,-35.625]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.050980392156862744,0.4627450980392157,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[8.75,-4.25],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-6.59,4.43],[-0.318,6.593],[4.5,12.75]],"o":[[0,0],[-8.75,4.25],[-1.75,2.75],[1.75,7],[4.264,5.288],[3.069,-2.063],[0,-0.5],[0.25,0.5]],"v":[[-67.375,-49.125],[-86.75,-54.75],[-98.25,-44.5],[-99.25,-25],[-83.5,9.5],[-62.097,14.598],[-56.5,2],[-66.75,-32.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[7.796,-3.39],[1.75,-2.75],[-1.35,-7.088],[-2.25,-5],[-14.172,1.542],[1.375,10.625],[14.25,29.75]],"o":[[0,0],[-8.625,3.75],[-1.75,2.75],[3,15.75],[6.765,15.033],[4.691,-0.51],[0,-0.5],[0.25,0.5]],"v":[[-70.375,-33.875],[-85.5,-37.25],[-96.75,-27],[-97.75,-7.5],[-86.75,21.75],[-56.328,49.583],[-48.875,31.5],[-63.75,-12.75]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[7.796,-3.39],[1.75,-2.75],[-1.35,-7.088],[-2.25,-5],[-14.172,1.542],[1.375,10.625],[14.25,29.75]],"o":[[0,0],[-8.625,3.75],[-1.75,2.75],[3,15.75],[6.765,15.033],[4.691,-0.51],[0,-0.5],[0.25,0.5]],"v":[[-70.375,-33.875],[-85.5,-37.25],[-96.75,-27],[-97.75,-7.5],[-86.75,21.75],[-56.328,49.583],[-48.875,31.5],[-63.75,-12.75]],"c":false}]},{"t":43,"s":[{"i":[[0,0],[8.75,-4.25],[1.75,-2.75],[-1.75,-7],[-5.439,-6.744],[-6.59,4.43],[-0.318,6.593],[4.5,12.75]],"o":[[0,0],[-8.75,4.25],[-1.75,2.75],[1.75,7],[4.264,5.288],[3.069,-2.063],[0,-0.5],[0.25,0.5]],"v":[[-67.375,-49.125],[-86.75,-54.75],[-98.25,-44.5],[-99.25,-25],[-83.5,9.5],[-62.097,14.598],[-56.5,2],[-66.75,-32.5]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Hand/Thump","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-6.5,-9.5],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[6.25,2.25],[0,0],[0.75,5],[3.75,5.5],[26,-13.5],[0.5,-1],[-23.5,-54.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[6.5,9.5],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-0.75,-5],[-3.75,-5.5],[-26,13.5],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.75,-1],[62.75,22],[90,37.75],[112.75,24.25],[96.25,-1.5],[59.5,-13.25],[42.5,-20],[35.25,-32],[28.875,-57.125],[-33.5,-72.5],[-68.5,-50.25],[-74.5,22],[-55,41],[-5,34],[39.25,32.5],[55.625,20.812],[52.375,20.812],[62.188,21.062]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[-6.859,-11.174],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[6.005,2.775],[0,0],[1.826,5.12],[4.682,4.515],[26.076,-10.152],[0.5,-1],[-23.5,-54.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[6.073,9.765],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-4.696,-2.011],[0,0],[-1.591,-4.708],[-8.592,-6.875],[-29.924,14.848],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.511,-1.239],[61.315,22.837],[89.761,39.902],[110.478,25.565],[96.37,0.772],[55.315,-16.239],[44.533,-22.63],[39.12,-33.315],[28.538,-57.049],[-23.076,-62.848],[-67.957,-41.033],[-74.5,22],[-55,41],[-2.13,31.37],[39.25,32.5],[55.266,20.932],[52.375,20.812],[60.035,20.823]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[-7.25,-13],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[5.738,3.347],[0,0],[3,5.25],[5.699,3.44],[22.088,-10.756],[0.5,-1],[-18.5,-44.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[5.607,10.053],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-3,-1.75],[0,0],[-2.508,-4.39],[-13.875,-8.375],[-28.75,14],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.25,-1.5],[59.75,23.75],[89.5,42.25],[108,27],[96.5,3.25],[50.75,-19.5],[46.75,-25.5],[41.25,-34.75],[27.125,-54.875],[-24.25,-56.5],[-70,-32.75],[-74.5,22],[-55,41],[1,28.5],[39.25,32.5],[54.875,21.062],[52.375,20.812],[57.688,20.562]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[-7.25,-13],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[5.738,3.347],[0,0],[3,5.25],[5.699,3.44],[22.088,-10.756],[0.5,-1],[-18.5,-44.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[5.607,10.053],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-3,-1.75],[0,0],[-2.508,-4.39],[-13.875,-8.375],[-28.75,14],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.25,-1.5],[59.75,23.75],[89.5,42.25],[108,27],[96.5,3.25],[50.75,-19.5],[46.75,-25.5],[41.25,-34.75],[27.125,-54.875],[-24.25,-56.5],[-70,-32.75],[-74.5,22],[-55,41],[1,28.5],[39.25,32.5],[54.875,21.062],[52.375,20.812],[57.688,20.562]],"c":false}]},{"t":43,"s":[{"i":[[0,0],[-6.5,-9.5],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[6.25,2.25],[0,0],[0.75,5],[3.75,5.5],[26,-13.5],[0.5,-1],[-23.5,-54.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[6.5,9.5],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-0.75,-5],[-3.75,-5.5],[-26,13.5],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.75,-1],[62.75,22],[90,37.75],[112.75,24.25],[96.25,-1.5],[59.5,-13.25],[42.5,-20],[35.25,-32],[28.875,-57.125],[-33.5,-72.5],[-68.5,-50.25],[-74.5,22],[-55,41],[-5,34],[39.25,32.5],[55.625,20.812],[52.375,20.812],[62.188,21.062]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.419607877731,0,0.454901993275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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":0,"k":0,"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":"Shape 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[26,-13.5],[0.5,-1],[-9.671,-39.373],[0,0],[-1.542,-3.576],[-12,-3],[-16,10],[-12.328,3.216],[0,0],[-2,0.312],[0,0],[0,0],[-7.625,-15.875],[-3,0.5],[-0.375,9.125],[8.75,3.5],[6.25,2.25],[0,0],[0.75,5],[3.75,5.5]],"o":[[-26,13.5],[-0.217,-0.217],[0.722,2.939],[0,0],[1,1.5],[12,3],[0.75,-0.5],[5.75,-1.5],[0,0],[-1.5,-11.562],[0,0],[0,0],[6.658,13.861],[4.378,-0.73],[0.6,-14.593],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-0.75,-5],[-3.75,-5.5]],"v":[[-33.5,-72.5],[-60.25,-56.75],[-72.938,-4.015],[-35.467,-18.261],[-66.25,15.5],[-46.75,34.5],[3.5,28],[47.75,26.5],[55.625,20.812],[61.125,20.812],[67.062,0.562],[69.25,-1.5],[102.5,16],[99.5,38.25],[112.75,24.25],[96.25,-1.5],[59.5,-13.25],[42.5,-20],[35.25,-32],[28.875,-57.125]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[31,-14.75],[7.25,-6.25],[-2.812,-16.485],[0,0],[-1.542,-3.576],[-12,-3],[-16,10],[-14,1.75],[0,0],[-2,0.312],[0,0],[0,0],[-7.625,-15.875],[-3,0.5],[-0.375,9.125],[8.75,3.5],[6.25,2.25],[0,0],[2.5,6],[3.75,5.5]],"o":[[-31.818,15.139],[-3,5.25],[0.501,2.985],[0,0],[1,1.5],[12,3],[0.75,-0.5],[5.897,-0.737],[0,0],[-2.375,-12.312],[0,0],[0,0],[6.658,13.861],[4.378,-0.73],[0.6,-14.593],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-1.945,-4.667],[-3.75,-5.5]],"v":[[-29.25,-60.25],[-71.375,-37.625],[-72.938,-4.015],[-35.467,-18.261],[-66.25,15.5],[-46.75,34.5],[7.75,24.25],[42.5,27],[52.125,20.312],[59.125,19.812],[67.062,0.562],[69.25,-1.5],[99.25,15.25],[98.5,40.5],[110.25,26.5],[97.75,2.75],[61.75,-12.75],[47.25,-20.25],[38.75,-35],[28.875,-57.125]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[31.75,-16.75],[5.25,-7.25],[-2.812,-16.485],[0,0],[-1.542,-3.576],[-12,-3],[-16,10],[-14,1.75],[0,0],[-2,0.312],[0,0],[0,0],[-2.979,-7.172],[-2.964,0.684],[-0.375,9.125],[8.75,3.5],[6.375,3.75],[0,0],[2.375,4.125],[3.75,5.5]],"o":[[-31.165,16.441],[-3,5.25],[0.501,2.985],[0,0],[1,1.5],[12,3],[0.75,-0.5],[5.897,-0.737],[0,0],[-2.375,-12.312],[0,0],[0,0],[6.75,16.25],[6.5,-1.5],[0.6,-14.593],[-8.75,-3.5],[-5.726,-3.368],[0,0],[-2.523,-4.382],[-3.75,-5.5]],"v":[[-22.75,-57.25],[-64,-28.75],[-65.938,4.485],[-28.467,-9.761],[-59.25,24],[-46.75,34.5],[7.75,24.25],[42.5,27],[52.125,20.312],[59.125,19.812],[67.062,0.562],[69.25,-1.5],[96.25,15],[98.5,40.5],[108.5,23.25],[88.25,-1.25],[58.75,-15.125],[51.75,-18.625],[45.75,-26.5],[34.125,-47.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[31.75,-16.75],[5.25,-7.25],[-2.812,-16.485],[0,0],[-1.542,-3.576],[-12,-3],[-16,10],[-14,1.75],[0,0],[-2,0.312],[0,0],[0,0],[-2.979,-7.172],[-2.964,0.684],[-0.375,9.125],[8.75,3.5],[6.375,3.75],[0,0],[2.375,4.125],[3.75,5.5]],"o":[[-31.165,16.441],[-3,5.25],[0.501,2.985],[0,0],[1,1.5],[12,3],[0.75,-0.5],[5.897,-0.737],[0,0],[-2.375,-12.312],[0,0],[0,0],[6.75,16.25],[6.5,-1.5],[0.6,-14.593],[-8.75,-3.5],[-5.726,-3.368],[0,0],[-2.523,-4.382],[-3.75,-5.5]],"v":[[-22.75,-57.25],[-64,-28.75],[-65.938,4.485],[-28.467,-9.761],[-59.25,24],[-46.75,34.5],[7.75,24.25],[42.5,27],[52.125,20.312],[59.125,19.812],[67.062,0.562],[69.25,-1.5],[96.25,15],[98.5,40.5],[108.5,23.25],[88.25,-1.25],[58.75,-15.125],[51.75,-18.625],[45.75,-26.5],[34.125,-47.375]],"c":true}]},{"t":43,"s":[{"i":[[26,-13.5],[0.5,-1],[-25.062,-31.735],[0,0],[-1.542,-3.576],[-12,-3],[-16,10],[-12.328,3.216],[0,0],[-2,0.312],[0,0],[0,0],[-7.625,-15.875],[-3,0.5],[-0.375,9.125],[8.75,3.5],[6.25,2.25],[0,0],[0.75,5],[3.75,5.5]],"o":[[-26,13.5],[-0.217,-0.217],[1.876,2.375],[0,0],[1,1.5],[12,3],[0.75,-0.5],[5.75,-1.5],[0,0],[-1.5,-11.562],[0,0],[0,0],[6.658,13.861],[4.378,-0.73],[0.6,-14.593],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-0.75,-5],[-3.75,-5.5]],"v":[[-33.5,-72.5],[-59,-57.5],[-72.938,-4.015],[-35.467,-18.261],[-66.25,15.5],[-46.75,34.5],[3.5,28],[47.75,26.5],[55.625,20.812],[61.125,20.812],[67.062,0.562],[69.25,-1.5],[102.5,16],[99.5,38.25],[112.75,24.25],[96.25,-1.5],[59.5,-13.25],[42.5,-20],[35.25,-32],[28.875,-57.125]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.050980392156862744,0.4627450980392157,0.9450980392156862,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-6.5,-9.5],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[6.25,2.25],[0,0],[0.75,5],[3.75,5.5],[26,-13.5],[0.5,-1],[-23.5,-54.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[6.5,9.5],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-0.75,-5],[-3.75,-5.5],[-26,13.5],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.75,-1],[62.75,22],[90,37.75],[112.75,24.25],[96.25,-1.5],[59.5,-13.25],[42.5,-20],[35.25,-32],[28.875,-57.125],[-33.5,-72.5],[-68.5,-50.25],[-74.5,22],[-55,41],[-5,34],[39.25,32.5],[55.625,20.812],[52.375,20.812],[62.188,21.062]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[-6.859,-11.174],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[6.005,2.775],[0,0],[1.826,5.12],[4.682,4.515],[26.076,-10.152],[0.5,-1],[-23.5,-54.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[6.073,9.765],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-4.696,-2.011],[0,0],[-1.591,-4.708],[-8.592,-6.875],[-29.924,14.848],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.511,-1.239],[61.315,22.837],[89.761,39.902],[110.478,25.565],[96.37,0.772],[55.315,-16.239],[44.533,-22.63],[39.12,-33.315],[28.538,-57.049],[-23.076,-62.848],[-67.957,-41.033],[-74.5,22],[-55,41],[-2.13,31.37],[39.25,32.5],[55.266,20.932],[52.375,20.812],[60.035,20.823]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[-7.25,-13],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[5.738,3.347],[0,0],[3,5.25],[5.699,3.44],[22.088,-10.756],[0.5,-1],[-18.5,-44.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[5.607,10.053],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-3,-1.75],[0,0],[-2.508,-4.39],[-13.875,-8.375],[-28.75,14],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.25,-1.5],[59.75,23.75],[89.5,42.25],[108,27],[96.5,3.25],[50.75,-19.5],[46.75,-25.5],[41.25,-34.75],[27.125,-54.875],[-24.25,-56.5],[-70,-32.75],[-74.5,22],[-55,41],[1,28.5],[39.25,32.5],[54.875,21.062],[52.375,20.812],[57.688,20.562]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[-7.25,-13],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[5.738,3.347],[0,0],[3,5.25],[5.699,3.44],[22.088,-10.756],[0.5,-1],[-18.5,-44.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[5.607,10.053],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-3,-1.75],[0,0],[-2.508,-4.39],[-13.875,-8.375],[-28.75,14],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.25,-1.5],[59.75,23.75],[89.5,42.25],[108,27],[96.5,3.25],[50.75,-19.5],[46.75,-25.5],[41.25,-34.75],[27.125,-54.875],[-24.25,-56.5],[-70,-32.75],[-74.5,22],[-55,41],[1,28.5],[39.25,32.5],[54.875,21.062],[52.375,20.812],[57.688,20.562]],"c":false}]},{"t":43,"s":[{"i":[[0,0],[-6.5,-9.5],[-9,-0.75],[-1.75,14.5],[8.75,3.5],[6.25,2.25],[0,0],[0.75,5],[3.75,5.5],[26,-13.5],[0.5,-1],[-23.5,-54.5],[-12,-3],[-16,10],[-12.25,3.5],[0,0],[0,0],[0,0]],"o":[[0,0],[6.5,9.5],[9,0.75],[1.75,-14.5],[-8.75,-3.5],[-6.25,-2.25],[0,0],[-0.75,-5],[-3.75,-5.5],[-26,13.5],[-0.25,-0.25],[1,1.5],[12,3],[0.75,-0.5],[12.25,-3.5],[0,0],[0,0],[0,0]],"v":[[68.75,-1],[62.75,22],[90,37.75],[112.75,24.25],[96.25,-1.5],[59.5,-13.25],[42.5,-20],[35.25,-32],[28.875,-57.125],[-33.5,-72.5],[-68.5,-50.25],[-74.5,22],[-55,41],[-5,34],[39.25,32.5],[55.625,20.812],[52.375,20.812],[62.188,21.062]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[95.5,4],[0,0],[-23.75,-2.25],[-23.5,1.25],[-5.25,3.25],[-5.36,-0.133],[-5.702,-0.129],[-6.5,-0.112],[-4.237,-0.051],[-11.143,5.65]],"o":[[-95.5,-4],[0,0],[0,-0.25],[0.25,0],[3.873,0.082],[4.819,0.119],[5.886,0.133],[4.1,0.07],[41.645,0.503],[0,-0.25]],"v":[[34.75,34.5],[-64,36.5],[-74,42.25],[-53.5,48.5],[-43.5,45.25],[-29.547,45.582],[-13.689,45.962],[4.972,46.338],[17.498,46.522],[116.5,40.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[75.5,3],[0,0],[-23.75,-2.25],[-23.5,1.25],[-0.75,5.25],[-6.787,-0.863],[-3.249,1.461],[-5.611,-0.094],[-3.459,-0.044],[-11.254,5.706]],"o":[[-95.508,-3.795],[0,0],[0,-0.25],[0.25,0],[4.708,0.099],[8.492,1.08],[4.732,-2.128],[3.368,0.057],[41.965,0.53],[0,-0.25]],"v":[[51.5,35.25],[-64,36.5],[-74,42.25],[-52.25,51],[-43.5,45.25],[-25.492,50.17],[-10.251,46.039],[5.998,46.855],[16.25,46.507],[116.5,40.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[75.5,3],[0,0],[-23.75,-2.25],[-23.5,1.25],[-0.75,5.25],[-6.787,-0.863],[-3.249,1.461],[-5.577,-0.624],[-3.75,1.243],[-11.254,5.706]],"o":[[-95.508,-3.795],[0,0],[0,-0.25],[0.25,0],[4.708,0.099],[8.492,1.08],[4.732,-2.128],[8.002,0.895],[42.25,1.493],[0,-0.25]],"v":[[51.5,35.25],[-64,36.5],[-74,42.25],[-52.25,51],[-43.5,45.25],[-25.492,50.17],[-10.251,46.039],[0.748,49.855],[18.75,46.757],[116.5,40.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[75.5,3],[0,0],[-23.75,-2.25],[-23.5,1.25],[-0.75,5.25],[-6.787,-0.863],[-3.249,1.461],[-5.577,-0.624],[-3.75,1.243],[-11.254,5.706]],"o":[[-95.508,-3.795],[0,0],[0,-0.25],[0.25,0],[4.708,0.099],[8.492,1.08],[4.732,-2.128],[8.002,0.895],[42.25,1.493],[0,-0.25]],"v":[[51.5,35.25],[-64,36.5],[-74,42.25],[-52.25,51],[-43.5,45.25],[-25.492,50.17],[-10.251,46.039],[0.748,49.855],[18.75,46.757],[116.5,40.75]],"c":true}]},{"t":43,"s":[{"i":[[95.5,4],[0,0],[-23.75,-2.25],[-23.5,1.25],[-5.25,3.25],[-5.36,-0.133],[-5.702,-0.129],[-6.5,-0.112],[-4.237,-0.051],[-11.143,5.65]],"o":[[-95.5,-4],[0,0],[0,-0.25],[0.25,0],[3.873,0.082],[4.819,0.119],[5.886,0.133],[4.1,0.07],[41.645,0.503],[0,-0.25]],"v":[[34.75,34.5],[-64,36.5],[-74,42.25],[-53.5,48.5],[-43.5,45.25],[-29.547,45.582],[-13.689,45.962],[4.972,46.338],[17.498,46.522],[116.5,40.75]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666680574,0.266666680574,0.266666680574,1],"ix":4},"o":{"a":0,"k":100,"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":0,"k":0,"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":80,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------