commit 9f23f6ab05dccfc0e60321cf8537f42987b010b5 Author: hmalik144 Date: Fri May 15 11:04:34 2020 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28dc02b --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +/.idea/* +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/README.md b/README.md new file mode 100644 index 0000000..87c566c --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# MoneyBox Android Technical Task + +A small application for viewing investment products. + +# Part A + +### Bug 1 - Layout does not look as expected + + - Constraints added to all TextInputLayouts + - Edit text views within TextInputLayouts and TextInputLayouts within match parent and the TextInputLayouts match parents + - correct spacing between edges margin of 12dp left and right + - email TextInputLayout with a 48dp margin at the top + +### Bug 2 - Validation is incorrect + + - Email matching android email matcher + - allValid within allFieldsValid() is true by default + - once allValid changes to false it remains false and no login called + - Changes to false every failed validation + +### Bug 3 - Animation is looping incorrectly + - set minimum and maximum frames based the firstAnim Pair range respectively + - set an animation completion listener and wait for first animation play to finish + - on completion of first animation change the min and max frames based on secondAnim Pair range + - play animation with new min and max frames + +# Part B + +## Requirements + +Minimum android SDK version 21, Android 5.0.0 (Lollipop) +Permissions : Internet, Network State + +## Features + + - Login (Name optional) + - View investment products + - Add one off payment of £20 to an investment + + +## Architectural Pattern + +MVVM - Model View Viewmodel +SOLID coding + +## Jetpack + +* [AndroidX](https://developer.android.com/jetpack) + +## Unit tests + +### Test case one + - Respository Unit test (Networkings) + +### Test case two + - Repository Unit test (Storage) + +### Test case one + - Login viewmodel test + +### Test case two + - UserAccount viewmodel test + + ## Integration tests + +### Test case one + - LoginActivity UI test + +## Built With + +* [Kodein](https://github.com/Kodein-Framework/Kodein-DI) - Painless Kotlin Dependency Injection +* [Retrofit](https://github.com/square/retrofit) - Type-safe HTTP client for Android and Java by Square, Inc +* [Secured Preference Store](https://github.com/iamMehedi/Secured-Preference-Store) - A SharedPreferences wrapper for Android that encrypts the content with 256 bit AES encryption +* [Lottie](https://github.com/airbnb/lottie-android) - Lottie is a mobile library for Android and iOS that parses Adobe After Effects animations exported as json with Bodymovin and renders them natively on mobile! + +## Submitted by + +* **Haider Malik** - *Android Developer* + + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..10807ab --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,76 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +apply plugin: 'kotlin-kapt' + +repositories { + google() + jcenter() +} + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.example.minimoneybox" + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + targetCompatibility = 1.8 + sourceCompatibility = "1.8" + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' + implementation 'com.airbnb.android:lottie:2.7.0' + androidTestImplementation 'androidx.test:rules:1.1.1' + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" + //mock websever for testing retrofit responses + testImplementation("com.squareup.okhttp3:mockwebserver:4.6.0") + testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0" + + //mockito and livedata testing + testImplementation 'org.mockito:mockito-inline:2.13.0' + testImplementation 'androidx.arch.core:core-testing:2.1.0' + + //Retrofit and GSON + implementation 'com.squareup.retrofit2:retrofit:2.8.1' + implementation 'com.squareup.retrofit2:converter-gson:2.8.1' + + //Kotlin Coroutines + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" + + //Kodein Dependency Injection + implementation "org.kodein.di:kodein-di-generic-jvm:6.2.1" + implementation "org.kodein.di:kodein-di-framework-android-x:6.2.1" + + //security for secured preferences + implementation "androidx.security:security-crypto:1.0.0-rc01" + + //keystore preferences wrapper + implementation 'online.devliving:securedpreferencestore:0.7.4' + +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/example/minimoneybox/LoginActivityTest.kt b/app/src/androidTest/java/com/example/minimoneybox/LoginActivityTest.kt new file mode 100644 index 0000000..9068997 --- /dev/null +++ b/app/src/androidTest/java/com/example/minimoneybox/LoginActivityTest.kt @@ -0,0 +1,138 @@ +package com.example.minimoneybox + + +import android.view.View +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.rule.ActivityTestRule +import com.example.minimoneybox.ui.login.LoginActivity +import com.google.android.material.textfield.TextInputLayout +import org.hamcrest.CoreMatchers.not +import org.hamcrest.Matcher +import org.hamcrest.TypeSafeMatcher +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + + +@LargeTest +@RunWith(AndroidJUnit4::class) +class LoginActivityTest { + + val validEmail = "email_address@domain.com" + val validPassword = "oLa95he!ui" + val invalidEmail = "email_address" + val invalidPassword = "oaa" + val validName = "Ludacris" + val invalidName = "Dj" + + + @Rule + @JvmField + var mActivityTestRule = ActivityTestRule(LoginActivity::class.java) + + @Test + fun noEntriesSubmission_invalidLogin() { + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_password)).check(matches(hasTextInputLayoutErrorText(getString(R.string.password_error)))) + onView(withId(R.id.til_email)).check(matches(hasTextInputLayoutErrorText(getString(R.string.email_address_error)))) + } + + @Test + fun validEmailNoPasswordNoName_invalidLogin() { + onView(withId(R.id.et_email)).perform(typeText(validEmail)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_password)).check(matches(hasTextInputLayoutErrorText(getString(R.string.password_error)))) + onView(withId(R.id.til_email)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.email_address_error))))) + } + + @Test + fun validPasswordNoEmailNoName_invalidLogin() { + onView(withId(R.id.et_password)).perform(typeText(validPassword)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_email)).check(matches(hasTextInputLayoutErrorText(getString(R.string.email_address_error)))) + onView(withId(R.id.til_password)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.password_error))))) + } + + @Test + fun validEmailAndPassword_noName_validLogin() { + onView(withId(R.id.et_email)).perform(typeText(validEmail)).check(matches(isDisplayed())) + onView(withId(R.id.et_password)).perform(typeText(validPassword)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_email)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.email_address_error))))) + onView(withId(R.id.til_password)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.password_error))))) + } + + @Test + fun validEmailAndPassword_validName_validLogin() { + onView(withId(R.id.et_email)).perform(typeText(validEmail)).check(matches(isDisplayed())) + onView(withId(R.id.et_password)).perform(typeText(validPassword)).check(matches(isDisplayed())) + onView(withId(R.id.et_name)).perform(typeText(validName)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_email)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.email_address_error))))) + onView(withId(R.id.til_password)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.password_error))))) + onView(withId(R.id.til_name)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.full_name_error))))) + } + + @Test + fun validEmailAndPassword_invalidName_validLogin() { + onView(withId(R.id.et_email)).perform(typeText(validEmail)).check(matches(isDisplayed())) + onView(withId(R.id.et_password)).perform(typeText(validPassword)).check(matches(isDisplayed())) + onView(withId(R.id.et_name)).perform(typeText(invalidName)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_email)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.email_address_error))))) + onView(withId(R.id.til_password)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.password_error))))) + onView(withId(R.id.til_name)).check(matches(hasTextInputLayoutErrorText(getString(R.string.full_name_error)))) + } + + @Test + fun invalidEmailValidPasswordNoName_invalidLogin() { + onView(withId(R.id.et_email)).perform(typeText(invalidEmail)).check(matches(isDisplayed())) + onView(withId(R.id.et_password)).perform(typeText(validPassword)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_password)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.password_error))))) + onView(withId(R.id.til_email)).check(matches(hasTextInputLayoutErrorText(getString(R.string.email_address_error)))) + } + + @Test + fun validEmailInvalidPasswordNoName_invalidLogin() { + onView(withId(R.id.et_email)).perform(typeText(validEmail)).check(matches(isDisplayed())) + onView(withId(R.id.et_password)).perform(typeText(invalidPassword)).check(matches(isDisplayed())) + onView(withId(R.id.btn_sign_in)).perform(click()) + + onView(withId(R.id.til_password)).check(matches(hasTextInputLayoutErrorText(getString(R.string.password_error)))) + onView(withId(R.id.til_email)).check(matches(not(hasTextInputLayoutErrorText(getString(R.string.email_address_error))))) + } + + private fun getString(id: Int): String = mActivityTestRule.activity.getString(id) + + private fun hasTextInputLayoutErrorText(expectedErrorText: String): Matcher? { + return object : TypeSafeMatcher() { + + override fun matchesSafely(item: View?): Boolean { + if (item !is TextInputLayout) { + return false + } + val error = (item).error ?: return false + val hint = error.toString() + return expectedErrorText == hint + } + + override fun describeTo(description: org.hamcrest.Description?) {} + } + } + +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..56cad45 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/pig.json b/app/src/main/assets/pig.json new file mode 100644 index 0000000..79a62b4 --- /dev/null +++ b/app/src/main/assets/pig.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":30,"ip":0,"op":159,"w":2000,"h":500,"nm":"00_MAIN","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","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":31,"s":[100],"e":[0]},{"t":34}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[944.66,497.89,0],"e":[929.66,492.89,0],"to":[-2.5,-0.83333331346512,0],"ti":[2.5,0.83333331346512,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[-0.34,231.64,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":31,"s":[20,20,100],"e":[70,70,100]},{"t":34}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,-2.5],[-0.224,-2.615],[-4.25,-0.75],[-3.75,1.5],[1.5,2],[3.5,1.75]],"o":[[-3.739,-1.068],[-2.661,2.447],[3.5,3.5],[5.25,0.25],[1,-2.25],[-1,-2.75]],"v":[[-4.75,225.25],[-10.526,227.615],[-6,237.5],[6.25,238.5],[10,231.25],[6,225.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117665291,0.694117665291,0.694117665291,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.369,0.741,0.729,0.05,0.184,0.371,0.365,1,0,0,0,0,0,0.61,0.5,1,1],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-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":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":35,"st":-32,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","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":31,"s":[100],"e":[0]},{"t":34}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[897.16,497.89,0],"e":[882.16,492.89,0],"to":[-2.5,-0.83333331346512,0],"ti":[2.5,0.83333331346512,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[-0.34,231.64,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":31,"s":[20,20,100],"e":[70,70,100]},{"t":34}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,-2.5],[-0.224,-2.615],[-4.25,-0.75],[-3.75,1.5],[1.5,2],[3.5,1.75]],"o":[[-3.739,-1.068],[-2.661,2.447],[3.5,3.5],[5.25,0.25],[1,-2.25],[-1,-2.75]],"v":[[-4.75,225.25],[-10.526,227.615],[-6,237.5],[6.25,238.5],[10,231.25],[6,225.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117665291,0.694117665291,0.694117665291,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.369,0.741,0.729,0.05,0.184,0.371,0.365,1,0,0,0,0,0,0.61,0.5,1,1],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-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":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":35,"st":-32,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","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":31,"s":[100],"e":[0]},{"t":34}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[932.16,497.89,0],"e":[949.66,490.39,0],"to":[2.91666674613953,-1.25,0],"ti":[-2.91666674613953,1.25,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[-0.34,231.64,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":31,"s":[20,20,100],"e":[70,70,100]},{"t":34}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,-2.5],[-0.224,-2.615],[-4.25,-0.75],[-3.75,1.5],[1.5,2],[3.5,1.75]],"o":[[-3.739,-1.068],[-2.661,2.447],[3.5,3.5],[5.25,0.25],[1,-2.25],[-1,-2.75]],"v":[[-4.75,225.25],[-10.526,227.615],[-6,237.5],[6.25,238.5],[10,231.25],[6,225.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117665291,0.694117665291,0.694117665291,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.369,0.741,0.729,0.05,0.184,0.371,0.365,1,0,0,0,0,0,0.61,0.5,1,1],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-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":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":35,"st":-32,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","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":31,"s":[100],"e":[0]},{"t":34}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[982.16,497.89,0],"e":[999.66,490.39,0],"to":[2.91666674613953,-1.25,0],"ti":[-2.91666674613953,1.25,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[-0.34,231.64,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":31,"s":[20,20,100],"e":[70,70,100]},{"t":34}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,-2.5],[-0.224,-2.615],[-4.25,-0.75],[-3.75,1.5],[1.5,2],[3.5,1.75]],"o":[[-3.739,-1.068],[-2.661,2.447],[3.5,3.5],[5.25,0.25],[1,-2.25],[-1,-2.75]],"v":[[-4.75,225.25],[-10.526,227.615],[-6,237.5],[6.25,238.5],[10,231.25],[6,225.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117665291,0.694117665291,0.694117665291,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.369,0.741,0.729,0.05,0.184,0.371,0.365,1,0,0,0,0,0,0.61,0.5,1,1],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-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":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":35,"st":-32,"bm":0},{"ddd":0,"ind":6,"ty":3,"nm":"CTRL_PIG","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":70,"s":[2076.541,414.521,0],"e":[1060.541,414.521,0],"to":[-169.33332824707,0,0],"ti":[102.666664123535,0,0]},{"t":85}],"ix":2},"a":{"a":0,"k":[-335.203,113.701,0],"ix":1},"s":{"a":0,"k":[181,181,100],"ix":6}},"ao":0,"ip":70,"op":491,"st":41,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 11 Outlines","parent":20,"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.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[20.899,6.525,0],"e":[15.962,7.775,0],"to":[-0.82291668653488,0.20833332836628,0],"ti":[0.82291668653488,-0.20833332836628,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[15.962,7.775,0],"e":[12.262,14.775,0],"to":[-0.82291668653488,0.20833332836628,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[12.262,14.775,0],"e":[15.962,7.775,0],"to":[0,0,0],"ti":[0.82291668653488,-0.20833332836628,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[5.976,10.257,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[-7.93,2.209],[6.36,2.89],[0,0]],"o":[[0,0],[-2.829,7.182],[0,0]],"v":[[6.163,-0.388],[-2.877,-10.57],[-5.53,8.007]],"c":true}],"e":[{"i":[[-4.43,2.209],[6.062,3.318],[0,0]],"o":[[0,0],[-2.829,7.182],[0,0]],"v":[[4.101,-2.076],[-2.896,-10.007],[-4.343,4.32]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[{"i":[[-4.43,2.209],[6.062,3.318],[0,0]],"o":[[0,0],[-2.829,7.182],[0,0]],"v":[[4.101,-2.076],[-2.896,-10.007],[-4.343,4.32]],"c":true}],"e":[{"i":[[-3.318,2.965],[3.955,2.333],[0,0]],"o":[[0,0],[-2.26,6.65],[0,0]],"v":[[2.547,-5.598],[-2.896,-10.007],[-4.239,1.834]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[{"i":[[-3.318,2.965],[3.955,2.333],[0,0]],"o":[[0,0],[-2.26,6.65],[0,0]],"v":[[2.547,-5.598],[-2.896,-10.007],[-4.239,1.834]],"c":true}],"e":[{"i":[[-4.43,2.209],[6.062,3.318],[0,0]],"o":[[0,0],[-2.829,7.182],[0,0]],"v":[[4.101,-2.076],[-2.896,-10.007],[-4.343,4.32]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.757000014361,0.583999992819,0.616000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.975,10.258],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 10 Outlines","parent":20,"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.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[25.355,4.609,0],"e":[21.605,5.859,0],"to":[-0.625,0.20833332836628,0],"ti":[0.625,-0.20833332836628,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[21.605,5.859,0],"e":[18.105,12.859,0],"to":[-0.625,0.20833332836628,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[18.105,12.859,0],"e":[21.605,5.859,0],"to":[0,0,0],"ti":[0.625,-0.20833332836628,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[8.79,8.341,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[0,0],[-0.286,-7.16],[0,0]],"o":[[0,0],[0.487,12.188],[0,0]],"v":[[-7.29,-8.072],[-11.898,6.049],[-2.128,15.341]],"c":true}],"e":[{"i":[[0,0],[-4.5,-6],[0,0]],"o":[[0,0],[4.5,6],[0,0]],"v":[[-8.54,-8.091],[4.04,0.424],[-3.128,8.091]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[{"i":[[0,0],[-4.5,-6],[0,0]],"o":[[0,0],[4.5,6],[0,0]],"v":[[-8.54,-8.091],[4.04,0.424],[-3.128,8.091]],"c":true}],"e":[{"i":[[0,0],[-4.5,-6],[0,0]],"o":[[0,0],[4.5,6],[0,0]],"v":[[-8.54,-8.091],[4.04,0.424],[-3.128,8.091]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.694000004787,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.79,8.341],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 8 Outlines","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[46.062,7.609,0],"ix":2},"a":{"a":0,"k":[7.333,10.257,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[8.154,1.625],[-7.5,3.318],[0,0]],"o":[[0,0],[3.5,7.182],[0,0]],"v":[[-6.896,0.737],[2.896,-9.695],[5.682,10.07]],"c":true}],"e":[{"i":[[7,1.667],[-7.5,3.318],[0,0]],"o":[[0,0],[3.5,7.182],[0,0]],"v":[[-7.083,0.674],[3.583,-10.007],[5.682,10.007]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[{"i":[[7,1.667],[-7.5,3.318],[0,0]],"o":[[0,0],[3.5,7.182],[0,0]],"v":[[-7.083,0.674],[3.583,-10.007],[5.682,10.007]],"c":true}],"e":[{"i":[[8.723,0.856],[-7.5,3.318],[0,0]],"o":[[0,0],[3.5,7.182],[0,0]],"v":[[-7.083,0.674],[3.169,-9.593],[5.199,9.938]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[{"i":[[8.723,0.856],[-7.5,3.318],[0,0]],"o":[[0,0],[3.5,7.182],[0,0]],"v":[[-7.083,0.674],[3.169,-9.593],[5.199,9.938]],"c":true}],"e":[{"i":[[7,1.667],[-7.5,3.318],[0,0]],"o":[[0,0],[3.5,7.182],[0,0]],"v":[[-7.083,0.674],[3.583,-10.007],[5.682,10.007]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.757000014361,0.583999992819,0.616000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[21.208,8.383],"e":[7.333,10.258],"to":[-2.3125,0.3125],"ti":[2.3125,-0.3125]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.293},"n":"0p4_1_0p167_0p293","t":85,"s":[7.333,10.258],"e":[-0.667,3.558],"to":[-2.3125,0.3125],"ti":[0,0]},{"i":{"x":0.833,"y":0.699},"o":{"x":0.8,"y":0},"n":"0p833_0p699_0p8_0","t":89,"s":[-0.667,3.558],"e":[7.333,10.258],"to":[0,0],"ti":[2.3125,-0.3125]},{"t":95}],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 7 Outlines","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[52.988,7.609,0],"e":[44.701,1.394,0],"to":[-1.38121545314789,-1.03591156005859,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[44.701,1.394,0],"e":[52.988,7.609,0],"to":[0,0,0],"ti":[1.38121545314789,1.03591156005859,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[6.259,10.258,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[0,0],[-1.427,-9.375],[0,0],[0,0]],"o":[[0,0],[-0.677,5.5],[0,0],[0,0]],"v":[[10.658,-11.883],[15.635,1.424],[13.007,8.383],[6.928,-1.451]],"c":true}],"e":[{"i":[[0,0],[-2.982,-8.666],[0,0],[0,0]],"o":[[0,0],[-3.019,4.839],[0,0],[0,0]],"v":[[-3.342,-10.008],[6.01,2.674],[-1.243,10.008],[-6.01,-3.826]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[{"i":[[0,0],[-2.982,-8.666],[0,0],[0,0]],"o":[[0,0],[-3.019,4.839],[0,0],[0,0]],"v":[[-3.342,-10.008],[6.01,2.674],[-1.243,10.008],[-6.01,-3.826]],"c":true}],"e":[{"i":[[0,0],[-2.982,-8.666],[0,0],[0,0]],"o":[[0,0],[-3.019,4.839],[0,0],[0,0]],"v":[[-3.342,-10.008],[6.01,2.674],[-1.243,10.008],[-6.01,-3.826]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.694000004787,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.259,10.258],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 4 Outlines","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":95}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[-323.141,147.805,0],"e":[-279.391,147.805,0],"to":[7.29166650772095,0,0],"ti":[-7.29166650772095,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[-279.391,147.805,0],"e":[-284.391,139.405,0],"to":[-2.30778074264526,-4.00552463531494,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[-284.391,139.405,0],"e":[-279.391,147.805,0],"to":[0,0,0],"ti":[-2.25023031234741,-4.00552463531494,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[8.228,14.031,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":[[1.65,0],[0,0],[0,1.65],[0,0],[-1.649,0],[0,0],[0,-1.649],[0,0]],"o":[[0,0],[-1.649,0],[0,0],[0,-1.649],[0,0],[1.65,0],[0,0],[0,1.65]],"v":[[4.978,13.78],[-4.978,13.78],[-7.978,10.78],[-7.978,-10.78],[-4.978,-13.78],[4.978,-13.78],[7.978,-10.78],[7.978,10.78]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.694000004787,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.228,14.031],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Layer 3 Outlines","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":95}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[-322.906,147.805,0],"e":[-327.406,139.405,0],"to":[-0.75,-1.39999997615814,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[-327.406,139.405,0],"e":[-322.906,147.805,0],"to":[0,0,0],"ti":[0.75,1.39999997615814,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[8.228,14.031,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":[[1.649,0],[0,0],[0,1.65],[0,0],[-1.65,0],[0,0],[0,-1.649],[0,0]],"o":[[0,0],[-1.65,0],[0,0],[0,-1.649],[0,0],[1.649,0],[0,0],[0,1.65]],"v":[[4.978,13.78],[-4.978,13.78],[-7.978,10.78],[-7.978,-10.78],[-4.978,-13.78],[4.978,-13.78],[7.978,-10.78],[7.978,10.78]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.694000004787,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.228,14.031],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"PigEye_L","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":95}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[28.052,26.36,0],"e":[6.052,26.36,0],"to":[-3.66666674613953,0,0],"ti":[3.66666674613953,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[6.052,26.36,0],"e":[4.444,30.26,0],"to":[-2.04373860359192,0.06906077265739,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[4.444,30.26,0],"e":[6.052,26.36,0],"to":[0,0,0],"ti":[-1.99631679058075,0.13812154531479,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[1.701,4.602,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[-0.004,-2.928],[1.831,0.008],[0,2.403],[-1.732,-0.023]],"o":[[0.005,3.448],[-2.482,-0.011],[0,-2.404],[1.893,0.025]],"v":[[3.888,-0.025],[-0.001,4.352],[-3.826,-0.025],[-0.001,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[0.801,0],[0,2.403],[-0.801,0]],"o":[[0,2.403],[-0.801,0],[0,-2.404],[0.801,0]],"v":[[1.451,0],[-0.001,4.352],[-1.451,0],[-0.001,-4.352]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[{"i":[[0,-2.404],[0.801,0],[0,2.403],[-0.801,0]],"o":[[0,2.403],[-0.801,0],[0,-2.404],[0.801,0]],"v":[[1.451,0],[-0.001,4.352],[-1.451,0],[-0.001,-4.352]],"c":true}],"e":[{"i":[[0.246,-2.322],[0.801,0],[-0.228,2.392],[-0.801,0]],"o":[[-0.254,2.39],[-0.801,0],[0.225,-2.355],[0.801,0]],"v":[[0.912,0.142],[-0.001,4.352],[-1.35,0.027],[0.961,-4.203]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":89,"s":[{"i":[[0.246,-2.322],[0.801,0],[-0.228,2.392],[-0.801,0]],"o":[[-0.254,2.39],[-0.801,0],[0.225,-2.355],[0.801,0]],"v":[[0.912,0.142],[-0.001,4.352],[-1.35,0.027],[0.961,-4.203]],"c":true}],"e":[{"i":[[0,-2.404],[0.801,0],[0,2.403],[-0.801,0]],"o":[[0,2.403],[-0.801,0],[0,-2.404],[0.801,0]],"v":[[1.451,0],[-0.001,4.352],[-1.451,0],[-0.001,-4.352]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.7,4.602],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"PigEye_R","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":95}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[52.711,26.36,0],"e":[30.711,26.36,0],"to":[-3.66666674613953,0,0],"ti":[3.66666674613953,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[30.711,26.36,0],"e":[28.161,19.757,0],"to":[-0.04097605869174,-3.10773491859436,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[28.161,19.757,0],"e":[30.711,26.36,0],"to":[0,0,0],"ti":[0.04097605869174,-3.0732045173645,0]},{"t":95}],"ix":2},"a":{"a":0,"k":[3.151,4.602,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[-0.042,-2.24],[2.109,0.008],[0,2.403],[-2.328,-0.038]],"o":[[0.063,3.385],[-2.391,-0.009],[0,-2.404],[2.172,0.035]],"v":[[4.151,-0.025],[0,4.352],[-4.089,-0.025],[0,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p833_1_0p167_0p167","t":95,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":100,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0.013,2.83]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":103,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0.013,2.83]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":106,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":149,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0.013,2.83]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":152,"s":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0.013,2.83]],"c":true}],"e":[{"i":[[0,-2.404],[1.602,0],[0,2.403],[-1.602,0]],"o":[[0,2.403],[-1.602,0],[0,-2.404],[1.602,0]],"v":[[2.901,0],[0,4.352],[-2.901,0],[0,-4.352]],"c":true}]},{"t":155}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.151,4.602],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"TrouNez_L","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8.228,9.437,0],"ix":2},"a":{"a":0,"k":[2.118,3.151,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,-1.602],[1.032,0],[0,1.603],[-1.031,0]],"o":[[0,1.603],[-1.031,0],[0,-1.602],[1.032,0]],"v":[[1.868,0],[0,2.901],[-1.868,0],[0,-2.901]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.118,3.151],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":222,"st":90,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"TrouNez_R","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[18.382,9.437,0],"ix":2},"a":{"a":0,"k":[2.118,3.151,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,-1.602],[1.031,0],[0,1.603],[-1.032,0]],"o":[[0,1.603],[-1.032,0],[0,-1.602],[1.031,0]],"v":[[1.868,0],[0,2.901],[-1.868,0],[0,-2.901]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.118,3.151],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":222,"st":90,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"TrouNez_L","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8.228,9.437,0],"ix":2},"a":{"a":0,"k":[2.118,3.151,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[0,-1.602],[1.032,0],[0,1.603],[-1.031,0]],"o":[[0,1.603],[-1.031,0],[0,-1.602],[1.032,0]],"v":[[2.681,-0.011],[0,2.901],[-2.618,-0.011],[0,-2.901]],"c":true}],"e":[{"i":[[0,-1.602],[1.032,0],[0,1.603],[-1.031,0]],"o":[[0,1.603],[-1.031,0],[0,-1.602],[1.032,0]],"v":[[1.868,0],[0,2.901],[-1.868,0],[0,-2.901]],"c":true}]},{"t":85}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.118,3.151],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":91,"st":70,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"TrouNez_R","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[18.382,9.437,0],"ix":2},"a":{"a":0,"k":[2.118,3.151,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[0,-1.602],[1.031,0],[0,1.603],[-1.032,0]],"o":[[0,1.603],[-1.032,0],[0,-1.602],[1.031,0]],"v":[[2.681,-0.004],[0,2.901],[-2.618,-0.004],[0,-2.901]],"c":true}],"e":[{"i":[[0,-1.602],[1.031,0],[0,1.603],[-1.032,0]],"o":[[0,1.603],[-1.032,0],[0,-1.602],[1.031,0]],"v":[[1.868,0],[0,2.901],[-1.868,0],[0,-2.901]],"c":true}]},{"t":85}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.118,3.151],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":91,"st":70,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Groin","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":94}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":70,"s":[41.376],"e":[3.876]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":85,"s":[3.876],"e":[3.876]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":94,"s":[3.876],"e":[3.876]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":100,"s":[3.876],"e":[-1.649]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103,"s":[-1.649],"e":[3.876]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":106,"s":[3.876],"e":[3.876]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":149,"s":[3.876],"e":[-1.649]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":152,"s":[-1.649],"e":[3.876]},{"t":155}],"ix":3},"y":{"a":0,"k":47.876,"ix":4}},"a":{"a":0,"k":[15.48,9.195,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":[[4.92,0],[0,0],[0,4.919],[-4.92,0],[0,0],[0,-4.921]],"o":[[0,0],[-4.92,0],[0,-4.921],[0,0],[4.92,0],[0,4.919]],"v":[[6.287,8.945],[-6.285,8.945],[-15.231,0.001],[-6.285,-8.945],[6.287,-8.945],[15.231,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.741000007181,0.760999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.48,9.195],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Pig_Body","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":85,"s":[-315.654,113.718,0],"e":[-318.416,110.817,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"n":"0p833_0p833_0p8_0","t":89,"s":[-318.416,110.817,0],"e":[-315.654,113.718,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94,"s":[-315.654,113.718,0],"e":[-315.654,113.718,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":100,"s":[-315.654,113.718,0],"e":[-315.654,117.585,0],"to":[0,0.6445671916008,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":103,"s":[-315.654,117.585,0],"e":[-315.654,113.718,0],"to":[0,0,0],"ti":[0,0.6445671916008,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":106,"s":[-315.654,113.718,0],"e":[-315.654,113.718,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":149,"s":[-315.654,113.718,0],"e":[-315.654,117.585,0],"to":[0,0.6445671916008,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":152,"s":[-315.654,117.585,0],"e":[-315.654,113.718,0],"to":[0,0,0],"ti":[0,0.6445671916008,0]},{"t":155}],"ix":2},"a":{"a":0,"k":[58.997,39.415,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},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[21.541,0],[0,0],[0,21.541],[-21.54,0],[0,0],[0,-21.541]],"o":[[0,0],[-21.54,0],[0,-21.541],[0,0],[21.541,0],[0,21.541]],"v":[[-19.515,39.132],[-19.583,39.165],[-58.747,0],[-19.583,-39.165],[-19.515,-39.198],[19.65,-0.033]],"c":true}],"e":[{"i":[[21.541,0],[0,0],[0,21.541],[-21.54,0],[0,0],[0,-21.541]],"o":[[0,0],[-21.54,0],[0,-21.541],[0,0],[21.541,0],[0,21.541]],"v":[[19.582,39.165],[-19.583,39.165],[-58.747,0],[-19.583,-39.165],[19.582,-39.165],[58.747,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[{"i":[[21.541,0],[0,0],[0,21.541],[-21.54,0],[0,0],[0,-21.541]],"o":[[0,0],[-21.54,0],[0,-21.541],[0,0],[21.541,0],[0,21.541]],"v":[[19.582,39.165],[-19.583,39.165],[-58.747,0],[-19.583,-39.165],[19.582,-39.165],[58.747,0]],"c":true}],"e":[{"i":[[21.541,0],[0,0],[0,21.541],[-21.54,0],[0,0],[0,-21.541]],"o":[[0,0],[-21.54,0],[0,-21.541],[0,0],[21.541,0],[0,21.541]],"v":[[19.582,39.165],[-19.583,39.165],[-58.747,0],[-19.583,-39.165],[19.582,-39.165],[58.747,0]],"c":true}]},{"t":94}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.694000004787,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.997,39.415],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Layer 9 Outlines","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":94}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[-344.649,160.4,0],"e":[-308.055,160.374,0],"to":[0.02163916826248,0.0647761374712,0],"ti":[-0.02302038483322,-0.09208117425442,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[-308.055,160.374,0],"e":[-308.055,160.374,0],"to":[0.57971811294556,2.31886339187622,0],"ti":[-0.02302038483322,-0.09208117425442,0]},{"t":94}],"ix":2},"a":{"a":0,"k":[1.322,26.6,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":[[1.65,0],[0,0],[0,1.65],[0,0],[-1.65,0],[0,0],[0,-1.649],[0,0]],"o":[[0,0],[-1.65,0],[0,0],[0,-1.649],[0,0],[1.65,0],[0,0],[0,1.65]],"v":[[4.978,13.78],[-4.978,13.78],[-7.978,10.78],[-7.978,-10.78],[-4.978,-13.78],[4.978,-13.78],[7.978,-10.78],[7.978,10.78]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.757000014361,0.583999992819,0.616000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.228,14.031],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Angle Outlines","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-15]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-15],"e":[0]},{"t":94}],"ix":10},"p":{"a":0,"k":[-351.709,160.72,0],"ix":2},"a":{"a":0,"k":[1.184,26.945,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":[[1.65,0],[0,0],[0,1.65],[0,0],[-1.649,0],[0,0],[0,-1.649],[0,0]],"o":[[0,0],[-1.649,0],[0,0],[0,-1.649],[0,0],[1.65,0],[0,0],[0,1.65]],"v":[[4.978,13.78],[-4.978,13.78],[-7.978,10.78],[-7.978,-10.78],[-4.978,-13.78],[4.978,-13.78],[7.978,-10.78],[7.978,10.78]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.757000014361,0.583999992819,0.616000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.228,14.031],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Layer 5 Outlines","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p4_1_0p167_0p167"],"t":85,"s":[0],"e":[-32]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.8],"y":[0]},"n":["0p833_0p833_0p8_0"],"t":89,"s":[-32],"e":[0]},{"i":{"x":[0.838],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p838_1_0p167_0"],"t":94,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":100,"s":[0],"e":[-29]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103,"s":[-29],"e":[0]},{"t":106}],"ix":10},"p":{"a":0,"k":[115.553,29.052,0],"ix":2},"a":{"a":0,"k":[1.592,10.295,0],"ix":1},"s":{"a":0,"k":[98,98,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":70,"s":[{"i":[[0,0],[-0.182,0.801],[-0.243,0.944],[-0.406,0.784],[-0.171,0.91],[-0.297,-1.397],[0.067,-1.588],[-0.06,-1.212],[0.081,-1.422]],"o":[[0.084,-0.461],[0.266,-1.171],[0.139,-1.289],[0.433,-0.781],[0.079,0.909],[0.199,0.938],[-0.042,0.987],[0.051,1.019],[0,0]],"v":[[-3.298,2.339],[-2.906,0.562],[-2.461,-1.616],[-2.098,-3.725],[-1.48,-5.979],[-0.749,-3.485],[-0.539,-0.998],[-0.667,0.603],[-0.681,2.599]],"c":true}],"e":[{"i":[[0,0],[-0.694,0.44],[-0.597,0.615],[-0.406,0.784],[-0.171,0.91],[0.221,-0.938],[0.483,-0.859],[0.667,-0.746],[0.947,-0.651]],"o":[[0.665,-0.215],[0.712,-0.454],[0.612,-0.609],[0.433,-0.781],[0.079,0.909],[-0.194,0.939],[-0.472,0.868],[-0.69,0.752],[0,0]],"v":[[-3.298,2.339],[-1.121,1.263],[0.855,-0.341],[2.366,-2.449],[3.176,-5.023],[3.077,-2.209],[2.075,0.533],[0.353,2.963],[-1.957,5.023]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.694000004787,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.36},"n":"0p4_1_0p167_0p36","t":70,"s":[-71.451,5.272],"e":[3.549,5.272],"to":[12.5,0],"ti":[-12.5,0]},{"t":95}],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":520,"st":70,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Wing_L","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"n":["0p4_1_0p6_0"],"t":28,"s":[100],"e":[3]},{"t":37}],"ix":10},"p":{"a":0,"k":[37.885,80.946,0],"ix":2},"a":{"a":0,"k":[14.293,0.102,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":[[7.684,0],[0,-9.493],[0,0],[0,0],[-3.278,0],[0,4.051],[0,0],[-4.405,0],[0,5.442],[0,0]],"o":[[-7.684,0],[0,0],[0,0],[0,4.051],[3.281,0],[0,0],[0,5.442],[4.406,0],[0,0],[0,-9.491]],"v":[[0.001,-29.769],[-13.913,-12.58],[-13.913,-12.58],[-13.913,9.733],[-7.978,17.067],[-2.038,9.733],[-2.038,19.915],[5.937,29.769],[13.913,19.915],[13.913,-12.58]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.164,30.019],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-29,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Eye_R Outlines","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"n":"0p4_1_0p6_0","t":70,"s":[118.576,71.409,0],"e":[118.576,76.672,0],"to":[0,0.87719297409058,0],"ti":[0,0,0]},{"i":{"x":1,"y":1},"o":{"x":0,"y":0},"n":"1_1_0_0","t":89,"s":[118.576,76.672,0],"e":[118.576,76.672,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"n":"0p4_1_0p6_0","t":101,"s":[118.576,76.672,0],"e":[118.576,71.409,0],"to":[0,0,0],"ti":[0,0,0]},{"t":109}],"ix":2},"a":{"a":0,"k":[8.618,10.104,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.6,"y":0},"n":"0p833_0p833_0p6_0","t":134,"s":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0,-9.855],[-8.368,-0.001],[0,9.855],[8.368,-0.001]],"c":true}],"e":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[1.316,-9.728],[-7.052,0.126],[1.316,9.981],[9.684,0.126]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":140,"s":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[1.316,-9.728],[-7.052,0.126],[1.316,9.981],[9.684,0.126]],"c":true}],"e":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0,-7.223],[-8.368,2.631],[0,12.486],[8.368,2.631]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"n":"0p4_1_0p167_0","t":152,"s":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0,-7.223],[-8.368,2.631],[0,12.486],[8.368,2.631]],"c":true}],"e":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0,-9.855],[-8.368,-0.001],[0,9.855],[8.368,-0.001]],"c":true}]},{"t":158}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.618,10.105],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-29,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Eye_L Outlines","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"n":"0p4_1_0p6_0","t":70,"s":[85.931,71.409,0],"e":[85.931,76.672,0],"to":[0,0.87719297409058,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":0.4},"o":{"x":0.6,"y":0.6},"n":"0p4_0p4_0p6_0p6","t":89,"s":[85.931,76.672,0],"e":[85.931,76.672,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"n":"0p4_1_0p6_0","t":101,"s":[85.931,76.672,0],"e":[85.931,71.409,0],"to":[0,0,0],"ti":[0,0,0]},{"t":109}],"ix":2},"a":{"a":0,"k":[8.618,10.104,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.6,"y":0},"n":"0p833_0p833_0p6_0","t":134,"s":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0.001,-9.855],[-8.368,-0.001],[0.001,9.855],[8.368,-0.001]],"c":true}],"e":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[1.325,-9.728],[-7.044,0.126],[1.325,9.981],[9.692,0.126]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p4_1_0p167_0p167","t":140,"s":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[1.325,-9.728],[-7.044,0.126],[1.325,9.981],[9.692,0.126]],"c":true}],"e":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0.166,-7.223],[-8.204,2.631],[0.166,12.486],[8.532,2.631]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"n":"0p4_1_0p167_0","t":152,"s":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0.166,-7.223],[-8.204,2.631],[0.166,12.486],[8.532,2.631]],"c":true}],"e":[{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0.001,-9.855],[-8.368,-0.001],[0.001,9.855],[8.368,-0.001]],"c":true}]},{"t":158}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.618,10.105],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-29,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Suit Outlines","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[78.908,113.188,0],"ix":2},"a":{"a":0,"k":[63.622,56.188,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,-1.104],[0.828,0],[0,1.104],[-0.828,0]],"o":[[0,1.104],[-0.828,0],[0,-1.104],[0.828,0]],"v":[[1.5,0],[0,2],[-1.5,0],[0,-2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.883,92.115],"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,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.104],[0.828,0],[0,1.104],[-0.828,0]],"o":[[0,1.104],[-0.828,0],[0,-1.104],[0.828,0]],"v":[[1.5,0],[0,2],[-1.5,0],[0,-2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.883,79.115],"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,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.104],[0.828,0],[0,1.104],[-0.828,0]],"o":[[0,1.104],[-0.828,0],[0,-1.104],[0.828,0]],"v":[[1.5,0],[0,2],[-1.5,0],[0,-2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.883,67.115],"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,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[29.791,-3.05],[0,-1.555],[0,0],[0,0],[0,17.987],[0,0]],"o":[[-1.548,0.159],[0,0],[0,0],[17.989,0],[0,0],[-0.588,15.736]],"v":[[-20.064,4.487],[-22.806,7.472],[-22.806,55.693],[-9.767,55.693],[22.806,23.121],[22.806,-55.693]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.54900004069,0.8,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.189,56.433],"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 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2,0],[27.133,35.865],[0,0],[0,0],[-17.988,0],[0,0],[0,0]],"o":[[-13,0],[0,0],[0,0],[0,17.989],[0,0],[0,0],[0,-1]],"v":[[41.567,2.927],[-44.567,-55.938],[-44.567,-55.132],[-44.567,23.366],[-11.995,55.938],[42.567,55.938],[44.567,6.927]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.54900004069,0.8,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.816,56.188],"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 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.747,-0.996],[0,0],[1.12,1.494],[0,0],[-0.747,0.996],[0,0],[-1.12,-1.494],[0,0]],"o":[[0,0],[-1.12,1.494],[0,0],[-0.747,-0.996],[0,0],[1.12,-1.494],[0,0],[0.747,0.996]],"v":[[4.624,6.681],[2.241,13.218],[-2.241,13.218],[-4.624,6.681],[-4.624,3.319],[-1.241,-13.218],[1.241,-13.218],[4.624,3.319]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922000002394,0.416000007181,0.423999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.383,59.615],"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 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.355,-0.474],[0,0],[0.534,0.712],[0,0],[-0.355,0.475],[0,0],[-0.534,-0.712],[0,0]],"o":[[0,0],[-0.534,0.712],[0,0],[-0.355,-0.474],[0,0],[0.534,-0.712],[0,0],[0.355,0.475]],"v":[[3.403,0.8],[1.067,3.913],[-1.067,3.913],[-3.403,0.8],[-3.403,-0.801],[-1.067,-3.913],[1.067,-3.913],[3.403,-0.801]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922000002394,0.416000007181,0.423999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.383,45.115],"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 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[33,0],[27.133,35.865],[0,0],[0,0],[0,0]],"o":[[-7,0],[0,0],[0,0],[0,0],[-0.611,16.375]],"v":[[22.761,2.266],[-63.372,-38.599],[-63.372,36.433],[63.372,38.599],[63.372,-38.109]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.622,38.849],"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 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":-29,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"Body Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":0,"s":[34],"e":[22]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p4_1_0p167_0"],"t":17,"s":[22],"e":[22]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"n":["0p4_1_0p6_0"],"t":30,"s":[22],"e":[28]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"n":["0p4_1_0p6_0"],"t":34,"s":[28],"e":[0]},{"t":38}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.356,"y":1},"o":{"x":0,"y":0},"n":"0p356_1_0_0","t":0,"s":[-248.836,59.573,0],"e":[900.164,326.573,0],"to":[211.836151123047,450.426879882813,0],"ti":[0,0,0]},{"i":{"x":1,"y":1},"o":{"x":1,"y":0.028},"n":"1_1_1_0p028","t":17,"s":[900.164,326.573,0],"e":[926.164,396.573,0],"to":[14.8361511230469,1.92689514160156,0],"ti":[0,0,0]},{"i":{"x":1,"y":1},"o":{"x":0.167,"y":0.395},"n":"1_1_0p167_0p395","t":30,"s":[926.164,396.573,0],"e":[926.164,413.573,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":1,"y":1},"o":{"x":0.167,"y":0.395},"n":"1_1_0p167_0p395","t":34,"s":[926.164,413.573,0],"e":[926.164,396.573,0],"to":[0,0,0],"ti":[0,0,0]},{"t":38}],"ix":2},"a":{"a":0,"k":[84.332,152.688,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":0,"s":[140,140,100],"e":[190,190,100]},{"t":17}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.667,0],[-0.002,-14.664],[0,0],[0,0],[-5.189,3.487],[0,0]],"o":[[-14.668,0],[0,0],[0,0],[6.72,0],[0,0],[0,-14.666]],"v":[[0.002,-27.332],[-26.556,-0.778],[-26.556,27.332],[8.405,27.332],[26.559,21.806],[26.559,-0.776]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.742,141.79],"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,"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,7.619],[0,0]],"o":[[0,0],[0,0],[0,7.618]],"v":[[-0.001,6.899],[3.415,-6.899],[-3.415,-6.899]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.543,86.298],"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,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.354,-1.321],[0,0],[0,0],[10.813,-4.268],[0,0],[0,0],[0.547,-3.563],[-3.561,-0.549],[0,0],[0,0],[0,0],[0,0],[-17.989,0],[0,0],[0,17.987],[0,0],[0.061,0.806],[0,0.614],[0,0],[0,0],[1.321,3.356]],"o":[[0,0],[0,0],[0,0],[-10.816,4.266],[0,0],[-3.561,-0.548],[-0.548,3.564],[0,0],[0,0],[0,0],[0,0],[0,17.987],[0,0],[17.99,0],[0,0],[0,-0.823],[0.075,-0.594],[0,0],[0,0],[3.353,-1.323],[-1.32,-3.355]],"v":[[68.824,-83.117],[63.418,-80.988],[63.418,-81.067],[32.123,-68.721],[11.206,-66.676],[-70.622,-82.245],[-78.063,-76.784],[-72.604,-69.338],[-63.326,-67.354],[-63.326,-47.054],[-63.326,-26.632],[-63.326,51.866],[-30.755,84.438],[30.845,84.438],[63.418,51.866],[63.418,-47.054],[63.294,-49.49],[63.418,-51.296],[63.418,-66.952],[73.61,-70.968],[77.29,-79.437]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.368999974868,0.741000007181,0.728999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.861,84.688],"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,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":-29,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Coin Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.059],"y":[1]},"o":{"x":[0.541],"y":[0]},"n":["0p059_1_0p541_0"],"t":82,"s":[995.107],"e":[1099.357]},{"i":{"x":[0.97],"y":[1]},"o":{"x":[0.03],"y":[0]},"n":["0p97_1_0p03_0"],"t":92,"s":[1099.357],"e":[1100.107]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":102,"s":[1100.107],"e":[995.107]},{"i":{"x":[0.059],"y":[1]},"o":{"x":[0.541],"y":[0]},"n":["0p059_1_0p541_0"],"t":131,"s":[995.107],"e":[1099.357]},{"i":{"x":[0.97],"y":[1]},"o":{"x":[0.03],"y":[0]},"n":["0p97_1_0p03_0"],"t":141,"s":[1099.357],"e":[1100.107]},{"t":151}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.341],"y":[1]},"o":{"x":[0.844],"y":[0]},"n":["0p341_1_0p844_0"],"t":82,"s":[378.814],"e":[278.814]},{"i":{"x":[0.97],"y":[0.989]},"o":{"x":[1],"y":[0]},"n":["0p97_0p989_1_0"],"t":92,"s":[278.814],"e":[433.814]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.488]},"n":["0p833_1_0p167_-0p488"],"t":102,"s":[433.814],"e":[378.814]},{"i":{"x":[0.341],"y":[1]},"o":{"x":[0.844],"y":[0]},"n":["0p341_1_0p844_0"],"t":131,"s":[378.814],"e":[278.814]},{"i":{"x":[0.97],"y":[0.989]},"o":{"x":[1],"y":[0]},"n":["0p97_0p989_1_0"],"t":141,"s":[278.814],"e":[433.814]},{"t":151}],"ix":4}},"a":{"a":0,"k":[9.618,10.105,0],"ix":1},"s":{"a":0,"k":[250,250,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0,-9.855],[-8.368,-0.001],[0,9.855],[8.368,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.827000038297,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[10.618,10.105],"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,"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],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1,9.854],[-1,9.854],[-1,-9.854],[1,-9.854]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.709999952129,0.176000004189,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.711,10.105],"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,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.621,0],[0,-5.439],[-4.623,0],[0,5.443]],"o":[[-4.623,0.001],[0,5.443],[4.621,0],[0,-5.44]],"v":[[0,-9.855],[-8.368,-0.001],[0,9.855],[8.368,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.709999952129,0.176000004189,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.618,10.105],"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,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"Wing_R","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"n":["0p4_1_0p6_0"],"t":28,"s":[-100],"e":[3]},{"i":{"x":[0.659],"y":[1]},"o":{"x":[0.6],"y":[0]},"n":["0p659_1_0p6_0"],"t":37,"s":[3],"e":[3]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.35],"y":[0]},"n":["0p833_1_0p35_0"],"t":82,"s":[3],"e":[-99]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":92,"s":[-99],"e":[-99]},{"i":{"x":[0.542],"y":[1]},"o":{"x":[0.639],"y":[0]},"n":["0p542_1_0p639_0"],"t":97,"s":[-99],"e":[3]},{"i":{"x":[0.659],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p659_1_0p167_0"],"t":109,"s":[3],"e":[3]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.35],"y":[0]},"n":["0p833_1_0p35_0"],"t":131,"s":[3],"e":[-99]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":141,"s":[-99],"e":[-99]},{"i":{"x":[0.542],"y":[1]},"o":{"x":[0.639],"y":[0]},"n":["0p542_1_0p639_0"],"t":146,"s":[-99],"e":[3]},{"t":158}],"ix":10},"p":{"a":0,"k":[137.093,80.85,0],"ix":2},"a":{"a":0,"k":[13.502,0.005,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":[[7.684,0],[0,-9.493],[0,0],[0,0],[-3.278,0],[0,4.051],[0,0],[-4.405,0],[0,5.442],[0,0]],"o":[[-7.684,0],[0,0],[0,0],[0,4.051],[3.281,0],[0,0],[0,5.442],[4.406,0],[0,0],[0,-9.491]],"v":[[0.001,-29.769],[-13.913,-12.58],[-13.913,-12.58],[-13.913,9.733],[-7.978,17.067],[-2.038,9.733],[-2.038,19.915],[5.937,29.769],[13.913,19.915],[13.913,-12.58]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.164,30.019],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-29,"op":421,"st":-29,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"Leg_R Outlines 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960.212,462.392,0],"ix":2},"a":{"a":0,"k":[9.111,19.886,0],"ix":1},"s":{"a":0,"k":[190,190,100],"ix":6}},"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":30,"s":[{"i":[[0.195,0],[0,0],[0,0],[0,0],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.196,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[8.508,18.93],[2.754,18.93],[2.754,-19.635],[-8.509,-19.635],[-8.509,18.93],[-8.861,19.281],[-8.509,19.635],[8.508,19.635],[8.861,19.281]],"c":true}],"e":[{"i":[[0.195,0],[0.329,0.066],[0,0],[0,0],[15.287,-14.942],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[14.437,-8.873],[0,0],[0,0],[0.042,-0.058],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[8.508,18.93],[2.783,18.873],[2.754,-19.635],[-8.509,-19.635],[-8.509,18.93],[-8.861,19.281],[-8.509,19.635],[8.508,19.635],[8.861,19.281]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":33,"s":[{"i":[[0.195,0],[0.329,0.066],[0,0],[0,0],[15.287,-14.942],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[14.437,-8.873],[0,0],[0,0],[0.042,-0.058],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[8.508,18.93],[2.783,18.873],[2.754,-19.635],[-8.509,-19.635],[-8.509,18.93],[-8.861,19.281],[-8.509,19.635],[8.508,19.635],[8.861,19.281]],"c":true}],"e":[{"i":[[0.195,0],[0,0],[0,0],[0,0],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.196,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[8.508,18.93],[2.754,18.93],[2.754,-19.635],[-8.509,-19.635],[-8.509,18.93],[-8.861,19.281],[-8.509,19.635],[8.508,19.635],[8.861,19.281]],"c":true}]},{"t":37}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.111,19.886],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":182,"st":-34,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"Leg_L Outlines 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[913.429,462.392,0],"ix":2},"a":{"a":0,"k":[9.111,19.886,0],"ix":1},"s":{"a":0,"k":[190,190,100],"ix":6}},"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":30,"s":[{"i":[[0.195,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.943,18.905],[5.137,18.93],[5.137,-19.635],[-6.139,-27.793],[-6.126,18.93],[-6.272,18.905],[-6.625,19.256],[-6.272,19.61],[10.943,19.61],[11.296,19.256]],"c":true}],"e":[{"i":[[0.195,0],[0.296,-0.058],[0,0],[0,0],[13.704,-14.087],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[12.467,-11.308],[0,0],[0,0],[-0.02,-0.123],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.943,18.905],[5.137,18.93],[5.137,-19.635],[-6.126,-19.635],[-6.126,18.93],[-6.272,18.905],[-6.625,19.256],[-6.272,19.61],[10.943,19.61],[11.296,19.256]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":33,"s":[{"i":[[0.195,0],[0.296,-0.058],[0,0],[0,0],[13.704,-14.087],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[12.467,-11.308],[0,0],[0,0],[-0.02,-0.123],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.943,18.905],[5.137,18.93],[5.137,-19.635],[-6.126,-19.635],[-6.126,18.93],[-6.272,18.905],[-6.625,19.256],[-6.272,19.61],[10.943,19.61],[11.296,19.256]],"c":true}],"e":[{"i":[[0.195,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.943,18.905],[5.137,18.93],[5.137,-19.635],[-6.126,-19.635],[-6.126,18.93],[-6.272,18.905],[-6.625,19.256],[-6.272,19.61],[10.943,19.61],[11.296,19.256]],"c":true}]},{"t":37}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.111,19.886],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":182,"st":-34,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"Leg_R Outlines 2","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-13.118,"ix":10},"p":{"a":0,"k":[108.93,179.283,0],"ix":2},"a":{"a":0,"k":[9.111,19.886,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.6,"y":0},"n":"0p833_0p833_0p6_0","t":8,"s":[{"i":[[0.195,0],[-0.006,-0.028],[0,0],[0,0],[13.334,-5.77],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[16.264,-5.192],[0,0],[0,0],[-0.569,1.091],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[-14.899,24.408],[-17.294,18.472],[2.754,-19.635],[-8.509,-19.635],[-22.306,10.189],[-22.613,11.254],[-22.416,11.426],[-14.899,25.113],[-14.546,24.759]],"c":true}],"e":[{"i":[[0.195,0],[0.158,-0.043],[0,0],[0,0],[3.252,-4.57],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[3.514,-11.359],[0,0],[0,0],[0.038,-0.101],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.689,17.79],[2.679,17.732],[2.754,-19.635],[-8.509,-19.635],[-8.582,17.724],[-8.934,18.078],[-8.582,18.431],[10.689,18.495],[11.042,18.141]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p833_1_0p167_0p167","t":26,"s":[{"i":[[0.195,0],[0.158,-0.043],[0,0],[0,0],[3.252,-4.57],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[3.514,-11.359],[0,0],[0,0],[0.038,-0.101],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.689,17.79],[2.679,17.732],[2.754,-19.635],[-8.509,-19.635],[-8.582,17.724],[-8.934,18.078],[-8.582,18.431],[10.689,18.495],[11.042,18.141]],"c":true}],"e":[{"i":[[0.195,0],[0.158,-0.043],[0,0],[0,0],[-0.758,-16.951],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[0.655,-11.282],[0,0],[0,0],[0.038,-0.101],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[17.051,14.831],[8.769,16.647],[2.754,-19.635],[-8.509,-19.635],[-0.642,18.681],[-0.994,19.035],[-0.642,19.388],[17.051,15.536],[17.404,15.182]],"c":true}]},{"t":28}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.111,19.886],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":30,"st":-29,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"Leg_L Outlines 2","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-13.118,"ix":10},"p":{"a":0,"k":[84.95,184.871,0],"ix":2},"a":{"a":0,"k":[9.111,19.886,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.84,"y":0.84},"o":{"x":0.6,"y":0},"n":"0p84_0p84_0p6_0","t":8,"s":[{"i":[[0.195,0],[0.072,-0.02],[0,0],[0,0],[16.661,-7.126],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[18.613,-8.403],[0,0],[0,0],[0.037,-0.009],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[-12.434,21.796],[-15.442,13.91],[5.137,-19.635],[-6.126,-19.635],[-20.366,4.766],[-20.512,4.741],[-20.865,5.092],[-20.512,5.446],[-12.434,22.501],[-12.081,22.147]],"c":true}],"e":[{"i":[[0.195,0],[0.081,0.008],[0,0],[0,0],[4.84,-8.429],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[3.962,-4.268],[0,0],[0,0],[0.094,0.008],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.96,17.721],[5.154,17.746],[5.137,-19.635],[-6.126,-19.635],[-6.109,17.746],[-6.254,17.721],[-6.607,18.072],[-6.254,18.426],[10.96,18.426],[11.313,18.072]],"c":true}]},{"i":{"x":0.83,"y":0.83},"o":{"x":0.16,"y":0.16},"n":"0p83_0p83_0p16_0p16","t":26,"s":[{"i":[[0.195,0],[0.081,0.008],[0,0],[0,0],[4.84,-8.429],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[3.962,-4.268],[0,0],[0,0],[0.094,0.008],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[10.96,17.721],[5.154,17.746],[5.137,-19.635],[-6.126,-19.635],[-6.109,17.746],[-6.254,17.721],[-6.607,18.072],[-6.254,18.426],[10.96,18.426],[11.313,18.072]],"c":true}],"e":[{"i":[[0.195,0],[0.081,0.008],[0,0],[0,0],[2.485,-8.425],[0,0],[0,-0.195],[-0.195,0],[0,0],[0,0.195]],"o":[[0,0],[2.932,-5.927],[0,0],[0,0],[0.094,0.008],[-0.195,0],[0,0.195],[0,0],[0.195,0],[0,-0.195]],"v":[[14.765,16.927],[8.026,18.23],[5.137,-19.635],[-6.126,-19.635],[-2.871,20.57],[-3.016,20.544],[-3.369,20.895],[-3.016,21.249],[14.765,17.632],[15.118,17.278]],"c":true}]},{"t":28}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.380000005984,0.435000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.111,19.886],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":30,"st":-29,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/application/MoneyBoxApplication.kt b/app/src/main/java/com/example/minimoneybox/application/MoneyBoxApplication.kt new file mode 100644 index 0000000..ecc86e3 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/application/MoneyBoxApplication.kt @@ -0,0 +1,52 @@ +package com.example.minimoneybox.application + +import android.app.Application +import com.example.minimoneybox.data.network.LoginApi +import com.example.minimoneybox.data.network.UserAccountApi +import com.example.minimoneybox.data.network.interceptors.HeaderInterceptor +import com.example.minimoneybox.data.network.interceptors.NetworkConnectionInterceptor +import com.example.minimoneybox.data.prefs.KeystoreStorage +import com.example.minimoneybox.data.repository.MoneyBoxRepositoryImpl +import com.example.minimoneybox.ui.login.LoginViewModelFactory +import com.example.minimoneybox.ui.user.UserAccountsViewModelFactory +import com.google.gson.Gson +import org.kodein.di.Kodein +import org.kodein.di.KodeinAware +import org.kodein.di.android.x.androidXModule +import org.kodein.di.generic.bind +import org.kodein.di.generic.instance +import org.kodein.di.generic.provider +import org.kodein.di.generic.singleton + +class MoneyBoxApplication: Application(), KodeinAware{ + + //Kodein aware to initialise the classes used for DI + override val kodein = Kodein.lazy { + import(androidXModule(this@MoneyBoxApplication)) + + //instance is context + bind() from singleton { NetworkConnectionInterceptor(instance()) } + bind() from singleton { HeaderInterceptor() } + //instance is context + bind() from singleton { KeystoreStorage(instance()) } + //instances above 2 interceptors + bind() from singleton { LoginApi(instance(), instance()) } + bind() from singleton { UserAccountApi(instance(), instance()) } + bind() from singleton { Gson() } + //instances are context, + bind() from singleton { MoneyBoxRepositoryImpl(instance(),instance(),instance(), instance()) } + //Viewmodel created from context + bind() from provider { + LoginViewModelFactory( + instance() + ) + } + bind() from provider { + UserAccountsViewModelFactory( + instance() + ) + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/models/Product.kt b/app/src/main/java/com/example/minimoneybox/data/models/Product.kt new file mode 100644 index 0000000..70c5533 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/models/Product.kt @@ -0,0 +1,41 @@ +package com.example.minimoneybox.data.models + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + + +class Product { + @SerializedName("Id") + @Expose + var id: Int? = null + @SerializedName("Name") + @Expose + var name: String? = null + @SerializedName("CategoryType") + @Expose + var categoryType: String? = null + @SerializedName("Type") + @Expose + var type: String? = null + @SerializedName("FriendlyName") + @Expose + var friendlyName: String? = null + @SerializedName("CanWithdraw") + @Expose + var canWithdraw: Boolean? = null + @SerializedName("ProductHexCode") + @Expose + var productHexCode: String? = null + @SerializedName("AnnualLimit") + @Expose + var annualLimit: Double? = null + @SerializedName("DepositLimit") + @Expose + var depositLimit: Double? = null + @SerializedName("MinimumWeeklyDeposit") + @Expose + var minimumWeeklyDeposit: Double? = null + @SerializedName("MaximumWeeklyDeposit") + @Expose + var maximumWeeklyDeposit: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/models/ProductsResponse.kt b/app/src/main/java/com/example/minimoneybox/data/models/ProductsResponse.kt new file mode 100644 index 0000000..1d03758 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/models/ProductsResponse.kt @@ -0,0 +1,38 @@ +package com.example.minimoneybox.data.models + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + + +class ProductsResponse { + @SerializedName("Id") + @Expose + var id: Int? = null + @SerializedName("PlanValue") + @Expose + var planValue: Double? = null + @SerializedName("Moneybox") + @Expose + var moneybox: Double? = null + @SerializedName("SubscriptionAmount") + @Expose + var subscriptionAmount: Double? = null + @SerializedName("TotalFees") + @Expose + var totalFees: Double? = null + @SerializedName("IsSelected") + @Expose + var isSelected: Boolean? = null + @SerializedName("IsFavourite") + @Expose + var isFavourite: Boolean? = null + @SerializedName("CollectionDayMessage") + @Expose + var collectionDayMessage: String? = null + @SerializedName("Product") + @Expose + var product: Product? = null + @SerializedName("state") + @Expose + var state: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/models/SessionObject.kt b/app/src/main/java/com/example/minimoneybox/data/models/SessionObject.kt new file mode 100644 index 0000000..88e42ae --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/models/SessionObject.kt @@ -0,0 +1,20 @@ +package com.example.minimoneybox.data.models + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + + +class SessionObject { + @SerializedName("BearerToken") + @Expose + var bearerToken: String? = null + @SerializedName("ExternalSessionId") + @Expose + var externalSessionId: String? = null + @SerializedName("SessionExternalId") + @Expose + var sessionExternalId: String? = null + @SerializedName("ExpiryInSeconds") + @Expose + var expiryInSeconds: Int? = null +} diff --git a/app/src/main/java/com/example/minimoneybox/data/models/UserLoginObject.kt b/app/src/main/java/com/example/minimoneybox/data/models/UserLoginObject.kt new file mode 100644 index 0000000..c436174 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/models/UserLoginObject.kt @@ -0,0 +1,7 @@ +package com.example.minimoneybox.data.models + +data class UserLoginObject( + val Email: String, + val Password: String, + val Idfa: String = "ANYTHING" +) \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/LoginApi.kt b/app/src/main/java/com/example/minimoneybox/data/network/LoginApi.kt new file mode 100644 index 0000000..2d44141 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/LoginApi.kt @@ -0,0 +1,46 @@ +package com.example.minimoneybox.data.network + +import com.example.minimoneybox.data.network.interceptors.HeaderInterceptor +import com.example.minimoneybox.data.network.interceptors.NetworkConnectionInterceptor +import com.example.minimoneybox.data.network.response.LoginResponse +import okhttp3.OkHttpClient +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.Body +import retrofit2.http.POST + +interface LoginApi { + + @POST("users/login") + suspend fun loginApiRequest(@Body body: HashMap): Response + + /** + * Return [Retrofit] class with api to login + * [NetworkConnectionInterceptor] to intercept when there is no network + * [HeaderInterceptor] add custom headers to retrofit calls + */ + companion object{ + operator fun invoke( + //injected @params + networkConnectionInterceptor: NetworkConnectionInterceptor, + customHeaderInterceptor: HeaderInterceptor + ) : LoginApi{ + + //okHttpClient with interceptors + val okkHttpclient = OkHttpClient.Builder() + .addNetworkInterceptor(networkConnectionInterceptor) + .addInterceptor(customHeaderInterceptor) + .build() + + //retrofit to be used in @Repository + return Retrofit.Builder() + .client(okkHttpclient) + .baseUrl("https://api-test01.moneyboxapp.com/") + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(LoginApi::class.java) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/SafeApiCall.kt b/app/src/main/java/com/example/minimoneybox/data/network/SafeApiCall.kt new file mode 100644 index 0000000..4221269 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/SafeApiCall.kt @@ -0,0 +1,63 @@ +package com.example.minimoneybox.data.network + +import android.util.Log +import org.json.JSONException +import org.json.JSONObject +import retrofit2.Response +import java.io.IOException + +/** + * This abstract class extract objects from [Response] + */ +abstract class SafeApiCall { + + suspend fun responseUnwrap( + call: suspend () -> Response + ): T { + val response = call.invoke() + + if (response.isSuccessful) { + //return the object within the response body + return response.body()!! + } else { + //the response was unsuccessful + //throw IOException error + throw IOException(errorMessage(response)) + } + } + + private fun errorMessage(errorResponse: Response): String { + val errorBody = errorResponse.errorBody()?.string() + val errorCode = "Error Code: ${errorResponse.code()}" + val errorMessageString = errorBody.getError() + + //build a log message to log in console + val log = if (errorMessageString.isNullOrEmpty()){ + errorCode + }else{ + StringBuilder() + .append(errorCode) + .append("\n") + .append(errorMessageString) + .toString() + } + Log.e("Api Response Error", log) + + //return error message + //if null return error code + return errorMessageString ?: errorCode + } + + private fun String?.getError(): String? { + this?.let { + try { + //convert response to JSON + //extract ["Message"] from error body + return JSONObject(it).getString("Message") + } catch (e: JSONException) { + Log.e(SafeApiCall::class.java.simpleName, e.message) + } + } + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/UserAccountApi.kt b/app/src/main/java/com/example/minimoneybox/data/network/UserAccountApi.kt new file mode 100644 index 0000000..641f049 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/UserAccountApi.kt @@ -0,0 +1,57 @@ +package com.example.minimoneybox.data.network + +import com.example.minimoneybox.data.network.interceptors.HeaderInterceptor +import com.example.minimoneybox.data.network.interceptors.NetworkConnectionInterceptor +import com.example.minimoneybox.data.network.response.PaymentResponse +import com.example.minimoneybox.data.network.response.ProductApiResponse +import okhttp3.OkHttpClient +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST + +interface UserAccountApi { + + @GET("investorproducts") + suspend fun getProductsFromApi( + @Header("Authorization") authHeader: String + ): Response + + @POST("oneoffpayments") + suspend fun oneOffPaymentsFromApi( + @Body body: HashMap, + @Header("Authorization") authHeader: String + ): Response + + /** + * Return [Retrofit] class with api to User accounts + * [NetworkConnectionInterceptor] to intercept when there is no network + * [HeaderInterceptor] add custom headers to retrofit calls + */ + companion object { + operator fun invoke( + //injected @params + networkConnectionInterceptor: NetworkConnectionInterceptor, + customHeaderInterceptor: HeaderInterceptor + ): UserAccountApi { + + //okHttpClient with interceptors + val okkHttpclient = OkHttpClient.Builder() + .addNetworkInterceptor(networkConnectionInterceptor) + .addInterceptor(customHeaderInterceptor) + .build() + + //retrofit to be used in @Repository + return Retrofit.Builder() + .client(okkHttpclient) + .baseUrl("https://api-test01.moneyboxapp.com/") + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(UserAccountApi::class.java) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/interceptors/HeaderInterceptor.kt b/app/src/main/java/com/example/minimoneybox/data/network/interceptors/HeaderInterceptor.kt new file mode 100644 index 0000000..0d81eee --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/interceptors/HeaderInterceptor.kt @@ -0,0 +1,23 @@ +package com.example.minimoneybox.data.network.interceptors + +import okhttp3.Interceptor +import okhttp3.Request +import okhttp3.Response + + +class HeaderInterceptor: Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val original = chain.request() + + val request: Request = original.newBuilder() + .header("AppId", "3a97b932a9d449c981b595") + .header("Content-Type", "application/json") + .header("appVersion","7.8.0") + .header("apiVersion", "3.0.0") + .method(original.method(), original.body()) + .build() + + return chain.proceed(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/interceptors/NetworkConnectionInterceptor.kt b/app/src/main/java/com/example/minimoneybox/data/network/interceptors/NetworkConnectionInterceptor.kt new file mode 100644 index 0000000..9170715 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/interceptors/NetworkConnectionInterceptor.kt @@ -0,0 +1,44 @@ +package com.example.minimoneybox.data.network.interceptors + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build +import androidx.annotation.RequiresApi +import okhttp3.Interceptor +import okhttp3.Response +import java.io.IOException + +class NetworkConnectionInterceptor( + context: Context +) : Interceptor { + + private val applicationContext = context.applicationContext + + override fun intercept(chain: Interceptor.Chain): Response { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && !isInternetAvailable()) { + throw IOException("Make sure you have an active data connection") + } + + return chain.proceed(chain.request()) + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun isInternetAvailable(): Boolean { + var result = false + val connectivityManager = + applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + connectivityManager?.let { + it.getNetworkCapabilities(connectivityManager.activeNetwork)?.apply { + result = when { + hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true + hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true + else -> false + } + } + } + return result + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/response/LoginResponse.kt b/app/src/main/java/com/example/minimoneybox/data/network/response/LoginResponse.kt new file mode 100644 index 0000000..ab27060 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/response/LoginResponse.kt @@ -0,0 +1,11 @@ +package com.example.minimoneybox.data.network.response + +import com.example.minimoneybox.data.models.SessionObject +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +class LoginResponse( + @SerializedName("Session") + @Expose + val session: SessionObject? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/response/PaymentResponse.kt b/app/src/main/java/com/example/minimoneybox/data/network/response/PaymentResponse.kt new file mode 100644 index 0000000..2569304 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/response/PaymentResponse.kt @@ -0,0 +1,11 @@ +package com.example.minimoneybox.data.network.response + +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + + +class PaymentResponse { + @SerializedName("Moneybox") + @Expose + var moneybox: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/network/response/ProductApiResponse.kt b/app/src/main/java/com/example/minimoneybox/data/network/response/ProductApiResponse.kt new file mode 100644 index 0000000..2aef5bf --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/network/response/ProductApiResponse.kt @@ -0,0 +1,27 @@ +package com.example.minimoneybox.data.network.response + +import com.example.minimoneybox.data.models.ProductsResponse +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + + +class ProductApiResponse { + @SerializedName("MoneyboxEndOfTaxYear") + @Expose + var moneyboxEndOfTaxYear: String? = null + @SerializedName("TotalPlanValue") + @Expose + var totalPlanValue: Double? = null + @SerializedName("TotalEarnings") + @Expose + var totalEarnings: Double? = null + @SerializedName("TotalContributionsNet") + @Expose + var totalContributionsNet: Double? = null + @SerializedName("TotalEarningsAsPercentage") + @Expose + var totalEarningsAsPercentage: Double? = null + @SerializedName("ProductResponses") + @Expose + var productsRespons: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/prefs/KeystoreStorage.kt b/app/src/main/java/com/example/minimoneybox/data/prefs/KeystoreStorage.kt new file mode 100644 index 0000000..ccc8627 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/prefs/KeystoreStorage.kt @@ -0,0 +1,71 @@ +package com.example.minimoneybox.data.prefs + +import android.content.Context +import devliving.online.securedpreferencestore.DefaultRecoveryHandler +import devliving.online.securedpreferencestore.SecuredPreferenceStore + +const val emailConstant = "EMAIL" +const val passwordConstant = "PASSWORD" +const val authToken = "AUTH" + +/** + * Secured preferences class storing values in keystore + * inclusive of version down to [android.os.Build.VERSION_CODES.LOLLIPOP] + */ +class KeystoreStorage(context: Context) { + + //lazy initialization + private val prefStore: SecuredPreferenceStore by lazy { + SecuredPreferenceStore.getSharedInstance() + } + + //init block to create instance of + init { + val storeFileName = "securedStore" + val keyPrefix = "mba" + val seedKey = "SecuredSeedData".toByteArray() + SecuredPreferenceStore.init( + context.applicationContext, + storeFileName, + keyPrefix, + seedKey, + DefaultRecoveryHandler() + ) + } + + @Synchronized + fun saveCredentialsInPrefs( + email: String, + password: String + ) { + val editor = prefStore.edit() + editor.putString(emailConstant, email) + editor.putString(passwordConstant, password) + + editor.apply() + } + + @Synchronized + fun loadCredentialsFromPrefs(): Pair { + val email = prefStore.getString(emailConstant, "") + val password = prefStore.getString(passwordConstant, "") + + return Pair(email, password) + } + + @Synchronized + fun saveTokenInPrefs( + token: String + ) { + val editor = prefStore.edit() + editor.putString(authToken, token) + + editor.apply() + } + + @Synchronized + fun loadTokenFromPrefs(): String? { + return prefStore.getString(authToken, "") + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/prefs/SecurePrefs.kt b/app/src/main/java/com/example/minimoneybox/data/prefs/SecurePrefs.kt new file mode 100644 index 0000000..898cfb3 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/prefs/SecurePrefs.kt @@ -0,0 +1,59 @@ +package com.example.minimoneybox.data.prefs + +import android.content.Context +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKeys + + +class SecurePrefs(context: Context){ + + val emailConstant = "EMAIL" + val passwordConstant = "PASSWORD" + val nameConstant = "NAME" + val authToken = "AUTH" + + private val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) + private val prefs = EncryptedSharedPreferences.create( + "encrypted_shared_prefs", + masterKeyAlias, + context, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + + @Synchronized + fun saveCredentialsInPrefs( + email: String, + password: String + ) { + val editor = prefs.edit() + editor.putString(emailConstant, email) + editor.putString(passwordConstant, password) + + editor.apply() + } + + @Synchronized + fun loadCredentialsFromPrefs(): Pair { + val email = prefs.getString(emailConstant, "") + val password = prefs.getString(passwordConstant, "") + + return Pair(email, password) + } + + @Synchronized + fun saveTokenInPrefs( + token: String + ) { + val editor = prefs.edit() + editor.putString(authToken, token) + + editor.apply() + } + + @Synchronized + fun loadTokenFromPrefs(): String? { + return prefs.getString(authToken, "") + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/repository/MoneyBoxRepository.kt b/app/src/main/java/com/example/minimoneybox/data/repository/MoneyBoxRepository.kt new file mode 100644 index 0000000..66aa29b --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/repository/MoneyBoxRepository.kt @@ -0,0 +1,29 @@ +package com.example.minimoneybox.data.repository + +import com.example.minimoneybox.data.network.interceptors.HeaderInterceptor +import com.example.minimoneybox.data.network.interceptors.NetworkConnectionInterceptor +import com.example.minimoneybox.data.network.response.LoginResponse +import com.example.minimoneybox.data.network.response.PaymentResponse +import com.example.minimoneybox.data.network.response.ProductApiResponse +import retrofit2.Retrofit + +/** + * Repository interface to implement repository methods + * + */ +interface MoneyBoxRepository { + + suspend fun loginUser(email: String, password: String): LoginResponse? + + fun saveCredentials(email: String, password: String) + + fun loadCredentials(): Pair + + fun saveAuthToken(token: String) + + fun loadAuthToken(): String? + + suspend fun getProducts(authCode: String): ProductApiResponse? + + suspend fun oneOffPayment(produceId: Int, authCode: String): PaymentResponse? +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/data/repository/MoneyBoxRepositoryImpl.kt b/app/src/main/java/com/example/minimoneybox/data/repository/MoneyBoxRepositoryImpl.kt new file mode 100644 index 0000000..848c185 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/data/repository/MoneyBoxRepositoryImpl.kt @@ -0,0 +1,73 @@ +package com.example.minimoneybox.data.repository + +import com.example.minimoneybox.data.network.LoginApi +import com.example.minimoneybox.data.network.UserAccountApi +import com.example.minimoneybox.data.network.response.LoginResponse +import com.example.minimoneybox.data.network.response.PaymentResponse +import com.example.minimoneybox.data.network.response.ProductApiResponse +import com.example.minimoneybox.data.prefs.KeystoreStorage +import com.example.minimoneybox.data.network.SafeApiCall +import com.example.minimoneybox.data.network.interceptors.HeaderInterceptor +import com.example.minimoneybox.data.network.interceptors.NetworkConnectionInterceptor +import com.google.gson.Gson +import retrofit2.Retrofit + +/** + * [MoneyBoxRepository] implementations in this Repository + * + */ +open class MoneyBoxRepositoryImpl( + private val prefs: KeystoreStorage, + private val loginApi: LoginApi, + private val userAccountApi: UserAccountApi, + private val gson: Gson +) : MoneyBoxRepository, SafeApiCall() { + + override suspend fun loginUser( + email: String, + password: String + ): LoginResponse{ + val hash = HashMap() + hash["Email"] = email + hash["Password"] = password + hash["Idfa"] = "ANYTHING" + + return responseUnwrap{ + loginApi.loginApiRequest(hash) + } + } + + override fun saveCredentials(email: String, password: String) { + prefs.saveCredentialsInPrefs(email, password) + } + + override fun loadCredentials(): Pair { + return prefs.loadCredentialsFromPrefs() + } + + override fun saveAuthToken(token: String) { + prefs.saveTokenInPrefs(token) + } + + override fun loadAuthToken(): String? { + return prefs.loadTokenFromPrefs() + } + + override suspend fun getProducts(authCode: String): ProductApiResponse { + return responseUnwrap{ + userAccountApi.getProductsFromApi("Bearer $authCode") + } + } + + override suspend fun oneOffPayment( + produceId: Int, authCode: String + ): PaymentResponse? { + val hash = HashMap() + hash["Amount"] = 20 + hash["InvestorProductId"] = produceId + + return responseUnwrap { + userAccountApi.oneOffPaymentsFromApi(hash,"Bearer $authCode") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/ui/login/LoginActivity.kt b/app/src/main/java/com/example/minimoneybox/ui/login/LoginActivity.kt new file mode 100644 index 0000000..ae32f6f --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/login/LoginActivity.kt @@ -0,0 +1,142 @@ +package com.example.minimoneybox.ui.login + +import android.animation.Animator +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProviders +import com.example.minimoneybox.R +import com.example.minimoneybox.ui.user.AccountActivity +import com.example.minimoneybox.utils.displayToast +import com.example.minimoneybox.utils.hide +import com.example.minimoneybox.utils.show +import kotlinx.android.synthetic.main.activity_login.* +import org.kodein.di.KodeinAware +import org.kodein.di.android.kodein +import org.kodein.di.generic.instance +import java.util.regex.Pattern +import android.util.Patterns.EMAIL_ADDRESS + +/** + * A login screen that offers login via email/password. + */ +class LoginActivity : AppCompatActivity(), KodeinAware { + + //retrieve the viewmodel factory from the kodein dependency injection + override val kodein by kodein() + private val factory : LoginViewModelFactory by instance() + + lateinit var viewModel: LoginViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_login) + //views replaced with kotlin synthetic views + //no need to use findViewById() + setupViews() + setupViewModel() + setupLiveData() + } + + override fun onStart() { + super.onStart() + setupAnimation() + } + + private fun setupViews() { + btn_sign_in.setOnClickListener { + if (allFieldsValid()) { + progress_circular.show() + startLogin() + } + } + } + + private fun startLogin(){ + viewModel.attemptLogin( + et_email.text.toString(), + et_password.text.toString(), + et_name.text.toString() + ) + } + + private fun allFieldsValid(): Boolean { + var validity = true + //Using Android Email address matcher + if (!EMAIL_ADDRESS.matcher(et_email.text.toString()).matches()) { + til_email.error = getString(R.string.email_address_error) + validity = false + } + + if (!Pattern.matches(PASSWORD_REGEX, et_password.text.toString())) { + til_password.error = getString(R.string.password_error) + validity = false + } + + if (et_name.text.isNotEmpty() && + !Pattern.matches(NAME_REGEX, et_name.text.toString()) + ) { + til_name.error = getString(R.string.full_name_error) + validity = false + } + + return validity + } + + private fun setupAnimation() { + //animation completion listener attached + //once the animation has run from frame first to frame last + //then set new frame min and max then play animation again + animation_view.apply { + setAnimation("pig.json") + setMinAndMaxFrame(firstAnim.first, firstAnim.second) + addAnimatorListener(object : Animator.AnimatorListener { + override fun onAnimationEnd(animation: Animator?) { + setMinAndMaxFrame(secondAnim.first, secondAnim.second) + playAnimation() + } + override fun onAnimationRepeat(animation: Animator?) {} + override fun onAnimationCancel(animation: Animator?) {} + override fun onAnimationStart(animation: Animator?) {} + }) + + playAnimation() + } + + } + + private fun setupViewModel(){ + viewModel = ViewModelProviders.of(this, factory).get(LoginViewModel::class.java) + } + + private fun setupLiveData(){ + viewModel.operationFailed.observe(this, Observer { + progress_circular.hide() + if (it != null) { + displayToast(it) + } + }) + + viewModel.operationSuccess.observe(this, Observer { + progress_circular.hide() + if (it == true){ startNewActivity() } + }) + } + + private fun startNewActivity(){ + Intent(this, AccountActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP + putExtra("NAME_USER", viewModel.name); + startActivity(this) + } + } + + companion object { + val EMAIL_REGEX = "[^@]+@[^.]+\\..+" + val NAME_REGEX = "[a-zA-Z]{6,30}" + val PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[A-Z]).{10,50}$" + val firstAnim = 0 to 109 + val secondAnim = 131 to 158 + } +} diff --git a/app/src/main/java/com/example/minimoneybox/ui/login/LoginViewModel.kt b/app/src/main/java/com/example/minimoneybox/ui/login/LoginViewModel.kt new file mode 100644 index 0000000..380222a --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/login/LoginViewModel.kt @@ -0,0 +1,57 @@ +package com.example.minimoneybox.ui.login + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.example.minimoneybox.data.repository.MoneyBoxRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.IOException + +class LoginViewModel( + val repository: MoneyBoxRepository +) : ViewModel() { + + //stored @Nullable value for users name + var name: String? = null + + //operation results livedata based on outcome of operation + val operationSuccess = MutableLiveData() + val operationFailed = MutableLiveData() + + fun attemptLogin( + email: String, + password: String, + usersName: String? + ){ + //clear name before operation + name = null + //open a coroutine on the IO thread and run async operations + //Network calls and secured shared preferences + CoroutineScope(Dispatchers.Main).launch { + try { + //retrieve response from API call from login api network request + val response = repository.loginUser(email, password) + + //null safety check to ensure bearer token exists + response?.session?.bearerToken?.let { + //save data in secured prefs + repository.saveAuthToken(it) + repository.saveCredentials(email,password) + + //update name in this viewmodel for later use + name = usersName + + operationSuccess.postValue(true) + return@launch + } + }catch (exception: IOException){ + operationFailed.postValue( + exception.message ?: "could not receive token") + return@launch + } + operationFailed.postValue("Could not login user") + } + } + +} diff --git a/app/src/main/java/com/example/minimoneybox/ui/login/LoginViewModelFactory.kt b/app/src/main/java/com/example/minimoneybox/ui/login/LoginViewModelFactory.kt new file mode 100644 index 0000000..cca7faf --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/login/LoginViewModelFactory.kt @@ -0,0 +1,22 @@ +package com.example.minimoneybox.ui.login + + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.example.minimoneybox.data.repository.MoneyBoxRepositoryImpl + +/** + * Viewmodel factory for [UserAccountsViewModel] + * @repository injected into MainViewModel + */ +@Suppress("UNCHECKED_CAST") +class LoginViewModelFactory( + private val repositoryImpl: MoneyBoxRepositoryImpl +): ViewModelProvider.NewInstanceFactory(){ + + override fun create(modelClass: Class): T { + return LoginViewModel( + repositoryImpl + ) as T + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/AccountActivity.kt b/app/src/main/java/com/example/minimoneybox/ui/user/AccountActivity.kt new file mode 100644 index 0000000..be38674 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/AccountActivity.kt @@ -0,0 +1,80 @@ +package com.example.minimoneybox.ui.user + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProviders +import com.example.minimoneybox.R +import com.example.minimoneybox.utils.displayToast +import com.example.minimoneybox.utils.hide +import com.example.minimoneybox.utils.setAnimation +import com.example.minimoneybox.utils.show +import kotlinx.android.synthetic.main.account_activity.* +import org.kodein.di.KodeinAware +import org.kodein.di.android.kodein +import org.kodein.di.generic.instance +/** + * Activity holding the fragments for products. + */ +class AccountActivity : AppCompatActivity(), KodeinAware { + + //retrieve the viewmodel factory from the kodein dependency injection + override val kodein by kodein() + private val factory : UserAccountsViewModelFactory by instance() + + val accountFragmentManager: FragmentManager by lazy { + supportFragmentManager + } + + //to be used by the fragments + lateinit var viewModel: UserAccountsViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.account_activity) + + viewModel = ViewModelProviders + .of(this , factory).get(UserAccountsViewModel::class.java) + intent.extras?.getString("NAME_USER").let { + viewModel.usersName = it + } + + if (savedInstanceState == null) { + accountFragmentManager.beginTransaction() + .replace(R.id.container, UserAccountsFragment()) + .setAnimation() + .commit() + } + + fetchData() + setupOperationObservers() + } + + //override back button + //conditional back pressing + override fun onBackPressed() { + if(accountFragmentManager.backStackEntryCount > 0){ + accountFragmentManager.popBackStack() + }else{ + super.onBackPressed() + } + } + + private fun fetchData(){ + progress_circular_account.show() + viewModel.getInvestorProducts() + } + + private fun setupOperationObservers(){ + viewModel.operationSuccess.observe(this, Observer { + progress_circular_account.hide() + }) + viewModel.operationFailed.observe(this, Observer { + displayToast(it) + progress_circular_account.hide() + }) + } +} + diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/CurrentInvestmentFragment.kt b/app/src/main/java/com/example/minimoneybox/ui/user/CurrentInvestmentFragment.kt new file mode 100644 index 0000000..5dd3648 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/CurrentInvestmentFragment.kt @@ -0,0 +1,102 @@ +package com.example.minimoneybox.ui.user + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.ProgressBar +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import com.example.minimoneybox.R +import com.example.minimoneybox.data.models.ProductsResponse +import com.example.minimoneybox.utils.show +import com.example.minimoneybox.utils.toCurrency +import kotlinx.android.synthetic.main.account_activity.* +import kotlinx.android.synthetic.main.investment_fragment.* +import kotlinx.android.synthetic.main.investment_fragment.view.* + +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" + +/** + * A Fragment showing product selected in [UserAccountsFragment]. + */ +class CurrentInvestmentFragment : Fragment() { + private var currentItemPosition: Int? = null + + private val accountActivity: AccountActivity by lazy { + activity as AccountActivity + } + + //grab viewmodel from the activity hosting fragment + private val viewModel by lazy { + accountActivity.viewModel + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + currentItemPosition = it.getInt(ARG_PARAM1) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate( + R.layout.investment_fragment, container, + false + ).apply { + //setup Observers after view instantiated + setUpObserver() + } + } + + private fun setUpObserver(){ + viewModel.plans.observe(this, Observer { list -> + //get list of products + currentItemPosition?.let { + populateViews(list[it]) + } + }) + } + + //setting up views via kotlin synthetics + //assign text and button on click + private fun populateViews(currentProducts: ProductsResponse) { + account_name_tv.text = currentProducts.product?.name + friendly_account_tv.text = currentProducts.product?.friendlyName + plan_val_tv.text = currentProducts.planValue?.toCurrency() + moneybox_val_tv.text = currentProducts.moneybox?.toCurrency() + btn_add_20.setOnClickListener { + currentProducts.id?.let { id -> addOneOffPayment(id) } + } + } + + private fun addOneOffPayment(id: Int) { + currentItemPosition?.let { + accountActivity.progress_circular_account.show() + viewModel.oneOffPayment(id) + } + } + + companion object { + /** + * fragment Instance using the provided parameters. + * + * @param param1 Parameter 1. + * @return A new instance of fragment CurrentInvestmentFragment. + */ + @JvmStatic + fun newInstance(param1: Int) = + CurrentInvestmentFragment().apply { + arguments = Bundle().apply { + putInt(ARG_PARAM1, param1) + } + } + } +} diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsFragment.kt b/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsFragment.kt new file mode 100644 index 0000000..6674301 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsFragment.kt @@ -0,0 +1,92 @@ +package com.example.minimoneybox.ui.user + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.example.minimoneybox.R +import com.example.minimoneybox.ui.user.recyclerview.ProductsAdapter +import com.example.minimoneybox.ui.user.recyclerview.RecyclerClickListener +import com.example.minimoneybox.utils.setAnimation +import com.example.minimoneybox.utils.toCurrency +import kotlinx.android.synthetic.main.user_accounts_fragment.* + +/** + * A Fragment showing the first overview of products list. + */ +class UserAccountsFragment : Fragment(), + RecyclerClickListener { + + private val viewModel by lazy { + (activity as AccountActivity).viewModel + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + return inflater.inflate( + R.layout.user_accounts_fragment, container, false + ) + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + setupDataObservers() + setupName() + setupRecyclerView() + } + + private fun setupRecyclerView() { + products_recycler_view.apply { + setHasFixedSize(false) + layoutManager = LinearLayoutManager(context) + } + } + + private fun setupName() { + val name = viewModel.usersName + + user_name_tv.text = if (name.isNullOrEmpty()) { + "Hello !" + } else { + "Hello $name !" + } + } + + private fun setupDataObservers() { + viewModel.totalPlanValue.observe(this, Observer { planValue -> + total_plan_val_tv.text = getTotalString(planValue) + }) + viewModel.plans.observe(this, Observer { + ProductsAdapter( + it, this).apply { + products_recycler_view.adapter = this + notifyDataSetChanged() + } + }) + } + + private fun getTotalString(planValue: Double?): CharSequence? { + return StringBuilder() + .append("Total Plan: ") + .append(planValue?.toCurrency()) + .toString() + } + + override fun onItemSelected(position: Int) { + (activity as AccountActivity).accountFragmentManager + .beginTransaction() + .replace( + R.id.container, + CurrentInvestmentFragment.newInstance(position) + ) + .setAnimation() + .addToBackStack("CurrentInvestment") + .commit() + } + +} diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsViewModel.kt b/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsViewModel.kt new file mode 100644 index 0000000..dac71ce --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsViewModel.kt @@ -0,0 +1,129 @@ +package com.example.minimoneybox.ui.user + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.example.minimoneybox.data.models.ProductsResponse +import com.example.minimoneybox.data.network.response.PaymentResponse +import com.example.minimoneybox.data.network.response.ProductApiResponse +import com.example.minimoneybox.data.repository.MoneyBoxRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.IOException + +class UserAccountsViewModel( + val repository: MoneyBoxRepository +) : ViewModel() { + + var usersName: String? = null + + val totalPlanValue = MutableLiveData() + val plans = MutableLiveData>() + + //operation results livedata based on outcome of operation + val operationSuccess = MutableLiveData() + val operationFailed = MutableLiveData() + + fun getInvestorProducts(){ + //retrieve auth token from safe storage/keystore + //or finish operation + val token = repository.loadAuthToken() + if (token.isNullOrEmpty()){ + operationFailed.postValue("Failed to retrieve token") + return + } + + //open a coroutine on the IO thread and run async operations + //Network calls and secured shared preferences + CoroutineScope(Dispatchers.IO).launch { + try { + repository.getProducts(token)?.let { + getProducts(it) + return@launch + } + }catch (exception: IOException){ + val credential = repository.loadCredentials() + val loginResponse = + repository.loginUser(credential.first, credential.second) + + val code = loginResponse?.session?.bearerToken?.let { + repository.saveAuthToken(it) + it + } + + //retrieve response from API call from login api network request + val response = code?.let { repository.getProducts(it) } + response?.let { + getProducts(it) + return@launch + } + }catch (exception: IOException){ + operationFailed.postValue(exception.message) + return@launch + } + operationFailed.postValue("Could not retrieve products") + } + } + + fun oneOffPayment(productId: Int){ + //retrieve auth token from safe storage/keystore + //or finish operation + val token = repository.loadAuthToken() + if (token.isNullOrEmpty()){ + operationFailed.postValue("Failed to retrieve token") + return + } + + //open a coroutine on the IO thread and run async operations + //Network calls and secured shared preferences + CoroutineScope(Dispatchers.IO).launch { + try { + //retrieve response from API call from for one off repayment + repository.oneOffPayment(productId, token)?.let { + oneOffPaymentResponse(it) + return@launch + } + }catch (exception: IOException){ + val credential = repository.loadCredentials() + val loginResponse = + repository.loginUser(credential.first, credential.second) + + val code = loginResponse?.session?.bearerToken?.let { + repository.saveAuthToken(it) + it + } + //retrieve response from API call from login api network request + val response = code?.let { + repository.oneOffPayment(productId, code) } + response?.let { + oneOffPaymentResponse(it) + return@launch + } + }catch (exception: IOException){ + operationFailed.postValue(exception.message) + return@launch + } + operationFailed.postValue("Could not retrieve products") + } + } + + private fun getProducts(response: ProductApiResponse){ + response.let { + //update livedata with relevent data + totalPlanValue.postValue(it.totalPlanValue) + plans.postValue(it.productsRespons) + + operationSuccess.postValue(true) + } + } + + private fun oneOffPaymentResponse(response: PaymentResponse){ + //null safety check to ensure bearer token exists + response.moneybox?.let { + getInvestorProducts() + + operationSuccess.postValue(true) + } + } + +} diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsViewModelFactory.kt b/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsViewModelFactory.kt new file mode 100644 index 0000000..1bdb71b --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/UserAccountsViewModelFactory.kt @@ -0,0 +1,21 @@ +package com.example.minimoneybox.ui.user + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.example.minimoneybox.data.repository.MoneyBoxRepositoryImpl + +/** + * Viewmodel factory for [UserAccountsViewModel] + * @repository injected into MainViewModel + */ +@Suppress("UNCHECKED_CAST") +class UserAccountsViewModelFactory( + private val repositoryImpl: MoneyBoxRepositoryImpl +): ViewModelProvider.NewInstanceFactory(){ + + override fun create(modelClass: Class): T { + return UserAccountsViewModel( + repositoryImpl + ) as T + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/recyclerview/ProductsAdapter.kt b/app/src/main/java/com/example/minimoneybox/ui/user/recyclerview/ProductsAdapter.kt new file mode 100644 index 0000000..da6470c --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/recyclerview/ProductsAdapter.kt @@ -0,0 +1,49 @@ +package com.example.minimoneybox.ui.user.recyclerview + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.minimoneybox.R +import com.example.minimoneybox.data.models.ProductsResponse +import com.example.minimoneybox.utils.toCurrency +import kotlinx.android.synthetic.main.products_list_item.view.* +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** + * [ProductsResponse] recycler view adapter + */ +class ProductsAdapter( + private val products: List, + private val recyclerClickListener: RecyclerClickListener +): Adapter() { + + class ProductsViewHolder(view: View) : + ViewHolder(view) { + var name = view.name_tv + var planValue = view.plan_val_tv + var moneyBoxVal = view.moneybox_val_tv + } + + override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ProductsViewHolder { + val view = LayoutInflater.from(p0.context) + .inflate(R.layout.products_list_item, p0, false) + + return ProductsViewHolder(view) + } + + override fun getItemCount(): Int = products.size + + override fun onBindViewHolder(p0: ProductsViewHolder, p1: Int) { + p0.name.text = products[p1].product?.friendlyName + p0.planValue.text = products[p1].planValue?.toCurrency() + p0.moneyBoxVal.text = products[p1].moneybox?.toCurrency() + + p0.itemView.setOnClickListener { + recyclerClickListener.onItemSelected(p1) + } + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/ui/user/recyclerview/RecyclerClickListener.kt b/app/src/main/java/com/example/minimoneybox/ui/user/recyclerview/RecyclerClickListener.kt new file mode 100644 index 0000000..3f0f47a --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/ui/user/recyclerview/RecyclerClickListener.kt @@ -0,0 +1,5 @@ +package com.example.minimoneybox.ui.user.recyclerview + +interface RecyclerClickListener { + fun onItemSelected(position: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/utils/FormattingUtils.kt b/app/src/main/java/com/example/minimoneybox/utils/FormattingUtils.kt new file mode 100644 index 0000000..5858709 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/utils/FormattingUtils.kt @@ -0,0 +1,12 @@ +package com.example.minimoneybox.utils + +import java.text.NumberFormat +import java.util.* + +fun Double.toCurrency(): String{ + NumberFormat.getCurrencyInstance().apply { + maximumFractionDigits = 2 + currency = Currency.getInstance("GBP") + return format(this@toCurrency) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/minimoneybox/utils/ViewUtils.kt b/app/src/main/java/com/example/minimoneybox/utils/ViewUtils.kt new file mode 100644 index 0000000..2164a42 --- /dev/null +++ b/app/src/main/java/com/example/minimoneybox/utils/ViewUtils.kt @@ -0,0 +1,27 @@ +package com.example.minimoneybox.utils + +import android.content.Context +import android.view.View +import android.widget.Toast +import androidx.fragment.app.FragmentTransaction + +fun View.show(){ + this.visibility = View.VISIBLE +} + +fun View.hide(){ + this.visibility = View.GONE +} + +fun Context.displayToast(message: String){ + Toast.makeText(this, message, Toast.LENGTH_LONG).show() +} + +fun FragmentTransaction.setAnimation() = apply { + setCustomAnimations( + android.R.anim.fade_in, + android.R.anim.fade_out, + android.R.anim.fade_in, + android.R.anim.fade_out + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..6348baa --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/background_button_colored_rounded_medium.xml b/app/src/main/res/drawable/background_button_colored_rounded_medium.xml new file mode 100644 index 0000000..be566d5 --- /dev/null +++ b/app/src/main/res/drawable/background_button_colored_rounded_medium.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_edit_text.xml b/app/src/main/res/drawable/background_edit_text.xml new file mode 100644 index 0000000..a25275d --- /dev/null +++ b/app/src/main/res/drawable/background_edit_text.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a0ad202 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/moneybox_logo.xml b/app/src/main/res/drawable/moneybox_logo.xml new file mode 100644 index 0000000..c81c6f5 --- /dev/null +++ b/app/src/main/res/drawable/moneybox_logo.xml @@ -0,0 +1,317 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/account_activity.xml b/app/src/main/res/layout/account_activity.xml new file mode 100644 index 0000000..8f8fa63 --- /dev/null +++ b/app/src/main/res/layout/account_activity.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..51baf89 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +