diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index bc1391f81..f7d331b8b 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -30,16 +30,16 @@ dependencies { implementation 'com.google.firebase:firebase-config:21.0.1' implementation 'com.google.firebase:firebase-datatransport:18.1.0' implementation 'com.google.firebase:firebase-appindexing:20.0.0' - implementation 'com.google.android.gms:play-services-maps:17.0.1' - implementation 'com.google.android.gms:play-services-auth:19.2.0' + implementation 'com.google.android.gms:play-services-maps:18.1.0' + implementation 'com.google.android.gms:play-services-auth:20.4.0' implementation 'com.google.android.gms:play-services-vision:20.1.3' - implementation 'com.google.android.gms:play-services-wearable:17.1.0' - implementation 'com.google.android.gms:play-services-location:18.0.0' - implementation 'com.google.android.gms:play-services-wallet:18.1.3' + implementation 'com.google.android.gms:play-services-wearable:18.0.0' + implementation 'com.google.android.gms:play-services-location:21.0.1' + implementation 'com.google.android.gms:play-services-wallet:19.1.0' implementation 'com.googlecode.mp4parser:isoparser:1.0.6' implementation 'com.stripe:stripe-android:2.0.2' implementation 'com.google.mlkit:language-id:16.1.1' - implementation 'com.android.billingclient:billing:5.0.0' + implementation 'com.android.billingclient:billing:5.1.0' implementation 'com.google.code.gson:gson:2.10' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/TMessagesProj/jni/jni.c b/TMessagesProj/jni/jni.c index 1c34b3e9c..1b0f168bd 100644 --- a/TMessagesProj/jni/jni.c +++ b/TMessagesProj/jni/jni.c @@ -219,9 +219,9 @@ int64_t listdir(const char *fileName, int32_t mode, int32_t docType, int64_t tim value += listdir(buff, mode, docType, time, subdirs); } } else { - stat(buff, &attrib); + int rc = stat(buff, &attrib); if (mode == 0) { - value += 512 * attrib.st_blocks; + value += rc == 0 ? attrib.st_size : 0; } else if (mode == 1) { if (attrib.st_atim.tv_sec != 0) { if (attrib.st_atim.tv_sec < time) { diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index cf4d88066..d350aa887 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ + @@ -75,6 +76,10 @@ + + + + 0) { // wanted to achieve an effect of next items covering current - ((ViewGroup) view.getParent()).bringChildToFront(view); + view.bringToFront(); } animation .setDuration(getRemoveDuration()) @@ -337,6 +336,14 @@ public class DefaultItemAnimator extends SimpleItemAnimator { } + protected void beforeAnimateMoveImpl(final RecyclerView.ViewHolder holder) { + + } + + protected void afterAnimateMoveImpl(final RecyclerView.ViewHolder holder) { + + } + protected void animateMoveImpl(final RecyclerView.ViewHolder holder, MoveInfo moveInfo) { int fromX = moveInfo.fromX; int fromY = moveInfo.fromY; @@ -362,6 +369,7 @@ public class DefaultItemAnimator extends SimpleItemAnimator { if (translationInterpolator != null) { animation.setInterpolator(translationInterpolator); } + beforeAnimateMoveImpl(holder); animation .setDuration(getMoveDuration()) .setStartDelay(getMoveDelay()) @@ -388,6 +396,8 @@ public class DefaultItemAnimator extends SimpleItemAnimator { dispatchMoveFinished(holder); mMoveAnimations.remove(holder); dispatchFinishedWhenDone(); + + afterAnimateMoveImpl(holder); } }) .start(); diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java index 3178efe54..81b297552 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java @@ -32,8 +32,6 @@ import android.view.ViewConfiguration; import android.view.ViewParent; import android.view.animation.Interpolator; -import org.telegram.messenger.AndroidUtilities; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.view.GestureDetectorCompat; @@ -41,6 +39,8 @@ import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener; import androidx.recyclerview.widget.RecyclerView.ViewHolder; +import org.telegram.messenger.AndroidUtilities; + import java.util.ArrayList; import java.util.List; @@ -506,6 +506,10 @@ public class ItemTouchHelper extends RecyclerView.ItemDecoration stopGestureDetection(); } + public void clearRecoverAnimations() { + mRecoverAnimations.clear(); + } + private void startGestureDetection() { mItemTouchHelperGestureListener = new ItemTouchHelperGestureListener(); mGestureDetector = new GestureDetectorCompat(mRecyclerView.getContext(), @@ -561,6 +565,10 @@ public class ItemTouchHelper extends RecyclerView.ItemDecoration mRecoverAnimations, mActionState, dx, dy); } + protected boolean shouldSwipeBack() { + return false; + } + /** * Starts dragging or swiping the given View. Call with null if you want to clear it. * @@ -596,28 +604,33 @@ public class ItemTouchHelper extends RecyclerView.ItemDecoration if (mSelected != null) { final ViewHolder prevSelected = mSelected; if (prevSelected.itemView.getParent() != null) { + final boolean swipeBack = shouldSwipeBack(); final int swipeDir = prevActionState == ACTION_STATE_DRAG ? 0 : swipeIfNecessary(prevSelected); releaseVelocityTracker(); // find where we should animate to final float targetTranslateX, targetTranslateY; int animationType; - switch (swipeDir) { - case LEFT: - case RIGHT: - case START: - case END: - targetTranslateY = 0; - targetTranslateX = Math.signum(mDx) * mRecyclerView.getWidth(); - break; - case UP: - case DOWN: - targetTranslateX = 0; - targetTranslateY = Math.signum(mDy) * mRecyclerView.getHeight(); - break; - default: - targetTranslateX = 0; - targetTranslateY = 0; + if (swipeBack) { + targetTranslateX = targetTranslateY = 0; + } else { + switch (swipeDir) { + case LEFT: + case RIGHT: + case START: + case END: + targetTranslateY = 0; + targetTranslateX = Math.signum(mDx) * mRecyclerView.getWidth(); + break; + case UP: + case DOWN: + targetTranslateX = 0; + targetTranslateY = Math.signum(mDy) * mRecyclerView.getHeight(); + break; + default: + targetTranslateX = 0; + targetTranslateY = 0; + } } if (prevActionState == ACTION_STATE_DRAG) { animationType = ANIMATION_TYPE_DRAG; diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java index f6f442d7e..0ac4c5194 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java @@ -158,6 +158,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager implements private int[] mReusableIntPair = new int[2]; private boolean needFixGap = true; + private boolean needFixEndGap = true; /** * Creates a vertical LinearLayoutManager @@ -958,7 +959,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager implements */ private int fixLayoutEndGap(int endOffset, RecyclerView.Recycler recycler, RecyclerView.State state, boolean canOffsetChildren) { - if (!needFixGap) { + if (!needFixGap || !needFixEndGap) { return 0; } int gap = mOrientationHelper.getEndAfterPadding() - endOffset; @@ -981,7 +982,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager implements return fixOffset; } - public int getStarForFixGap() { + public int getStartForFixGap() { return mOrientationHelper.getStartAfterPadding(); } @@ -993,7 +994,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager implements if (!needFixGap) { return 0; } - int gap = startOffset - getStarForFixGap(); + int gap = startOffset - getStartForFixGap(); int fixOffset = 0; if (gap > 0) { // check if we should fix this gap. @@ -2601,4 +2602,8 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager implements public void setNeedFixGap(boolean needFixGap) { this.needFixGap = needFixGap; } + + public void setNeedFixEndGap(boolean needFixEndGap) { + this.needFixEndGap = needFixEndGap; + } } diff --git a/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java b/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java index c88b9e5e3..a0e8f37e3 100755 --- a/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java +++ b/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java @@ -32,6 +32,7 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.google.zxing.qrcode.encoder.Encoder; import com.google.zxing.qrcode.encoder.QRCode; +import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.R; import org.telegram.messenger.SvgHelper; import org.telegram.ui.Components.RLottieDrawable; @@ -51,6 +52,7 @@ public final class QRCodeWriter { private float[] radii = new float[8]; private int imageBloks; private int imageBlockX; + public boolean includeSideQuads = true; private int sideQuadSize; private int imageSize; @@ -126,57 +128,11 @@ public final class QRCodeWriter { imageBlockX = (inputWidth - imageBloks) / 2; imageSize = imageBloks * multiple - 24; int imageX = (size - imageSize) / 2; - - boolean isTransparentBackground = Color.alpha(backgroundColor) == 0; - Path clipPath = new Path(); - RectF rectF = new RectF(); - for (int a = 0; a < 3; a++) { - int x, y; - if (a == 0) { - x = padding; - y = padding; - } else if (a == 1) { - x = size - sideQuadSize * multiple - padding; - y = padding; - } else { - x = padding; - y = size - sideQuadSize * multiple - padding; - } - - float r; - if (isTransparentBackground) { - rectF.set(x + multiple, y + multiple, x + (sideQuadSize - 1) * multiple, y + (sideQuadSize - 1) * multiple); - r = (sideQuadSize * multiple) / 4.0f * radiusFactor; - clipPath.reset(); - clipPath.addRoundRect(rectF, r, r, Path.Direction.CW); - clipPath.close(); - canvas.save(); - canvas.clipPath(clipPath, Region.Op.DIFFERENCE); - } - r = (sideQuadSize * multiple) / 3.0f * radiusFactor; - Arrays.fill(radii, r); - rect.setColor(color); - rect.setBounds(x, y, x + sideQuadSize * multiple, y + sideQuadSize * multiple); - rect.draw(canvas); - canvas.drawRect(x + multiple, y + multiple, x + (sideQuadSize - 1) * multiple, y + (sideQuadSize - 1) * multiple, blackPaint); - if (isTransparentBackground) { - canvas.restore(); - } - - if (!isTransparentBackground) { - r = (sideQuadSize * multiple) / 4.0f * radiusFactor; - Arrays.fill(radii, r); - rect.setColor(backgroundColor); - rect.setBounds(x + multiple, y + multiple, x + (sideQuadSize - 1) * multiple, y + (sideQuadSize - 1) * multiple); - rect.draw(canvas); - } - - r = ((sideQuadSize - 2) * multiple) / 4.0f * radiusFactor; - Arrays.fill(radii, r); - rect.setColor(color); - rect.setBounds(x + multiple * 2, y + multiple * 2, x + (sideQuadSize - 2) * multiple, y + (sideQuadSize - 2) * multiple); - rect.draw(canvas); + if (includeSideQuads) { + blackPaint.setColor(color); + drawSideQuadsGradient(canvas, blackPaint, rect, sideQuadSize, multiple, padding, size, radiusFactor, radii, backgroundColor, color); } + boolean isTransparentBackground = Color.alpha(backgroundColor) == 0; float r = multiple / 2.0f * radiusFactor; for (int y = 0, outputY = padding; y < inputHeight; y++, outputY += multiple) { @@ -241,6 +197,102 @@ public final class QRCodeWriter { return bitmap; } + public static void drawSideQuadsGradient(Canvas canvas, Paint blackPaint, GradientDrawable rect, float sideQuadSize, float multiple, int padding, float size, float radiusFactor, float[] radii, int backgroundColor, int color) { + boolean isTransparentBackground = Color.alpha(backgroundColor) == 0; + rect.setShape(GradientDrawable.RECTANGLE); + rect.setCornerRadii(radii); + Path clipPath = new Path(); + RectF rectF = new RectF(); + for (int a = 0; a < 3; a++) { + float x, y; + if (a == 0) { + x = padding; + y = padding; + } else if (a == 1) { + x = size - sideQuadSize * multiple - padding; + y = padding; + } else { + x = padding; + y = size - sideQuadSize * multiple - padding; + } + + float r; + if (isTransparentBackground) { + rectF.set(x + multiple, y + multiple, x + (sideQuadSize - 1) * multiple, y + (sideQuadSize - 1) * multiple); + r = (sideQuadSize * multiple) / 4.0f * radiusFactor; + clipPath.reset(); + clipPath.addRoundRect(rectF, r, r, Path.Direction.CW); + clipPath.close(); + canvas.save(); + canvas.clipPath(clipPath, Region.Op.DIFFERENCE); + } + r = (sideQuadSize * multiple) / 3.0f * radiusFactor; + Arrays.fill(radii, r); + rect.setColor(color); + rect.setBounds((int) x, (int) y, (int) (x + sideQuadSize * multiple), (int) (y + sideQuadSize * multiple)); + rect.draw(canvas); + canvas.drawRect(x + multiple, y + multiple, x + (sideQuadSize - 1) * multiple, y + (sideQuadSize - 1) * multiple, blackPaint); + if (isTransparentBackground) { + canvas.restore(); + } + + if (!isTransparentBackground) { + r = (sideQuadSize * multiple) / 4.0f * radiusFactor; + Arrays.fill(radii, r); + rect.setColor(backgroundColor); + rect.setBounds((int) (x + multiple), (int) (y + multiple), (int) (x + (sideQuadSize - 1) * multiple), (int) (y + (sideQuadSize - 1) * multiple)); + rect.draw(canvas); + } + + r = ((sideQuadSize - 2) * multiple) / 4.0f * radiusFactor; + Arrays.fill(radii, r); + rect.setColor(color); + rect.setBounds((int) (x + multiple * 2), (int) (y + multiple * 2), (int) (x + (sideQuadSize - 2) * multiple), (int) (y + (sideQuadSize - 2) * multiple)); + rect.draw(canvas); + } + } + + public static void drawSideQuads(Canvas canvas, float xOffset, float yOffset, Paint blackPaint, float sideQuadSize, float multiple, int padding, float size, float radiusFactor, float[] radii, boolean isTransparentBackground) { + Path clipPath = new Path(); + for (int a = 0; a < 3; a++) { + float x, y; + if (a == 0) { + x = padding; + y = padding; + } else if (a == 1) { + x = size - sideQuadSize * multiple - padding; + y = padding; + } else { + x = padding; + y = size - sideQuadSize * multiple - padding; + } + + x += xOffset; + y += yOffset; + + float r; + if (isTransparentBackground) { + AndroidUtilities.rectTmp.set(x + multiple, y + multiple, x + (sideQuadSize - 1) * multiple, y + (sideQuadSize - 1) * multiple); + r = (sideQuadSize * multiple) / 4.0f * radiusFactor; + clipPath.reset(); + clipPath.addRoundRect(AndroidUtilities.rectTmp, r, r, Path.Direction.CW); + clipPath.close(); + canvas.save(); + canvas.clipPath(clipPath, Region.Op.DIFFERENCE); + } + r = (sideQuadSize * multiple) / 3.0f * radiusFactor; + AndroidUtilities.rectTmp.set(x, y, x + sideQuadSize * multiple, y + sideQuadSize * multiple); + canvas.drawRoundRect(AndroidUtilities.rectTmp, r, r, blackPaint); + if (isTransparentBackground) { + canvas.restore(); + } + + r = ((sideQuadSize - 2) * multiple) / 4.0f * radiusFactor; + AndroidUtilities.rectTmp.set(x + multiple * 2, y + multiple * 2, x + (sideQuadSize - 2) * multiple, y + (sideQuadSize - 2) * multiple); + canvas.drawRoundRect(AndroidUtilities.rectTmp, r, r, blackPaint); + } + } + private boolean has(int x, int y) { if (x >= imageBlockX && x < imageBlockX + imageBloks && y >= imageBlockX && y < imageBlockX + imageBloks) { return false; @@ -257,4 +309,8 @@ public final class QRCodeWriter { public int getImageSize() { return imageSize; } + + public int getSideSize() { + return sideQuadSize; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index db1e17980..9eca21043 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -475,7 +475,7 @@ public class AndroidUtilities { return spannableStringBuilder; } - public static void recycleBitmaps(ArrayList bitmapToRecycle) { + public static void recycleBitmaps(List bitmapToRecycle) { if (bitmapToRecycle != null && !bitmapToRecycle.isEmpty()) { AndroidUtilities.runOnUIThread(() -> Utilities.globalQueue.postRunnable(() -> { for (int i = 0; i < bitmapToRecycle.size(); i++) { @@ -526,6 +526,10 @@ public class AndroidUtilities { }); } + public static void recycleBitmap(Bitmap image) { + recycleBitmaps(Collections.singletonList(image)); + } + private static class LinkSpec { String url; int start; @@ -2636,7 +2640,7 @@ public class AndroidUtilities { } public static boolean shouldShowClipboardToast() { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.S || !OneUIUtilities.hasBuiltInClipboardToasts(); + return (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || !OneUIUtilities.hasBuiltInClipboardToasts()) && Build.VERSION.SDK_INT < 32 /* TODO: Update to TIRAMISU when compileSdkVersion would be 32 */; } public static boolean addToClipboard(CharSequence str) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 6e44ac825..ee09a72d4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -24,8 +24,8 @@ public class BuildVars { public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29; - public static int BUILD_VERSION = 2929; - public static String BUILD_VERSION_STRING = "9.1.6"; + public static int BUILD_VERSION = 2956; + public static String BUILD_VERSION_STRING = "9.2.0"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java index 9993a1999..bd471c81a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java @@ -1700,9 +1700,17 @@ public class ChatObject { } public static boolean canDeleteTopic(int currentAccount, TLRPC.Chat chat, int topicId) { + if (topicId == 1) { + // general topic can't be deleted + return false; + } return chat != null && canDeleteTopic(currentAccount, chat, MessagesController.getInstance(currentAccount).getTopicsController().findTopic(chat.id, topicId)); } public static boolean canDeleteTopic(int currentAccount, TLRPC.Chat chat, TLRPC.TL_forumTopic topic) { + if (topic != null && topic.id == 1) { + // general topic can't be deleted + return false; + } return canUserDoAction(chat, ACTION_DELETE_MESSAGES) || isMyTopic(currentAccount, topic) && topic.topMessage != null && topic.topicStartMessage != null && topic.topMessage.id - topic.topicStartMessage.id <= Math.max(1, topic.groupedMessages == null ? 0 : topic.groupedMessages.size()) && MessageObject.peersEqual(topic.from_id, topic.topMessage.from_id); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java b/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java index 06b0d3317..21aaa4340 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ChatsWidgetService.java @@ -23,8 +23,6 @@ import android.widget.RemoteViewsService; import androidx.collection.LongSparseArray; -import com.google.android.exoplayer2.util.Log; - import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AvatarDrawable; @@ -352,8 +350,6 @@ class ChatsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { fillInIntent.putExtras(extras); rv.setOnClickFillInIntent(R.id.shortcut_widget_item, fillInIntent); - Log.d("kek", "kek " + name); - rv.setViewVisibility(R.id.shortcut_widget_item_divider, position == getCount() ? View.GONE : View.VISIBLE); return rv; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetService.java b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetService.java index ea0cadb1a..675b4852d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsWidgetService.java @@ -203,8 +203,6 @@ class ContactsRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactor } extras.putInt("currentAccount", accountInstance.getCurrentAccount()); - Log.d("kek", "kek " + name); - Intent fillInIntent = new Intent(); fillInIntent.putExtras(extras); rv.setOnClickFillInIntent(a == 0 ? R.id.contacts_widget_item1 : R.id.contacts_widget_item2, fillInIntent); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java new file mode 100644 index 000000000..a26eaa99a --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java @@ -0,0 +1,1217 @@ +package org.telegram.messenger; + +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.SQLite.SQLiteDatabase; +import org.telegram.SQLite.SQLitePreparedStatement; +import org.telegram.tgnet.NativeByteBuffer; +import org.telegram.tgnet.TLRPC; + +import java.util.ArrayList; +import java.util.HashMap; + +public class DatabaseMigrationHelper { + public static int migrate(MessagesStorage messagesStorage, int version) throws Exception { + SQLiteDatabase database = messagesStorage.getDatabase(); + if (version < 4) { + database.executeFast("CREATE TABLE IF NOT EXISTS user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose(); + + database.executeFast("DROP INDEX IF EXISTS read_state_out_idx_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS ttl_idx_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS date_idx_messages;").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages ON messages(mid, out);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS task_idx_messages ON messages(uid, out, read_state, ttl, date, send_state);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages ON messages(uid, date, mid);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS sphone_deleted_idx_user_phones ON user_phones_v6(sphone, deleted);").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_randoms ON randoms(mid);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS download_queue(uid INTEGER, type INTEGER, date INTEGER, data BLOB, PRIMARY KEY (uid, type));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS type_date_idx_download_queue ON download_queue(type, date);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS dialog_settings(did INTEGER PRIMARY KEY, flags INTEGER);").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_idx_dialogs ON dialogs(unread_count);").stepThis().dispose(); + + database.executeFast("UPDATE messages SET send_state = 2 WHERE mid < 0 AND send_state = 1").stepThis().dispose(); + + messagesStorage.fixNotificationSettings(); + database.executeFast("PRAGMA user_version = 4").stepThis().dispose(); + version = 4; + } + if (version == 4) { + database.executeFast("CREATE TABLE IF NOT EXISTS enc_tasks_v2(mid INTEGER PRIMARY KEY, date INTEGER)").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_enc_tasks_v2 ON enc_tasks_v2(date);").stepThis().dispose(); + database.beginTransaction(); + SQLiteCursor cursor = database.queryFinalized("SELECT date, data FROM enc_tasks WHERE 1"); + SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v2 VALUES(?, ?)"); + if (cursor.next()) { + int date = cursor.intValue(0); + NativeByteBuffer data = cursor.byteBufferValue(1); + if (data != null) { + int length = data.limit(); + for (int a = 0; a < length / 4; a++) { + state.requery(); + state.bindInteger(1, data.readInt32(false)); + state.bindInteger(2, date); + state.step(); + } + data.reuse(); + } + } + state.dispose(); + cursor.dispose(); + database.commitTransaction(); + + database.executeFast("DROP INDEX IF EXISTS date_idx_enc_tasks;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS enc_tasks;").stepThis().dispose(); + + database.executeFast("ALTER TABLE messages ADD COLUMN media INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 6").stepThis().dispose(); + version = 6; + } + if (version == 6) { + database.executeFast("CREATE TABLE IF NOT EXISTS messages_seq(mid INTEGER PRIMARY KEY, seq_in INTEGER, seq_out INTEGER);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS seq_idx_messages_seq ON messages_seq(seq_in, seq_out);").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN layer INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN seq_in INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN seq_out INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 7").stepThis().dispose(); + version = 7; + } + if (version == 7 || version == 8 || version == 9) { + database.executeFast("ALTER TABLE enc_chats ADD COLUMN use_count INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN exchange_id INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN key_date INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN fprint INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN fauthkey BLOB default NULL").stepThis().dispose(); + database.executeFast("ALTER TABLE enc_chats ADD COLUMN khash BLOB default NULL").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 10").stepThis().dispose(); + version = 10; + } + if (version == 10) { + database.executeFast("CREATE TABLE IF NOT EXISTS web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, PRIMARY KEY (id, type));").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 11").stepThis().dispose(); + version = 11; + } + if (version == 11 || version == 12) { + database.executeFast("DROP INDEX IF EXISTS uid_mid_idx_media;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS mid_idx_media;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS uid_date_mid_idx_media;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS media;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS media_counts;").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS media_v2(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, type INTEGER, data BLOB)").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS media_counts_v2(uid INTEGER, type INTEGER, count INTEGER, PRIMARY KEY(uid, type))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media ON media_v2(uid, mid, type, date);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS keyvalue(id TEXT PRIMARY KEY, value TEXT)").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 13").stepThis().dispose(); + version = 13; + } + if (version == 13) { + database.executeFast("ALTER TABLE messages ADD COLUMN replydata BLOB default NULL").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 14").stepThis().dispose(); + version = 14; + } + if (version == 14) { + database.executeFast("CREATE TABLE IF NOT EXISTS hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 15").stepThis().dispose(); + version = 15; + } + if (version == 15) { + database.executeFast("CREATE TABLE IF NOT EXISTS webpage_pending(id INTEGER, mid INTEGER, PRIMARY KEY (id, mid));").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 16").stepThis().dispose(); + version = 16; + } + if (version == 16) { + database.executeFast("ALTER TABLE dialogs ADD COLUMN inbox_max INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN outbox_max INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 17").stepThis().dispose(); + version = 17; + } + if (version == 17) { + database.executeFast("PRAGMA user_version = 18").stepThis().dispose(); + version = 18; + } + if (version == 18) { + database.executeFast("DROP TABLE IF EXISTS stickers;").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS stickers_v2(id INTEGER PRIMARY KEY, data BLOB, date INTEGER, hash INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 19").stepThis().dispose(); + version = 19; + } + if (version == 19) { + database.executeFast("CREATE TABLE IF NOT EXISTS bot_keyboard(uid INTEGER PRIMARY KEY, mid INTEGER, info BLOB)").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS bot_keyboard_idx_mid ON bot_keyboard(mid);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 20").stepThis().dispose(); + version = 20; + } + if (version == 20) { + database.executeFast("CREATE TABLE search_recent(did INTEGER PRIMARY KEY, date INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 21").stepThis().dispose(); + version = 21; + } + if (version == 21) { + database.executeFast("CREATE TABLE IF NOT EXISTS chat_settings_v2(uid INTEGER PRIMARY KEY, info BLOB)").stepThis().dispose(); + + SQLiteCursor cursor = database.queryFinalized("SELECT uid, participants FROM chat_settings WHERE uid < 0"); + SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_settings_v2 VALUES(?, ?)"); + while (cursor.next()) { + long chatId = cursor.intValue(0); + NativeByteBuffer data = cursor.byteBufferValue(1); + if (data != null) { + TLRPC.ChatParticipants participants = TLRPC.ChatParticipants.TLdeserialize(data, data.readInt32(false), false); + data.reuse(); + if (participants != null) { + TLRPC.TL_chatFull chatFull = new TLRPC.TL_chatFull(); + chatFull.id = chatId; + chatFull.chat_photo = new TLRPC.TL_photoEmpty(); + chatFull.notify_settings = new TLRPC.TL_peerNotifySettingsEmpty_layer77(); + chatFull.exported_invite = null; + chatFull.participants = participants; + NativeByteBuffer data2 = new NativeByteBuffer(chatFull.getObjectSize()); + chatFull.serializeToStream(data2); + state.requery(); + state.bindLong(1, chatId); + state.bindByteBuffer(2, data2); + state.step(); + data2.reuse(); + } + } + } + state.dispose(); + cursor.dispose(); + + database.executeFast("DROP TABLE IF EXISTS chat_settings;").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN last_mid_i INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN unread_count_i INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN pts INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN date_i INTEGER default 0").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS last_mid_i_idx_dialogs ON dialogs(last_mid_i);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_i_idx_dialogs ON dialogs(unread_count_i);").stepThis().dispose(); + database.executeFast("ALTER TABLE messages ADD COLUMN imp INTEGER default 0").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS messages_holes(uid INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, start));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_messages_holes ON messages_holes(uid, end);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 22").stepThis().dispose(); + version = 22; + } + if (version == 22) { + database.executeFast("CREATE TABLE IF NOT EXISTS media_holes_v2(uid INTEGER, type INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, type, start));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_media_holes_v2 ON media_holes_v2(uid, type, end);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 23").stepThis().dispose(); + version = 23; + } + if (version == 23 || version == 24) { + database.executeFast("DELETE FROM media_holes_v2 WHERE uid != 0 AND type >= 0 AND start IN (0, 1)").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 25").stepThis().dispose(); + version = 25; + } + if (version == 25 || version == 26) { + database.executeFast("CREATE TABLE IF NOT EXISTS channel_users_v2(did INTEGER, uid INTEGER, date INTEGER, data BLOB, PRIMARY KEY(did, uid))").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 27").stepThis().dispose(); + version = 27; + } + if (version == 27) { + database.executeFast("ALTER TABLE web_recent_v3 ADD COLUMN document BLOB default NULL").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 28").stepThis().dispose(); + version = 28; + } + if (version == 28 || version == 29) { + database.executeFast("DELETE FROM sent_files_v2 WHERE 1").stepThis().dispose(); + database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 30").stepThis().dispose(); + version = 30; + } + if (version == 30) { + database.executeFast("ALTER TABLE chat_settings_v2 ADD COLUMN pinned INTEGER default 0").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS chat_settings_pinned_idx ON chat_settings_v2(uid, pinned) WHERE pinned != 0;").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS users_data(uid INTEGER PRIMARY KEY, about TEXT)").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 31").stepThis().dispose(); + version = 31; + } + if (version == 31) { + database.executeFast("DROP TABLE IF EXISTS bot_recent;").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS chat_hints(did INTEGER, type INTEGER, rating REAL, date INTEGER, PRIMARY KEY(did, type))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS chat_hints_rating_idx ON chat_hints(rating);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 32").stepThis().dispose(); + version = 32; + } + if (version == 32) { + database.executeFast("DROP INDEX IF EXISTS uid_mid_idx_imp_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS uid_date_mid_imp_idx_messages;").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 33").stepThis().dispose(); + version = 33; + } + if (version == 33) { + database.executeFast("CREATE TABLE IF NOT EXISTS pending_tasks(id INTEGER PRIMARY KEY, data BLOB);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 34").stepThis().dispose(); + version = 34; + } + if (version == 34) { + database.executeFast("CREATE TABLE IF NOT EXISTS stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 35").stepThis().dispose(); + version = 35; + } + if (version == 35) { + database.executeFast("CREATE TABLE IF NOT EXISTS requested_holes(uid INTEGER, seq_out_start INTEGER, seq_out_end INTEGER, PRIMARY KEY (uid, seq_out_start, seq_out_end));").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 36").stepThis().dispose(); + version = 36; + } + if (version == 36) { + database.executeFast("ALTER TABLE enc_chats ADD COLUMN in_seq_no INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 37").stepThis().dispose(); + version = 37; + } + if (version == 37) { + database.executeFast("CREATE TABLE IF NOT EXISTS botcache(id TEXT PRIMARY KEY, date INTEGER, data BLOB)").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS botcache_date_idx ON botcache(date);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 38").stepThis().dispose(); + version = 38; + } + if (version == 38) { + database.executeFast("ALTER TABLE dialogs ADD COLUMN pinned INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 39").stepThis().dispose(); + version = 39; + } + if (version == 39) { + database.executeFast("ALTER TABLE enc_chats ADD COLUMN admin_id INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 40").stepThis().dispose(); + version = 40; + } + if (version == 40) { + messagesStorage.fixNotificationSettings(); + database.executeFast("PRAGMA user_version = 41").stepThis().dispose(); + version = 41; + } + if (version == 41) { + database.executeFast("ALTER TABLE messages ADD COLUMN mention INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE user_contacts_v6 ADD COLUMN imported INTEGER default 0").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages ON messages(uid, mention, read_state);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 42").stepThis().dispose(); + version = 42; + } + if (version == 42) { + database.executeFast("CREATE TABLE IF NOT EXISTS sharing_locations(uid INTEGER PRIMARY KEY, mid INTEGER, date INTEGER, period INTEGER, message BLOB);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 43").stepThis().dispose(); + version = 43; + } + if (version == 43) { + database.executeFast("PRAGMA user_version = 44").stepThis().dispose(); + version = 44; + } + if (version == 44) { + database.executeFast("CREATE TABLE IF NOT EXISTS user_contacts_v7(key TEXT PRIMARY KEY, uid INTEGER, fname TEXT, sname TEXT, imported INTEGER)").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS user_phones_v7(key TEXT, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (key, phone))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS sphone_deleted_idx_user_phones ON user_phones_v7(sphone, deleted);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 45").stepThis().dispose(); + version = 45; + } + if (version == 45) { + database.executeFast("ALTER TABLE enc_chats ADD COLUMN mtproto_seq INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 46").stepThis().dispose(); + version = 46; + } + if (version == 46) { + database.executeFast("DELETE FROM botcache WHERE 1").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 47").stepThis().dispose(); + version = 47; + } + if (version == 47) { + database.executeFast("ALTER TABLE dialogs ADD COLUMN flags INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 48").stepThis().dispose(); + version = 48; + } + if (version == 48) { + database.executeFast("CREATE TABLE IF NOT EXISTS unread_push_messages(uid INTEGER, mid INTEGER, random INTEGER, date INTEGER, data BLOB, fm TEXT, name TEXT, uname TEXT, flags INTEGER, PRIMARY KEY(uid, mid))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS unread_push_messages_idx_date ON unread_push_messages(date);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS unread_push_messages_idx_random ON unread_push_messages(random);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 49").stepThis().dispose(); + version = 49; + } + if (version == 49) { + database.executeFast("CREATE TABLE IF NOT EXISTS user_settings(uid INTEGER PRIMARY KEY, info BLOB, pinned INTEGER)").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS user_settings_pinned_idx ON user_settings(uid, pinned) WHERE pinned != 0;").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 50").stepThis().dispose(); + version = 50; + } + if (version == 50) { + database.executeFast("DELETE FROM sent_files_v2 WHERE 1").stepThis().dispose(); + database.executeFast("ALTER TABLE sent_files_v2 ADD COLUMN parent TEXT").stepThis().dispose(); + database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose(); + database.executeFast("ALTER TABLE download_queue ADD COLUMN parent TEXT").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 51").stepThis().dispose(); + version = 51; + } + if (version == 51) { + database.executeFast("ALTER TABLE media_counts_v2 ADD COLUMN old INTEGER").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 52").stepThis().dispose(); + version = 52; + } + if (version == 52) { + database.executeFast("CREATE TABLE IF NOT EXISTS polls_v2(mid INTEGER, uid INTEGER, id INTEGER, PRIMARY KEY (mid, uid));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS polls_id ON polls_v2(id);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 53").stepThis().dispose(); + version = 53; + } + if (version == 53) { + database.executeFast("ALTER TABLE chat_settings_v2 ADD COLUMN online INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 54").stepThis().dispose(); + version = 54; + } + if (version == 54) { + database.executeFast("DROP TABLE IF EXISTS wallpapers;").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 55").stepThis().dispose(); + version = 55; + } + if (version == 55) { + database.executeFast("CREATE TABLE IF NOT EXISTS wallpapers2(uid INTEGER PRIMARY KEY, data BLOB, num INTEGER)").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS wallpapers_num ON wallpapers2(num);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 56").stepThis().dispose(); + version = 56; + } + if (version == 56 || version == 57) { + database.executeFast("CREATE TABLE IF NOT EXISTS emoji_keywords_v2(lang TEXT, keyword TEXT, emoji TEXT, PRIMARY KEY(lang, keyword, emoji));").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS emoji_keywords_info_v2(lang TEXT PRIMARY KEY, alias TEXT, version INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 58").stepThis().dispose(); + version = 58; + } + if (version == 58) { + database.executeFast("CREATE INDEX IF NOT EXISTS emoji_keywords_v2_keyword ON emoji_keywords_v2(keyword);").stepThis().dispose(); + database.executeFast("ALTER TABLE emoji_keywords_info_v2 ADD COLUMN date INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 59").stepThis().dispose(); + version = 59; + } + if (version == 59) { + database.executeFast("ALTER TABLE dialogs ADD COLUMN folder_id INTEGER default 0").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN data BLOB default NULL").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS folder_id_idx_dialogs ON dialogs(folder_id);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 60").stepThis().dispose(); + version = 60; + } + if (version == 60) { + database.executeFast("DROP TABLE IF EXISTS channel_admins;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS blocked_users;").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 61").stepThis().dispose(); + version = 61; + } + if (version == 61) { + database.executeFast("DROP INDEX IF EXISTS send_state_idx_messages;").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_messages2 ON messages(mid, send_state, date);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 62").stepThis().dispose(); + version = 62; + } + if (version == 62) { + database.executeFast("CREATE TABLE IF NOT EXISTS scheduled_messages(mid INTEGER PRIMARY KEY, uid INTEGER, send_state INTEGER, date INTEGER, data BLOB, ttl INTEGER, replydata BLOB)").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_scheduled_messages ON scheduled_messages(mid, send_state, date);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_idx_scheduled_messages ON scheduled_messages(uid, date);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 63").stepThis().dispose(); + version = 63; + } + if (version == 63) { + database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 64").stepThis().dispose(); + version = 64; + } + if (version == 64) { + database.executeFast("CREATE TABLE IF NOT EXISTS dialog_filter(id INTEGER PRIMARY KEY, ord INTEGER, unread_count INTEGER, flags INTEGER, title TEXT)").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS dialog_filter_ep(id INTEGER, peer INTEGER, PRIMARY KEY (id, peer))").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 65").stepThis().dispose(); + version = 65; + } + if (version == 65) { + database.executeFast("CREATE INDEX IF NOT EXISTS flags_idx_dialogs ON dialogs(flags);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 66").stepThis().dispose(); + version = 66; + } + if (version == 66) { + database.executeFast("CREATE TABLE dialog_filter_pin_v2(id INTEGER, peer INTEGER, pin INTEGER, PRIMARY KEY (id, peer))").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 67").stepThis().dispose(); + version = 67; + } + if (version == 67) { + database.executeFast("CREATE TABLE IF NOT EXISTS stickers_dice(emoji TEXT PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 68").stepThis().dispose(); + version = 68; + } + if (version == 68) { + messagesStorage.executeNoException("ALTER TABLE messages ADD COLUMN forwards INTEGER default 0"); + database.executeFast("PRAGMA user_version = 69").stepThis().dispose(); + version = 69; + } + if (version == 69) { + messagesStorage.executeNoException("ALTER TABLE messages ADD COLUMN replies_data BLOB default NULL"); + messagesStorage.executeNoException("ALTER TABLE messages ADD COLUMN thread_reply_id INTEGER default 0"); + database.executeFast("PRAGMA user_version = 70").stepThis().dispose(); + version = 70; + } + if (version == 70) { + database.executeFast("CREATE TABLE IF NOT EXISTS chat_pinned_v2(uid INTEGER, mid INTEGER, data BLOB, PRIMARY KEY (uid, mid));").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 71").stepThis().dispose(); + version = 71; + } + if (version == 71) { + messagesStorage.executeNoException("ALTER TABLE sharing_locations ADD COLUMN proximity INTEGER default 0"); + database.executeFast("PRAGMA user_version = 72").stepThis().dispose(); + version = 72; + } + if (version == 72) { + database.executeFast("CREATE TABLE IF NOT EXISTS chat_pinned_count(uid INTEGER PRIMARY KEY, count INTEGER, end INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 73").stepThis().dispose(); + version = 73; + } + if (version == 73) { + messagesStorage.executeNoException("ALTER TABLE chat_settings_v2 ADD COLUMN inviter INTEGER default 0"); + database.executeFast("PRAGMA user_version = 74").stepThis().dispose(); + version = 74; + } + if (version == 74) { + database.executeFast("CREATE TABLE IF NOT EXISTS shortcut_widget(id INTEGER, did INTEGER, ord INTEGER, PRIMARY KEY (id, did));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS shortcut_widget_did ON shortcut_widget(did);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 75").stepThis().dispose(); + version = 75; + } + if (version == 75) { + messagesStorage.executeNoException("ALTER TABLE chat_settings_v2 ADD COLUMN links INTEGER default 0"); + database.executeFast("PRAGMA user_version = 76").stepThis().dispose(); + version = 76; + } + if (version == 76) { + messagesStorage.executeNoException("ALTER TABLE enc_tasks_v2 ADD COLUMN media INTEGER default -1"); + database.executeFast("PRAGMA user_version = 77").stepThis().dispose(); + version = 77; + } + if (version == 77) { + database.executeFast("DROP TABLE IF EXISTS channel_admins_v2;").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS channel_admins_v3(did INTEGER, uid INTEGER, data BLOB, PRIMARY KEY(did, uid))").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 78").stepThis().dispose(); + version = 78; + } + if (version == 78) { + database.executeFast("DROP TABLE IF EXISTS bot_info;").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS bot_info_v2(uid INTEGER, dialogId INTEGER, info BLOB, PRIMARY KEY(uid, dialogId))").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 79").stepThis().dispose(); + version = 79; + } + if (version == 79) { + database.executeFast("CREATE TABLE IF NOT EXISTS enc_tasks_v3(mid INTEGER, date INTEGER, media INTEGER, PRIMARY KEY(mid, media))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_enc_tasks_v3 ON enc_tasks_v3(date);").stepThis().dispose(); + + database.beginTransaction(); + SQLiteCursor cursor = database.queryFinalized("SELECT mid, date, media FROM enc_tasks_v2 WHERE 1"); + SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v3 VALUES(?, ?, ?)"); + if (cursor.next()) { + long mid = cursor.longValue(0); + int date = cursor.intValue(1); + int media = cursor.intValue(2); + + state.requery(); + state.bindLong(1, mid); + state.bindInteger(2, date); + state.bindInteger(3, media); + state.step(); + } + state.dispose(); + cursor.dispose(); + database.commitTransaction(); + + database.executeFast("DROP INDEX IF EXISTS date_idx_enc_tasks_v2;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS enc_tasks_v2;").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 80").stepThis().dispose(); + version = 80; + } + if (version == 80) { + database.executeFast("CREATE TABLE IF NOT EXISTS scheduled_messages_v2(mid INTEGER, uid INTEGER, send_state INTEGER, date INTEGER, data BLOB, ttl INTEGER, replydata BLOB, PRIMARY KEY(mid, uid))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_scheduled_messages_v2 ON scheduled_messages_v2(mid, send_state, date);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_idx_scheduled_messages_v2 ON scheduled_messages_v2(uid, date);").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS bot_keyboard_idx_mid_v2 ON bot_keyboard(mid, uid);").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS bot_keyboard_idx_mid;").stepThis().dispose(); + + database.beginTransaction(); + SQLiteCursor cursor; + try { + cursor = database.queryFinalized("SELECT mid, uid, send_state, date, data, ttl, replydata FROM scheduled_messages_v2 WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO scheduled_messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?)"); + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(4); + if (data == null) { + continue; + } + int mid = cursor.intValue(0); + long uid = cursor.longValue(1); + int sendState = cursor.intValue(2); + int date = cursor.intValue(3); + int ttl = cursor.intValue(5); + NativeByteBuffer replydata = cursor.byteBufferValue(6); + + statement.requery(); + statement.bindInteger(1, mid); + statement.bindLong(2, uid); + statement.bindInteger(3, sendState); + statement.bindByteBuffer(4, data); + statement.bindInteger(5, date); + statement.bindInteger(6, ttl); + if (replydata != null) { + statement.bindByteBuffer(7, replydata); + } else { + statement.bindNull(7); + } + statement.step(); + if (replydata != null) { + replydata.reuse(); + } + data.reuse(); + } + cursor.dispose(); + statement.dispose(); + } + + database.executeFast("DROP INDEX IF EXISTS send_state_idx_scheduled_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS uid_date_idx_scheduled_messages;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS scheduled_messages;").stepThis().dispose(); + + database.commitTransaction(); + database.executeFast("PRAGMA user_version = 81").stepThis().dispose(); + version = 81; + } + if (version == 81) { + database.executeFast("CREATE TABLE IF NOT EXISTS media_v3(mid INTEGER, uid INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v3 ON media_v3(uid, mid, type, date);").stepThis().dispose(); + + database.beginTransaction(); + SQLiteCursor cursor; + try { + cursor = database.queryFinalized("SELECT mid, uid, date, type, data FROM media_v2 WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO media_v3 VALUES(?, ?, ?, ?, ?)"); + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(4); + if (data == null) { + continue; + } + int mid = cursor.intValue(0); + long uid = cursor.longValue(1); + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + int date = cursor.intValue(2); + int type = cursor.intValue(3); + + statement.requery(); + statement.bindInteger(1, mid); + statement.bindLong(2, uid); + statement.bindInteger(3, date); + statement.bindInteger(4, type); + statement.bindByteBuffer(5, data); + statement.step(); + data.reuse(); + } + cursor.dispose(); + statement.dispose(); + } + + database.executeFast("DROP INDEX IF EXISTS uid_mid_type_date_idx_media;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS media_v2;").stepThis().dispose(); + database.commitTransaction(); + + database.executeFast("PRAGMA user_version = 82").stepThis().dispose(); + version = 82; + } + if (version == 82) { + database.executeFast("CREATE TABLE IF NOT EXISTS randoms_v2(random_id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (random_id, mid, uid))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_randoms_v2 ON randoms_v2(mid, uid);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS enc_tasks_v4(mid INTEGER, uid INTEGER, date INTEGER, media INTEGER, PRIMARY KEY(mid, uid, media))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_enc_tasks_v4 ON enc_tasks_v4(date);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS polls_v2(mid INTEGER, uid INTEGER, id INTEGER, PRIMARY KEY (mid, uid));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS polls_id_v2 ON polls_v2(id);").stepThis().dispose(); + + database.executeFast("CREATE TABLE IF NOT EXISTS webpage_pending_v2(id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (id, mid, uid));").stepThis().dispose(); + + database.beginTransaction(); + + SQLiteCursor cursor; + try { + cursor = database.queryFinalized("SELECT r.random_id, r.mid, m.uid FROM randoms as r INNER JOIN messages as m ON r.mid = m.mid WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO randoms_v2 VALUES(?, ?, ?)"); + while (cursor.next()) { + long randomId = cursor.longValue(0); + int mid = cursor.intValue(1); + long uid = cursor.longValue(2); + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + + statement.requery(); + statement.bindLong(1, randomId); + statement.bindInteger(2, mid); + statement.bindLong(3, uid); + statement.step(); + } + cursor.dispose(); + statement.dispose(); + } + + try { + cursor = database.queryFinalized("SELECT p.mid, m.uid, p.id FROM polls as p INNER JOIN messages as m ON p.mid = m.mid WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO polls_v2 VALUES(?, ?, ?)"); + while (cursor.next()) { + int mid = cursor.intValue(0); + long uid = cursor.longValue(1); + long id = cursor.longValue(2); + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + + statement.requery(); + statement.bindInteger(1, mid); + statement.bindLong(2, uid); + statement.bindLong(3, id); + statement.step(); + } + cursor.dispose(); + statement.dispose(); + } + + try { + cursor = database.queryFinalized("SELECT wp.id, wp.mid, m.uid FROM webpage_pending as wp INNER JOIN messages as m ON wp.mid = m.mid WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO webpage_pending_v2 VALUES(?, ?, ?)"); + while (cursor.next()) { + long id = cursor.longValue(0); + int mid = cursor.intValue(1); + long uid = cursor.longValue(2); + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + + statement.requery(); + statement.bindLong(1, id); + statement.bindInteger(2, mid); + statement.bindLong(3, uid); + statement.step(); + } + cursor.dispose(); + statement.dispose(); + } + + try { + cursor = database.queryFinalized("SELECT et.mid, m.uid, et.date, et.media FROM enc_tasks_v3 as et INNER JOIN messages as m ON et.mid = m.mid WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)"); + while (cursor.next()) { + int mid = cursor.intValue(0); + long uid = cursor.longValue(1); + int date = cursor.intValue(2); + int media = cursor.intValue(3); + + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + + statement.requery(); + statement.bindInteger(1, mid); + statement.bindLong(2, uid); + statement.bindInteger(3, date); + statement.bindInteger(4, media); + statement.step(); + } + cursor.dispose(); + statement.dispose(); + } + + database.executeFast("DROP INDEX IF EXISTS mid_idx_randoms;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS randoms;").stepThis().dispose(); + + database.executeFast("DROP INDEX IF EXISTS date_idx_enc_tasks_v3;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS enc_tasks_v3;").stepThis().dispose(); + + database.executeFast("DROP INDEX IF EXISTS polls_id;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS polls;").stepThis().dispose(); + + database.executeFast("DROP TABLE IF EXISTS webpage_pending;").stepThis().dispose(); + database.commitTransaction(); + + database.executeFast("PRAGMA user_version = 83").stepThis().dispose(); + version = 83; + } + if (version == 83) { + database.executeFast("CREATE TABLE IF NOT EXISTS messages_v2(mid INTEGER, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER, media INTEGER, replydata BLOB, imp INTEGER, mention INTEGER, forwards INTEGER, replies_data BLOB, thread_reply_id INTEGER, is_channel INTEGER, PRIMARY KEY(mid, uid))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_read_out_idx_messages_v2 ON messages_v2(uid, mid, read_state, out);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages_v2 ON messages_v2(uid, date, mid);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages_v2 ON messages_v2(mid, out);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS task_idx_messages_v2 ON messages_v2(uid, out, read_state, ttl, date, send_state);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_messages_v2 ON messages_v2(mid, send_state, date);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages_v2 ON messages_v2(uid, mention, read_state);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS is_channel_idx_messages_v2 ON messages_v2(mid, is_channel);").stepThis().dispose(); + + database.beginTransaction(); + + SQLiteCursor cursor; + + try { + cursor = database.queryFinalized("SELECT mid, uid, read_state, send_state, date, data, out, ttl, media, replydata, imp, mention, forwards, replies_data, thread_reply_id FROM messages WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + int num = 0; + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(5); + if (data == null) { + continue; + } + num++; + long mid = cursor.intValue(0); + long uid = cursor.longValue(1); + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + int readState = cursor.intValue(2); + int sendState = cursor.intValue(3); + int date = cursor.intValue(4); + int out = cursor.intValue(6); + int ttl = cursor.intValue(7); + int media = cursor.intValue(8); + NativeByteBuffer replydata = cursor.byteBufferValue(9); + int imp = cursor.intValue(10); + int mention = cursor.intValue(11); + int forwards = cursor.intValue(12); + NativeByteBuffer repliesdata = cursor.byteBufferValue(13); + int thread_reply_id = cursor.intValue(14); + int channelId = (int) (uid >> 32); + if (ttl < 0) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + if (message != null) { + message.readAttachPath(data, messagesStorage.getUserConfig().clientUserId); + if (message.params == null) { + message.params = new HashMap<>(); + message.params.put("fwd_peer", "" + ttl); + } + data.reuse(); + data = new NativeByteBuffer(message.getObjectSize()); + message.serializeToStream(data); + } + ttl = 0; + } + + statement.requery(); + statement.bindInteger(1, (int) mid); + statement.bindLong(2, uid); + statement.bindInteger(3, readState); + statement.bindInteger(4, sendState); + statement.bindInteger(5, date); + statement.bindByteBuffer(6, data); + statement.bindInteger(7, out); + statement.bindInteger(8, ttl); + statement.bindInteger(9, media); + if (replydata != null) { + statement.bindByteBuffer(10, replydata); + } else { + statement.bindNull(10); + } + statement.bindInteger(11, imp); + statement.bindInteger(12, mention); + statement.bindInteger(13, forwards); + if (repliesdata != null) { + statement.bindByteBuffer(14, repliesdata); + } else { + statement.bindNull(14); + } + statement.bindInteger(15, thread_reply_id); + statement.bindInteger(16, channelId > 0 ? 1 : 0); + statement.step(); + if (replydata != null) { + replydata.reuse(); + } + if (repliesdata != null) { + repliesdata.reuse(); + } + data.reuse(); + } + cursor.dispose(); + statement.dispose(); + } + + ArrayList secretChatsToUpdate = null; + ArrayList foldersToUpdate = null; + cursor = database.queryFinalized("SELECT did, last_mid, last_mid_i FROM dialogs WHERE 1"); + SQLitePreparedStatement statement4 = database.executeFast("UPDATE dialogs SET last_mid = ?, last_mid_i = ? WHERE did = ?"); + while (cursor.next()) { + long did = cursor.longValue(0); + int lowerId = (int) did; + int highId = (int) (did >> 32); + if (lowerId == 0) { + if (secretChatsToUpdate == null) { + secretChatsToUpdate = new ArrayList<>(); + } + secretChatsToUpdate.add(highId); + } else if (highId == 2) { + if (foldersToUpdate == null) { + foldersToUpdate = new ArrayList<>(); + } + foldersToUpdate.add(lowerId); + } + + statement4.requery(); + statement4.bindInteger(1, cursor.intValue(1)); + statement4.bindInteger(2, cursor.intValue(2)); + statement4.bindLong(3, did); + statement4.step(); + } + statement4.dispose(); + cursor.dispose(); + + cursor = database.queryFinalized("SELECT uid, mid FROM unread_push_messages WHERE 1"); + statement4 = database.executeFast("UPDATE unread_push_messages SET mid = ? WHERE uid = ? AND mid = ?"); + while (cursor.next()) { + long did = cursor.longValue(0); + int mid = cursor.intValue(1); + statement4.requery(); + statement4.bindInteger(1, mid); + statement4.bindLong(2, did); + statement4.bindInteger(3, mid); + statement4.step(); + } + statement4.dispose(); + cursor.dispose(); + + if (secretChatsToUpdate != null) { + SQLitePreparedStatement statement = database.executeFast("UPDATE dialogs SET did = ? WHERE did = ?"); + SQLitePreparedStatement statement2 = database.executeFast("UPDATE dialog_filter_pin_v2 SET peer = ? WHERE peer = ?"); + SQLitePreparedStatement statement3 = database.executeFast("UPDATE dialog_filter_ep SET peer = ? WHERE peer = ?"); + for (int a = 0, N = secretChatsToUpdate.size(); a < N; a++) { + int sid = secretChatsToUpdate.get(a); + + long newId = DialogObject.makeEncryptedDialogId(sid); + long oldId = ((long) sid) << 32; + statement.requery(); + statement.bindLong(1, newId); + statement.bindLong(2, oldId); + statement.step(); + + statement2.requery(); + statement2.bindLong(1, newId); + statement2.bindLong(2, oldId); + statement2.step(); + + statement3.requery(); + statement3.bindLong(1, newId); + statement3.bindLong(2, oldId); + statement3.step(); + } + statement.dispose(); + statement2.dispose(); + statement3.dispose(); + } + if (foldersToUpdate != null) { + SQLitePreparedStatement statement = database.executeFast("UPDATE dialogs SET did = ? WHERE did = ?"); + for (int a = 0, N = foldersToUpdate.size(); a < N; a++) { + int fid = foldersToUpdate.get(a); + + long newId = DialogObject.makeFolderDialogId(fid); + long oldId = (((long) 2) << 32) | fid; + statement.requery(); + statement.bindLong(1, newId); + statement.bindLong(2, oldId); + statement.step(); + } + statement.dispose(); + } + + database.executeFast("DROP INDEX IF EXISTS uid_mid_read_out_idx_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS uid_date_mid_idx_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS mid_out_idx_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS task_idx_messages;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS send_state_idx_messages2;").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS uid_mention_idx_messages;").stepThis().dispose(); + database.executeFast("DROP TABLE IF EXISTS messages;").stepThis().dispose(); + database.commitTransaction(); + + database.executeFast("PRAGMA user_version = 84").stepThis().dispose(); + version = 84; + } + if (version == 84) { + database.executeFast("CREATE TABLE IF NOT EXISTS media_v4(mid INTEGER, uid INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid, type))").stepThis().dispose(); + database.beginTransaction(); + SQLiteCursor cursor; + try { + cursor = database.queryFinalized("SELECT mid, uid, date, type, data FROM media_v3 WHERE 1"); + } catch (Exception e) { + cursor = null; + FileLog.e(e); + } + if (cursor != null) { + SQLitePreparedStatement statement = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(4); + if (data == null) { + continue; + } + int mid = cursor.intValue(0); + long uid = cursor.longValue(1); + int lowerId = (int) uid; + if (lowerId == 0) { + int highId = (int) (uid >> 32); + uid = DialogObject.makeEncryptedDialogId(highId); + } + int date = cursor.intValue(2); + int type = cursor.intValue(3); + + statement.requery(); + statement.bindInteger(1, mid); + statement.bindLong(2, uid); + statement.bindInteger(3, date); + statement.bindInteger(4, type); + statement.bindByteBuffer(5, data); + statement.step(); + data.reuse(); + } + cursor.dispose(); + statement.dispose(); + } + database.commitTransaction(); + + database.executeFast("DROP TABLE IF EXISTS media_v3;").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 85").stepThis().dispose(); + version = 85; + } + if (version == 85) { + messagesStorage.executeNoException("ALTER TABLE messages_v2 ADD COLUMN reply_to_message_id INTEGER default 0"); + messagesStorage.executeNoException("ALTER TABLE scheduled_messages_v2 ADD COLUMN reply_to_message_id INTEGER default 0"); + + database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_messages_v2 ON messages_v2(mid, reply_to_message_id);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_scheduled_messages_v2 ON scheduled_messages_v2(mid, reply_to_message_id);").stepThis().dispose(); + + messagesStorage.executeNoException("UPDATE messages_v2 SET replydata = NULL"); + messagesStorage.executeNoException("UPDATE scheduled_messages_v2 SET replydata = NULL"); + database.executeFast("PRAGMA user_version = 86").stepThis().dispose(); + version = 86; + } + + if (version == 86) { + database.executeFast("CREATE TABLE IF NOT EXISTS reactions(data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 87").stepThis().dispose(); + version = 87; + } + + if (version == 87) { + database.executeFast("ALTER TABLE dialogs ADD COLUMN unread_reactions INTEGER default 0").stepThis().dispose(); + database.executeFast("CREATE TABLE reaction_mentions(message_id INTEGER PRIMARY KEY, state INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 88").stepThis().dispose(); + version = 88; + } + + if (version == 88 || version == 89) { + database.executeFast("DROP TABLE IF EXISTS reaction_mentions;").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS reaction_mentions(message_id INTEGER, state INTEGER, dialog_id INTEGER, PRIMARY KEY(dialog_id, message_id));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_did ON reaction_mentions(dialog_id);").stepThis().dispose(); + + database.executeFast("DROP INDEX IF EXISTS uid_mid_type_date_idx_media_v3").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v4 ON media_v4(uid, mid, type, date);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 90").stepThis().dispose(); + + version = 90; + } + + if (version == 90 || version == 91) { + database.executeFast("DROP TABLE IF EXISTS downloading_documents;").stepThis().dispose(); + database.executeFast("CREATE TABLE downloading_documents(data BLOB, hash INTEGER, id INTEGER, state INTEGER, date INTEGER, PRIMARY KEY(hash, id));").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 92").stepThis().dispose(); + version = 92; + } + + if (version == 92) { + database.executeFast("CREATE TABLE IF NOT EXISTS attach_menu_bots(data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 93").stepThis().dispose(); + version = 95; + } + + if (version == 95 || version == 93) { + messagesStorage.executeNoException("ALTER TABLE messages_v2 ADD COLUMN custom_params BLOB default NULL"); + database.executeFast("PRAGMA user_version = 96").stepThis().dispose(); + version = 96; + } + + // skip 94, 95. private beta db rollback + if (version == 96) { + database.executeFast("CREATE TABLE IF NOT EXISTS premium_promo(data BLOB, date INTEGER);").stepThis().dispose(); + database.executeFast("UPDATE stickers_v2 SET date = 0"); + database.executeFast("PRAGMA user_version = 97").stepThis().dispose(); + version = 97; + } + + if (version == 97) { + database.executeFast("DROP TABLE IF EXISTS stickers_featured;").stepThis().dispose(); + database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER, premium INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 98").stepThis().dispose(); + version = 98; + } + + if (version == 98) { + database.executeFast("CREATE TABLE animated_emoji(document_id INTEGER PRIMARY KEY, data BLOB);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 99").stepThis().dispose(); + version = 99; + } + + if (version == 99) { + database.executeFast("ALTER TABLE stickers_featured ADD COLUMN emoji INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 100").stepThis().dispose(); + version = 100; + } + + if (version == 100) { + database.executeFast("CREATE TABLE emoji_statuses(data BLOB, type INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 101").stepThis().dispose(); + version = 101; + } + + if (version == 101) { + database.executeFast("ALTER TABLE messages_v2 ADD COLUMN group_id INTEGER default NULL").stepThis().dispose(); + database.executeFast("ALTER TABLE dialogs ADD COLUMN last_mid_group INTEGER default NULL").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_groupid_messages_v2 ON messages_v2(uid, mid, group_id);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 102").stepThis().dispose(); + version = 102; + } + + if (version == 102) { + database.executeFast("CREATE TABLE messages_holes_topics(uid INTEGER, topic_id INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, topic_id, start));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_messages_holes ON messages_holes_topics(uid, topic_id, end);").stepThis().dispose(); + + database.executeFast("CREATE TABLE messages_topics(mid INTEGER, uid INTEGER, topic_id INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER, media INTEGER, replydata BLOB, imp INTEGER, mention INTEGER, forwards INTEGER, replies_data BLOB, thread_reply_id INTEGER, is_channel INTEGER, reply_to_message_id INTEGER, custom_params BLOB, PRIMARY KEY(mid, topic_id, uid))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_read_out_idx_messages_topics ON messages_topics(uid, mid, read_state, out);").stepThis().dispose();//move to topic id + database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages_topics ON messages_topics(uid, date, mid);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages_topics ON messages_topics(mid, out);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS task_idx_messages_topics ON messages_topics(uid, out, read_state, ttl, date, send_state);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_messages_topics ON messages_topics(mid, send_state, date);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages_topics ON messages_topics(uid, mention, read_state);").stepThis().dispose();//move to uid, topic_id, mentiin_read_state + database.executeFast("CREATE INDEX IF NOT EXISTS is_channel_idx_messages_topics ON messages_topics(mid, is_channel);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_messages_topics ON messages_topics(mid, reply_to_message_id);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS mid_uid_messages_topics ON messages_topics(mid, uid);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS mid_uid_topic_id_messages_topics ON messages_topics(mid, topic_id, uid);").stepThis().dispose(); + + database.executeFast("CREATE TABLE media_topics(mid INTEGER, uid INTEGER, topic_id INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid, topic_id, type))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_topics ON media_topics(uid, topic_id, mid, type, date);").stepThis().dispose(); + + database.executeFast("CREATE TABLE media_holes_topics(uid INTEGER, topic_id INTEGER, type INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, topic_id, type, start));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_media_holes_topics ON media_holes_topics(uid, topic_id, type, end);").stepThis().dispose(); + + database.executeFast("CREATE TABLE topics(did INTEGER, topic_id INTEGER, data BLOB, top_message INTEGER, topic_message BLOB, unread_count INTEGER, max_read_id INTEGER, unread_mentions INTEGER, unread_reactions INTEGER, PRIMARY KEY(did, topic_id));").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS did_top_message_topics ON topics(did, top_message);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 103").stepThis().dispose(); + version = 103; + } + + if (version == 103) { + database.executeFast("CREATE TABLE IF NOT EXISTS media_counts_topics(uid INTEGER, topic_id INTEGER, type INTEGER, count INTEGER, old INTEGER, PRIMARY KEY(uid, topic_id, type))").stepThis().dispose(); + database.executeFast("CREATE TABLE IF NOT EXISTS reaction_mentions_topics(message_id INTEGER, state INTEGER, dialog_id INTEGER, topic_id INTEGER, PRIMARY KEY(message_id, dialog_id, topic_id))").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_topics_did ON reaction_mentions_topics(dialog_id, topic_id);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 104").stepThis().dispose(); + version = 104; + } + + if (version == 104) { + database.executeFast("ALTER TABLE topics ADD COLUMN read_outbox INTEGER default 0").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 105").stepThis().dispose(); + version = 105; + } + + if (version == 105) { + database.executeFast("ALTER TABLE topics ADD COLUMN pinned INTEGER default 0").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 106").stepThis().dispose(); + version = 106; + } + + if (version == 106) { + database.executeFast("DROP INDEX IF EXISTS uid_mid_read_out_idx_messages_topics").stepThis().dispose(); + database.executeFast("DROP INDEX IF EXISTS uid_mention_idx_messages_topics").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_read_out_idx_messages_topics ON messages_topics(uid, topic_id, mid, read_state, out);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages_topics ON messages_topics(uid, topic_id, mention, read_state);").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS uid_topic_id_messages_topics ON messages_topics(uid, topic_id);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_topic_id_date_mid_messages_topics ON messages_topics(uid, topic_id, date, mid);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS uid_topic_id_mid_messages_topics ON messages_topics(uid, topic_id, mid);").stepThis().dispose(); + + database.executeFast("CREATE INDEX IF NOT EXISTS did_topics ON topics(did);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 107").stepThis().dispose(); + version = 107; + } + + if (version == 107) { + database.executeFast("ALTER TABLE topics ADD COLUMN total_messages_count INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 108").stepThis().dispose(); + version = 108; + } + + if (version == 108) { + database.executeFast("ALTER TABLE topics ADD COLUMN hidden INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 109").stepThis().dispose(); + version = 109; + } + + if (version == 109) { + database.executeFast("ALTER TABLE dialogs ADD COLUMN ttl_period INTEGER default 0").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 110").stepThis().dispose(); + version = 110; + } + + return version; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java index 30b87c88b..1bf846e35 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java @@ -8,7 +8,10 @@ package org.telegram.messenger; +import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; public class DialogObject { @@ -98,4 +101,66 @@ public class DialogObject { public static int getFolderId(long dialogId) { return (int) dialogId; } + + public static String getDialogTitle(TLObject dialog) { + return setDialogPhotoTitle(null, null, dialog); + } + + public static String setDialogPhotoTitle(ImageReceiver imageReceiver, AvatarDrawable avatarDrawable, TLObject dialog) { + String title = ""; + if (dialog instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) dialog; + if (UserObject.isReplyUser(user)) { + title = LocaleController.getString("RepliesTitle", R.string.RepliesTitle); + if (avatarDrawable != null) { + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); + } + if (imageReceiver != null) { + imageReceiver.setForUserOrChat(null, avatarDrawable); + } + } else if (UserObject.isUserSelf(user)) { + title = LocaleController.getString("SavedMessages", R.string.SavedMessages); + if (avatarDrawable != null) { + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); + } + if (imageReceiver != null) { + imageReceiver.setForUserOrChat(null, avatarDrawable); + } + } else { + title = UserObject.getUserName(user); + if (avatarDrawable != null) { + avatarDrawable.setInfo(user); + } + if (imageReceiver != null) { + imageReceiver.setForUserOrChat(dialog, avatarDrawable); + } + } + } else if (dialog instanceof TLRPC.Chat) { + TLRPC.Chat chat = (TLRPC.Chat) dialog; + title = chat.title; + if (avatarDrawable != null) { + avatarDrawable.setInfo(chat); + } + if (imageReceiver != null) { + imageReceiver.setForUserOrChat(dialog, avatarDrawable); + } + } + return title; + } + + public static String setDialogPhotoTitle(BackupImageView imageView, TLObject dialog) { + if (imageView != null) { + return setDialogPhotoTitle(imageView.getImageReceiver(), imageView.getAvatarDrawable(), dialog); + } + return setDialogPhotoTitle(null, null, dialog); + } + + public static String getPublicUsername(TLObject dialog) { + if (dialog instanceof TLRPC.Chat) { + return ChatObject.getPublicUsername((TLRPC.Chat) dialog); + } else if (dialog instanceof TLRPC.User) { + return UserObject.getPublicUsername((TLRPC.User) dialog); + } + return null; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java b/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java index 06b79e162..b943fd284 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DownloadController.java @@ -1108,14 +1108,26 @@ public class DownloadController extends BaseController implements NotificationCe public void startDownloadFile(TLRPC.Document document, MessageObject parentObject) { - if (parentObject.getDocument() == null) { + if (parentObject == null) { + return; + } + TLRPC.Document parentDocument = parentObject.getDocument(); + if (parentDocument == null) { return; } AndroidUtilities.runOnUIThread(() -> { + if (parentDocument == null) { + return; + } boolean contains = false; for (int i = 0; i < recentDownloadingFiles.size(); i++) { - if (recentDownloadingFiles.get(i).getDocument() != null && recentDownloadingFiles.get(i).getDocument().id == parentObject.getDocument().id) { + MessageObject messageObject = recentDownloadingFiles.get(i); + if (messageObject == null) { + continue; + } + TLRPC.Document document1 = messageObject.getDocument(); + if (document1 != null && document1.id == parentDocument.id) { contains = true; break; } @@ -1123,7 +1135,12 @@ public class DownloadController extends BaseController implements NotificationCe if (!contains) { for (int i = 0; i < downloadingFiles.size(); i++) { - if (downloadingFiles.get(i).getDocument() != null && downloadingFiles.get(i).getDocument().id == parentObject.getDocument().id) { + MessageObject messageObject = downloadingFiles.get(i); + if (messageObject == null) { + continue; + } + TLRPC.Document document1 = messageObject.getDocument(); + if (document1 != null && document1.id == parentDocument.id) { contains = true; break; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java index 59c99d67b..6e385e255 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java @@ -24,7 +24,6 @@ import android.text.TextPaint; import android.text.TextUtils; import android.text.style.DynamicDrawableSpan; import android.text.style.ImageSpan; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -330,9 +329,9 @@ public class Emoji { this.end = end; this.code = code; } - int start; - int end; - CharSequence code; + public int start; + public int end; + public CharSequence code; } public static boolean fullyConsistsOfEmojis(CharSequence cs) { @@ -505,10 +504,14 @@ public class Emoji { s = Spannable.Factory.getInstance().newSpannable(cs.toString()); } ArrayList emojis = parseEmojis(s, emojiOnly); + if (emojis.isEmpty()) { + return cs; + } AnimatedEmojiSpan[] animatedEmojiSpans = s.getSpans(0, s.length(), AnimatedEmojiSpan.class); EmojiSpan span; Drawable drawable; + int limitCount = SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH ? 100 : 50; for (int i = 0; i < emojis.size(); ++i) { try { EmojiSpanRange emojiRange = emojis.get(i); @@ -534,7 +537,6 @@ public class Emoji { } catch (Exception e) { FileLog.e(e); } - int limitCount = SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH ? 100 : 50; if ((Build.VERSION.SDK_INT < 23 || Build.VERSION.SDK_INT >= 29)/* && !BuildVars.DEBUG_PRIVATE_VERSION*/ && (i + 1) >= limitCount) { break; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index 3681d9c60..f200a952f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -16,6 +16,7 @@ import org.telegram.ui.LaunchActivity; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.util.ArrayList; @@ -186,6 +187,7 @@ public class FileLoadOperation { private File tempPath; private boolean isForceRequest; private int priority; + private long fileDialogId; private boolean ungzip; @@ -218,6 +220,7 @@ public class FileLoadOperation { public FileLoadOperation(ImageLocation imageLocation, Object parent, String extension, long size) { updateParams(); parentObject = parent; + fileDialogId = FileLoader.getDialogIdFromParent(currentAccount, parentObject); isStream = imageLocation.imageType == FileLoader.IMAGE_TYPE_ANIMATION; if (imageLocation.isEncrypted()) { location = new TLRPC.TL_inputEncryptedFileLocation(); @@ -324,6 +327,7 @@ public class FileLoadOperation { updateParams(); try { parentObject = parent; + fileDialogId = FileLoader.getDialogIdFromParent(currentAccount, parentObject); if (documentLocation instanceof TLRPC.TL_documentEncrypted) { location = new TLRPC.TL_inputEncryptedFileLocation(); location.id = documentLocation.id; @@ -827,6 +831,7 @@ public class FileLoadOperation { finalFileExist = false; } + if (!finalFileExist) { cacheFileTemp = new File(tempPath, fileNameTemp); if (ungzip) { @@ -964,6 +969,11 @@ public class FileLoadOperation { } } + if (fileDialogId != 0) { + FileLoader.getInstance(currentAccount).getFileDatabase().saveFileDialogId(cacheFileParts, fileDialogId); + FileLoader.getInstance(currentAccount).getFileDatabase().saveFileDialogId(cacheFileTemp, fileDialogId); + } + if (cacheFileTemp.exists()) { if (newKeyGenerated) { cacheFileTemp.delete(); @@ -1281,6 +1291,14 @@ public class FileLoadOperation { if (BuildVars.DEBUG_VERSION) { FileLog.d("finished preloading file to " + cacheFileTemp + " loaded " + totalPreloadedBytes + " of " + totalBytesCount); } + if (fileDialogId != 0) { + if (cacheFileTemp != null) { + FileLoader.getInstance(currentAccount).getFileDatabase().removeFiles(Collections.singletonList(cacheFileTemp)); + } + if (cacheFileParts != null) { + FileLoader.getInstance(currentAccount).getFileDatabase().removeFiles(Collections.singletonList(cacheFileParts)); + } + } delegate.didFinishLoadingFile(FileLoadOperation.this, cacheFileFinal); } else { final File cacheIvTempFinal = cacheIvTemp; @@ -1310,7 +1328,7 @@ public class FileLoadOperation { } catch (ZipException zipException) { ungzip = false; } catch (Throwable e) { - FileLog.e(e); + FileLog.e(e, !(e instanceof FileNotFoundException)); if (BuildVars.LOGS_ENABLED) { FileLog.e("unable to ungzip temp = " + cacheFileTempFinal + " to final = " + cacheFileFinal); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index 296df15e1..c3a075f51 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -19,11 +19,14 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class FileLoader extends BaseController { @@ -35,6 +38,30 @@ public class FileLoader extends BaseController { private int priorityIncreasePointer; + private static Pattern sentPattern; + + public static long getDialogIdFromParent(int currentAccount, Object parentObject) { + if (parentObject instanceof String) { + String str = (String) parentObject; + if (str.startsWith("sent_")) { + if (sentPattern == null) { + sentPattern = Pattern.compile("sent_.*_.*_([0-9]+)"); + } + try { + Matcher matcher = sentPattern.matcher(str); + if (matcher.matches()) { + return Long.parseLong(matcher.group(1)); + } + } catch (Exception e) { + FileLog.e(e); + } + } + } else if (parentObject instanceof MessageObject) { + return ((MessageObject) parentObject).getDialogId(); + } + return 0; + } + private int getPriorityValue(int priorityType) { if (priorityType == PRIORITY_STREAM) { return Integer.MAX_VALUE; @@ -51,6 +78,10 @@ public class FileLoader extends BaseController { } } + public DispatchQueue getFileLoaderQueue() { + return fileLoaderQueue; + } + public interface FileLoaderDelegate { void fileUploadProgressChanged(FileUploadOperation operation, String location, long uploadedSize, long totalSize, boolean isEncrypted); @@ -104,7 +135,6 @@ public class FileLoader extends BaseController { private ConcurrentHashMap loadOperationPaths = new ConcurrentHashMap<>(); - private ArrayList activeFileLoadOperation = new ArrayList<>(); private ConcurrentHashMap loadOperationPathsUI = new ConcurrentHashMap<>(10, 1, 2); private HashMap uploadSizes = new HashMap<>(); @@ -498,6 +528,30 @@ public class FileLoader extends BaseController { } } + + public void cancelLoadAllFiles() { + for (String fileName : loadOperationPathsUI.keySet()) { + LoadOperationUIObject uiObject = loadOperationPathsUI.get(fileName); + Runnable runnable = uiObject != null ? uiObject.loadInternalRunnable : null; + boolean removed = uiObject != null; + if (runnable != null) { + fileLoaderQueue.cancelRunnable(runnable); + } + fileLoaderQueue.postRunnable(() -> { + FileLoadOperation operation = loadOperationPaths.remove(fileName); + if (operation != null) { + FileLoaderPriorityQueue queue = operation.getQueue(); + queue.cancel(operation); + } + }); +// if (removed && document != null) { +// AndroidUtilities.runOnUIThread(() -> { +// getNotificationCenter().postNotificationName(NotificationCenter.onDownloadingFilesChanged); +// }); +// } + } + } + public boolean isLoadingFile(final String fileName) { return fileName != null && loadOperationPathsUI.containsKey(fileName); } @@ -713,8 +767,15 @@ public class FileLoader extends BaseController { if (!operation.isPreloadVideoOperation() && operation.isPreloadFinished()) { return; } - if (document != null && parentObject instanceof MessageObject && ((MessageObject) parentObject).putInDownloadsStore) { - getDownloadController().onDownloadComplete((MessageObject) parentObject); + long dialogId = getDialogIdFromParent(currentAccount, parentObject); + if (dialogId != 0) { + getFileLoader().getFileDatabase().saveFileDialogId(finalFile, dialogId); + } + if (parentObject instanceof MessageObject) { + MessageObject messageObject = (MessageObject) parentObject; + if (document != null && messageObject.putInDownloadsStore) { + getDownloadController().onDownloadComplete(messageObject); + } } if (!operation.isPreloadVideoOperation()) { @@ -915,7 +976,7 @@ public class FileLoader extends BaseController { } } } else if (MessageObject.getMedia(message) instanceof TLRPC.TL_messageMediaInvoice) { - TLRPC.WebDocument document = ((TLRPC.TL_messageMediaInvoice) MessageObject.getMedia(message)).photo; + TLRPC.WebDocument document = ((TLRPC.TL_messageMediaInvoice) MessageObject.getMedia(message)).webPhoto; if (document != null) { return Utilities.MD5(document.url) + "." + ImageLoader.getHttpUrlExtension(document.url, getMimeTypePart(document.mime_type)); } @@ -1087,7 +1148,7 @@ public class FileLoader extends BaseController { return new File(dir, getAttachFileName(attach, ext)); } - private FilePathDatabase getFileDatabase() { + public FilePathDatabase getFileDatabase() { return filePathDatabase; } @@ -1498,4 +1559,19 @@ public class FileLoader extends BaseController { private static class LoadOperationUIObject { Runnable loadInternalRunnable; } + + public static byte[] longToBytes(long x) { + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.putLong(x); + return buffer.array(); + } + + public static long bytesToLong(byte[] bytes) { + long l = 0; + for (int i = 0; i < 8; i++) { + l <<= 8; + l ^= bytes[i] & 0xFF; + } + return l; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java index 7cf4f94b8..200ad3bfe 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java @@ -37,6 +37,7 @@ public class FileLog { private File networkFile = null; private File tonlibFile = null; private boolean initied; + public static boolean databaseIsMalformed = false; private OutputStreamWriter tlStreamWriter = null; private File tlRequestsFile = null; @@ -311,7 +312,7 @@ public class FileLog { AndroidUtilities.appCenterLog(e); } if (BuildVars.DEBUG_VERSION && e instanceof SQLiteException && e.getMessage() != null && e.getMessage().contains("disk image is malformed")) { - + databaseIsMalformed = true; } ensureInitied(); e.printStackTrace(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java b/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java index e1a65d098..8b0bbbc7e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FilePathDatabase.java @@ -10,6 +10,7 @@ import org.telegram.SQLite.SQLitePreparedStatement; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.CountDownLatch; public class FilePathDatabase { @@ -21,7 +22,7 @@ public class FilePathDatabase { private File cacheFile; private File shmCacheFile; - private final static int LAST_DB_VERSION = 2; + private final static int LAST_DB_VERSION = 3; private final static String DATABASE_NAME = "file_to_path"; private final static String DATABASE_BACKUP_NAME = "file_to_path_backup"; @@ -56,6 +57,9 @@ public class FilePathDatabase { if (createTable) { database.executeFast("CREATE TABLE paths(document_id INTEGER, dc_id INTEGER, type INTEGER, path TEXT, PRIMARY KEY(document_id, dc_id, type));").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS path_in_paths ON paths(path);").stepThis().dispose(); + + database.executeFast("CREATE TABLE paths_by_dialog_id(path TEXT PRIMARY KEY, dialog_id INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = " + LAST_DB_VERSION).stepThis().dispose(); } else { int version = database.executeInt("PRAGMA user_version"); @@ -95,6 +99,11 @@ public class FilePathDatabase { database.executeFast("PRAGMA user_version = " + 2).stepThis().dispose(); version = 2; } + if (version == 2) { + database.executeFast("CREATE TABLE paths_by_dialog_id(path TEXT PRIMARY KEY, dialog_id INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = " + 3).stepThis().dispose(); + version = 3; + } } private void createBackup() { @@ -271,6 +280,7 @@ public class FilePathDatabase { dispatchQueue.postRunnable(() -> { try { database.executeFast("DELETE FROM paths WHERE 1").stepThis().dispose(); + database.executeFast("DELETE FROM paths_by_dialog_id WHERE 1").stepThis().dispose(); } catch (Exception e) { FileLog.e(e); } @@ -300,6 +310,68 @@ public class FilePathDatabase { return res[0]; } + public void saveFileDialogId(File file, long dialogId) { + if (file == null) { + return; + } + dispatchQueue.postRunnable(() -> { + SQLitePreparedStatement state = null; + try { + state = database.executeFast("REPLACE INTO paths_by_dialog_id VALUES(?, ?)"); + state.requery(); + state.bindString(1, file.getPath()); + state.bindLong(2, dialogId); + state.step(); + } catch (Exception e) { + FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + } + }); + } + + public long getFileDialogId(File file) { + if (file == null) { + return 0; + } + long dialogId = 0; + SQLiteCursor cursor = null; + try { + cursor = database.queryFinalized("SELECT dialog_id FROM paths_by_dialog_id WHERE path = '" + file.getPath() + "'"); + if (cursor.next()) { + dialogId = cursor.longValue(0); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + return dialogId; + } + + public DispatchQueue getQueue() { + return dispatchQueue; + } + + public void removeFiles(List filesToRemove) { + dispatchQueue.postRunnable(() -> { + try { + database.beginTransaction(); + for (int i = 0; i < filesToRemove.size(); i++) { + database.executeFast("DELETE FROM paths_by_dialog_id WHERE path = '" + filesToRemove.get(i).getPath() + "'").stepThis().dispose(); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + database.commitTransaction(); + } + }); + } + public static class PathData { public final long id; public final int dc; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java index d52dd1830..aa9a3bb02 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileRefController.java @@ -458,7 +458,7 @@ public class FileRefController extends BaseController { } } else if (string.startsWith("sent_")) { String[] params = string.split("_"); - if (params.length == 3) { + if (params.length >= 3) { long channelId = Utilities.parseLong(params[1]); if (channelId != 0) { TLRPC.TL_channels_getMessages req = new TLRPC.TL_channels_getMessages(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java index 6ead2534c..f208907fe 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java @@ -257,7 +257,7 @@ public class FileUploadOperation { if (stream == null) { File cacheFile = new File(uploadingFilePath); if (AndroidUtilities.isInternalUri(Uri.fromFile(cacheFile))) { - throw new Exception("trying to upload internal file"); + throw new FileLog.IgnoreSentException("trying to upload internal file"); } stream = new RandomAccessFile(cacheFile, "r"); boolean isInternalFile = false; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java index 42f9adfb0..237f27e55 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/GoogleLocationProvider.java @@ -29,7 +29,7 @@ public class GoogleLocationProvider implements ILocationServiceProvider { @Override public void init(Context context) { locationProviderClient = LocationServices.getFusedLocationProviderClient(context); - settingsClient = new SettingsClient(context); + settingsClient = LocationServices.getSettingsClient(context); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java index 862ef50cc..e3af7cb76 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java @@ -28,7 +28,6 @@ import android.os.Environment; import android.os.SystemClock; import android.provider.MediaStore; import android.text.TextUtils; -import android.util.Log; import android.util.SparseArray; import androidx.exifinterface.media.ExifInterface; @@ -1354,7 +1353,7 @@ public class ImageLoader { } } } catch (Throwable e) { - FileLog.e(e); + FileLog.e(e, !(e instanceof FileNotFoundException)); } } else { try { @@ -1399,7 +1398,8 @@ public class ImageLoader { Utilities.loadWebpImage(image, buffer, buffer.limit(), null, !opts.inPurgeable); file.close(); } else { - if (opts.inPurgeable || secureDocumentKey != null || Build.VERSION.SDK_INT <= 29) { + try { + RandomAccessFile f = new RandomAccessFile(cacheFileFinal, "r"); int len = (int) f.length(); int offset = 0; @@ -1426,7 +1426,11 @@ public class ImageLoader { if (!error) { image = BitmapFactory.decodeByteArray(data, offset, len, opts); } - } else { + } catch (Throwable e) { + + } + + if (image == null) { FileInputStream is; if (inEncryptedFile) { is = new EncryptedFileInputStream(cacheFileFinal, cacheImage.encryptionKeyPath); @@ -1623,7 +1627,7 @@ public class ImageLoader { toSet = bitmapDrawable; } else { Bitmap image = bitmapDrawable.getBitmap(); - image.recycle(); + AndroidUtilities.recycleBitmap(image); } if (toSet != null && incrementUseCount) { incrementUseCount(cacheImage.key); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java index 619f54a8b..ef5264ba6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java @@ -44,6 +44,17 @@ import java.util.ArrayList; public class ImageReceiver implements NotificationCenter.NotificationCenterDelegate { + public boolean updateThumbShaderMatrix() { + if (currentThumbDrawable != null && thumbShader != null) { + drawDrawable(null, currentThumbDrawable, 255, thumbShader, 0, 0, null); + return true; + } if (staticThumbDrawable != null && thumbShader != null) { + drawDrawable(null, staticThumbDrawable, 255, thumbShader, 0, 0, null); + return true; + } + return false; + } + public interface ImageReceiverDelegate { void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb, boolean memCache); @@ -208,7 +219,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private String currentThumbKey; private int thumbTag; private Drawable currentThumbDrawable; - private BitmapShader thumbShader; + public BitmapShader thumbShader; private int thumbOrientation; private ImageLocation currentMediaLocation; @@ -378,13 +389,15 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (userFull == null) { MessagesController.getInstance(currentAccount).loadFullUser(user, currentGuid, false); } else { - if (userFull.profile_photo != null) { - TLRPC.Photo photo = userFull.profile_photo; - if (photo != null && photo.video_sizes != null && !photo.video_sizes.isEmpty()) { - TLRPC.VideoSize videoSize = photo.video_sizes.get(0); - for (int i = 0; i < photo.video_sizes.size(); i++) { - if ("p".equals(photo.video_sizes.get(i).type)) { - videoSize = photo.video_sizes.get(i); + TLRPC.Photo photo = userFull.profile_photo; + if (photo != null) { + ArrayList videoSizes = photo.video_sizes; + if (videoSizes != null && !videoSizes.isEmpty()) { + TLRPC.VideoSize videoSize = videoSizes.get(0); + for (int i = 0; i < videoSizes.size(); i++) { + TLRPC.VideoSize videoSize1 = videoSizes.get(i); + if ("p".equals(videoSize1.type)) { + videoSize = videoSize1; break; } } @@ -1170,10 +1183,12 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (isRoundRect) { try { - if (roundRadius[0] == 0) { - canvas.drawRect(roundRect, roundPaint); - } else { - canvas.drawRoundRect(roundRect, roundRadius[0], roundRadius[0], roundPaint); + if (canvas != null) { + if (roundRadius[0] == 0) { + canvas.drawRect(roundRect, roundPaint); + } else { + canvas.drawRoundRect(roundRect, roundRadius[0], roundRadius[0], roundPaint); + } } } catch (Exception e) { onBitmapException(bitmapDrawable); @@ -1187,7 +1202,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg roundPath.reset(); roundPath.addRoundRect(roundRect, radii, Path.Direction.CW); roundPath.close(); - canvas.drawPath(roundPath, roundPaint); + if (canvas != null) { + canvas.drawPath(roundPath, roundPaint); + } } } } else { @@ -1273,16 +1290,18 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (isRoundRect) { try { - if (roundRadius[0] == 0) { - if (reactionLastFrame) { - AndroidUtilities.rectTmp.set(roundRect); - AndroidUtilities.rectTmp.inset(-(drawRegion.width() * ReactionLastFrame.LAST_FRAME_SCALE - drawRegion.width()) / 2f, -(drawRegion.height() * ReactionLastFrame.LAST_FRAME_SCALE - drawRegion.height()) / 2f); - canvas.drawRect(AndroidUtilities.rectTmp, roundPaint); + if (canvas != null) { + if (roundRadius[0] == 0) { + if (reactionLastFrame) { + AndroidUtilities.rectTmp.set(roundRect); + AndroidUtilities.rectTmp.inset(-(drawRegion.width() * ReactionLastFrame.LAST_FRAME_SCALE - drawRegion.width()) / 2f, -(drawRegion.height() * ReactionLastFrame.LAST_FRAME_SCALE - drawRegion.height()) / 2f); + canvas.drawRect(AndroidUtilities.rectTmp, roundPaint); + } else { + canvas.drawRect(roundRect, roundPaint); + } } else { - canvas.drawRect(roundRect, roundPaint); + canvas.drawRoundRect(roundRect, roundRadius[0], roundRadius[0], roundPaint); } - } else { - canvas.drawRoundRect(roundRect, roundRadius[0], roundRadius[0], roundPaint); } } catch (Exception e) { if (backgroundThreadDrawHolder == null) { @@ -1298,7 +1317,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg roundPath.reset(); roundPath.addRoundRect(roundRect, radii, Path.Direction.CW); roundPath.close(); - canvas.drawPath(roundPath, roundPaint); + if (canvas != null) { + canvas.drawPath(roundPath, roundPaint); + } } } } @@ -1339,104 +1360,106 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg canvas.restore(); } } else { - if (Math.abs(scaleW - scaleH) > 0.00001f) { - canvas.save(); - if (clip) { - canvas.clipRect(imageX, imageY, imageX + imageW, imageY + imageH); - } - - if (orientation % 360 != 0) { - if (centerRotation) { - canvas.rotate(orientation, imageW / 2, imageH / 2); - } else { - canvas.rotate(orientation, 0, 0); + if (canvas != null) { + if (Math.abs(scaleW - scaleH) > 0.00001f) { + canvas.save(); + if (clip) { + canvas.clipRect(imageX, imageY, imageX + imageW, imageY + imageH); } - } - if (bitmapW / scaleH > imageW) { - bitmapW /= scaleH; - drawRegion.set(imageX - (bitmapW - imageW) / 2.0f, imageY, imageX + (bitmapW + imageW) / 2.0f, imageY + imageH); + if (orientation % 360 != 0) { + if (centerRotation) { + canvas.rotate(orientation, imageW / 2, imageH / 2); + } else { + canvas.rotate(orientation, 0, 0); + } + } + + if (bitmapW / scaleH > imageW) { + bitmapW /= scaleH; + drawRegion.set(imageX - (bitmapW - imageW) / 2.0f, imageY, imageX + (bitmapW + imageW) / 2.0f, imageY + imageH); + } else { + bitmapH /= scaleW; + drawRegion.set(imageX, imageY - (bitmapH - imageH) / 2.0f, imageX + imageW, imageY + (bitmapH + imageH) / 2.0f); + } + if (bitmapDrawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(imageX, imageY, imageW, imageH); + } + if (backgroundThreadDrawHolder == null) { + if (orientation % 360 == 90 || orientation % 360 == 270) { + float width = drawRegion.width() / 2; + float height = drawRegion.height() / 2; + float centerX = drawRegion.centerX(); + float centerY = drawRegion.centerY(); + bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); + } else { + bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + } + } + if (isVisible) { + try { + if (Build.VERSION.SDK_INT >= 29) { + if (blendMode != null) { + bitmapDrawable.getPaint().setBlendMode((BlendMode) blendMode); + } else { + bitmapDrawable.getPaint().setBlendMode(null); + } + } + drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); + } catch (Exception e) { + if (backgroundThreadDrawHolder == null) { + onBitmapException(bitmapDrawable); + } + FileLog.e(e); + } + } + + canvas.restore(); } else { - bitmapH /= scaleW; - drawRegion.set(imageX, imageY - (bitmapH - imageH) / 2.0f, imageX + imageW, imageY + (bitmapH + imageH) / 2.0f); - } - if (bitmapDrawable instanceof AnimatedFileDrawable) { - ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(imageX, imageY, imageW, imageH); - } - if (backgroundThreadDrawHolder == null) { - if (orientation % 360 == 90 || orientation % 360 == 270) { - float width = drawRegion.width() / 2; - float height = drawRegion.height() / 2; - float centerX = drawRegion.centerX(); - float centerY = drawRegion.centerY(); - bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); - } else { - bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); - } - } - if (isVisible) { - try { - if (Build.VERSION.SDK_INT >= 29) { - if (blendMode != null) { - bitmapDrawable.getPaint().setBlendMode((BlendMode) blendMode); - } else { - bitmapDrawable.getPaint().setBlendMode(null); - } + canvas.save(); + if (orientation % 360 != 0) { + if (centerRotation) { + canvas.rotate(orientation, imageW / 2, imageH / 2); + } else { + canvas.rotate(orientation, 0, 0); } - drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); - } catch (Exception e) { - if (backgroundThreadDrawHolder == null) { + } + drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH); + if (isRoundVideo) { + drawRegion.inset(-AndroidUtilities.roundMessageInset, -AndroidUtilities.roundMessageInset); + } + if (bitmapDrawable instanceof AnimatedFileDrawable) { + ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(imageX, imageY, imageW, imageH); + } + if (backgroundThreadDrawHolder == null) { + if (orientation % 360 == 90 || orientation % 360 == 270) { + float width = drawRegion.width() / 2; + float height = drawRegion.height() / 2; + float centerX = drawRegion.centerX(); + float centerY = drawRegion.centerY(); + bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); + } else { + bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); + } + } + if (isVisible) { + try { + if (Build.VERSION.SDK_INT >= 29) { + if (blendMode != null) { + bitmapDrawable.getPaint().setBlendMode((BlendMode) blendMode); + } else { + bitmapDrawable.getPaint().setBlendMode(null); + } + } + + drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); + } catch (Exception e) { onBitmapException(bitmapDrawable); + FileLog.e(e); } - FileLog.e(e); } + canvas.restore(); } - - canvas.restore(); - } else { - canvas.save(); - if (orientation % 360 != 0) { - if (centerRotation) { - canvas.rotate(orientation, imageW / 2, imageH / 2); - } else { - canvas.rotate(orientation, 0, 0); - } - } - drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH); - if (isRoundVideo) { - drawRegion.inset(-AndroidUtilities.roundMessageInset, -AndroidUtilities.roundMessageInset); - } - if (bitmapDrawable instanceof AnimatedFileDrawable) { - ((AnimatedFileDrawable) bitmapDrawable).setActualDrawRect(imageX, imageY, imageW, imageH); - } - if (backgroundThreadDrawHolder == null) { - if (orientation % 360 == 90 || orientation % 360 == 270) { - float width = drawRegion.width() / 2; - float height = drawRegion.height() / 2; - float centerX = drawRegion.centerX(); - float centerY = drawRegion.centerY(); - bitmapDrawable.setBounds((int) (centerX - height), (int) (centerY - width), (int) (centerX + height), (int) (centerY + width)); - } else { - bitmapDrawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); - } - } - if (isVisible) { - try { - if (Build.VERSION.SDK_INT >= 29) { - if (blendMode != null) { - bitmapDrawable.getPaint().setBlendMode((BlendMode) blendMode); - } else { - bitmapDrawable.getPaint().setBlendMode(null); - } - } - - drawBitmapDrawable(canvas, bitmapDrawable, backgroundThreadDrawHolder, alpha); - } catch (Exception e) { - onBitmapException(bitmapDrawable); - FileLog.e(e); - } - } - canvas.restore(); } } } @@ -1464,7 +1487,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } drawable.setBounds((int) drawRegion.left, (int) drawRegion.top, (int) drawRegion.right, (int) drawRegion.bottom); } - if (isVisible) { + if (isVisible && canvas != null) { try { drawable.setAlpha(alpha); if (backgroundThreadDrawHolder != null) { @@ -1511,7 +1534,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg } else { bitmapDrawable.setAlpha(alpha); if (bitmapDrawable instanceof RLottieDrawable) { - ((RLottieDrawable) bitmapDrawable).drawInternal(canvas, false, currentTime, 0); + ((RLottieDrawable) bitmapDrawable).drawInternal(canvas, null, false, currentTime, 0); } else if (bitmapDrawable instanceof AnimatedFileDrawable) { ((AnimatedFileDrawable) bitmapDrawable).drawInternal(canvas, false, currentTime, 0); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java index adac600ff..e33a1a7aa 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java @@ -414,7 +414,9 @@ public class LocaleController { public static String getLanguageFlag(String countryCode) { if (countryCode.length() != 2 || countryCode.equals("YL")) return null; - if (countryCode.equals("XG")) { + if (countryCode.equals("FT")) { + return "\uD83C\uDFF4\u200D\u2620\uFE0F"; + } else if (countryCode.equals("XG")) { return "\uD83D\uDEF0"; } else if (countryCode.equals("XV")){ return "\uD83C\uDF0D"; @@ -1056,10 +1058,11 @@ public class LocaleController { String param = getInstance().stringForQuantity(getInstance().currentPluralRules.quantityForNumber(plural)); param = key + "_" + param; int resourceId = ApplicationLoader.applicationContext.getResources().getIdentifier(param, "string", ApplicationLoader.applicationContext.getPackageName()); + int fallbackResourceId = ApplicationLoader.applicationContext.getResources().getIdentifier(key + "_other", "string", ApplicationLoader.applicationContext.getPackageName()); Object[] argsWithPlural = new Object[args.length + 1]; argsWithPlural[0] = plural; System.arraycopy(args, 0, argsWithPlural, 1, args.length); - return formatString(param, key + "_other", resourceId, argsWithPlural); + return formatString(param, key + "_other", resourceId, fallbackResourceId, argsWithPlural); } public static String formatPluralStringComma(String key, int plural) { @@ -1108,10 +1111,10 @@ public class LocaleController { } public static String formatString(String key, int res, Object... args) { - return formatString(key, null, res, args); + return formatString(key, null, res, 0, args); } - public static String formatString(String key, String fallback, int res, Object... args) { + public static String formatString(String key, String fallback, int res, int fallbackRes, Object... args) { try { String value = BuildVars.USE_CLOUD_STRINGS ? getInstance().localeValues.get(key) : null; if (value == null) { @@ -1119,7 +1122,15 @@ public class LocaleController { value = getInstance().localeValues.get(fallback); } if (value == null) { - value = ApplicationLoader.applicationContext.getString(res); + try { + value = ApplicationLoader.applicationContext.getString(res); + } catch (Exception e) { + if (fallbackRes != 0) { + try { + value = ApplicationLoader.applicationContext.getString(fallbackRes); + } catch (Exception ignored) {} + } + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocationSharingService.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocationSharingService.java index aaf5a60dc..91f68f78f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocationSharingService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocationSharingService.java @@ -128,25 +128,29 @@ public class LocationSharingService extends Service implements NotificationCente if (getInfos().isEmpty()) { stopSelf(); } - if (builder == null) { - Intent intent2 = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); - intent2.setAction("org.tmessages.openlocations"); - intent2.addCategory(Intent.CATEGORY_LAUNCHER); - PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent2, PendingIntent.FLAG_MUTABLE); + try { + if (builder == null) { + Intent intent2 = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); + intent2.setAction("org.tmessages.openlocations"); + intent2.addCategory(Intent.CATEGORY_LAUNCHER); + PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent2, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); - builder = new NotificationCompat.Builder(ApplicationLoader.applicationContext); - builder.setWhen(System.currentTimeMillis()); - builder.setSmallIcon(R.drawable.live_loc); - builder.setContentIntent(contentIntent); - NotificationsController.checkOtherNotificationsChannel(); - builder.setChannelId(NotificationsController.OTHER_NOTIFICATIONS_CHANNEL); - builder.setContentTitle(LocaleController.getString("AppName", R.string.AppName)); - Intent stopIntent = new Intent(ApplicationLoader.applicationContext, StopLiveLocationReceiver.class); - builder.addAction(0, LocaleController.getString("StopLiveLocation", R.string.StopLiveLocation), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, stopIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)); + builder = new NotificationCompat.Builder(ApplicationLoader.applicationContext); + builder.setWhen(System.currentTimeMillis()); + builder.setSmallIcon(R.drawable.live_loc); + builder.setContentIntent(contentIntent); + NotificationsController.checkOtherNotificationsChannel(); + builder.setChannelId(NotificationsController.OTHER_NOTIFICATIONS_CHANNEL); + builder.setContentTitle(LocaleController.getString("AppName", R.string.AppName)); + Intent stopIntent = new Intent(ApplicationLoader.applicationContext, StopLiveLocationReceiver.class); + builder.addAction(0, LocaleController.getString("StopLiveLocation", R.string.StopLiveLocation), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, stopIntent, PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)); + } + + updateNotification(false); + startForeground(6, builder.build()); + } catch (Throwable e) { + FileLog.e(e); } - - updateNotification(false); - startForeground(6, builder.build()); return Service.START_NOT_STICKY; } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java index b46b1025c..8d878c024 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java @@ -1071,16 +1071,23 @@ public class MediaDataController extends BaseController { return getStickerSet(inputStickerSet, cacheOnly, null); } - public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputStickerSet, boolean cacheOnly, Runnable onNotFound) { + public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputStickerSet, boolean cacheOnly, Utilities.Callback onResponse) { if (inputStickerSet == null) { return null; } + TLRPC.TL_messages_stickerSet cacheSet = null; if (inputStickerSet instanceof TLRPC.TL_inputStickerSetID && stickerSetsById.containsKey(inputStickerSet.id)) { - return stickerSetsById.get(inputStickerSet.id); + cacheSet = stickerSetsById.get(inputStickerSet.id); } else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetShortName && inputStickerSet.short_name != null && stickerSetsByName.containsKey(inputStickerSet.short_name.toLowerCase())) { - return stickerSetsByName.get(inputStickerSet.short_name.toLowerCase()); + cacheSet = stickerSetsByName.get(inputStickerSet.short_name.toLowerCase()); } else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiDefaultStatuses && stickerSetDefaultStatuses != null) { - return stickerSetDefaultStatuses; + cacheSet = stickerSetDefaultStatuses; + } + if (cacheSet != null) { + if (onResponse != null) { + onResponse.run(cacheSet); + } + return cacheSet; } if (cacheOnly) { return null; @@ -1100,11 +1107,16 @@ public class MediaDataController extends BaseController { stickerSetDefaultStatuses = set; } getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set); + if (onResponse != null) { + onResponse.run(set); + } }); } else { - if (onNotFound != null) { - onNotFound.run(); - } + AndroidUtilities.runOnUIThread(() -> { + if (onResponse != null) { + onResponse.run(null); + } + }); } }); return null; @@ -2713,27 +2725,31 @@ public class MediaDataController extends BaseController { } public void preloadStickerSetThumb(TLRPC.TL_messages_stickerSet stickerSet) { - TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(stickerSet.set.thumbs, 90); - if (thumb != null) { - ArrayList documents = stickerSet.documents; - if (documents != null && !documents.isEmpty()) { - loadStickerSetThumbInternal(thumb, stickerSet, documents.get(0), stickerSet.set.thumb_version); + if (stickerSet != null && stickerSet.set != null) { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(stickerSet.set.thumbs, 90); + if (thumb != null) { + ArrayList documents = stickerSet.documents; + if (documents != null && !documents.isEmpty()) { + loadStickerSetThumbInternal(thumb, stickerSet, documents.get(0), stickerSet.set.thumb_version); + } } } } public void preloadStickerSetThumb(TLRPC.StickerSetCovered stickerSet) { - TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(stickerSet.set.thumbs, 90); - if (thumb != null) { - TLRPC.Document sticker; - if (stickerSet.cover != null) { - sticker = stickerSet.cover; - } else if (!stickerSet.covers.isEmpty()) { - sticker = stickerSet.covers.get(0); - } else { - return; + if (stickerSet != null && stickerSet.set != null) { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(stickerSet.set.thumbs, 90); + if (thumb != null) { + TLRPC.Document sticker; + if (stickerSet.cover != null) { + sticker = stickerSet.cover; + } else if (!stickerSet.covers.isEmpty()) { + sticker = stickerSet.covers.get(0); + } else { + return; + } + loadStickerSetThumbInternal(thumb, stickerSet, sticker, stickerSet.set.thumb_version); } - loadStickerSetThumbInternal(thumb, stickerSet, sticker, stickerSet.set.thumb_version); } } @@ -6923,14 +6939,14 @@ public class MediaDataController extends BaseController { } public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, boolean allowAnimated) { - getEmojiSuggestions(langCodes, keyword, fullMatch, callback, null, allowAnimated, null); + getEmojiSuggestions(langCodes, keyword, fullMatch, callback, null, allowAnimated, false, null); } public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, final CountDownLatch sync, boolean allowAnimated) { - getEmojiSuggestions(langCodes, keyword, fullMatch, callback, sync, allowAnimated, null); + getEmojiSuggestions(langCodes, keyword, fullMatch, callback, sync, allowAnimated, false, null); } - public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, final CountDownLatch sync, boolean allowAnimated, Integer maxAnimatedPerEmoji) { + public void getEmojiSuggestions(String[] langCodes, String keyword, boolean fullMatch, KeywordResultCallback callback, final CountDownLatch sync, boolean allowAnimated, boolean allowTopicIcons, Integer maxAnimatedPerEmoji) { if (callback == null) { return; } @@ -7042,7 +7058,7 @@ public class MediaDataController extends BaseController { }); String aliasFinal = alias; if (allowAnimated && SharedConfig.suggestAnimatedEmoji) { - fillWithAnimatedEmoji(result, maxAnimatedPerEmoji, () -> { + fillWithAnimatedEmoji(result, maxAnimatedPerEmoji, allowTopicIcons, () -> { if (sync != null) { callback.run(result, aliasFinal); sync.countDown(); @@ -7070,14 +7086,14 @@ public class MediaDataController extends BaseController { private boolean triedLoadingEmojipacks = false; - public void fillWithAnimatedEmoji(ArrayList result, Integer maxAnimatedPerEmojiInput, Runnable onDone) { + public void fillWithAnimatedEmoji(ArrayList result, Integer maxAnimatedPerEmojiInput, boolean allowTopicIcons, Runnable onDone) { if (result == null || result.isEmpty()) { if (onDone != null) { onDone.run(); } return; } - final ArrayList[] emojiPacks = new ArrayList[2]; + final ArrayList[] emojiPacks = new ArrayList[1]; emojiPacks[0] = getStickerSets(TYPE_EMOJIPACKS); final Runnable fillRunnable = () -> { ArrayList featuredSets = getFeaturedEmojiSets(); @@ -7085,13 +7101,29 @@ public class MediaDataController extends BaseController { ArrayList animatedEmoji = new ArrayList<>(); final int maxAnimatedPerEmoji = maxAnimatedPerEmojiInput == null ? (result.size() > 5 ? 1 : (result.size() > 2 ? 2 : 3)) : maxAnimatedPerEmojiInput; int len = maxAnimatedPerEmojiInput == null ? Math.min(15, result.size()) : result.size(); + boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + String topicIconsName = null; + if (allowTopicIcons) { + topicIconsName = UserConfig.getInstance(currentAccount).defaultTopicIcons; + if (emojiPacks[0] != null) { + TLRPC.TL_messages_stickerSet set = null; + if (topicIconsName != null) { + set = MediaDataController.getInstance(currentAccount).getStickerSetByName(topicIconsName); + if (set == null) { + set = MediaDataController.getInstance(currentAccount).getStickerSetByEmojiOrName(topicIconsName); + } + } + if (set != null) { + emojiPacks[0].add(set); + } + } + } for (int i = 0; i < len; ++i) { String emoji = result.get(i).emoji; if (emoji == null) { continue; } animatedEmoji.clear(); - boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); if (Emoji.recentEmoji != null) { for (int j = 0; j < Emoji.recentEmoji.size(); ++j) { if (Emoji.recentEmoji.get(j).startsWith("animated_")) { @@ -7099,8 +7131,9 @@ public class MediaDataController extends BaseController { long documentId = Long.parseLong(Emoji.recentEmoji.get(j).substring(9)); TLRPC.Document document = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); if (document != null && - (isPremium || MessageObject.isFreeEmoji(document)) && - emoji.equals(MessageObject.findAnimatedEmojiEmoticon(document, null))) { + emoji.equals(MessageObject.findAnimatedEmojiEmoticon(document, null)) && + (isPremium || MessageObject.isFreeEmoji(document)) + ) { animatedEmoji.add(document); } } catch (Exception ignore) { @@ -7127,7 +7160,7 @@ public class MediaDataController extends BaseController { } } - if (attribute != null && emoji.equals(attribute.alt) && (isPremium || attribute.free)) { + if (attribute != null && emoji.equals(attribute.alt) && (isPremium || attribute.free || set.set != null && set.set.short_name != null && set.set.short_name.equals(topicIconsName))) { boolean duplicate = false; for (int l = 0; l < animatedEmoji.size(); ++l) { if (animatedEmoji.get(l).id == document.id) { @@ -7172,7 +7205,7 @@ public class MediaDataController extends BaseController { } } - if (attribute != null && emoji.equals(attribute.alt) && (isPremium || attribute.free)) { + if (attribute != null && emoji.equals(attribute.alt) && (isPremium || attribute.free || set.set != null && set.set.short_name != null && set.set.short_name.equals(topicIconsName))) { boolean duplicate = false; for (int l = 0; l < animatedEmoji.size(); ++l) { if (animatedEmoji.get(l).id == document.id) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 2cdae265c..04ac68ef2 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -28,7 +28,6 @@ import android.text.style.URLSpan; import android.text.util.Linkify; import android.util.Base64; -import androidx.annotation.IntDef; import androidx.collection.LongSparseArray; import org.telegram.PhoneFormat.PhoneFormat; @@ -42,7 +41,6 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.ChatMessageCell; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; -import org.telegram.ui.Components.EmojiView; import org.telegram.ui.Components.Forum.ForumBubbleDrawable; import org.telegram.ui.Components.Forum.ForumUtilities; import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble; @@ -62,8 +60,6 @@ import org.telegram.ui.Components.spoilers.SpoilerEffect; import java.io.BufferedReader; import java.io.File; import java.io.StringReader; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.net.URLEncoder; import java.util.AbstractMap; import java.util.ArrayList; @@ -252,7 +248,7 @@ public class MessageObject { // forwarding preview params public boolean hideSendersName; public TLRPC.Peer sendAsPeer; - public ForumBubbleDrawable[] topicIconDrawable = new ForumBubbleDrawable[1]; + public Drawable[] topicIconDrawable = new Drawable[1]; static final String[] excludeWords = new String[]{ " vs. ", @@ -273,6 +269,7 @@ public class MessageObject { public Drawable customAvatarDrawable; private byte[] randomWaveform; + public boolean drawServiceWithDefaultTypeface; public static boolean hasUnreadReactions(TLRPC.Message message) { if (message == null) { @@ -305,12 +302,16 @@ public class MessageObject { return false; } - public static int getTopicId(TLRPC.Message message) { + private static int getTopicId(TLRPC.Message message) { + return getTopicId(message, false); + } + + public static int getTopicId(TLRPC.Message message, boolean sureIsForum) { if (message != null && message.action instanceof TLRPC.TL_messageActionTopicCreate) { return message.id; } if (message == null || message.reply_to == null || !message.reply_to.forum_topic) { - return 0; + return sureIsForum ? 1 : 0; // 1 = general topic } if (message instanceof TLRPC.TL_messageService && !(message.action instanceof TLRPC.TL_messageActionPinMessage)) { int topicId = message.reply_to.reply_to_msg_id; @@ -1334,12 +1335,9 @@ public class MessageObject { boolean large = emojiOnlyCount == animatedEmojiCount; int cacheType = -1; TextPaint emojiPaint; - switch (emojiOnlyCount) { + switch (Math.max(emojiOnlyCount, animatedEmojiCount)) { case 0: case 1: - cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES_LARGE; - emojiPaint = large ? Theme.chat_msgTextPaintEmoji[0] : Theme.chat_msgTextPaintEmoji[2]; - break; case 2: cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES_LARGE; emojiPaint = large ? Theme.chat_msgTextPaintEmoji[0] : Theme.chat_msgTextPaintEmoji[2]; @@ -1855,7 +1853,11 @@ public class MessageObject { } } else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionDeleteMessage) { message = ((TLRPC.TL_channelAdminLogEventActionDeleteMessage) event.action).message; - messageText = replaceWithLink(LocaleController.getString("EventLogDeletedMessages", R.string.EventLogDeletedMessages), "un1", fromUser); + if (fromUser != null && fromUser.id == MessagesController.getInstance(currentAccount).telegramAntispamUserId) { + messageText = LocaleController.getString("EventLogDeletedMessages", R.string.EventLogDeletedMessages).replace("un1", UserObject.getUserName(fromUser)); + } else { + messageText = replaceWithLink(LocaleController.getString("EventLogDeletedMessages", R.string.EventLogDeletedMessages), "un1", fromUser); + } } else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeLinkedChat) { long newChatId = ((TLRPC.TL_channelAdminLogEventActionChangeLinkedChat) event.action).new_value; long oldChatId = ((TLRPC.TL_channelAdminLogEventActionChangeLinkedChat) event.action).prev_value; @@ -2284,12 +2286,18 @@ public class MessageObject { messageText = replaceWithLink(messageText, "un2", createTopic.topic); } else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionEditTopic) { TLRPC.TL_channelAdminLogEventActionEditTopic editTopic = (TLRPC.TL_channelAdminLogEventActionEditTopic) event.action; - messageText = replaceWithLink( - LocaleController.formatString("EventLogEditTopic", R.string.EventLogEditTopic), - "un1", fromUser - ); - messageText = replaceWithLink(messageText, "un2", editTopic.prev_topic); - messageText = replaceWithLink(messageText, "un3", editTopic.new_topic); + if (editTopic.prev_topic instanceof TLRPC.TL_forumTopic && editTopic.new_topic instanceof TLRPC.TL_forumTopic && + ((TLRPC.TL_forumTopic) editTopic.prev_topic).hidden != ((TLRPC.TL_forumTopic) editTopic.new_topic).hidden) { + String text = ((TLRPC.TL_forumTopic) editTopic.new_topic).hidden ? LocaleController.getString("TopicHidden2", R.string.TopicHidden2) : LocaleController.getString("TopicShown2", R.string.TopicShown2); + messageText = replaceWithLink(text, "%s", fromUser); + } else { + messageText = replaceWithLink( + LocaleController.getString("EventLogEditTopic", R.string.EventLogEditTopic), + "un1", fromUser + ); + messageText = replaceWithLink(messageText, "un2", editTopic.prev_topic); + messageText = replaceWithLink(messageText, "un3", editTopic.new_topic); + } } else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionDeleteTopic) { TLRPC.TL_channelAdminLogEventActionDeleteTopic deleteTopic = (TLRPC.TL_channelAdminLogEventActionDeleteTopic) event.action; messageText = replaceWithLink( @@ -2337,11 +2345,13 @@ public class MessageObject { if (message != null) { message.out = false; + message.realId = message.id; message.id = mid[0]++; message.flags &= ~TLRPC.MESSAGE_FLAG_REPLY; message.reply_to = null; message.flags = message.flags & ~TLRPC.MESSAGE_FLAG_EDITED; MessageObject messageObject = new MessageObject(currentAccount, message, null, null, true, true, eventId); + messageObject.currentEvent = event; if (messageObject.contentType >= 0) { if (mediaController.isPlayingMessage(messageObject)) { MessageObject player = mediaController.getPlayingMessageObject(); @@ -3081,6 +3091,7 @@ public class MessageObject { fromChat = getChat(chats, sChats, messageOwner.from_id.channel_id); } TLObject fromObject = fromUser != null ? fromUser : fromChat; + drawServiceWithDefaultTypeface = false; if (messageOwner instanceof TLRPC.TL_messageService) { if (messageOwner.action != null) { @@ -3347,6 +3358,22 @@ public class MessageObject { } else { messageText = LocaleController.getString("ActionTTLChannelDisabled", R.string.ActionTTLChannelDisabled); } + } else if (action.auto_setting_from != 0) { + drawServiceWithDefaultTypeface = true; + if (action.auto_setting_from == UserConfig.getInstance(currentAccount).clientUserId) { + messageText = AndroidUtilities.replaceTags(LocaleController.formatString("AutoDeleteGlobalActionFromYou", R.string.AutoDeleteGlobalActionFromYou, LocaleController.formatTTLString(action.period))); + } else { + TLObject object = null; + if (users != null) { + users.get(action.auto_setting_from); + } + if (object == null && chats != null) { + object = chats.get(action.auto_setting_from); + } else { + object = fromObject; + } + messageText = replaceWithLink(AndroidUtilities.replaceTags(LocaleController.formatString("AutoDeleteGlobalAction", R.string.AutoDeleteGlobalAction, LocaleController.formatTTLString(action.period))), "un1", object); + } } else if (action.period != 0) { if (isOut()) { messageText = LocaleController.formatString("ActionTTLYouChanged", R.string.ActionTTLYouChanged, LocaleController.formatTTLString(action.period)); @@ -3458,7 +3485,15 @@ public class MessageObject { name = "DELETED"; } - if ((messageOwner.action.flags & 4) > 0) { + if ((messageOwner.action.flags & 8) > 0) { + if (((TLRPC.TL_messageActionTopicEdit) messageOwner.action).hidden) { + messageText = replaceWithLink(LocaleController.getString("TopicHidden2", R.string.TopicHidden2), "%s", object); + messageTextShort = LocaleController.getString("TopicHidden", R.string.TopicHidden); + } else { + messageText = replaceWithLink(LocaleController.getString("TopicShown2", R.string.TopicShown2), "%s", object); + messageTextShort = LocaleController.getString("TopicShown", R.string.TopicShown); + } + } else if ((messageOwner.action.flags & 4) > 0) { if (((TLRPC.TL_messageActionTopicEdit) messageOwner.action).closed) { messageText = replaceWithLink(LocaleController.getString("TopicClosed2", R.string.TopicClosed2), "%s", object); messageTextShort = LocaleController.getString("TopicClosed", R.string.TopicClosed); @@ -3905,7 +3940,7 @@ public class MessageObject { if (document != null) { return document.mime_type; } else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaInvoice) { - TLRPC.WebDocument photo = ((TLRPC.TL_messageMediaInvoice) getMedia(messageOwner)).photo; + TLRPC.WebDocument photo = ((TLRPC.TL_messageMediaInvoice) getMedia(messageOwner)).webPhoto; if (photo != null) { return photo.mime_type; } @@ -5448,23 +5483,27 @@ public class MessageObject { return messageOwner.out; } + Boolean isOutOwnerCached; public boolean isOutOwner() { if (preview) { return true; } + if (isOutOwnerCached != null) { + return isOutOwnerCached; + } TLRPC.Chat chat = messageOwner.peer_id != null && messageOwner.peer_id.channel_id != 0 ? getChat(null, null, messageOwner.peer_id.channel_id) : null; if (!messageOwner.out || !(messageOwner.from_id instanceof TLRPC.TL_peerUser) && (!(messageOwner.from_id instanceof TLRPC.TL_peerChannel) || ChatObject.isChannel(chat) && !chat.megagroup) || messageOwner.post) { - return false; + return isOutOwnerCached = false; } if (messageOwner.fwd_from == null) { - return true; + return isOutOwnerCached= true; } long selfUserId = UserConfig.getInstance(currentAccount).getClientUserId(); if (getDialogId() == selfUserId) { - return messageOwner.fwd_from.from_id instanceof TLRPC.TL_peerUser && messageOwner.fwd_from.from_id.user_id == selfUserId && (messageOwner.fwd_from.saved_from_peer == null || messageOwner.fwd_from.saved_from_peer.user_id == selfUserId) + return isOutOwnerCached = messageOwner.fwd_from.from_id instanceof TLRPC.TL_peerUser && messageOwner.fwd_from.from_id.user_id == selfUserId && (messageOwner.fwd_from.saved_from_peer == null || messageOwner.fwd_from.saved_from_peer.user_id == selfUserId) || messageOwner.fwd_from.saved_from_peer != null && messageOwner.fwd_from.saved_from_peer.user_id == selfUserId && (messageOwner.fwd_from.from_id == null || messageOwner.fwd_from.from_id.user_id == selfUserId); } - return messageOwner.fwd_from.saved_from_peer == null || messageOwner.fwd_from.saved_from_peer.user_id == selfUserId; + return isOutOwnerCached = messageOwner.fwd_from.saved_from_peer == null || messageOwner.fwd_from.saved_from_peer.user_id == selfUserId; } public boolean needDrawAvatar() { @@ -5481,6 +5520,9 @@ public class MessageObject { if (customAvatarDrawable != null) { return true; } + if (isSponsored() && (isFromChat() || sponsoredShowPeerPhoto)) { + return true; + } return !isSponsored() && (isFromChat() && isFromUser() || isFromGroup() || eventId != 0 || messageOwner.fwd_from != null && messageOwner.fwd_from.saved_from_peer != null); } @@ -5563,6 +5605,35 @@ public class MessageObject { return 0; } + public TLObject getFromPeerObject() { + if (messageOwner != null) { + if (messageOwner.from_id instanceof TLRPC.TL_peerChannel_layer131 || + messageOwner.from_id instanceof TLRPC.TL_peerChannel) { + return MessagesController.getInstance(currentAccount).getChat(messageOwner.from_id.channel_id); + } else if ( + messageOwner.from_id instanceof TLRPC.TL_peerUser_layer131 || + messageOwner.from_id instanceof TLRPC.TL_peerUser + ) { + return MessagesController.getInstance(currentAccount).getUser(messageOwner.from_id.user_id); + } else if ( + messageOwner.from_id instanceof TLRPC.TL_peerChat_layer131 || + messageOwner.from_id instanceof TLRPC.TL_peerChat + ) { + return MessagesController.getInstance(currentAccount).getChat(messageOwner.from_id.chat_id); + } + } + return null; + } + + public static String getPeerObjectName(TLObject object) { + if (object instanceof TLRPC.User) { + return UserObject.getUserName((TLRPC.User) object); + } else if (object instanceof TLRPC.Chat) { + return ((TLRPC.Chat) object).title; + } + return "DELETED"; + } + public boolean isFromUser() { return messageOwner.from_id instanceof TLRPC.TL_peerUser && !messageOwner.post; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 573470e8d..9268e6772 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -371,6 +371,8 @@ public class MessagesController extends BaseController implements NotificationCe public int reactionsInChatMax; public int forumUpgradeParticipantsMin; public int topicsPinnedLimit; + public long telegramAntispamUserId; + public int telegramAntispamGroupSizeMin; public int uploadMaxFileParts; public int uploadMaxFilePartsPremium; @@ -588,6 +590,14 @@ public class MessagesController extends BaseController implements NotificationCe return chatLocal != null && chatLocal.forum; } + public boolean isForum(MessageObject msg) { + return msg != null && isForum(msg.getDialogId()); + } + + public boolean isForum(TLRPC.Message msg) { + return msg != null && isForum(MessageObject.getDialogId(msg)); + } + public void markAllTopicsAsRead(long did) { getMessagesStorage().loadTopics(did, topics -> { AndroidUtilities.runOnUIThread(() -> { @@ -1117,6 +1127,8 @@ public class MessagesController extends BaseController implements NotificationCe transcribeButtonPressed = mainPreferences.getInt("transcribeButtonPressed", 0); forumUpgradeParticipantsMin = mainPreferences.getInt("forumUpgradeParticipantsMin", 200); topicsPinnedLimit = mainPreferences.getInt("topicsPinnedLimit", 3); + telegramAntispamUserId = mainPreferences.getLong("telegramAntispamUserId", -1); + telegramAntispamGroupSizeMin = mainPreferences.getInt("telegramAntispamGroupSizeMin", 100); BuildVars.GOOGLE_AUTH_CLIENT_ID = mainPreferences.getString("googleAuthClientId", BuildVars.GOOGLE_AUTH_CLIENT_ID); Set currencySet = mainPreferences.getStringSet("directPaymentsCurrency", null); @@ -1335,7 +1347,6 @@ public class MessagesController extends BaseController implements NotificationCe sendLoadPeersRequest(req3, requests, pinnedDialogs, pinnedRemoteDialogs, users, chats, filtersToSave, filtersToDelete, filtersOrder, filterDialogRemovals, filterUserRemovals, filtersUnreadCounterReset); } - //no TLRPC.TL_messages_getPeerDialogs req4 = null; for (HashMap.Entry entry : dialogsToLoadMap.entrySet()) { if (req4 == null) { @@ -2644,6 +2655,31 @@ public class MessagesController extends BaseController implements NotificationCe } } } + case "telegram_antispam_user_id": { + if (value.value instanceof TLRPC.TL_jsonString) { + TLRPC.TL_jsonString string = (TLRPC.TL_jsonString) value.value; + try { + long number = Long.parseLong(string.value); + if (number != telegramAntispamUserId) { + telegramAntispamUserId = number; + editor.putLong("telegramAntispamUserId", telegramAntispamUserId); + changed = true; + } + } catch (Exception e) { + FileLog.e(e); + } + } + } + case "telegram_antispam_group_size_min": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber number = (TLRPC.TL_jsonNumber) value.value; + if (number.value != telegramAntispamGroupSizeMin) { + telegramAntispamGroupSizeMin = (int) number.value; + editor.putInt("telegramAntispamGroupSizeMin", telegramAntispamGroupSizeMin); + changed = true; + } + } + } } } if (changed) { @@ -3029,7 +3065,6 @@ public class MessagesController extends BaseController implements NotificationCe inputPeer.chat_id = -id; } } else { - TLRPC.User user = getUser(id); inputPeer = new TLRPC.TL_peerUser(); inputPeer.user_id = id; } @@ -3618,6 +3653,15 @@ public class MessagesController extends BaseController implements NotificationCe return users.get(id); } + public TLObject getUserOrChat(long dialogId) { + if (users.containsKey(dialogId)) { + return users.get(dialogId); + } else if (chats.containsKey(-dialogId)) { + return chats.get(-dialogId); + } + return null; + } + public TLObject getUserOrChat(String username) { if (username == null || username.length() == 0) { return null; @@ -3982,7 +4026,9 @@ public class MessagesController extends BaseController implements NotificationCe addOrRemoveActiveVoiceChat(chat); } if (oldChat != null && oldChat.forum != chat.forum) { - getNotificationCenter().postNotificationName(NotificationCenter.chatSwithcedToForum, chat.id); + AndroidUtilities.runOnUIThread(() -> { + getNotificationCenter().postNotificationName(NotificationCenter.chatSwithcedToForum, chat.id); + }); } } @@ -4133,7 +4179,6 @@ public class MessagesController extends BaseController implements NotificationCe if (did == 0 && (dialogs == null || dialogs.isEmpty())) { return; } - //probably TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs(); if (dialogs != null) { for (int a = 0; a < dialogs.size(); a++) { @@ -4376,11 +4421,18 @@ public class MessagesController extends BaseController implements NotificationCe getMediaDataController().getGroupStickerSetById(res.full_chat.stickerset); } getNotificationCenter().postNotificationName(NotificationCenter.chatInfoDidLoad, res.full_chat, classGuid, false, true); - if ((res.full_chat.flags & 2048) != 0) { - TLRPC.Dialog dialog = dialogs_dict.get(-chatId); - if (dialog != null && dialog.folder_id != res.full_chat.folder_id) { - dialog.folder_id = res.full_chat.folder_id; - sortDialogs(null); + + TLRPC.Dialog dialog = dialogs_dict.get(-chatId); + if (dialog != null) { + if ((res.full_chat.flags & 2048) != 0) { + if (dialog.folder_id != res.full_chat.folder_id) { + dialog.folder_id = res.full_chat.folder_id; + sortDialogs(null); + getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); + } + } + if (dialog.ttl_period != res.full_chat.ttl_period) { + dialog.ttl_period = res.full_chat.ttl_period; getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); } } @@ -4456,13 +4508,18 @@ public class MessagesController extends BaseController implements NotificationCe getNotificationCenter().postNotificationName(NotificationCenter.botInfoDidLoad, userFull.bot_info, classGuid); } getNotificationCenter().postNotificationName(NotificationCenter.userInfoDidLoad, user.id, userFull); - if ((userFull.flags & 2048) != 0) { - TLRPC.Dialog dialog = dialogs_dict.get(user.id); - if (dialog != null && dialog.folder_id != userFull.folder_id) { + + TLRPC.Dialog dialog = dialogs_dict.get(user.id); + if (dialog != null) { + if ((userFull.flags & 2048) != 0 && dialog.folder_id != userFull.folder_id) { dialog.folder_id = userFull.folder_id; sortDialogs(null); getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); } + if ((userFull.flags & 16384) != 0 && dialog.ttl_period != userFull.ttl_period) { + dialog.ttl_period = userFull.ttl_period; + getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); + } } }); } else { @@ -5892,28 +5949,31 @@ public class MessagesController extends BaseController implements NotificationCe }); TLRPC.ChatFull chatFull = null; TLRPC.UserFull userFull = null; + TLRPC.Dialog dialog = getMessagesController().dialogs_dict.get(did); + if (dialog != null) { + dialog.ttl_period = ttl; + } + getMessagesStorage().setDialogTtl(did, ttl); if (did > 0) { userFull = getUserFull(did); - if (userFull == null) { - return; + if (userFull != null) { + userFull.ttl_period = ttl; + userFull.flags |= 16384; } - userFull.ttl_period = ttl; - userFull.flags |= 16384; } else { chatFull = getChatFull(-did); - if (chatFull == null) { - return; - } - chatFull.ttl_period = ttl; - if (chatFull instanceof TLRPC.TL_channelFull) { - chatFull.flags |= 16777216; - } else { - chatFull.flags |= 16384; + if (chatFull != null) { + chatFull.ttl_period = ttl; + if (chatFull instanceof TLRPC.TL_channelFull) { + chatFull.flags |= 16777216; + } else { + chatFull.flags |= 16384; + } } } if (chatFull != null) { getNotificationCenter().postNotificationName(NotificationCenter.chatInfoDidLoad, chatFull, 0, false, false); - } else { + } else if (userFull != null) { getNotificationCenter().postNotificationName(NotificationCenter.userInfoDidLoad, did, userFull); } } @@ -6761,7 +6821,6 @@ public class MessagesController extends BaseController implements NotificationCe chatsDict.put(c.id, c); } - //no TLRPC.TL_messages_getPeerDialogs req1 = new TLRPC.TL_messages_getPeerDialogs(); TLRPC.TL_inputDialogPeer peer = new TLRPC.TL_inputDialogPeer(); if (res.peer.user_id != 0) { @@ -7359,7 +7418,6 @@ public class MessagesController extends BaseController implements NotificationCe getConnectionsManager().bindRequestToGuid(reqId, classGuid); } else { if (loadDialog && (load_type == 3 || load_type == 2) && last_message_id == 0) { - //probably-- TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs(); TLRPC.InputPeer inputPeer = getInputPeer(dialogId); TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer(); @@ -8126,7 +8184,6 @@ public class MessagesController extends BaseController implements NotificationCe FileLog.d("load unknown dialog " + dialogId); } - //probably-- TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs(); TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer(); inputDialogPeer.peer = peer; @@ -10162,10 +10219,14 @@ public class MessagesController extends BaseController implements NotificationCe } } - public int createChat(String title, ArrayList selectedContacts, String about, int type, boolean forImport, Location location, String locationAddress, BaseFragment fragment) { + public int createChat(String title, ArrayList selectedContacts, String about, int type, boolean forImport, Location location, String locationAddress, int ttlPeriod, BaseFragment fragment) { if (type == ChatObject.CHAT_TYPE_CHAT && !forImport) { TLRPC.TL_messages_createChat req = new TLRPC.TL_messages_createChat(); req.title = title; + if (ttlPeriod > 0) { + req.ttl_period = ttlPeriod; + req.flags |= 1; + } for (int a = 0; a < selectedContacts.size(); a++) { TLRPC.User user = getUser(selectedContacts.get(a)); if (user == null) { @@ -10690,6 +10751,78 @@ public class MessagesController extends BaseController implements NotificationCe deleteParticipantFromChat(chatId, user, null, false, false); } + public void deleteParticipantFromChat(long chatId, TLRPC.InputPeer peer) { + deleteParticipantFromChat(chatId, peer, false, false); + } + + public void deleteParticipantFromChat(long chatId, TLRPC.InputPeer peer, boolean forceDelete, boolean revoke) { + if (peer == null) { + return; + } + TLObject request; + TLRPC.Chat ownerChat = getChat(chatId); + boolean self = peer instanceof TLRPC.TL_inputPeerUser && UserObject.isUserSelf(getMessagesController().getUser(peer.user_id)); + boolean isChannel = ChatObject.isChannel(ownerChat); + if (isChannel) { + if (self) { + if (ownerChat.creator && forceDelete) { + TLRPC.TL_channels_deleteChannel req = new TLRPC.TL_channels_deleteChannel(); + req.channel = getInputChannel(ownerChat); + request = req; + } else { + TLRPC.TL_channels_leaveChannel req = new TLRPC.TL_channels_leaveChannel(); + req.channel = getInputChannel(ownerChat); + request = req; + } + } else { + TLRPC.TL_channels_editBanned req = new TLRPC.TL_channels_editBanned(); + req.channel = getInputChannel(ownerChat); + req.participant = peer; + req.banned_rights = new TLRPC.TL_chatBannedRights(); + req.banned_rights.view_messages = true; + req.banned_rights.send_media = true; + req.banned_rights.send_messages = true; + req.banned_rights.send_stickers = true; + req.banned_rights.send_gifs = true; + req.banned_rights.send_games = true; + req.banned_rights.send_inline = true; + req.banned_rights.embed_links = true; + req.banned_rights.pin_messages = true; + req.banned_rights.send_polls = true; + req.banned_rights.invite_users = true; + req.banned_rights.change_info = true; + request = req; + } + } else { + if (forceDelete) { + TLRPC.TL_messages_deleteChat req = new TLRPC.TL_messages_deleteChat(); + req.chat_id = chatId; + getConnectionsManager().sendRequest(req, (response, error) -> { + + }); + return; + } + TLRPC.TL_messages_deleteChatUser req = new TLRPC.TL_messages_deleteChatUser(); + req.chat_id = chatId; + req.user_id = (TLRPC.InputUser) getInputUser(peer); + req.revoke_history = true; + request = req; + } + if (self) { + deleteDialog(-chatId, 0, revoke); + } + getConnectionsManager().sendRequest(request, (response, error) -> { + if (error != null) { + return; + } + TLRPC.Updates updates = (TLRPC.Updates) response; + processUpdates(updates, false); + if (isChannel && !self) { + AndroidUtilities.runOnUIThread(() -> loadFullChat(chatId, 0, true), 1000); + } + }, ConnectionsManager.RequestFlagInvokeAfter); + } + public void deleteParticipantFromChat(long chatId, TLRPC.User user, TLRPC.Chat chat, boolean forceDelete, boolean revoke) { if (user == null && chat == null) { return; @@ -11272,7 +11405,6 @@ public class MessagesController extends BaseController implements NotificationCe gettingUnknownChannels.put(channel.id, true); - //no TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs(); TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer(); inputDialogPeer.peer = inputPeer; @@ -15047,6 +15179,7 @@ public class MessagesController extends BaseController implements NotificationCe long peerId = MessageObject.getPeerId(updatePeerHistoryTTL.peer); TLRPC.ChatFull chatFull = null; TLRPC.UserFull userFull = null; + if (peerId > 0) { userFull = getUserFull(peerId); if (userFull != null) { @@ -15083,6 +15216,12 @@ public class MessagesController extends BaseController implements NotificationCe getNotificationCenter().postNotificationName(NotificationCenter.userInfoDidLoad, peerId, userFull); getMessagesStorage().updateUserInfo(userFull, false); } + getMessagesStorage().setDialogTtl(peerId, updatePeerHistoryTTL.ttl_period); + TLRPC.Dialog dialog = dialogs_dict.get(peerId); + if (dialog != null) { + dialog.ttl_period = updatePeerHistoryTTL.ttl_period; + getNotificationCenter().postNotificationName(NotificationCenter.updateInterfaces, 0); + } } else if (baseUpdate instanceof TLRPC.TL_updatePendingJoinRequests) { TLRPC.TL_updatePendingJoinRequests update = (TLRPC.TL_updatePendingJoinRequests) baseUpdate; getMemberRequestsController().onPendingRequestsUpdated(update); @@ -15573,7 +15712,6 @@ public class MessagesController extends BaseController implements NotificationCe } if (needReload) { if (topicId == 0) { - //no TLRPC.TL_messages_getPeerDialogs req = new TLRPC.TL_messages_getPeerDialogs(); TLRPC.TL_inputDialogPeer inputDialogPeer = new TLRPC.TL_inputDialogPeer(); inputDialogPeer.peer = getInputPeer(dialogId); @@ -16744,7 +16882,7 @@ public class MessagesController extends BaseController implements NotificationCe }); } - public void checkIsInChat(TLRPC.Chat chat, TLRPC.User user, IsInChatCheckedCallback callback) { + public void checkIsInChat(boolean tryCacheFirst, TLRPC.Chat chat, TLRPC.User user, IsInChatCheckedCallback callback) { if (chat == null || user == null) { if (callback != null) { callback.run(false, null, null); @@ -16752,6 +16890,30 @@ public class MessagesController extends BaseController implements NotificationCe return; } if (chat.megagroup || ChatObject.isChannel(chat)) { + if (tryCacheFirst) { + TLRPC.ChatFull chatFull = getChatFull(chat.id); + if (chatFull != null) { + TLRPC.ChatParticipant userParticipant = null; + if (chatFull.participants != null && chatFull.participants.participants != null) { + final int count = chatFull.participants.participants.size(); + for (int i = 0; i < count; ++i) { + TLRPC.ChatParticipant participant = chatFull.participants.participants.get(i); + if (participant != null && participant.user_id == user.id) { + userParticipant = participant; + break; + } + } + } + if (callback != null && userParticipant != null) { + callback.run( + userParticipant != null, + chatFull.participants != null && chatFull.participants.admin_id == user.id ? ChatRightsEditActivity.emptyAdminRights(true) : null, + null + ); + return; + } + } + } TLRPC.TL_channels_getParticipant req = new TLRPC.TL_channels_getParticipant(); req.channel = getInputChannel(chat.id); req.participant = getInputPeer(user); @@ -16781,9 +16943,9 @@ public class MessagesController extends BaseController implements NotificationCe } if (callback != null) { callback.run( - userParticipant != null, - chatFull.participants != null && chatFull.participants.admin_id == user.id ? ChatRightsEditActivity.emptyAdminRights(true) : null, - null + userParticipant != null, + chatFull.participants != null && chatFull.participants.admin_id == user.id ? ChatRightsEditActivity.emptyAdminRights(true) : null, + null ); } } else { @@ -16874,4 +17036,38 @@ public class MessagesController extends BaseController implements NotificationCe return unreadCount; } + private boolean requestingContactToken; + private TLRPC.TL_exportedContactToken cachedContactToken; + public TLRPC.TL_exportedContactToken getCachedContactToken() { + if (cachedContactToken != null && cachedContactToken.expires > System.currentTimeMillis() / 1000) { + return cachedContactToken; + } + return null; + } + public void requestContactToken(Utilities.Callback callback) { + requestContactToken(0, callback); + } + public void requestContactToken(long minDuration, Utilities.Callback callback) { + if (callback == null || requestingContactToken) { + return; + } + if (cachedContactToken != null && cachedContactToken.expires > System.currentTimeMillis() / 1000) { + callback.run(cachedContactToken); + return; + } + requestingContactToken = true; + final long start = System.currentTimeMillis(); + getConnectionsManager().sendRequest(new TLRPC.TL_contacts_exportContactToken(), (res, err) -> { + if (res instanceof TLRPC.TL_exportedContactToken) { + cachedContactToken = (TLRPC.TL_exportedContactToken) res; + AndroidUtilities.runOnUIThread(() -> { + callback.run(cachedContactToken); + requestingContactToken = false; + }, Math.max(0, minDuration - (System.currentTimeMillis() - start))); + } else { + requestingContactToken = false; + } + }); + } + } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index 3d0c6eb00..6d89856d6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -93,7 +93,7 @@ public class MessagesStorage extends BaseController { } } - private final static int LAST_DB_VERSION = 107; + private final static int LAST_DB_VERSION = 110; private boolean databaseMigrationInProgress; public boolean showClearDatabaseAlert; private LongSparseIntArray dialogIsForum = new LongSparseIntArray(); @@ -200,7 +200,6 @@ public class MessagesStorage extends BaseController { public MessagesStorage(int instance) { super(instance); storageQueue = new DispatchQueue("storageQueue_" + instance); - //storageQueue.setPriority(Thread.MAX_PRIORITY); storageQueue.postRunnable(() -> openDatabase(1)); } @@ -315,7 +314,7 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE TABLE user_phones_v7(key TEXT, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (key, phone))").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS sphone_deleted_idx_user_phones ON user_phones_v7(sphone, deleted);").stepThis().dispose(); - database.executeFast("CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER, inbox_max INTEGER, outbox_max INTEGER, last_mid_i INTEGER, unread_count_i INTEGER, pts INTEGER, date_i INTEGER, pinned INTEGER, flags INTEGER, folder_id INTEGER, data BLOB, unread_reactions INTEGER, last_mid_group INTEGER)").stepThis().dispose(); + database.executeFast("CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER, inbox_max INTEGER, outbox_max INTEGER, last_mid_i INTEGER, unread_count_i INTEGER, pts INTEGER, date_i INTEGER, pinned INTEGER, flags INTEGER, folder_id INTEGER, data BLOB, unread_reactions INTEGER, last_mid_group INTEGER, ttl_period INTEGER)").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_dialogs ON dialogs(date);").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS last_mid_idx_dialogs ON dialogs(last_mid);").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_idx_dialogs ON dialogs(unread_count);").stepThis().dispose(); @@ -438,7 +437,7 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE TABLE media_holes_topics(uid INTEGER, topic_id INTEGER, type INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, topic_id, type, start));").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_media_holes_topics ON media_holes_topics(uid, topic_id, type, end);").stepThis().dispose(); - database.executeFast("CREATE TABLE topics(did INTEGER, topic_id INTEGER, data BLOB, top_message INTEGER, topic_message BLOB, unread_count INTEGER, max_read_id INTEGER, unread_mentions INTEGER, unread_reactions INTEGER, read_outbox INTEGER, pinned INTEGER, PRIMARY KEY(did, topic_id));").stepThis().dispose(); + database.executeFast("CREATE TABLE topics(did INTEGER, topic_id INTEGER, data BLOB, top_message INTEGER, topic_message BLOB, unread_count INTEGER, max_read_id INTEGER, unread_mentions INTEGER, unread_reactions INTEGER, read_outbox INTEGER, pinned INTEGER, total_messages_count INTEGER, hidden INTEGER, PRIMARY KEY(did, topic_id));").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS did_top_message_topics ON topics(did, top_message);").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS did_topics ON topics(did);").stepThis().dispose(); @@ -554,1196 +553,16 @@ public class MessagesStorage extends BaseController { int version = currentVersion; FileLog.d("MessagesStorage start db migration from " + version + " to " + LAST_DB_VERSION); - if (version < 4) { - database.executeFast("CREATE TABLE IF NOT EXISTS user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))").stepThis().dispose(); + version = DatabaseMigrationHelper.migrate(MessagesStorage.this, version); - database.executeFast("DROP INDEX IF EXISTS read_state_out_idx_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS ttl_idx_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS date_idx_messages;").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages ON messages(mid, out);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS task_idx_messages ON messages(uid, out, read_state, ttl, date, send_state);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages ON messages(uid, date, mid);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS sphone_deleted_idx_user_phones ON user_phones_v6(sphone, deleted);").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_randoms ON randoms(mid);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS download_queue(uid INTEGER, type INTEGER, date INTEGER, data BLOB, PRIMARY KEY (uid, type));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS type_date_idx_download_queue ON download_queue(type, date);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS dialog_settings(did INTEGER PRIMARY KEY, flags INTEGER);").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_idx_dialogs ON dialogs(unread_count);").stepThis().dispose(); - - database.executeFast("UPDATE messages SET send_state = 2 WHERE mid < 0 AND send_state = 1").stepThis().dispose(); - - fixNotificationSettings(); - database.executeFast("PRAGMA user_version = 4").stepThis().dispose(); - version = 4; - } - if (version == 4) { - database.executeFast("CREATE TABLE IF NOT EXISTS enc_tasks_v2(mid INTEGER PRIMARY KEY, date INTEGER)").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_enc_tasks_v2 ON enc_tasks_v2(date);").stepThis().dispose(); - database.beginTransaction(); - SQLiteCursor cursor = database.queryFinalized("SELECT date, data FROM enc_tasks WHERE 1"); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v2 VALUES(?, ?)"); - if (cursor.next()) { - int date = cursor.intValue(0); - NativeByteBuffer data = cursor.byteBufferValue(1); - if (data != null) { - int length = data.limit(); - for (int a = 0; a < length / 4; a++) { - state.requery(); - state.bindInteger(1, data.readInt32(false)); - state.bindInteger(2, date); - state.step(); - } - data.reuse(); - } - } - state.dispose(); - cursor.dispose(); - database.commitTransaction(); - - database.executeFast("DROP INDEX IF EXISTS date_idx_enc_tasks;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS enc_tasks;").stepThis().dispose(); - - database.executeFast("ALTER TABLE messages ADD COLUMN media INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 6").stepThis().dispose(); - version = 6; - } - if (version == 6) { - database.executeFast("CREATE TABLE IF NOT EXISTS messages_seq(mid INTEGER PRIMARY KEY, seq_in INTEGER, seq_out INTEGER);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS seq_idx_messages_seq ON messages_seq(seq_in, seq_out);").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN layer INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN seq_in INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN seq_out INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 7").stepThis().dispose(); - version = 7; - } - if (version == 7 || version == 8 || version == 9) { - database.executeFast("ALTER TABLE enc_chats ADD COLUMN use_count INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN exchange_id INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN key_date INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN fprint INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN fauthkey BLOB default NULL").stepThis().dispose(); - database.executeFast("ALTER TABLE enc_chats ADD COLUMN khash BLOB default NULL").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 10").stepThis().dispose(); - version = 10; - } - if (version == 10) { - database.executeFast("CREATE TABLE IF NOT EXISTS web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, PRIMARY KEY (id, type));").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 11").stepThis().dispose(); - version = 11; - } - if (version == 11 || version == 12) { - database.executeFast("DROP INDEX IF EXISTS uid_mid_idx_media;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS mid_idx_media;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS uid_date_mid_idx_media;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS media;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS media_counts;").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS media_v2(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, type INTEGER, data BLOB)").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS media_counts_v2(uid INTEGER, type INTEGER, count INTEGER, PRIMARY KEY(uid, type))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media ON media_v2(uid, mid, type, date);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS keyvalue(id TEXT PRIMARY KEY, value TEXT)").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 13").stepThis().dispose(); - version = 13; - } - if (version == 13) { - database.executeFast("ALTER TABLE messages ADD COLUMN replydata BLOB default NULL").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 14").stepThis().dispose(); - version = 14; - } - if (version == 14) { - database.executeFast("CREATE TABLE IF NOT EXISTS hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 15").stepThis().dispose(); - version = 15; - } - if (version == 15) { - database.executeFast("CREATE TABLE IF NOT EXISTS webpage_pending(id INTEGER, mid INTEGER, PRIMARY KEY (id, mid));").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 16").stepThis().dispose(); - version = 16; - } - if (version == 16) { - database.executeFast("ALTER TABLE dialogs ADD COLUMN inbox_max INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN outbox_max INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 17").stepThis().dispose(); - version = 17; - } - if (version == 17) { - database.executeFast("PRAGMA user_version = 18").stepThis().dispose(); - version = 18; - } - if (version == 18) { - database.executeFast("DROP TABLE IF EXISTS stickers;").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS stickers_v2(id INTEGER PRIMARY KEY, data BLOB, date INTEGER, hash INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 19").stepThis().dispose(); - version = 19; - } - if (version == 19) { - database.executeFast("CREATE TABLE IF NOT EXISTS bot_keyboard(uid INTEGER PRIMARY KEY, mid INTEGER, info BLOB)").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS bot_keyboard_idx_mid ON bot_keyboard(mid);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 20").stepThis().dispose(); - version = 20; - } - if (version == 20) { - database.executeFast("CREATE TABLE search_recent(did INTEGER PRIMARY KEY, date INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 21").stepThis().dispose(); - version = 21; - } - if (version == 21) { - database.executeFast("CREATE TABLE IF NOT EXISTS chat_settings_v2(uid INTEGER PRIMARY KEY, info BLOB)").stepThis().dispose(); - - SQLiteCursor cursor = database.queryFinalized("SELECT uid, participants FROM chat_settings WHERE uid < 0"); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_settings_v2 VALUES(?, ?)"); - while (cursor.next()) { - long chatId = cursor.intValue(0); - NativeByteBuffer data = cursor.byteBufferValue(1); - if (data != null) { - TLRPC.ChatParticipants participants = TLRPC.ChatParticipants.TLdeserialize(data, data.readInt32(false), false); - data.reuse(); - if (participants != null) { - TLRPC.TL_chatFull chatFull = new TLRPC.TL_chatFull(); - chatFull.id = chatId; - chatFull.chat_photo = new TLRPC.TL_photoEmpty(); - chatFull.notify_settings = new TLRPC.TL_peerNotifySettingsEmpty_layer77(); - chatFull.exported_invite = null; - chatFull.participants = participants; - NativeByteBuffer data2 = new NativeByteBuffer(chatFull.getObjectSize()); - chatFull.serializeToStream(data2); - state.requery(); - state.bindLong(1, chatId); - state.bindByteBuffer(2, data2); - state.step(); - data2.reuse(); - } - } - } - state.dispose(); - cursor.dispose(); - - database.executeFast("DROP TABLE IF EXISTS chat_settings;").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN last_mid_i INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN unread_count_i INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN pts INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN date_i INTEGER default 0").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS last_mid_i_idx_dialogs ON dialogs(last_mid_i);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS unread_count_i_idx_dialogs ON dialogs(unread_count_i);").stepThis().dispose(); - database.executeFast("ALTER TABLE messages ADD COLUMN imp INTEGER default 0").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS messages_holes(uid INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, start));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_messages_holes ON messages_holes(uid, end);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 22").stepThis().dispose(); - version = 22; - } - if (version == 22) { - database.executeFast("CREATE TABLE IF NOT EXISTS media_holes_v2(uid INTEGER, type INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, type, start));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_media_holes_v2 ON media_holes_v2(uid, type, end);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 23").stepThis().dispose(); - version = 23; - } - if (version == 23 || version == 24) { - database.executeFast("DELETE FROM media_holes_v2 WHERE uid != 0 AND type >= 0 AND start IN (0, 1)").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 25").stepThis().dispose(); - version = 25; - } - if (version == 25 || version == 26) { - database.executeFast("CREATE TABLE IF NOT EXISTS channel_users_v2(did INTEGER, uid INTEGER, date INTEGER, data BLOB, PRIMARY KEY(did, uid))").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 27").stepThis().dispose(); - version = 27; - } - if (version == 27) { - database.executeFast("ALTER TABLE web_recent_v3 ADD COLUMN document BLOB default NULL").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 28").stepThis().dispose(); - version = 28; - } - if (version == 28 || version == 29) { - database.executeFast("DELETE FROM sent_files_v2 WHERE 1").stepThis().dispose(); - database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 30").stepThis().dispose(); - version = 30; - } - if (version == 30) { - database.executeFast("ALTER TABLE chat_settings_v2 ADD COLUMN pinned INTEGER default 0").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS chat_settings_pinned_idx ON chat_settings_v2(uid, pinned) WHERE pinned != 0;").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS users_data(uid INTEGER PRIMARY KEY, about TEXT)").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 31").stepThis().dispose(); - version = 31; - } - if (version == 31) { - database.executeFast("DROP TABLE IF EXISTS bot_recent;").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS chat_hints(did INTEGER, type INTEGER, rating REAL, date INTEGER, PRIMARY KEY(did, type))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS chat_hints_rating_idx ON chat_hints(rating);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 32").stepThis().dispose(); - version = 32; - } - if (version == 32) { - database.executeFast("DROP INDEX IF EXISTS uid_mid_idx_imp_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS uid_date_mid_imp_idx_messages;").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 33").stepThis().dispose(); - version = 33; - } - if (version == 33) { - database.executeFast("CREATE TABLE IF NOT EXISTS pending_tasks(id INTEGER PRIMARY KEY, data BLOB);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 34").stepThis().dispose(); - version = 34; - } - if (version == 34) { - database.executeFast("CREATE TABLE IF NOT EXISTS stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 35").stepThis().dispose(); - version = 35; - } - if (version == 35) { - database.executeFast("CREATE TABLE IF NOT EXISTS requested_holes(uid INTEGER, seq_out_start INTEGER, seq_out_end INTEGER, PRIMARY KEY (uid, seq_out_start, seq_out_end));").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 36").stepThis().dispose(); - version = 36; - } - if (version == 36) { - database.executeFast("ALTER TABLE enc_chats ADD COLUMN in_seq_no INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 37").stepThis().dispose(); - version = 37; - } - if (version == 37) { - database.executeFast("CREATE TABLE IF NOT EXISTS botcache(id TEXT PRIMARY KEY, date INTEGER, data BLOB)").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS botcache_date_idx ON botcache(date);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 38").stepThis().dispose(); - version = 38; - } - if (version == 38) { - database.executeFast("ALTER TABLE dialogs ADD COLUMN pinned INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 39").stepThis().dispose(); - version = 39; - } - if (version == 39) { - database.executeFast("ALTER TABLE enc_chats ADD COLUMN admin_id INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 40").stepThis().dispose(); - version = 40; - } - if (version == 40) { - fixNotificationSettings(); - database.executeFast("PRAGMA user_version = 41").stepThis().dispose(); - version = 41; - } - if (version == 41) { - database.executeFast("ALTER TABLE messages ADD COLUMN mention INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE user_contacts_v6 ADD COLUMN imported INTEGER default 0").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages ON messages(uid, mention, read_state);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 42").stepThis().dispose(); - version = 42; - } - if (version == 42) { - database.executeFast("CREATE TABLE IF NOT EXISTS sharing_locations(uid INTEGER PRIMARY KEY, mid INTEGER, date INTEGER, period INTEGER, message BLOB);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 43").stepThis().dispose(); - version = 43; - } - if (version == 43) { - database.executeFast("PRAGMA user_version = 44").stepThis().dispose(); - version = 44; - } - if (version == 44) { - database.executeFast("CREATE TABLE IF NOT EXISTS user_contacts_v7(key TEXT PRIMARY KEY, uid INTEGER, fname TEXT, sname TEXT, imported INTEGER)").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS user_phones_v7(key TEXT, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (key, phone))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS sphone_deleted_idx_user_phones ON user_phones_v7(sphone, deleted);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 45").stepThis().dispose(); - version = 45; - } - if (version == 45) { - database.executeFast("ALTER TABLE enc_chats ADD COLUMN mtproto_seq INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 46").stepThis().dispose(); - version = 46; - } - if (version == 46) { - database.executeFast("DELETE FROM botcache WHERE 1").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 47").stepThis().dispose(); - version = 47; - } - if (version == 47) { - database.executeFast("ALTER TABLE dialogs ADD COLUMN flags INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 48").stepThis().dispose(); - version = 48; - } - if (version == 48) { - database.executeFast("CREATE TABLE IF NOT EXISTS unread_push_messages(uid INTEGER, mid INTEGER, random INTEGER, date INTEGER, data BLOB, fm TEXT, name TEXT, uname TEXT, flags INTEGER, PRIMARY KEY(uid, mid))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS unread_push_messages_idx_date ON unread_push_messages(date);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS unread_push_messages_idx_random ON unread_push_messages(random);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 49").stepThis().dispose(); - version = 49; - } - if (version == 49) { - database.executeFast("CREATE TABLE IF NOT EXISTS user_settings(uid INTEGER PRIMARY KEY, info BLOB, pinned INTEGER)").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS user_settings_pinned_idx ON user_settings(uid, pinned) WHERE pinned != 0;").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 50").stepThis().dispose(); - version = 50; - } - if (version == 50) { - database.executeFast("DELETE FROM sent_files_v2 WHERE 1").stepThis().dispose(); - database.executeFast("ALTER TABLE sent_files_v2 ADD COLUMN parent TEXT").stepThis().dispose(); - database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose(); - database.executeFast("ALTER TABLE download_queue ADD COLUMN parent TEXT").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 51").stepThis().dispose(); - version = 51; - } - if (version == 51) { - database.executeFast("ALTER TABLE media_counts_v2 ADD COLUMN old INTEGER").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 52").stepThis().dispose(); - version = 52; - } - if (version == 52) { - database.executeFast("CREATE TABLE IF NOT EXISTS polls_v2(mid INTEGER, uid INTEGER, id INTEGER, PRIMARY KEY (mid, uid));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS polls_id ON polls_v2(id);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 53").stepThis().dispose(); - version = 53; - } - if (version == 53) { - database.executeFast("ALTER TABLE chat_settings_v2 ADD COLUMN online INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 54").stepThis().dispose(); - version = 54; - } - if (version == 54) { - database.executeFast("DROP TABLE IF EXISTS wallpapers;").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 55").stepThis().dispose(); - version = 55; - } - if (version == 55) { - database.executeFast("CREATE TABLE IF NOT EXISTS wallpapers2(uid INTEGER PRIMARY KEY, data BLOB, num INTEGER)").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS wallpapers_num ON wallpapers2(num);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 56").stepThis().dispose(); - version = 56; - } - if (version == 56 || version == 57) { - database.executeFast("CREATE TABLE IF NOT EXISTS emoji_keywords_v2(lang TEXT, keyword TEXT, emoji TEXT, PRIMARY KEY(lang, keyword, emoji));").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS emoji_keywords_info_v2(lang TEXT PRIMARY KEY, alias TEXT, version INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 58").stepThis().dispose(); - version = 58; - } - if (version == 58) { - database.executeFast("CREATE INDEX IF NOT EXISTS emoji_keywords_v2_keyword ON emoji_keywords_v2(keyword);").stepThis().dispose(); - database.executeFast("ALTER TABLE emoji_keywords_info_v2 ADD COLUMN date INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 59").stepThis().dispose(); - version = 59; - } - if (version == 59) { - database.executeFast("ALTER TABLE dialogs ADD COLUMN folder_id INTEGER default 0").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN data BLOB default NULL").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS folder_id_idx_dialogs ON dialogs(folder_id);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 60").stepThis().dispose(); - version = 60; - } - if (version == 60) { - database.executeFast("DROP TABLE IF EXISTS channel_admins;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS blocked_users;").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 61").stepThis().dispose(); - version = 61; - } - if (version == 61) { - database.executeFast("DROP INDEX IF EXISTS send_state_idx_messages;").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_messages2 ON messages(mid, send_state, date);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 62").stepThis().dispose(); - version = 62; - } - if (version == 62) { - database.executeFast("CREATE TABLE IF NOT EXISTS scheduled_messages(mid INTEGER PRIMARY KEY, uid INTEGER, send_state INTEGER, date INTEGER, data BLOB, ttl INTEGER, replydata BLOB)").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_scheduled_messages ON scheduled_messages(mid, send_state, date);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_idx_scheduled_messages ON scheduled_messages(uid, date);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 63").stepThis().dispose(); - version = 63; - } - if (version == 63) { - database.executeFast("DELETE FROM download_queue WHERE 1").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 64").stepThis().dispose(); - version = 64; - } - if (version == 64) { - database.executeFast("CREATE TABLE IF NOT EXISTS dialog_filter(id INTEGER PRIMARY KEY, ord INTEGER, unread_count INTEGER, flags INTEGER, title TEXT)").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS dialog_filter_ep(id INTEGER, peer INTEGER, PRIMARY KEY (id, peer))").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 65").stepThis().dispose(); - version = 65; - } - if (version == 65) { - database.executeFast("CREATE INDEX IF NOT EXISTS flags_idx_dialogs ON dialogs(flags);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 66").stepThis().dispose(); - version = 66; - } - if (version == 66) { - database.executeFast("CREATE TABLE dialog_filter_pin_v2(id INTEGER, peer INTEGER, pin INTEGER, PRIMARY KEY (id, peer))").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 67").stepThis().dispose(); - version = 67; - } - if (version == 67) { - database.executeFast("CREATE TABLE IF NOT EXISTS stickers_dice(emoji TEXT PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 68").stepThis().dispose(); - version = 68; - } - if (version == 68) { - executeNoException("ALTER TABLE messages ADD COLUMN forwards INTEGER default 0"); - database.executeFast("PRAGMA user_version = 69").stepThis().dispose(); - version = 69; - } - if (version == 69) { - executeNoException("ALTER TABLE messages ADD COLUMN replies_data BLOB default NULL"); - executeNoException("ALTER TABLE messages ADD COLUMN thread_reply_id INTEGER default 0"); - database.executeFast("PRAGMA user_version = 70").stepThis().dispose(); - version = 70; - } - if (version == 70) { - database.executeFast("CREATE TABLE IF NOT EXISTS chat_pinned_v2(uid INTEGER, mid INTEGER, data BLOB, PRIMARY KEY (uid, mid));").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 71").stepThis().dispose(); - version = 71; - } - if (version == 71) { - executeNoException("ALTER TABLE sharing_locations ADD COLUMN proximity INTEGER default 0"); - database.executeFast("PRAGMA user_version = 72").stepThis().dispose(); - version = 72; - } - if (version == 72) { - database.executeFast("CREATE TABLE IF NOT EXISTS chat_pinned_count(uid INTEGER PRIMARY KEY, count INTEGER, end INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 73").stepThis().dispose(); - version = 73; - } - if (version == 73) { - executeNoException("ALTER TABLE chat_settings_v2 ADD COLUMN inviter INTEGER default 0"); - database.executeFast("PRAGMA user_version = 74").stepThis().dispose(); - version = 74; - } - if (version == 74) { - database.executeFast("CREATE TABLE IF NOT EXISTS shortcut_widget(id INTEGER, did INTEGER, ord INTEGER, PRIMARY KEY (id, did));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS shortcut_widget_did ON shortcut_widget(did);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 75").stepThis().dispose(); - version = 75; - } - if (version == 75) { - executeNoException("ALTER TABLE chat_settings_v2 ADD COLUMN links INTEGER default 0"); - database.executeFast("PRAGMA user_version = 76").stepThis().dispose(); - version = 76; - } - if (version == 76) { - executeNoException("ALTER TABLE enc_tasks_v2 ADD COLUMN media INTEGER default -1"); - database.executeFast("PRAGMA user_version = 77").stepThis().dispose(); - version = 77; - } - if (version == 77) { - database.executeFast("DROP TABLE IF EXISTS channel_admins_v2;").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS channel_admins_v3(did INTEGER, uid INTEGER, data BLOB, PRIMARY KEY(did, uid))").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 78").stepThis().dispose(); - version = 78; - } - if (version == 78) { - database.executeFast("DROP TABLE IF EXISTS bot_info;").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS bot_info_v2(uid INTEGER, dialogId INTEGER, info BLOB, PRIMARY KEY(uid, dialogId))").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 79").stepThis().dispose(); - version = 79; - } - if (version == 79) { - database.executeFast("CREATE TABLE IF NOT EXISTS enc_tasks_v3(mid INTEGER, date INTEGER, media INTEGER, PRIMARY KEY(mid, media))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_enc_tasks_v3 ON enc_tasks_v3(date);").stepThis().dispose(); - - database.beginTransaction(); - SQLiteCursor cursor = database.queryFinalized("SELECT mid, date, media FROM enc_tasks_v2 WHERE 1"); - SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v3 VALUES(?, ?, ?)"); - if (cursor.next()) { - long mid = cursor.longValue(0); - int date = cursor.intValue(1); - int media = cursor.intValue(2); - - state.requery(); - state.bindLong(1, mid); - state.bindInteger(2, date); - state.bindInteger(3, media); - state.step(); - } - state.dispose(); - cursor.dispose(); - database.commitTransaction(); - - database.executeFast("DROP INDEX IF EXISTS date_idx_enc_tasks_v2;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS enc_tasks_v2;").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 80").stepThis().dispose(); - version = 80; - } - if (version == 80) { - database.executeFast("CREATE TABLE IF NOT EXISTS scheduled_messages_v2(mid INTEGER, uid INTEGER, send_state INTEGER, date INTEGER, data BLOB, ttl INTEGER, replydata BLOB, PRIMARY KEY(mid, uid))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_scheduled_messages_v2 ON scheduled_messages_v2(mid, send_state, date);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_idx_scheduled_messages_v2 ON scheduled_messages_v2(uid, date);").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS bot_keyboard_idx_mid_v2 ON bot_keyboard(mid, uid);").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS bot_keyboard_idx_mid;").stepThis().dispose(); - - database.beginTransaction(); - SQLiteCursor cursor; - try { - cursor = database.queryFinalized("SELECT mid, uid, send_state, date, data, ttl, replydata FROM scheduled_messages_v2 WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO scheduled_messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?)"); - while (cursor.next()) { - NativeByteBuffer data = cursor.byteBufferValue(4); - if (data == null) { - continue; - } - int mid = cursor.intValue(0); - long uid = cursor.longValue(1); - int sendState = cursor.intValue(2); - int date = cursor.intValue(3); - int ttl = cursor.intValue(5); - NativeByteBuffer replydata = cursor.byteBufferValue(6); - - statement.requery(); - statement.bindInteger(1, mid); - statement.bindLong(2, uid); - statement.bindInteger(3, sendState); - statement.bindByteBuffer(4, data); - statement.bindInteger(5, date); - statement.bindInteger(6, ttl); - if (replydata != null) { - statement.bindByteBuffer(7, replydata); - } else { - statement.bindNull(7); - } - statement.step(); - if (replydata != null) { - replydata.reuse(); - } - data.reuse(); - } - cursor.dispose(); - statement.dispose(); - } - - database.executeFast("DROP INDEX IF EXISTS send_state_idx_scheduled_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS uid_date_idx_scheduled_messages;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS scheduled_messages;").stepThis().dispose(); - - database.commitTransaction(); - database.executeFast("PRAGMA user_version = 81").stepThis().dispose(); - version = 81; - } - if (version == 81) { - database.executeFast("CREATE TABLE IF NOT EXISTS media_v3(mid INTEGER, uid INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v3 ON media_v3(uid, mid, type, date);").stepThis().dispose(); - - database.beginTransaction(); - SQLiteCursor cursor; - try { - cursor = database.queryFinalized("SELECT mid, uid, date, type, data FROM media_v2 WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO media_v3 VALUES(?, ?, ?, ?, ?)"); - while (cursor.next()) { - NativeByteBuffer data = cursor.byteBufferValue(4); - if (data == null) { - continue; - } - int mid = cursor.intValue(0); - long uid = cursor.longValue(1); - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - int date = cursor.intValue(2); - int type = cursor.intValue(3); - - statement.requery(); - statement.bindInteger(1, mid); - statement.bindLong(2, uid); - statement.bindInteger(3, date); - statement.bindInteger(4, type); - statement.bindByteBuffer(5, data); - statement.step(); - data.reuse(); - } - cursor.dispose(); - statement.dispose(); - } - - database.executeFast("DROP INDEX IF EXISTS uid_mid_type_date_idx_media;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS media_v2;").stepThis().dispose(); - database.commitTransaction(); - - database.executeFast("PRAGMA user_version = 82").stepThis().dispose(); - version = 82; - } - if (version == 82) { - database.executeFast("CREATE TABLE IF NOT EXISTS randoms_v2(random_id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (random_id, mid, uid))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS mid_idx_randoms_v2 ON randoms_v2(mid, uid);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS enc_tasks_v4(mid INTEGER, uid INTEGER, date INTEGER, media INTEGER, PRIMARY KEY(mid, uid, media))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS date_idx_enc_tasks_v4 ON enc_tasks_v4(date);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS polls_v2(mid INTEGER, uid INTEGER, id INTEGER, PRIMARY KEY (mid, uid));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS polls_id_v2 ON polls_v2(id);").stepThis().dispose(); - - database.executeFast("CREATE TABLE IF NOT EXISTS webpage_pending_v2(id INTEGER, mid INTEGER, uid INTEGER, PRIMARY KEY (id, mid, uid));").stepThis().dispose(); - - database.beginTransaction(); - - SQLiteCursor cursor; - try { - cursor = database.queryFinalized("SELECT r.random_id, r.mid, m.uid FROM randoms as r INNER JOIN messages as m ON r.mid = m.mid WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO randoms_v2 VALUES(?, ?, ?)"); - while (cursor.next()) { - long randomId = cursor.longValue(0); - int mid = cursor.intValue(1); - long uid = cursor.longValue(2); - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - - statement.requery(); - statement.bindLong(1, randomId); - statement.bindInteger(2, mid); - statement.bindLong(3, uid); - statement.step(); - } - cursor.dispose(); - statement.dispose(); - } - - try { - cursor = database.queryFinalized("SELECT p.mid, m.uid, p.id FROM polls as p INNER JOIN messages as m ON p.mid = m.mid WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO polls_v2 VALUES(?, ?, ?)"); - while (cursor.next()) { - int mid = cursor.intValue(0); - long uid = cursor.longValue(1); - long id = cursor.longValue(2); - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - - statement.requery(); - statement.bindInteger(1, mid); - statement.bindLong(2, uid); - statement.bindLong(3, id); - statement.step(); - } - cursor.dispose(); - statement.dispose(); - } - - try { - cursor = database.queryFinalized("SELECT wp.id, wp.mid, m.uid FROM webpage_pending as wp INNER JOIN messages as m ON wp.mid = m.mid WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO webpage_pending_v2 VALUES(?, ?, ?)"); - while (cursor.next()) { - long id = cursor.longValue(0); - int mid = cursor.intValue(1); - long uid = cursor.longValue(2); - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - - statement.requery(); - statement.bindLong(1, id); - statement.bindInteger(2, mid); - statement.bindLong(3, uid); - statement.step(); - } - cursor.dispose(); - statement.dispose(); - } - - try { - cursor = database.queryFinalized("SELECT et.mid, m.uid, et.date, et.media FROM enc_tasks_v3 as et INNER JOIN messages as m ON et.mid = m.mid WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)"); - while (cursor.next()) { - int mid = cursor.intValue(0); - long uid = cursor.longValue(1); - int date = cursor.intValue(2); - int media = cursor.intValue(3); - - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - - statement.requery(); - statement.bindInteger(1, mid); - statement.bindLong(2, uid); - statement.bindInteger(3, date); - statement.bindInteger(4, media); - statement.step(); - } - cursor.dispose(); - statement.dispose(); - } - - database.executeFast("DROP INDEX IF EXISTS mid_idx_randoms;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS randoms;").stepThis().dispose(); - - database.executeFast("DROP INDEX IF EXISTS date_idx_enc_tasks_v3;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS enc_tasks_v3;").stepThis().dispose(); - - database.executeFast("DROP INDEX IF EXISTS polls_id;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS polls;").stepThis().dispose(); - - database.executeFast("DROP TABLE IF EXISTS webpage_pending;").stepThis().dispose(); - database.commitTransaction(); - - database.executeFast("PRAGMA user_version = 83").stepThis().dispose(); - version = 83; - } - if (version == 83) { - database.executeFast("CREATE TABLE IF NOT EXISTS messages_v2(mid INTEGER, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER, media INTEGER, replydata BLOB, imp INTEGER, mention INTEGER, forwards INTEGER, replies_data BLOB, thread_reply_id INTEGER, is_channel INTEGER, PRIMARY KEY(mid, uid))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_read_out_idx_messages_v2 ON messages_v2(uid, mid, read_state, out);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages_v2 ON messages_v2(uid, date, mid);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages_v2 ON messages_v2(mid, out);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS task_idx_messages_v2 ON messages_v2(uid, out, read_state, ttl, date, send_state);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_messages_v2 ON messages_v2(mid, send_state, date);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages_v2 ON messages_v2(uid, mention, read_state);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS is_channel_idx_messages_v2 ON messages_v2(mid, is_channel);").stepThis().dispose(); - - database.beginTransaction(); - - SQLiteCursor cursor; - - try { - cursor = database.queryFinalized("SELECT mid, uid, read_state, send_state, date, data, out, ttl, media, replydata, imp, mention, forwards, replies_data, thread_reply_id FROM messages WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - int num = 0; - while (cursor.next()) { - NativeByteBuffer data = cursor.byteBufferValue(5); - if (data == null) { - continue; - } - num++; - long mid = cursor.intValue(0); - long uid = cursor.longValue(1); - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - int readState = cursor.intValue(2); - int sendState = cursor.intValue(3); - int date = cursor.intValue(4); - int out = cursor.intValue(6); - int ttl = cursor.intValue(7); - int media = cursor.intValue(8); - NativeByteBuffer replydata = cursor.byteBufferValue(9); - int imp = cursor.intValue(10); - int mention = cursor.intValue(11); - int forwards = cursor.intValue(12); - NativeByteBuffer repliesdata = cursor.byteBufferValue(13); - int thread_reply_id = cursor.intValue(14); - int channelId = (int) (uid >> 32); - if (ttl < 0) { - TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); - if (message != null) { - message.readAttachPath(data, getUserConfig().clientUserId); - if (message.params == null) { - message.params = new HashMap<>(); - message.params.put("fwd_peer", "" + ttl); - } - data.reuse(); - data = new NativeByteBuffer(message.getObjectSize()); - message.serializeToStream(data); - } - ttl = 0; - } - - statement.requery(); - statement.bindInteger(1, (int) mid); - statement.bindLong(2, uid); - statement.bindInteger(3, readState); - statement.bindInteger(4, sendState); - statement.bindInteger(5, date); - statement.bindByteBuffer(6, data); - statement.bindInteger(7, out); - statement.bindInteger(8, ttl); - statement.bindInteger(9, media); - if (replydata != null) { - statement.bindByteBuffer(10, replydata); - } else { - statement.bindNull(10); - } - statement.bindInteger(11, imp); - statement.bindInteger(12, mention); - statement.bindInteger(13, forwards); - if (repliesdata != null) { - statement.bindByteBuffer(14, repliesdata); - } else { - statement.bindNull(14); - } - statement.bindInteger(15, thread_reply_id); - statement.bindInteger(16, channelId > 0 ? 1 : 0); - statement.step(); - if (replydata != null) { - replydata.reuse(); - } - if (repliesdata != null) { - repliesdata.reuse(); - } - data.reuse(); - } - cursor.dispose(); - statement.dispose(); - } - - ArrayList secretChatsToUpdate = null; - ArrayList foldersToUpdate = null; - cursor = database.queryFinalized("SELECT did, last_mid, last_mid_i FROM dialogs WHERE 1"); - SQLitePreparedStatement statement4 = database.executeFast("UPDATE dialogs SET last_mid = ?, last_mid_i = ? WHERE did = ?"); - while (cursor.next()) { - long did = cursor.longValue(0); - int lowerId = (int) did; - int highId = (int) (did >> 32); - if (lowerId == 0) { - if (secretChatsToUpdate == null) { - secretChatsToUpdate = new ArrayList<>(); - } - secretChatsToUpdate.add(highId); - } else if (highId == 2) { - if (foldersToUpdate == null) { - foldersToUpdate = new ArrayList<>(); - } - foldersToUpdate.add(lowerId); - } - - statement4.requery(); - statement4.bindInteger(1, cursor.intValue(1)); - statement4.bindInteger(2, cursor.intValue(2)); - statement4.bindLong(3, did); - statement4.step(); - } - statement4.dispose(); - cursor.dispose(); - - cursor = database.queryFinalized("SELECT uid, mid FROM unread_push_messages WHERE 1"); - statement4 = database.executeFast("UPDATE unread_push_messages SET mid = ? WHERE uid = ? AND mid = ?"); - while (cursor.next()) { - long did = cursor.longValue(0); - int mid = cursor.intValue(1); - statement4.requery(); - statement4.bindInteger(1, mid); - statement4.bindLong(2, did); - statement4.bindInteger(3, mid); - statement4.step(); - } - statement4.dispose(); - cursor.dispose(); - - if (secretChatsToUpdate != null) { - SQLitePreparedStatement statement = database.executeFast("UPDATE dialogs SET did = ? WHERE did = ?"); - SQLitePreparedStatement statement2 = database.executeFast("UPDATE dialog_filter_pin_v2 SET peer = ? WHERE peer = ?"); - SQLitePreparedStatement statement3 = database.executeFast("UPDATE dialog_filter_ep SET peer = ? WHERE peer = ?"); - for (int a = 0, N = secretChatsToUpdate.size(); a < N; a++) { - int sid = secretChatsToUpdate.get(a); - - long newId = DialogObject.makeEncryptedDialogId(sid); - long oldId = ((long) sid) << 32; - statement.requery(); - statement.bindLong(1, newId); - statement.bindLong(2, oldId); - statement.step(); - - statement2.requery(); - statement2.bindLong(1, newId); - statement2.bindLong(2, oldId); - statement2.step(); - - statement3.requery(); - statement3.bindLong(1, newId); - statement3.bindLong(2, oldId); - statement3.step(); - } - statement.dispose(); - statement2.dispose(); - statement3.dispose(); - } - if (foldersToUpdate != null) { - SQLitePreparedStatement statement = database.executeFast("UPDATE dialogs SET did = ? WHERE did = ?"); - for (int a = 0, N = foldersToUpdate.size(); a < N; a++) { - int fid = foldersToUpdate.get(a); - - long newId = DialogObject.makeFolderDialogId(fid); - long oldId = (((long) 2) << 32) | fid; - statement.requery(); - statement.bindLong(1, newId); - statement.bindLong(2, oldId); - statement.step(); - } - statement.dispose(); - } - - database.executeFast("DROP INDEX IF EXISTS uid_mid_read_out_idx_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS uid_date_mid_idx_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS mid_out_idx_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS task_idx_messages;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS send_state_idx_messages2;").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS uid_mention_idx_messages;").stepThis().dispose(); - database.executeFast("DROP TABLE IF EXISTS messages;").stepThis().dispose(); - database.commitTransaction(); - - database.executeFast("PRAGMA user_version = 84").stepThis().dispose(); - version = 84; - } - if (version == 84) { - database.executeFast("CREATE TABLE IF NOT EXISTS media_v4(mid INTEGER, uid INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid, type))").stepThis().dispose(); - database.beginTransaction(); - SQLiteCursor cursor; - try { - cursor = database.queryFinalized("SELECT mid, uid, date, type, data FROM media_v3 WHERE 1"); - } catch (Exception e) { - cursor = null; - FileLog.e(e); - } - if (cursor != null) { - SQLitePreparedStatement statement = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); - while (cursor.next()) { - NativeByteBuffer data = cursor.byteBufferValue(4); - if (data == null) { - continue; - } - int mid = cursor.intValue(0); - long uid = cursor.longValue(1); - int lowerId = (int) uid; - if (lowerId == 0) { - int highId = (int) (uid >> 32); - uid = DialogObject.makeEncryptedDialogId(highId); - } - int date = cursor.intValue(2); - int type = cursor.intValue(3); - - statement.requery(); - statement.bindInteger(1, mid); - statement.bindLong(2, uid); - statement.bindInteger(3, date); - statement.bindInteger(4, type); - statement.bindByteBuffer(5, data); - statement.step(); - data.reuse(); - } - cursor.dispose(); - statement.dispose(); - } - database.commitTransaction(); - - database.executeFast("DROP TABLE IF EXISTS media_v3;").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 85").stepThis().dispose(); - version = 85; - } - if (version == 85) { - executeNoException("ALTER TABLE messages_v2 ADD COLUMN reply_to_message_id INTEGER default 0"); - executeNoException("ALTER TABLE scheduled_messages_v2 ADD COLUMN reply_to_message_id INTEGER default 0"); - - database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_messages_v2 ON messages_v2(mid, reply_to_message_id);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_scheduled_messages_v2 ON scheduled_messages_v2(mid, reply_to_message_id);").stepThis().dispose(); - - executeNoException("UPDATE messages_v2 SET replydata = NULL"); - executeNoException("UPDATE scheduled_messages_v2 SET replydata = NULL"); - database.executeFast("PRAGMA user_version = 86").stepThis().dispose(); - version = 86; - } - - if (version == 86) { - database.executeFast("CREATE TABLE IF NOT EXISTS reactions(data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 87").stepThis().dispose(); - version = 87; - } - - if (version == 87) { - database.executeFast("ALTER TABLE dialogs ADD COLUMN unread_reactions INTEGER default 0").stepThis().dispose(); - database.executeFast("CREATE TABLE reaction_mentions(message_id INTEGER PRIMARY KEY, state INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 88").stepThis().dispose(); - version = 88; - } - - if (version == 88 || version == 89) { - database.executeFast("DROP TABLE IF EXISTS reaction_mentions;").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS reaction_mentions(message_id INTEGER, state INTEGER, dialog_id INTEGER, PRIMARY KEY(dialog_id, message_id));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_did ON reaction_mentions(dialog_id);").stepThis().dispose(); - - database.executeFast("DROP INDEX IF EXISTS uid_mid_type_date_idx_media_v3").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_v4 ON media_v4(uid, mid, type, date);").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 90").stepThis().dispose(); - - version = 90; - } - - if (version == 90 || version == 91) { - database.executeFast("DROP TABLE IF EXISTS downloading_documents;").stepThis().dispose(); - database.executeFast("CREATE TABLE downloading_documents(data BLOB, hash INTEGER, id INTEGER, state INTEGER, date INTEGER, PRIMARY KEY(hash, id));").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 92").stepThis().dispose(); - version = 92; - } - - if (version == 92) { - database.executeFast("CREATE TABLE IF NOT EXISTS attach_menu_bots(data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 93").stepThis().dispose(); - version = 95; - } - - if (version == 95 || version == 93) { - executeNoException("ALTER TABLE messages_v2 ADD COLUMN custom_params BLOB default NULL"); - database.executeFast("PRAGMA user_version = 96").stepThis().dispose(); - version = 96; - } - - // skip 94, 95. private beta db rollback - if (version == 96) { - database.executeFast("CREATE TABLE IF NOT EXISTS premium_promo(data BLOB, date INTEGER);").stepThis().dispose(); - database.executeFast("UPDATE stickers_v2 SET date = 0"); - database.executeFast("PRAGMA user_version = 97").stepThis().dispose(); - version = 97; - } - - if (version == 97) { - database.executeFast("DROP TABLE IF EXISTS stickers_featured;").stepThis().dispose(); - database.executeFast("CREATE TABLE stickers_featured(id INTEGER PRIMARY KEY, data BLOB, unread BLOB, date INTEGER, hash INTEGER, premium INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 98").stepThis().dispose(); - version = 98; - } - - if (version == 98) { - database.executeFast("CREATE TABLE animated_emoji(document_id INTEGER PRIMARY KEY, data BLOB);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 99").stepThis().dispose(); - version = 99; - } - - if (version == 99) { - database.executeFast("ALTER TABLE stickers_featured ADD COLUMN emoji INTEGER default 0").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 100").stepThis().dispose(); - version = 100; - } - - if (version == 100) { - database.executeFast("CREATE TABLE emoji_statuses(data BLOB, type INTEGER);").stepThis().dispose(); - database.executeFast("PRAGMA user_version = 101").stepThis().dispose(); - version = 101; - } - - if (version == 101) { - database.executeFast("ALTER TABLE messages_v2 ADD COLUMN group_id INTEGER default NULL").stepThis().dispose(); - database.executeFast("ALTER TABLE dialogs ADD COLUMN last_mid_group INTEGER default NULL").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_groupid_messages_v2 ON messages_v2(uid, mid, group_id);").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 102").stepThis().dispose(); - version = 102; - } - - if (version == 102) { - database.executeFast("CREATE TABLE messages_holes_topics(uid INTEGER, topic_id INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, topic_id, start));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_messages_holes ON messages_holes_topics(uid, topic_id, end);").stepThis().dispose(); - - database.executeFast("CREATE TABLE messages_topics(mid INTEGER, uid INTEGER, topic_id INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER, media INTEGER, replydata BLOB, imp INTEGER, mention INTEGER, forwards INTEGER, replies_data BLOB, thread_reply_id INTEGER, is_channel INTEGER, reply_to_message_id INTEGER, custom_params BLOB, PRIMARY KEY(mid, topic_id, uid))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_read_out_idx_messages_topics ON messages_topics(uid, mid, read_state, out);").stepThis().dispose();//move to topic id - database.executeFast("CREATE INDEX IF NOT EXISTS uid_date_mid_idx_messages_topics ON messages_topics(uid, date, mid);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS mid_out_idx_messages_topics ON messages_topics(mid, out);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS task_idx_messages_topics ON messages_topics(uid, out, read_state, ttl, date, send_state);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS send_state_idx_messages_topics ON messages_topics(mid, send_state, date);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages_topics ON messages_topics(uid, mention, read_state);").stepThis().dispose();//move to uid, topic_id, mentiin_read_state - database.executeFast("CREATE INDEX IF NOT EXISTS is_channel_idx_messages_topics ON messages_topics(mid, is_channel);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_messages_topics ON messages_topics(mid, reply_to_message_id);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS mid_uid_messages_topics ON messages_topics(mid, uid);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS mid_uid_topic_id_messages_topics ON messages_topics(mid, topic_id, uid);").stepThis().dispose(); - - database.executeFast("CREATE TABLE media_topics(mid INTEGER, uid INTEGER, topic_id INTEGER, date INTEGER, type INTEGER, data BLOB, PRIMARY KEY(mid, uid, topic_id, type))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_type_date_idx_media_topics ON media_topics(uid, topic_id, mid, type, date);").stepThis().dispose(); - - database.executeFast("CREATE TABLE media_holes_topics(uid INTEGER, topic_id INTEGER, type INTEGER, start INTEGER, end INTEGER, PRIMARY KEY(uid, topic_id, type, start));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_end_media_holes_topics ON media_holes_topics(uid, topic_id, type, end);").stepThis().dispose(); - - database.executeFast("CREATE TABLE topics(did INTEGER, topic_id INTEGER, data BLOB, top_message INTEGER, topic_message BLOB, unread_count INTEGER, max_read_id INTEGER, unread_mentions INTEGER, unread_reactions INTEGER, PRIMARY KEY(did, topic_id));").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS did_top_message_topics ON topics(did, top_message);").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 103").stepThis().dispose(); - version = 103; - } - - if (version == 103) { - database.executeFast("CREATE TABLE IF NOT EXISTS media_counts_topics(uid INTEGER, topic_id INTEGER, type INTEGER, count INTEGER, old INTEGER, PRIMARY KEY(uid, topic_id, type))").stepThis().dispose(); - database.executeFast("CREATE TABLE IF NOT EXISTS reaction_mentions_topics(message_id INTEGER, state INTEGER, dialog_id INTEGER, topic_id INTEGER, PRIMARY KEY(message_id, dialog_id, topic_id))").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS reaction_mentions_topics_did ON reaction_mentions_topics(dialog_id, topic_id);").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 104").stepThis().dispose(); - version = 104; - } - - if (version == 104) { - database.executeFast("ALTER TABLE topics ADD COLUMN read_outbox INTEGER default 0").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 105").stepThis().dispose(); - version = 105; - } - - if (version == 105) { - database.executeFast("ALTER TABLE topics ADD COLUMN pinned INTEGER default 0").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 106").stepThis().dispose(); - version = 106; - } - - if (version == 106) { - database.executeFast("DROP INDEX IF EXISTS uid_mid_read_out_idx_messages_topics").stepThis().dispose(); - database.executeFast("DROP INDEX IF EXISTS uid_mention_idx_messages_topics").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mid_read_out_idx_messages_topics ON messages_topics(uid, topic_id, mid, read_state, out);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_mention_idx_messages_topics ON messages_topics(uid, topic_id, mention, read_state);").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS uid_topic_id_messages_topics ON messages_topics(uid, topic_id);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_topic_id_date_mid_messages_topics ON messages_topics(uid, topic_id, date, mid);").stepThis().dispose(); - database.executeFast("CREATE INDEX IF NOT EXISTS uid_topic_id_mid_messages_topics ON messages_topics(uid, topic_id, mid);").stepThis().dispose(); - - database.executeFast("CREATE INDEX IF NOT EXISTS did_topics ON topics(did);").stepThis().dispose(); - - database.executeFast("PRAGMA user_version = 107").stepThis().dispose(); - version = 107; - } - - FileLog.d("MessagesStorage db migration finished"); + FileLog.d("MessagesStorage db migration finished to varsion " + version); AndroidUtilities.runOnUIThread(() -> { databaseMigrationInProgress = false; NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.onDatabaseMigration, false); }); } - private void executeNoException(String query) { + void executeNoException(String query) { try { database.executeFast(query).stepThis().dispose(); } catch (Exception e) { @@ -1822,7 +641,7 @@ public class MessagesStorage extends BaseController { }); } - private void fixNotificationSettings() { + public void fixNotificationSettings() { storageQueue.postRunnable(() -> { try { LongSparseArray ids = new LongSparseArray<>(); @@ -2400,7 +1219,7 @@ public class MessagesStorage extends BaseController { if (replace) { database.executeFast("DELETE FROM topics WHERE did = " + dialogId).stepThis().dispose(); } - state = database.executeFast("REPLACE INTO topics VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state = database.executeFast("REPLACE INTO topics VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); if (inTransaction) { database.beginTransaction(); } @@ -2431,6 +1250,8 @@ public class MessagesStorage extends BaseController { } else { state.bindInteger(11, topic.pinned ? 1 + topic.pinnedOrder : 0); } + state.bindInteger(12, topic.totalMessagesCount); + state.bindInteger(13, topic.hidden ? 1 : 0); state.step(); messageData.reuse(); @@ -2473,6 +1294,18 @@ public class MessagesStorage extends BaseController { SQLitePreparedStatement state = null; SQLiteCursor cursor = null; try { + if ((flags & TopicsController.TOPIC_FLAG_TOTAL_MESSAGES_COUNT) != 0) { + state = database.executeFast("UPDATE topics SET total_messages_count = ? WHERE did = ? AND topic_id = ?"); + state.requery(); + state.bindInteger(1, fromTopic.totalMessagesCount); + state.bindLong(2, dialogId); + state.bindInteger(3, fromTopic.id); + state.step(); + state.dispose(); + if (flags == TopicsController.TOPIC_FLAG_TOTAL_MESSAGES_COUNT) { + return; + } + } TLRPC.TL_forumTopic topicToUpdate = null; cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM topics WHERE did = %d AND topic_id = %d", dialogId, fromTopic.id)); if (cursor.next()) { @@ -2501,14 +1334,18 @@ public class MessagesStorage extends BaseController { if ((flags & TopicsController.TOPIC_FLAG_CLOSE) != 0) { topicToUpdate.closed = fromTopic.closed; } - state = database.executeFast("UPDATE topics SET data = ?, pinned = ? WHERE did = ? AND topic_id = ?"); + if ((flags & TopicsController.TOPIC_FLAG_HIDE) != 0) { + topicToUpdate.hidden = fromTopic.hidden; + } + state = database.executeFast("UPDATE topics SET data = ?, pinned = ?, hidden = ? WHERE did = ? AND topic_id = ?"); database.beginTransaction(); NativeByteBuffer data = new NativeByteBuffer(topicToUpdate.getObjectSize()); topicToUpdate.serializeToStream(data); state.bindByteBuffer(1, data); state.bindInteger(2, pinnedOrder); - state.bindLong(3, dialogId); - state.bindInteger(4, topicToUpdate.id); + state.bindInteger(3, topicToUpdate.hidden ? 1 : 0); + state.bindLong(4, dialogId); + state.bindInteger(5, topicToUpdate.id); state.step(); data.reuse(); } @@ -2531,7 +1368,7 @@ public class MessagesStorage extends BaseController { ArrayList topics = null; SQLiteCursor cursor = null; try { - cursor = database.queryFinalized(String.format(Locale.US, "SELECT top_message, data, topic_message, unread_count, max_read_id, unread_mentions, unread_reactions, read_outbox, pinned FROM topics WHERE did = %d ORDER BY pinned ASC", dialogId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT top_message, data, topic_message, unread_count, max_read_id, unread_mentions, unread_reactions, read_outbox, pinned, total_messages_count FROM topics WHERE did = %d ORDER BY pinned ASC", dialogId)); SparseArray> topicsByTopMessageId = null; HashSet topMessageIds = null; @@ -2570,6 +1407,7 @@ public class MessagesStorage extends BaseController { topic.read_outbox_max_id = cursor.intValue(7); topic.pinnedOrder = cursor.intValue(8) - 1; topic.pinned = topic.pinnedOrder >= 0; + topic.totalMessagesCount = cursor.intValue(9); } data.reuse(); @@ -2818,6 +1656,24 @@ public class MessagesStorage extends BaseController { }); } + public void setDialogTtl(long did, int ttl) { + storageQueue.postRunnable(() -> { + try { + database.executeFast(String.format(Locale.US, "UPDATE dialogs SET ttl_period = %d WHERE did = %d", ttl, did)).stepThis().dispose(); + } catch (SQLiteException e) { + FileLog.e(e); + } + }); + } + + public ArrayList getDatabaseFiles() { + ArrayList files = new ArrayList<>(); + files.add(cacheFile); + files.add(walCacheFile); + files.add(shmCacheFile); + return files; + } + private static class ReadDialog { public int lastMid; public int date; @@ -2907,7 +1763,7 @@ public class MessagesStorage extends BaseController { LongSparseArray groupsToLoad = new LongSparseArray<>(); SQLiteCursor cursor = null; try { - cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions, d.last_mid_group FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.did IN (%s) ORDER BY d.pinned DESC, d.date DESC", ids)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions, d.last_mid_group, d.ttl_period FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.did IN (%s) ORDER BY d.pinned DESC, d.date DESC", ids)); while (cursor.next()) { long dialogId = cursor.longValue(0); TLRPC.Dialog dialog = new TLRPC.TL_dialog(); @@ -2935,9 +1791,11 @@ public class MessagesStorage extends BaseController { } dialog.folder_id = cursor.intValue(17); dialog.unread_reactions_count = cursor.intValue(19); - if (!cursor.isNull(20)) { - groupsToLoad.append(dialogId, cursor.longValue(20)); + long groupMessagesId = cursor.longValue(20); + if (groupMessagesId != 0) { + groupsToLoad.append(dialogId, groupMessagesId); } + dialog.ttl_period = cursor.intValue(21); dialogs.dialogs.add(dialog); NativeByteBuffer data = cursor.byteBufferValue(4); @@ -5666,7 +4524,7 @@ public class MessagesStorage extends BaseController { if (data != null) { TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); data.reuse(); - topicId = MessageObject.getTopicId(message); + topicId = MessageObject.getTopicId(message, isForum(dialogId)); } } cursor.dispose(); @@ -7050,6 +5908,14 @@ public class MessagesStorage extends BaseController { state = null; unknownDialogsIds.remove(info.user.id); } + if ((info.flags & 16384) != 0) { + state = database.executeFast("UPDATE dialogs SET ttl_period = ? WHERE did = ?"); + state.bindInteger(1, info.ttl_period); + state.bindLong(2, info.user.id); + state.step(); + state.dispose(); + state = null; + } } catch (Exception e) { FileLog.e(e); } finally { @@ -7174,6 +6040,13 @@ public class MessagesStorage extends BaseController { state = null; unknownDialogsIds.remove(-info.id); } + + state = database.executeFast("UPDATE dialogs SET ttl_period = ? WHERE did = ?"); + state.bindInteger(1, info.ttl_period); + state.bindLong(2, -info.id); + state.step(); + state.dispose(); + state = null; } catch (Exception e) { FileLog.e(e); } finally { @@ -9952,7 +8825,7 @@ public class MessagesStorage extends BaseController { data4.reuse(); data5.reuse(); if (dialog != null) { - state = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)"); + state = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); state.bindLong(1, dialog.id); state.bindInteger(2, dialog.last_message_date); state.bindInteger(3, dialog.unread_count); @@ -9968,6 +8841,8 @@ public class MessagesStorage extends BaseController { state.bindInteger(13, dialog.folder_id); state.bindNull(14); state.bindInteger(15, dialog.unread_reactions_count); + state.bindInteger(16, 0); + state.bindInteger(17, dialog.ttl_period); state.step(); state.dispose(); state = null; @@ -11123,6 +9998,7 @@ public class MessagesStorage extends BaseController { HashMap topicsReadMax = new HashMap<>(); HashMap topicsNewUnreadMessages = new HashMap<>(); + HashMap topicsNewMessages = new HashMap<>(); HashMap topicMessagesMap = new HashMap<>(); HashMap> topicMentionsIdsMap = new HashMap<>(); HashMap topicsMentions = new HashMap<>(); @@ -11146,7 +10022,7 @@ public class MessagesStorage extends BaseController { int messageId = message.id; MessageObject.getDialogId(message); - int topicId = MessageObject.getTopicId(message); + int topicId = MessageObject.getTopicId(message, isForum(message.dialog_id)); if (message.mentioned && message.media_unread) { ArrayList ids = dialogMentionsIdsMap.get(message.dialog_id); @@ -11156,6 +10032,7 @@ public class MessagesStorage extends BaseController { } ids.add(messageId); if (topicId != 0) { + FileLog.d("add message with message to " + message.dialog_id + " " + topicId); TopicKey topicKey = TopicKey.of(message.dialog_id, topicId); ArrayList ids2 = topicMentionsIdsMap.get(topicKey); if (ids2 == null) { @@ -11222,6 +10099,14 @@ public class MessagesStorage extends BaseController { newUnread++; topicsNewUnreadMessages.put(topicKey, newUnread); } + if (currentTopicMaxId < message.id) { + Integer newMessages = topicsNewMessages.get(topicKey); + if (newMessages == null) { + newMessages = 0; + } + newMessages++; + topicsNewMessages.put(topicKey, newMessages); + } } } if (MediaDataController.canAddMessageToMedia(message)) { @@ -11523,7 +10408,7 @@ public class MessagesStorage extends BaseController { continue; } fixUnsupportedMedia(message); - int topicId = MessageObject.getTopicId(message); + int topicId = MessageObject.getTopicId(message, isForum(message.dialog_id)); state_messages.requery(); int messageId = message.id; @@ -11773,7 +10658,7 @@ public class MessagesStorage extends BaseController { state_download.bindInteger(2, type); state_download.bindInteger(3, message.date); state_download.bindByteBuffer(4, data); - state_download.bindString(5, "sent_" + (message.peer_id != null ? message.peer_id.channel_id : 0) + "_" + message.id); + state_download.bindString(5, "sent_" + (message.peer_id != null ? message.peer_id.channel_id : 0) + "_" + message.id + "_" + DialogObject.getPeerDialogId(message.peer_id)); state_download.step(); data.reuse(); } @@ -11809,9 +10694,9 @@ public class MessagesStorage extends BaseController { } } - state_dialogs_replace = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state_dialogs_replace = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); state_dialogs_update = database.executeFast("UPDATE dialogs SET date = ?, unread_count = ?, last_mid = ?, last_mid_group = ?, unread_count_i = ? WHERE did = ?"); - state_topics_update = database.executeFast("UPDATE topics SET unread_count = ?, top_message = ?, unread_mentions = ? WHERE did = ? AND topic_id = ?"); + state_topics_update = database.executeFast("UPDATE topics SET unread_count = ?, top_message = ?, unread_mentions = ?, total_messages_count = ? WHERE did = ? AND topic_id = ?"); ArrayList dids = new ArrayList<>(); for (int a = 0; a < messagesMap.size(); a++) { @@ -11903,6 +10788,7 @@ public class MessagesStorage extends BaseController { } else { state_dialogs_replace.bindNull(16); } + state_dialogs_replace.bindInteger(17, 0); state_dialogs_replace.step(); unknownDialogsIds.put(key, true); } @@ -11923,12 +10809,14 @@ public class MessagesStorage extends BaseController { TLRPC.Message message = topicMessagesMap.get(topicKey); - cursor = database.queryFinalized("SELECT unread_count, top_message, unread_mentions FROM topics WHERE did = " + topicKey.dialogId + " AND topic_id = " + topicKey.topicId); + cursor = database.queryFinalized("SELECT unread_count, top_message, unread_mentions, total_messages_count FROM topics WHERE did = " + topicKey.dialogId + " AND topic_id = " + topicKey.topicId); int oldUnreadCount = 0; int oldMentions = 0; + int oldTotalCount = 0; int topMessage = 0; int newMentions = 0; int newUnreadMessages = 0; + int newMessages = 0; boolean exist = false; if (cursor.next()) { @@ -11936,6 +10824,7 @@ public class MessagesStorage extends BaseController { oldUnreadCount = cursor.intValue(0); topMessage = cursor.intValue(1); oldMentions = cursor.intValue(2); + oldTotalCount = cursor.intValue(3); } cursor.dispose(); cursor = null; @@ -11953,6 +10842,7 @@ public class MessagesStorage extends BaseController { } Integer newMessagesInteger = topicsNewUnreadMessages.get(topicKey); Integer newMentionsInteger = topicsMentions.get(topicKey); + Integer newMessagesTotalInteger = topicsNewMessages.get(topicKey); int messageId = message != null ? message.id : topMessage; if (message != null) { @@ -11963,19 +10853,23 @@ public class MessagesStorage extends BaseController { if (newMessagesInteger != null) { newUnreadMessages = newMessagesInteger; } - if (newMentionsInteger != null) { newMentions = newMentionsInteger; } + if (newMessagesTotalInteger != null) { + newMessages = newMessagesTotalInteger; + } int newUnreadCount = oldUnreadCount + newUnreadMessages; int newUnreadMentions = oldMentions + newMentions; + int newTotalMessagesCount = oldTotalCount == 0 ? 0 : oldTotalCount + newMessages; state_topics_update.requery(); state_topics_update.bindInteger(1, newUnreadCount); state_topics_update.bindInteger(2, messageId); state_topics_update.bindInteger(3, newUnreadMentions); - state_topics_update.bindLong(4, topicKey.dialogId); - state_topics_update.bindInteger(5, topicKey.topicId); + state_topics_update.bindInteger(4, newTotalMessagesCount); + state_topics_update.bindLong(5, topicKey.dialogId); + state_topics_update.bindInteger(6, topicKey.topicId); state_topics_update.step(); if (isForum(topicKey.dialogId)) { @@ -11999,6 +10893,7 @@ public class MessagesStorage extends BaseController { topicUpdate.unreadMentions = oldMentions + newMentions; topicUpdate.topMessageId = messageId; topicUpdate.unreadCount = oldUnreadCount + newUnreadMessages; + topicUpdate.totalMessagesCount = newTotalMessagesCount; topicUpdatesInUi.add(topicUpdate); } } @@ -12161,7 +11056,7 @@ public class MessagesStorage extends BaseController { }); } else if (message.action instanceof TLRPC.TL_messageActionTopicEdit) { TLRPC.TL_messageActionTopicEdit action = (TLRPC.TL_messageActionTopicEdit) message.action; - forumTopic.id = MessageObject.getTopicId(message); + forumTopic.id = MessageObject.getTopicId(message, true); forumTopic.icon_emoji_id = action.icon_emoji_id; forumTopic.title = action.title; forumTopic.closed = action.closed; @@ -12873,18 +11768,19 @@ public class MessagesStorage extends BaseController { } topicsToDelete.add(TopicKey.of(did, message.id)); } - topicId = MessageObject.getTopicId(message); + topicId = MessageObject.getTopicId(message, isForum(did)); } if (topicId != 0) { TopicKey topicKey = TopicKey.of(dialogId, topicId); int read_state = cursor.intValue(2); + int[] count = topicsMessagesToUpdate.get(topicKey); + if (count == null) { + count = new int[3]; + topicsMessagesToUpdate.put(topicKey, count); + } + count[2]++; if (cursor.intValue(3) == 0) { - int[] count = topicsMessagesToUpdate.get(topicKey); - if (count == null) { - count = new int[2]; - topicsMessagesToUpdate.put(topicKey, count); - } if (read_state < 2) { count[1]++; } @@ -12970,12 +11866,14 @@ public class MessagesStorage extends BaseController { if (!topicsMessagesToUpdate.isEmpty()) { HashSet dialogsToCheck = null; for (TopicKey topicKey : topicsMessagesToUpdate.keySet()) { - cursor = database.queryFinalized(String.format(Locale.US, "SELECT unread_count, unread_mentions FROM topics WHERE did = %d AND topic_id = %d", topicKey.dialogId, topicKey.topicId)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT unread_count, unread_mentions, total_messages_count FROM topics WHERE did = %d AND topic_id = %d", topicKey.dialogId, topicKey.topicId)); int old_unread_count = 0; int old_mentions_count = 0; + int old_total_count = 0; if (cursor.next()) { old_unread_count = cursor.intValue(0); old_mentions_count = cursor.intValue(1); + old_total_count = cursor.intValue(2); } cursor.dispose(); cursor = null; @@ -12983,12 +11881,15 @@ public class MessagesStorage extends BaseController { int[] counts = topicsMessagesToUpdate.get(topicKey); int newUnreadCount = Math.max(0, old_unread_count - counts[0]); int newUnreadMentionsCount = Math.max(0, old_mentions_count - counts[1]); - state = database.executeFast("UPDATE topics SET unread_count = ?, unread_mentions = ? WHERE did = ? AND topic_id = ?"); + int newTotalCount = Math.max(0, old_total_count - counts[2]); + state = database.executeFast("UPDATE topics SET unread_count = ?, unread_mentions = ?, total_messages_count = ? WHERE did = ? AND topic_id = ?"); state.requery(); state.bindInteger(1, newUnreadCount); state.bindInteger(2, newUnreadMentionsCount); - state.bindLong(3, topicKey.dialogId); - state.bindLong(4, topicKey.topicId); + state.bindLong(3, newTotalCount); + state.bindLong(4, topicKey.dialogId); + state.bindLong(5, topicKey.topicId); + state.step(); state.dispose(); state = null; @@ -13004,6 +11905,7 @@ public class MessagesStorage extends BaseController { topicUpdate.dialogId = topicKey.dialogId; topicUpdate.topicId = topicKey.topicId; topicUpdate.unreadCount = newUnreadCount; + topicUpdate.totalMessagesCount = newTotalCount; topicUpdate.onlyCounters = true; if (topicUpdatesInUi == null) { topicUpdatesInUi = new ArrayList<>(); @@ -13278,7 +12180,7 @@ public class MessagesStorage extends BaseController { ArrayList encryptedToLoad = new ArrayList<>(); LongSparseArray groupsToLoad = new LongSparseArray<>(); - cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, m.date, d.pts, d.inbox_max, d.outbox_max, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions, d.last_mid_group FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid AND d.last_mid_group IS NULL WHERE d.did IN(%s)", ids)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, m.date, d.pts, d.inbox_max, d.outbox_max, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions, d.last_mid_group, d.ttl_period FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid AND d.last_mid_group IS NULL WHERE d.did IN(%s)", ids)); while (cursor.next()) { long dialogId = cursor.longValue(0); TLRPC.Dialog dialog; @@ -13313,10 +12215,11 @@ public class MessagesStorage extends BaseController { dialog.unread_mark = (dialog_flags & 1) != 0; dialog.folder_id = cursor.intValue(15); dialog.unread_reactions_count = cursor.intValue(17); - - if (!cursor.isNull(18)) { - groupsToLoad.put(dialogId, cursor.longValue(18)); + long groupMessagesId = cursor.longValue(18); + if (groupMessagesId != 0) { + groupsToLoad.put(dialogId, groupMessagesId); } + dialog.ttl_period = cursor.intValue(19); dialogs.dialogs.add(dialog); @@ -13991,7 +12894,7 @@ public class MessagesStorage extends BaseController { for (int i = 0; i < 2; i++) { boolean isTopic = i == 1; - int topicId = MessageObject.getTopicId(message); + int topicId = MessageObject.getTopicId(message, isForum(message.dialog_id)); if (isTopic && topicId == 0) { continue; } @@ -14065,7 +12968,7 @@ public class MessagesStorage extends BaseController { if (MediaDataController.canAddMessageToMedia(message)) { for (int i = 0; i < 2; i++) { boolean isTopic = i == 1; - int topicId = MessageObject.getTopicId(message); + int topicId = MessageObject.getTopicId(message, isForum(message.dialog_id)); if (isTopic && topicId == 0) { continue; } @@ -14322,7 +13225,7 @@ public class MessagesStorage extends BaseController { state3.bindInteger(7, message.date); state3.bindLong(8, dialogId); } else { - state3 = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state3 = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); state3.bindLong(1, dialogId); state3.bindInteger(2, message.date); state3.bindInteger(3, 0); @@ -14343,6 +13246,7 @@ public class MessagesStorage extends BaseController { } else { state3.bindNull(16); } + state3.bindInteger(17, 0); unknownDialogsIds.put(dialogId, true); } state3.step(); @@ -14358,7 +13262,7 @@ public class MessagesStorage extends BaseController { boolean isTopicMessage = i == 1; int topicId = threadMessageId; if (isTopicMessage && topicId == 0) { - topicId = MessageObject.getTopicId(message); + topicId = MessageObject.getTopicId(message, isForum(message.dialog_id)); } if (isTopicMessage && topicId == 0) { continue; @@ -14448,7 +13352,7 @@ public class MessagesStorage extends BaseController { } } } - int topicId = MessageObject.getTopicId(message); + int topicId = MessageObject.getTopicId(message, isForum(message.dialog_id)); if (threadMessageId != 0 || (load_type == -2 && topicId != 0)) { if (MediaDataController.canAddMessageToMedia(message)) { state_media_topics.requery(); @@ -14776,7 +13680,7 @@ public class MessagesStorage extends BaseController { } ArrayList> dialogsToLoadGroupMessages = new ArrayList<>(); - cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions, d.last_mid_group FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid AND d.last_mid_group IS NULL LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.folder_id = %d ORDER BY d.pinned DESC, d.date DESC LIMIT %d,%d", fid, off, cnt)); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, s.flags, m.date, d.pts, d.inbox_max, d.outbox_max, m.replydata, d.pinned, d.unread_count_i, d.flags, d.folder_id, d.data, d.unread_reactions, d.last_mid_group, d.ttl_period FROM dialogs as d LEFT JOIN messages_v2 as m ON d.last_mid = m.mid AND d.did = m.uid AND d.last_mid_group IS NULL LEFT JOIN dialog_settings as s ON d.did = s.did WHERE d.folder_id = %d ORDER BY d.pinned DESC, d.date DESC LIMIT %d,%d", fid, off, cnt)); while (cursor.next()) { long dialogId = cursor.longValue(0); TLRPC.Dialog dialog; @@ -14823,9 +13727,11 @@ public class MessagesStorage extends BaseController { } dialog.folder_id = cursor.intValue(17); dialog.unread_reactions_count = cursor.intValue(19); - if (!cursor.isNull(20)) { - dialogsToLoadGroupMessages.add(new Pair<>(dialogId, cursor.longValue(20))); + long groupMessagesId = cursor.longValue(20); + if (groupMessagesId != 0) { + dialogsToLoadGroupMessages.add(new Pair<>(dialogId, groupMessagesId)); } + dialog.ttl_period = cursor.intValue(21); dialogs.dialogs.add(dialog); if (draftsDialogIds != null) { @@ -15100,7 +14006,7 @@ public class MessagesStorage extends BaseController { if (!dialogs.dialogs.isEmpty()) { state_messages = database.executeFast("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, 0, NULL, ?)"); - state_dialogs = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + state_dialogs = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); state_media = database.executeFast("REPLACE INTO media_v4 VALUES(?, ?, ?, ?, ?)"); state_settings = database.executeFast("REPLACE INTO dialog_settings VALUES(?, ?)"); state_holes = database.executeFast("REPLACE INTO messages_holes VALUES(?, ?, ?)"); @@ -15280,6 +14186,7 @@ public class MessagesStorage extends BaseController { } else { state_dialogs.bindNull(16); } + state_dialogs.bindInteger(17, dialog.ttl_period); state_dialogs.step(); if (data != null) { data.reuse(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java index 2cb0024c2..c79e99067 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java @@ -10,6 +10,7 @@ package org.telegram.messenger; import android.os.SystemClock; import android.util.SparseArray; +import android.view.View; import androidx.annotation.UiThread; @@ -264,6 +265,7 @@ public class NotificationCenter { public static final int permissionsGranted = totalEvents++; public static int topicsDidLoaded = totalEvents++; public static int chatSwithcedToForum = totalEvents++; + public static int didUpdateGlobalAutoDeleteTimer = totalEvents++; private SparseArray> observers = new SparseArray<>(); private SparseArray> removeAfterBroadcast = new SparseArray<>(); @@ -510,9 +512,6 @@ public class NotificationCenter { if (!allowDuringAnimation && isAnimationInProgress()) { DelayedPost delayedPost = new DelayedPost(id, args); delayedPosts.add(delayedPost); - if (BuildVars.LOGS_ENABLED) { - FileLog.e("delay post notification " + id + " with args count = " + args.length); - } return; } if (!postponeCallbackList.isEmpty()) { @@ -653,4 +652,29 @@ public class NotificationCenter { time = SystemClock.elapsedRealtime(); } } + + public static void listenEmojiLoading(View view) { + if (view == null) { + return; + } + + final NotificationCenterDelegate delegate = (id, account, args) -> { + if (id == NotificationCenter.emojiLoaded) { + if (view != null && view.isAttachedToWindow()) { + view.invalidate(); + } + } + }; + view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + NotificationCenter.getGlobalInstance().addObserver(delegate, NotificationCenter.emojiLoaded); + } + + @Override + public void onViewDetachedFromWindow(View view) { + NotificationCenter.getGlobalInstance().removeObserver(delegate, NotificationCenter.emojiLoaded); + } + }); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 74abe4ee0..2ebb767ed 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -856,7 +856,7 @@ public class NotificationsController extends BaseController { } long originalDialogId = dialogId; - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = MessageObject.getTopicId(messageObject.messageOwner, getMessagesController().isForum(messageObject)); if (dialogId == openedDialogId && ApplicationLoader.isScreenOn) { if (!isFcm) { playInChatSound(); @@ -919,7 +919,7 @@ public class NotificationsController extends BaseController { if (messageObject.isReactionPush) { SparseBooleanArray sparseBooleanArray = new SparseBooleanArray(); sparseBooleanArray.put(mid, true); - getMessagesController().checkUnreadReactions(dialogId, MessageObject.getTopicId(messageObject.messageOwner), sparseBooleanArray); + getMessagesController().checkUnreadReactions(dialogId, topicId, sparseBooleanArray); } } @@ -951,7 +951,7 @@ public class NotificationsController extends BaseController { } else if (added) { MessageObject messageObject = messageObjects.get(0); long dialog_id = messageObject.getDialogId(); - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = MessageObject.getTopicId(messageObject.messageOwner, getMessagesController().isForum(dialog_id)); Boolean isChannel; if (messageObject.isFcmMessage()) { isChannel = messageObject.localChannel; @@ -1182,7 +1182,7 @@ public class NotificationsController extends BaseController { } long dialog_id = messageObject.getDialogId(); long original_dialog_id = dialog_id; - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = MessageObject.getTopicId(messageObject.messageOwner, getMessagesController().isForum(messageObject)); if (messageObject.messageOwner.mentioned) { dialog_id = messageObject.getFromChatId(); } @@ -1254,7 +1254,7 @@ public class NotificationsController extends BaseController { } long dialogId = messageObject.getDialogId(); long originalDialogId = dialogId; - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = MessageObject.getTopicId(messageObject.messageOwner, getMessagesController().isForum(messageObject)); long randomId = messageObject.messageOwner.random_id; if (messageObject.messageOwner.mentioned) { dialogId = messageObject.getFromChatId(); @@ -3428,7 +3428,7 @@ public class NotificationsController extends BaseController { } long dialog_id = lastMessageObject.getDialogId(); - int topicId = MessageObject.getTopicId(lastMessageObject.messageOwner); + int topicId = MessageObject.getTopicId(lastMessageObject.messageOwner, getMessagesController().isForum(lastMessageObject)); boolean isChannel = false; long override_dialog_id = dialog_id; @@ -4016,7 +4016,7 @@ public class NotificationsController extends BaseController { for (int a = 0; a < pushMessages.size(); a++) { MessageObject messageObject = pushMessages.get(a); long dialog_id = messageObject.getDialogId(); - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = MessageObject.getTopicId(messageObject.messageOwner, getMessagesController().isForum(messageObject)); int dismissDate = preferences.getInt("dismissDate" + dialog_id, 0); if (messageObject.messageOwner.date <= dismissDate) { continue; @@ -4305,7 +4305,7 @@ public class NotificationsController extends BaseController { int rowsMid = 0; for (int a = messageObjects.size() - 1; a >= 0; a--) { MessageObject messageObject = messageObjects.get(a); - int messageTopicId = MessageObject.getTopicId(messageObject.messageOwner); + int messageTopicId = MessageObject.getTopicId(messageObject.messageOwner, getMessagesController().isForum(messageObject)); if (topicId != messageTopicId) { continue; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java index ca6158704..75e8db83c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java @@ -1451,7 +1451,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe HashMap params = null; if (DialogObject.isEncryptedDialog(did) && messageObject.messageOwner.peer_id != null && (messageObject.messageOwner.media.photo instanceof TLRPC.TL_photo || messageObject.messageOwner.media.document instanceof TLRPC.TL_document)) { params = new HashMap<>(); - params.put("parentObject", "sent_" + messageObject.messageOwner.peer_id.channel_id + "_" + messageObject.getId()); + params.put("parentObject", "sent_" + messageObject.messageOwner.peer_id.channel_id + "_" + messageObject.getId() + "_" + messageObject.getDialogId()); } if (messageObject.messageOwner.media.photo instanceof TLRPC.TL_photo) { sendMessage((TLRPC.TL_photo) messageObject.messageOwner.media.photo, null, did, messageObject.replyMessageObject, null, messageObject.messageOwner.message, messageObject.messageOwner.entities, null, params, true, 0, messageObject.messageOwner.media.ttl_seconds, messageObject, false); @@ -2374,7 +2374,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe ArrayList arr = new ArrayList<>(); arr.add(newMsg); - getMessagesStorage().putMessages(arr, false, true, false, 0, messageObject.scheduled, MessageObject.getTopicId(newMsg)); + getMessagesStorage().putMessages(arr, false, true, false, 0, messageObject.scheduled, MessageObject.getTopicId(newMsg, getMessagesController().isForum(newMsg))); getMessagesController().getTopicsController().processEditedMessage(newMsg); messageObject.type = -1; @@ -5570,7 +5570,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe LongSparseArray> channelReplies = null; for (int a = 0; a < updatesArr.size(); a++) { TLRPC.Update update = updatesArr.get(a); - if (update instanceof TLRPC.TL_updateNewMessage) { + if (update instanceof TLRPC.TL_updateNewMessage && ((TLRPC.TL_updateNewMessage) update).message.action == null) { final TLRPC.TL_updateNewMessage newMessage = (TLRPC.TL_updateNewMessage) update; sentMessages.add(message = newMessage.message); Utilities.stageQueue.postRunnable(() -> getMessagesController().processNewDifferenceParams(-1, newMessage.pts, -1, newMessage.pts_count)); @@ -5783,7 +5783,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe } if (sentMessage.media instanceof TLRPC.TL_messageMediaPhoto && sentMessage.media.photo != null && newMsg.media instanceof TLRPC.TL_messageMediaPhoto && newMsg.media.photo != null) { if (sentMessage.media.ttl_seconds == 0 && !newMsgObj.scheduled) { - getMessagesStorage().putSentFile(originalPath, sentMessage.media.photo, 0, "sent_" + sentMessage.peer_id.channel_id + "_" + sentMessage.id); + getMessagesStorage().putSentFile(originalPath, sentMessage.media.photo, 0, "sent_" + sentMessage.peer_id.channel_id + "_" + sentMessage.id + "_" + DialogObject.getPeerDialogId(sentMessage.peer_id)); } if (newMsg.media.photo.sizes.size() == 1 && newMsg.media.photo.sizes.get(0).location instanceof TLRPC.TL_fileLocationUnavailable) { @@ -5843,13 +5843,13 @@ public class SendMessagesHelper extends BaseController implements NotificationCe boolean isVideo = MessageObject.isVideoMessage(sentMessage); if ((isVideo || MessageObject.isGifMessage(sentMessage)) && MessageObject.isGifDocument(sentMessage.media.document) == MessageObject.isGifDocument(newMsg.media.document)) { if (!newMsgObj.scheduled) { - getMessagesStorage().putSentFile(originalPath, sentMessage.media.document, 2, "sent_" + sentMessage.peer_id.channel_id + "_" + sentMessage.id); + getMessagesStorage().putSentFile(originalPath, sentMessage.media.document, 2, "sent_" + sentMessage.peer_id.channel_id + "_" + sentMessage.id + "_" + DialogObject.getPeerDialogId(sentMessage.peer_id)); } if (isVideo) { sentMessage.attachPath = newMsg.attachPath; } } else if (!MessageObject.isVoiceMessage(sentMessage) && !MessageObject.isRoundVideoMessage(sentMessage) && !newMsgObj.scheduled) { - getMessagesStorage().putSentFile(originalPath, sentMessage.media.document, 1, "sent_" + sentMessage.peer_id.channel_id + "_" + sentMessage.id); + getMessagesStorage().putSentFile(originalPath, sentMessage.media.document, 1, "sent_" + sentMessage.peer_id.channel_id + "_" + sentMessage.id + "_" + DialogObject.getPeerDialogId(sentMessage.peer_id)); } } @@ -7063,7 +7063,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe messageMediaInvoice.title = invoice.title; messageMediaInvoice.description = invoice.description; if (invoice.photo != null) { - messageMediaInvoice.photo = invoice.photo; + messageMediaInvoice.webPhoto = invoice.photo; messageMediaInvoice.flags |= 1; } messageMediaInvoice.currency = invoice.currency; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java index 26762b8f0..5682fb5de 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SvgHelper.java @@ -164,7 +164,7 @@ public class SvgHelper { } float scale = getScale((int) w, (int) h); - if (placeholderGradient != null) { + if (placeholderGradient[threadIndex] != null && gradientWidth > 0) { if (drawInBackground) { long dt = time - lastUpdateTime; if (dt > 64) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TopicsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/TopicsController.java index 3d9ddc8c0..92841bb4a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TopicsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TopicsController.java @@ -1,6 +1,7 @@ package org.telegram.messenger; import android.content.SharedPreferences; +import android.graphics.drawable.Drawable; import android.text.TextPaint; import android.text.TextUtils; import android.util.SparseArray; @@ -21,7 +22,6 @@ import org.telegram.ui.Components.Forum.ForumUtilities; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -33,7 +33,8 @@ public class TopicsController extends BaseController { public static final int TOPIC_FLAG_ICON = 2; public static final int TOPIC_FLAG_PIN = 4; public static final int TOPIC_FLAG_CLOSE = 8; - + public static final int TOPIC_FLAG_TOTAL_MESSAGES_COUNT = 16; + public static final int TOPIC_FLAG_HIDE = 32; private static final int MAX_PRELOAD_COUNT = 20; @@ -67,7 +68,7 @@ public class TopicsController extends BaseController { return; } - if (BuildVars.DEBUG_PRIVATE_VERSION) { + if (BuildVars.LOGS_ENABLED) { FileLog.d("load topics " + chatId + " fromCache=" + fromCache + " loadType=" + loadType); } topicsIsLoading.put(chatId, 1); @@ -75,7 +76,7 @@ public class TopicsController extends BaseController { if (fromCache) { getMessagesStorage().loadTopics(-chatId, topics -> { AndroidUtilities.runOnUIThread(() -> { - if (BuildVars.DEBUG_PRIVATE_VERSION) { + if (BuildVars.LOGS_ENABLED) { FileLog.d("loaded from cache " + chatId + " topics_count=" + (topics == null ? 0 : topics.size())); } @@ -98,7 +99,7 @@ public class TopicsController extends BaseController { getForumTopics.offset_id = loadOffsets.lastMessageId; getForumTopics.offset_topic = loadOffsets.lastTopicId; - if (BuildVars.DEBUG_PRIVATE_VERSION) { + if (BuildVars.LOGS_ENABLED) { FileLog.d("offset_date=" + loadOffsets.lastMessageDate + " offset_id=" + loadOffsets.lastMessageId + " offset_topic=" + loadOffsets.lastTopicId); } } @@ -111,7 +112,7 @@ public class TopicsController extends BaseController { messagesMap.put(topics.messages.get(i).id, topics.messages.get(i)); } AndroidUtilities.runOnUIThread(() -> { - getMessagesStorage().putUsersAndChats(((TLRPC.TL_messages_forumTopics) response).users, ((TLRPC.TL_messages_forumTopics) response).chats, true, false); + getMessagesStorage().putUsersAndChats(((TLRPC.TL_messages_forumTopics) response).users, ((TLRPC.TL_messages_forumTopics) response).chats, true, true); getMessagesController().putUsers(((TLRPC.TL_messages_forumTopics) response).users, false); getMessagesController().putChats(((TLRPC.TL_messages_forumTopics) response).chats, false); @@ -141,6 +142,9 @@ public class TopicsController extends BaseController { } public void processTopics(long chatId, ArrayList newTopics, SparseArray messagesMap, boolean fromCache, int loadType, int totalCount) { + if (BuildVars.LOGS_ENABLED) { + FileLog.d("processTopics=" + "new_topics_size=" + (newTopics == null ? 0 : newTopics.size()) + " fromCache=" + fromCache + " load_type=" + loadType + " totalCount=" + totalCount); + } ArrayList topics = topicsByChatId.get(chatId); ArrayList topicsToReload = null; LongSparseArray topicsMap = topicsMapByChatId.get(chatId); @@ -204,9 +208,10 @@ public class TopicsController extends BaseController { if (topicsToReload != null && loadType != LOAD_TYPE_LOAD_UNKNOWN) { reloadTopics(chatId, topicsToReload); - } else if (loadType == LOAD_TYPE_LOAD_NEXT && topics.size() >= totalCount && totalCount >= 0) { + } else if (((loadType == LOAD_TYPE_PRELOAD && !fromCache) || loadType == LOAD_TYPE_LOAD_NEXT) && topics.size() >= totalCount && totalCount >= 0) { endIsReached.put(chatId, 1); getUserConfig().getPreferences().edit().putBoolean("topics_end_reached_" + chatId, true).apply(); + changed = true; } if (changed) { @@ -239,7 +244,19 @@ public class TopicsController extends BaseController { ArrayList topics = topicsByChatId.get(chatId); if (topics != null) { if (openedTopicsBuChatId.get(chatId, 0) > 0) { - Collections.sort(topics, Comparator.comparingInt(o -> o.topMessage == null ? Integer.MAX_VALUE : -(o.pinned ? Integer.MAX_VALUE - o.pinnedOrder : o.topMessage.date))); +// Comparator.comparingInt(o -> o.topMessage == null ? Integer.MAX_VALUE : -(o.pinned ? Integer.MAX_VALUE - o.pinnedOrder : o.topMessage.date)) + Collections.sort(topics, (a, b) -> { + if (a.hidden != b.hidden) { + return a.hidden ? -1 : 1; + } + if (a.pinned != b.pinned) { + return a.pinned ? -1 : 1; + } + if (a.pinned && b.pinned) { + return a.pinnedOrder - b.pinnedOrder; + } + return (b.topMessage != null ? b.topMessage.date : 0) - (a.topMessage != null ? a.topMessage.date : 0); + }); } if (notify) { getNotificationCenter().postNotificationName(NotificationCenter.topicsDidLoaded, chatId, true); @@ -405,6 +422,10 @@ public class TopicsController extends BaseController { } public CharSequence getTopicIconName(TLRPC.Chat chat, MessageObject message, TextPaint paint) { + return getTopicIconName(chat, message, paint, null); + } + + public CharSequence getTopicIconName(TLRPC.Chat chat, MessageObject message, TextPaint paint, Drawable[] drawableToSet) { if (message.messageOwner.reply_to == null) { return null; } @@ -415,7 +436,7 @@ public class TopicsController extends BaseController { if (topicId != 0) { TLRPC.TL_forumTopic topic = findTopic(chat.id, topicId); if (topic != null) { - return ForumUtilities.getTopicSpannedName(topic, paint); + return ForumUtilities.getTopicSpannedName(topic, paint, drawableToSet); } } return null; @@ -464,7 +485,7 @@ public class TopicsController extends BaseController { } public void onTopicEdited(long dialogId, TLRPC.TL_forumTopic forumTopic) { - getMessagesStorage().updateTopicData(dialogId, forumTopic, TOPIC_FLAG_ICON + TOPIC_FLAG_TITLE); + getMessagesStorage().updateTopicData(dialogId, forumTopic, TOPIC_FLAG_ICON + TOPIC_FLAG_TITLE + TOPIC_FLAG_HIDE); sortTopics(-dialogId); } @@ -590,6 +611,37 @@ public class TopicsController extends BaseController { } } + public void toggleShowTopic(long chatId, int topicId, boolean show) { + TLRPC.TL_channels_editForumTopic req = new TLRPC.TL_channels_editForumTopic(); + req.channel = getMessagesController().getInputChannel(chatId); + req.topic_id = topicId; + req.flags = 8; + boolean wasHidden = show; + req.hidden = !show; + + TLRPC.TL_forumTopic topic = findTopic(chatId, topicId); + if (topic != null) { + wasHidden = topic.hidden; + topic.hidden = req.hidden; + if (topic.hidden) { + topic.closed = true; +// topic.pinned = true; +// ArrayList order = getCurrentPinnedOrder(chatId); +// order.remove((Integer) topicId); +// order.add(0, topicId); +// applyPinnedOrder(chatId, order); + } + updateTopicInUi(-chatId, topic, TOPIC_FLAG_PIN | TOPIC_FLAG_HIDE | TOPIC_FLAG_CLOSE); + getMessagesStorage().updateTopicData(-chatId, topic, TOPIC_FLAG_PIN | TOPIC_FLAG_HIDE | TOPIC_FLAG_CLOSE); + } + + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> { + if (err != null) { + + } + }); + } + public void pinTopic(long chatId, int topicId, boolean pin, BaseFragment fragment) { TLRPC.TL_channels_updatePinnedForumTopic req = new TLRPC.TL_channels_updatePinnedForumTopic(); req.channel = getMessagesController().getInputChannel(chatId); @@ -611,13 +663,15 @@ public class TopicsController extends BaseController { return; } applyPinnedOrder(chatId, prevOrder); - fragment.showDialog( + AndroidUtilities.runOnUIThread(() -> { + fragment.showDialog( new AlertDialog.Builder(fragment.getContext()) - .setTitle(LocaleController.getString("LimitReached", R.string.LimitReached)) - .setMessage(LocaleController.formatString("LimitReachedPinnedTopics", R.string.LimitReachedPinnedTopics, MessagesController.getInstance(currentAccount).topicsPinnedLimit)) - .setPositiveButton(LocaleController.getString("OK", R.string.OK), null) - .create() - ); + .setTitle(LocaleController.getString("LimitReached", R.string.LimitReached)) + .setMessage(LocaleController.formatString("LimitReachedPinnedTopics", R.string.LimitReachedPinnedTopics, MessagesController.getInstance(currentAccount).topicsPinnedLimit)) + .setPositiveButton(LocaleController.getString("OK", R.string.OK), null) + .create() + ); + }); } else if ("PINNED_TOPIC_NOT_MODIFIED".equals(error.text)) { reloadTopics(chatId, false); } @@ -751,6 +805,9 @@ public class TopicsController extends BaseController { topic.unread_mentions_count = update.unreadMentions; topicsByTopMsgId.put(messageHash(topic.top_message, -update.dialogId), topic); } + if (update.totalMessagesCount > 0) { + topic.totalMessagesCount = update.totalMessagesCount; + } changedDialogs.add(-update.dialogId); } } @@ -890,6 +947,9 @@ public class TopicsController extends BaseController { if ((flags & TOPIC_FLAG_PIN) != 0) { topic.pinned = forumTopic.pinned; } + if ((flags & TOPIC_FLAG_HIDE) != 0) { + topic.hidden = forumTopic.hidden; + } sortTopics(-dialogId); } } @@ -926,6 +986,7 @@ public class TopicsController extends BaseController { } public static class TopicUpdate { + public int totalMessagesCount = -1; long dialogId; int topicId; int unreadMentions; @@ -951,6 +1012,25 @@ public class TopicsController extends BaseController { v = 0; } openedTopicsBuChatId.put(chatId, v); + } + public void getTopicRepliesCount(long dialogId, int topicId) { + TLRPC.TL_forumTopic topic = findTopic(-dialogId, topicId); + if (topic != null) { + if (topic.totalMessagesCount == 0) { + TLRPC.TL_messages_getReplies req = new TLRPC.TL_messages_getReplies(); + req.peer = getMessagesController().getInputPeer(dialogId); + req.msg_id = topicId; + req.limit = 1; + getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response != null) { + TLRPC.messages_Messages messages = (TLRPC.messages_Messages) response; + topic.totalMessagesCount = messages.count; + getMessagesStorage().updateTopicData(dialogId, topic, TOPIC_FLAG_TOTAL_MESSAGES_COUNT); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.topicsDidLoaded, -dialogId, true); + } + })); + } + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index 41e33b371..253bdd2b1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -527,4 +527,34 @@ public class UserConfig extends BaseController { } return null; } + + + int globalTtl = 0; + boolean ttlIsLoading = false; + long lastLoadingTime; + + public int getGlobalTTl() { + return globalTtl; + } + + public void loadGlobalTTl() { + if (ttlIsLoading || System.currentTimeMillis() - lastLoadingTime < 60 * 1000) { + return; + } + ttlIsLoading = true; + TLRPC.TL_messages_getDefaultHistoryTTL getDefaultHistoryTTL = new TLRPC.TL_messages_getDefaultHistoryTTL(); + getConnectionsManager().sendRequest(getDefaultHistoryTTL, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response != null) { + globalTtl = ((TLRPC.TL_defaultHistoryTTL) response).period / 60; + getNotificationCenter().postNotificationName(NotificationCenter.didUpdateGlobalAutoDeleteTimer); + ttlIsLoading = false; + lastLoadingTime = System.currentTimeMillis(); + } + })); + + } + + public void setGlobalTtl(int ttl) { + globalTtl = ttl; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java b/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java index a023c6b5d..076d12bad 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java @@ -27,6 +27,7 @@ public class VideoEditedInfo { public long avatarStartTime = -1; public float start; public float end; + public int compressQuality; public int rotationValue; public int originalWidth; public int originalHeight; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java b/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java index cc58fc6ff..84a6a8311 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/browser/Browser.java @@ -424,7 +424,7 @@ public class Browser { try { Intent viewIntent = new Intent(Intent.ACTION_VIEW, uri); List allActivities = ApplicationLoader.applicationContext.getPackageManager().queryIntentActivities(viewIntent, 0); - if (allActivities != null && allActivities.size() > 1) { + if (allActivities != null && allActivities.size() >= 1) { return false; } } catch (Exception ignore) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java index 626c030df..2a1a8e0db 100755 --- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java @@ -3059,7 +3059,11 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa } am.abandonAudioFocus(this); } - am.unregisterMediaButtonEventReceiver(new ComponentName(this, VoIPMediaButtonReceiver.class)); + try { + am.unregisterMediaButtonEventReceiver(new ComponentName(this, VoIPMediaButtonReceiver.class)); + } catch (Exception e) { + FileLog.e(e); + } if (hasAudioFocus) { am.abandonAudioFocus(this); } diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java index 1942a2ce3..a17ceb6c9 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java @@ -18,7 +18,6 @@ import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLoader; import org.telegram.messenger.MessageObject; -import org.telegram.messenger.MessagesController; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.Utilities; @@ -69,7 +68,7 @@ public class TLRPC { public static final int MESSAGE_FLAG_HAS_BOT_ID = 0x00000800; public static final int MESSAGE_FLAG_EDITED = 0x00008000; - public static final int LAYER = 149; + public static final int LAYER = 150; public static class TL_stats_megagroupStats extends TLObject { public static int constructor = 0xef7ff916; @@ -3841,21 +3840,21 @@ public class TLRPC { public static Peer TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { Peer result = null; switch (constructor) { + case 0xa2a5371e: + result = new TL_peerChannel(); + break; case 0xbddde532: result = new TL_peerChannel_layer131(); break; case 0x59511722: result = new TL_peerUser(); break; - case 0xa2a5371e: - result = new TL_peerChannel(); + case 0x9db1bc6d: + result = new TL_peerUser_layer131(); break; case 0x36c6019a: result = new TL_peerChat(); break; - case 0x9db1bc6d: - result = new TL_peerUser_layer131(); - break; case 0xbad0e5bb: result = new TL_peerChat_layer131(); break; @@ -4684,7 +4683,7 @@ public class TLRPC { case 0x64199744: result = new TL_secureFileEmpty(); break; - case 0xe0277a62: + case 0x7d09c27e: result = new TL_secureFile(); break; } @@ -6695,6 +6694,7 @@ public class TLRPC { public static abstract class auth_SentCodeType extends TLObject { public int flags; + public String url; public int length; public String pattern; public String prefix; @@ -6727,6 +6727,9 @@ public class TLRPC { case 0xc000bba2: result = new TL_auth_sentCodeTypeSms(); break; + case 0xd9565c39: + result = new TL_auth_sentCodeTypeFragmentSms(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in auth_SentCodeType", constructor)); @@ -6854,6 +6857,22 @@ public class TLRPC { } } + public static class TL_auth_sentCodeTypeFragmentSms extends auth_SentCodeType { + public static int constructor = 0xd9565c39; + + + public void readParams(AbstractSerializedData stream, boolean exception) { + url = stream.readString(exception); + length = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(url); + stream.writeInt32(length); + } + } + public static abstract class messages_StickerSetInstallResult extends TLObject { public ArrayList sets = new ArrayList<>(); @@ -7862,7 +7881,7 @@ public class TLRPC { public static class TL_messageMediaInvoice extends MessageMedia { public static int constructor = 0xf6a548d3; - public WebDocument photo; + public WebDocument webPhoto; public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); @@ -7871,7 +7890,7 @@ public class TLRPC { title = stream.readString(exception); description = stream.readString(exception); if ((flags & 1) != 0) { - photo = WebDocument.TLdeserialize(stream, stream.readInt32(exception), exception); + webPhoto = WebDocument.TLdeserialize(stream, stream.readInt32(exception), exception); } if ((flags & 4) != 0) { receipt_msg_id = stream.readInt32(exception); @@ -7892,7 +7911,7 @@ public class TLRPC { stream.writeString(title); stream.writeString(description); if ((flags & 1) != 0) { - photo.serializeToStream(stream); + webPhoto.serializeToStream(stream); } if ((flags & 4) != 0) { stream.writeInt32(receipt_msg_id); @@ -12061,6 +12080,7 @@ public class TLRPC { public ArrayList available_reactions_legacy = new ArrayList<>(); public int flags2; public boolean can_delete_channel; + public boolean antispam; public ChatReactions available_reactions; public long inviterId; //custom @@ -14534,6 +14554,7 @@ public class TLRPC { blocked = (flags & 4194304) != 0; flags2 = stream.readInt32(exception); can_delete_channel = (flags2 & 1) != 0; + antispam = (flags2 & 2) != 0; id = stream.readInt64(exception); about = stream.readString(exception); if ((flags & 1) != 0) { @@ -14669,6 +14690,7 @@ public class TLRPC { flags = blocked ? (flags | 4194304) : (flags &~ 4194304); stream.writeInt32(flags); flags2 = can_delete_channel ? (flags2 | 1) : (flags2 &~ 1); + flags2 = antispam ? (flags2 | 2) : (flags2 &~ 2); stream.writeInt32(flags2); stream.writeInt64(id); stream.writeString(about); @@ -21139,6 +21161,37 @@ public class TLRPC { } } + public static class TL_exportedContactToken extends TLObject { + public static int constructor = 0x41bf109b; + + public String url; + public int expires; + + public static TL_exportedContactToken TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_exportedContactToken.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_exportedContactToken", constructor)); + } else { + return null; + } + } + TL_exportedContactToken result = new TL_exportedContactToken(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + url = stream.readString(exception); + expires = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(url); + stream.writeInt32(expires); + } + } + public static class TL_botCommand extends TLObject { public static int constructor = 0xc27ac8c7; @@ -21410,7 +21463,6 @@ public class TLRPC { public static class TL_inputGroupCallStream extends InputFileLocation { public static int constructor = 0x598a92a; - public int flags; public TL_inputGroupCall call; public long time_ms; public int scale; @@ -22350,6 +22402,9 @@ public class TLRPC { } public void serializeToStream(AbstractSerializedData stream) { + if (username == null) { + flags = flags & ~8; + } stream.writeInt32(constructor); flags = self ? (flags | 1024) : (flags &~ 1024); flags = contact ? (flags | 2048) : (flags &~ 2048); @@ -23993,6 +24048,9 @@ public class TLRPC { result = new TL_messageActionUserJoined(); break; case 0xb18a431c: + result = new TL_messageActionTopicEdit_layer149(); + break; + case 0xc0944820: result = new TL_messageActionTopicEdit(); break; case 0x55555551: @@ -24004,9 +24062,12 @@ public class TLRPC { case 0x55555552: result = new TL_messageActionTTLChange(); break; - case 0xaa1afbfd: + case 0x3c134d7b: result = new TL_messageActionSetMessagesTTL(); break; + case 0xaa1afbfd: + result = new TL_messageActionSetMessagesTTL_layer149(); + break; case 0xd95c6154: result = new TL_messageActionSecureValuesSent(); break; @@ -24414,10 +24475,48 @@ public class TLRPC { } public static class TL_messageActionTopicEdit extends MessageAction { - public static int constructor = 0xb18a431c; + public static int constructor = 0xc0944820; public long icon_emoji_id; public boolean closed; + public boolean hidden; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + if ((flags & 1) != 0) { + title = stream.readString(exception); + } + if ((flags & 2) != 0) { + icon_emoji_id = stream.readInt64(exception); + } + if ((flags & 4) != 0) { + closed = stream.readBool(exception); + } + if ((flags & 8) != 0) { + hidden = stream.readBool(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + if ((flags & 1) != 0) { + stream.writeString(title); + } + if ((flags & 2) != 0) { + stream.writeInt64(icon_emoji_id); + } + if ((flags & 4) != 0) { + stream.writeBool(closed); + } + if ((flags & 8) != 0) { + stream.writeBool(hidden); + } + } + } + + public static class TL_messageActionTopicEdit_layer149 extends TL_messageActionTopicEdit { + public static int constructor = 0xb18a431c; public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); @@ -24677,9 +24776,31 @@ public class TLRPC { } public static class TL_messageActionSetMessagesTTL extends MessageAction { - public static int constructor = 0xaa1afbfd; + public static int constructor = 0x3c134d7b; public int period; + public long auto_setting_from; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + period = stream.readInt32(exception); + if ((flags & 1) != 0) { + auto_setting_from = stream.readInt64(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeInt32(period); + if ((flags & 1) != 0) { + stream.writeInt64(auto_setting_from); + } + } + } + + public static class TL_messageActionSetMessagesTTL_layer149 extends TL_messageActionSetMessagesTTL { + public static int constructor = 0xaa1afbfd; public void readParams(AbstractSerializedData stream, boolean exception) { period = stream.readInt32(exception); @@ -44148,6 +44269,9 @@ public class TLRPC { case 0xd61ad6ee: result = new TL_auth_codeTypeMissedCall(); break; + case 0x6ed998c: + result = new TL_auth_codeTypeFragmentSms(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in auth_CodeType", constructor)); @@ -44195,6 +44319,15 @@ public class TLRPC { } } + public static class TL_auth_codeTypeFragmentSms extends auth_CodeType { + public static int constructor = 0x6ed998c; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static abstract class messages_TranslatedText extends TLObject { public static messages_TranslatedText TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -51228,10 +51361,12 @@ public class TLRPC { } public static class TL_messages_createChat extends TLObject { - public static int constructor = 0x9cb126e; + public static int constructor = 0x34a818; + public int flags; public ArrayList users = new ArrayList<>(); public String title; + public int ttl_period; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { return Updates.TLdeserialize(stream, constructor, exception); @@ -51239,6 +51374,7 @@ public class TLRPC { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); + stream.writeInt32(flags); stream.writeInt32(0x1cb5c415); int count = users.size(); stream.writeInt32(count); @@ -51246,6 +51382,9 @@ public class TLRPC { users.get(a).serializeToStream(stream); } stream.writeString(title); + if ((flags & 1) != 0) { + stream.writeInt32(ttl_period); + } } } @@ -61607,18 +61746,24 @@ public class TLRPC { public int pts; public DraftMessage draft; public int folder_id; + public int ttl_period; public int last_message_date; //custom public long id; //custom public int pinnedNum; //custom + public boolean isFolder; //custom - public static Dialog TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + public static Dialog TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { Dialog result = null; switch (constructor) { - case 0xa8edd0f5: + case 0xd58a08c6: result = new TL_dialog(); break; + case 0xa8edd0f5: + result = new TL_dialog_layer149(); + break; case 0x71bd134c: result = new TL_dialogFolder(); + result.isFolder = true; break; } if (result == null && exception) { @@ -61632,8 +61777,7 @@ public class TLRPC { } public static class TL_dialog extends Dialog { - public static int constructor = 0xa8edd0f5; - public int stableId = MessagesController.stableIdPointer++; + public static int constructor = 0xd58a08c6; public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); @@ -61646,7 +61790,7 @@ public class TLRPC { unread_count = stream.readInt32(exception); unread_mentions_count = stream.readInt32(exception); unread_reactions_count = stream.readInt32(exception); - notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + notify_settings = TL_peerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 1) != 0) { pts = stream.readInt32(exception); } @@ -61656,6 +61800,9 @@ public class TLRPC { if ((flags & 16) != 0) { folder_id = stream.readInt32(exception); } + if ((flags & 32) != 0) { + ttl_period = stream.readInt32(exception); + } } public void serializeToStream(AbstractSerializedData stream) { @@ -61680,6 +61827,66 @@ public class TLRPC { if ((flags & 16) != 0) { stream.writeInt32(folder_id); } + if ((flags & 32) != 0) { + stream.writeInt32(ttl_period); + } + } + } + + public static class TL_dialog_layer149 extends TL_dialog { + public static int constructor = 0xa8edd0f5; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + pinned = (flags & 4) != 0; + unread_mark = (flags & 8) != 0; + peer = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + top_message = stream.readInt32(exception); + read_inbox_max_id = stream.readInt32(exception); + read_outbox_max_id = stream.readInt32(exception); + unread_count = stream.readInt32(exception); + unread_mentions_count = stream.readInt32(exception); + unread_reactions_count = stream.readInt32(exception); + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 1) != 0) { + pts = stream.readInt32(exception); + } + if ((flags & 2) != 0) { + draft = DraftMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 16) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 32) != 0) { + ttl_period = stream.readInt32(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = pinned ? (flags | 4) : (flags &~ 4); + flags = unread_mark ? (flags | 8) : (flags &~ 8); + stream.writeInt32(flags); + peer.serializeToStream(stream); + stream.writeInt32(top_message); + stream.writeInt32(read_inbox_max_id); + stream.writeInt32(read_outbox_max_id); + stream.writeInt32(unread_count); + stream.writeInt32(unread_mentions_count); + stream.writeInt32(unread_reactions_count); + notify_settings.serializeToStream(stream); + if ((flags & 1) != 0) { + stream.writeInt32(pts); + } + if ((flags & 2) != 0) { + draft.serializeToStream(stream); + } + if ((flags & 16) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 32) != 0) { + stream.writeInt32(ttl_period); + } } } @@ -64166,6 +64373,7 @@ public class TLRPC { public boolean closed; public boolean pinned; public boolean isShort; + public boolean hidden; public int id; public int date; public String title; @@ -64185,6 +64393,7 @@ public class TLRPC { public Message topMessage; // custom public String searchQuery; //custom public int pinnedOrder; // custom + public int totalMessagesCount; // custom public static TL_forumTopic TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { TL_forumTopic result = null; @@ -64214,6 +64423,7 @@ public class TLRPC { closed = (flags & 4) != 0; pinned = (flags & 8) != 0; isShort = (flags & 32) != 0; + hidden = (flags & 64) != 0; id = stream.readInt32(exception); date = stream.readInt32(exception); title = stream.readString(exception); @@ -64240,6 +64450,7 @@ public class TLRPC { flags = closed ? (flags | 4) : (flags &~ 4); flags = pinned ? (flags | 8) : (flags &~ 8); flags = isShort ? (flags | 32) : (flags &~ 32); + flags = hidden ? (flags | 64) : (flags &~ 64); stream.writeInt32(flags); stream.writeInt32(id); stream.writeInt32(date); @@ -64438,7 +64649,7 @@ public class TLRPC { } public static class TL_channels_editForumTopic extends TLObject { - public static int constructor = 0x6c883e2d; + public static int constructor = 0xf4dfa185; public int flags; public InputChannel channel; @@ -64446,6 +64657,7 @@ public class TLRPC { public String title; public long icon_emoji_id; public boolean closed; + public boolean hidden; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { return Updates.TLdeserialize(stream, constructor, exception); @@ -64465,6 +64677,9 @@ public class TLRPC { if ((flags & 4) != 0) { stream.writeBool(closed); } + if ((flags & 8) != 0) { + stream.writeBool(hidden); + } } } @@ -64709,6 +64924,124 @@ public class TLRPC { } } } + + public static class TL_channels_toggleAntiSpam extends TLObject { + public static int constructor = 0x68f3e4eb; + + public InputChannel channel; + public boolean enabled; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Updates.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + stream.writeBool(enabled); + } + } + + public static class TL_channels_reportAntiSpamFalsePositive extends TLObject { + public static int constructor = 0xa850a693; + + public InputChannel channel; + public int msg_id; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + stream.writeInt32(msg_id); + } + } + + public static class TL_messages_setDefaultHistoryTTL extends TLObject { + public static int constructor = 0x9eb51445; + + public int period; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(period); + } + } + + public static class TL_messages_getDefaultHistoryTTL extends TLObject { + public static int constructor = 0x658b7188; + + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_defaultHistoryTTL.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_defaultHistoryTTL extends TLObject { + public static int constructor = 0x43b46b20; + + public int period; + + public static TL_defaultHistoryTTL TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_defaultHistoryTTL.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_defaultHistoryTTL", constructor)); + } else { + return null; + } + } + TL_defaultHistoryTTL result = new TL_defaultHistoryTTL(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + period = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(period); + } + } + public static class TL_contacts_exportContactToken extends TLObject { + public static int constructor = 0xf8654027; + + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_exportedContactToken.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_contacts_importContactToken extends TLObject { + public static int constructor = 0x13005788; + + public String token; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return User.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(token); + } + } + //functions public static class Vector extends TLObject { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java index fc443f7c6..1b1ccaaf1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java @@ -12,6 +12,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; @@ -48,6 +49,7 @@ import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.ui.Adapters.FiltersView; import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EllipsizeSpanAnimator; import org.telegram.ui.Components.FireworksEffect; @@ -69,8 +71,9 @@ public class ActionBar extends FrameLayout { } } - private INavigationLayout.BackButtonState backButtonState; + private INavigationLayout.BackButtonState backButtonState = INavigationLayout.BackButtonState.BACK; private ImageView backButtonImageView; + private BackupImageView avatarSearchImageView; private Drawable backButtonDrawable; private SimpleTextView[] titleTextView = new SimpleTextView[2]; private SimpleTextView subtitleTextView; @@ -117,6 +120,7 @@ public class ActionBar extends FrameLayout { private boolean castShadows = true; protected boolean isSearchFieldVisible; + public float searchFieldVisibleAlpha; protected int itemsBackgroundColor; protected int itemsActionModeBackgroundColor; protected int itemsColor; @@ -130,10 +134,13 @@ public class ActionBar extends FrameLayout { private boolean fromBottom; private boolean centerScale; private CharSequence subtitle; + private boolean drawBackButton; private View.OnTouchListener interceptTouchEventListener; private final Theme.ResourcesProvider resourcesProvider; + private PorterDuff.Mode colorFilterMode = PorterDuff.Mode.MULTIPLY; + SizeNotifierFrameLayout contentView; boolean blurredBackground; public Paint blurScrimPaint = new Paint(); @@ -158,7 +165,14 @@ public class ActionBar extends FrameLayout { }); } + public void setColorFilterMode(PorterDuff.Mode colorFilterMode) { + this.colorFilterMode = colorFilterMode; + } + public INavigationLayout.BackButtonState getBackButtonState() { + if (backButtonDrawable instanceof INavigationLayout.IBackButtonDrawable) { + return ((INavigationLayout.IBackButtonDrawable) backButtonDrawable).getBackButtonState(); + } return backButtonState; } @@ -170,7 +184,7 @@ public class ActionBar extends FrameLayout { backButtonImageView.setScaleType(ImageView.ScaleType.CENTER); backButtonImageView.setBackgroundDrawable(Theme.createSelectorDrawable(itemsBackgroundColor)); if (itemsColor != 0) { - backButtonImageView.setColorFilter(new PorterDuffColorFilter(itemsColor, PorterDuff.Mode.MULTIPLY)); + backButtonImageView.setColorFilter(new PorterDuffColorFilter(itemsColor, colorFilterMode)); } backButtonImageView.setPadding(AndroidUtilities.dp(1), 0, 0, 0); addView(backButtonImageView, LayoutHelper.createFrame(54, 54, Gravity.LEFT | Gravity.TOP)); @@ -224,6 +238,23 @@ public class ActionBar extends FrameLayout { invalidate(); } + public BackupImageView getSearchAvatarImageView() { + return avatarSearchImageView; + } + + public void setSearchAvatarImageView(BackupImageView backupImageView) { + if (avatarSearchImageView == backupImageView) { + return; + } + if (avatarSearchImageView != null) { + removeView(avatarSearchImageView); + } + avatarSearchImageView = backupImageView; + if (avatarSearchImageView != null) { + addView(avatarSearchImageView); + } + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (supportsHolidayImage && !titleOverlayShown && !LocaleController.isRTL && ev.getAction() == MotionEvent.ACTION_DOWN) { @@ -252,9 +283,12 @@ public class ActionBar extends FrameLayout { @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - if (parentFragment != null && parentFragment.getParentLayout().isActionBarInCrossfade()) { + if (parentFragment != null && parentFragment.getParentLayout() != null && parentFragment.getParentLayout().isActionBarInCrossfade()) { return false; } + if (drawBackButton && child == backButtonImageView) { + return true; + } boolean clip = shouldClipChild(child); if (clip) { @@ -318,9 +352,6 @@ public class ActionBar extends FrameLayout { } backButtonImageView.setVisibility(resource == 0 ? GONE : VISIBLE); backButtonImageView.setImageResource(resource); - if (resource == R.drawable.ic_ab_back) { - backButtonState = INavigationLayout.BackButtonState.BACK; - } } private void createSubtitleTextView() { @@ -380,7 +411,12 @@ public class ActionBar extends FrameLayout { if (titleTextView[i] != null) { return; } - titleTextView[i] = new SimpleTextView(getContext()); + titleTextView[i] = new SimpleTextView(getContext()) { + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + } + }; titleTextView[i].setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); if (titleColorToSet != 0) { titleTextView[i].setTextColor(titleColorToSet); @@ -691,6 +727,15 @@ public class ActionBar extends FrameLayout { } actionModeAnimation = new AnimatorSet(); actionModeAnimation.playTogether(animators); + if (backgroundUpdateListener != null) { + ValueAnimator alphaUpdate = ValueAnimator.ofFloat(0, 1); + alphaUpdate.addUpdateListener(anm -> { + if (backgroundUpdateListener != null) { + backgroundUpdateListener.run(); + } + }); + actionModeAnimation.playTogether(alphaUpdate); + } actionModeAnimation.setDuration(200); actionModeAnimation.addListener(new AnimatorListenerAdapter() { @Override @@ -844,6 +889,15 @@ public class ActionBar extends FrameLayout { } actionModeAnimation = new AnimatorSet(); actionModeAnimation.playTogether(animators); + if (backgroundUpdateListener != null) { + ValueAnimator alphaUpdate = ValueAnimator.ofFloat(0, 1); + alphaUpdate.addUpdateListener(anm -> { + if (backgroundUpdateListener != null) { + backgroundUpdateListener.run(); + } + }); + actionModeAnimation.playTogether(alphaUpdate); + } actionModeAnimation.setDuration(200); actionModeAnimation.addListener(new AnimatorListenerAdapter() { @Override @@ -948,8 +1002,17 @@ public class ActionBar extends FrameLayout { return actionMode != null && actionModeVisible && ((actionModeTag == null && tag == null) || (actionModeTag != null && actionModeTag.equals(tag))); } + Runnable backgroundUpdateListener; AnimatorSet searchVisibleAnimator; + public void listenToBackgroundUpdate(Runnable invalidate) { + backgroundUpdateListener = invalidate; + } + + protected boolean onSearchChangedIgnoreTitles() { + return false; + } + public void onSearchFieldVisibilityChanged(boolean visible) { isSearchFieldVisible = visible; if (searchVisibleAnimator != null) { @@ -958,14 +1021,26 @@ public class ActionBar extends FrameLayout { searchVisibleAnimator = new AnimatorSet(); final ArrayList viewsToHide = new ArrayList<>(); - if (titleTextView[0] != null) { - viewsToHide.add(titleTextView[0]); + final boolean ignoreTitles = onSearchChangedIgnoreTitles(); + if (!ignoreTitles) { + if (titleTextView[0] != null) { + viewsToHide.add(titleTextView[0]); + } + + if (subtitleTextView != null && !TextUtils.isEmpty(subtitle)) { + viewsToHide.add(subtitleTextView); + subtitleTextView.setVisibility(visible ? INVISIBLE : VISIBLE); + } } - if (subtitleTextView != null && !TextUtils.isEmpty(subtitle)) { - viewsToHide.add(subtitleTextView); - subtitleTextView.setVisibility(visible ? INVISIBLE : VISIBLE); - } + ValueAnimator alphaUpdate = ValueAnimator.ofFloat(searchFieldVisibleAlpha, visible ? 1f : 0f); + alphaUpdate.addUpdateListener(anm -> { + searchFieldVisibleAlpha = (float) anm.getAnimatedValue(); + if (backgroundUpdateListener != null) { + backgroundUpdateListener.run(); + } + }); + searchVisibleAnimator.playTogether(alphaUpdate); for (int i = 0; i < viewsToHide.size(); i++) { View view = viewsToHide.get(i); @@ -979,6 +1054,10 @@ public class ActionBar extends FrameLayout { searchVisibleAnimator.playTogether(ObjectAnimator.ofFloat(view, View.SCALE_Y, visible ? 0.95f : 1f)); searchVisibleAnimator.playTogether(ObjectAnimator.ofFloat(view, View.SCALE_X, visible ? 0.95f : 1f)); } + if (avatarSearchImageView != null) { + avatarSearchImageView.setVisibility(View.VISIBLE); + searchVisibleAnimator.playTogether(ObjectAnimator.ofFloat(avatarSearchImageView, View.ALPHA, visible ? 1f : 0f)); + } centerScale = true; requestLayout(); searchVisibleAnimator.addListener(new AnimatorListenerAdapter() { @@ -994,7 +1073,7 @@ public class ActionBar extends FrameLayout { } } - if (visible) { + if (visible && !ignoreTitles) { if (titleTextView[0] != null) { titleTextView[0].setVisibility(View.GONE); } @@ -1002,16 +1081,24 @@ public class ActionBar extends FrameLayout { titleTextView[1].setVisibility(View.GONE); } } + + if (avatarSearchImageView != null) { + if (!visible) { + avatarSearchImageView.setVisibility(View.GONE); + } + } } }); searchVisibleAnimator.setDuration(150).start(); - Drawable drawable = backButtonImageView.getDrawable(); - if (drawable instanceof MenuDrawable) { - MenuDrawable menuDrawable = (MenuDrawable) drawable; - menuDrawable.setRotateToBack(true); - menuDrawable.setRotation(visible ? 1 : 0, true); + if (backButtonImageView != null) { + Drawable drawable = backButtonImageView.getDrawable(); + if (drawable instanceof MenuDrawable) { + MenuDrawable menuDrawable = (MenuDrawable) drawable; + menuDrawable.setRotateToBack(true); + menuDrawable.setRotation(visible ? 1 : 0, true); + } } } @@ -1194,10 +1281,17 @@ public class ActionBar extends FrameLayout { } } + if (avatarSearchImageView != null) { + avatarSearchImageView.measure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(42), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(42), MeasureSpec.EXACTLY) + ); + } + int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); - if (child.getVisibility() == GONE || child == titleTextView[0] || child == titleTextView[1] || child == subtitleTextView || child == menu || child == backButtonImageView || child == additionalSubtitleTextView) { + if (child.getVisibility() == GONE || child == titleTextView[0] || child == titleTextView[1] || child == subtitleTextView || child == menu || child == backButtonImageView || child == additionalSubtitleTextView || child == avatarSearchImageView) { continue; } measureChildWithMargins(child, widthMeasureSpec, 0, MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY), 0); @@ -1250,10 +1344,19 @@ public class ActionBar extends FrameLayout { additionalSubtitleTextView.layout(textLeft, additionalTop + textTop, textLeft + additionalSubtitleTextView.getMeasuredWidth(), additionalTop + textTop + additionalSubtitleTextView.getTextHeight()); } + if (avatarSearchImageView != null) { + avatarSearchImageView.layout( + AndroidUtilities.dp(56 + 8), + additionalTop + (getCurrentActionBarHeight() - avatarSearchImageView.getMeasuredHeight()) / 2, + AndroidUtilities.dp(56 + 8) + avatarSearchImageView.getMeasuredWidth(), + additionalTop + (getCurrentActionBarHeight() + avatarSearchImageView.getMeasuredHeight()) / 2 + ); + } + int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); - if (child.getVisibility() == GONE || child == titleTextView[0] || child == titleTextView[1] || child == subtitleTextView || child == menu || child == backButtonImageView || child == additionalSubtitleTextView) { + if (child.getVisibility() == GONE || child == titleTextView[0] || child == titleTextView[1] || child == subtitleTextView || child == menu || child == backButtonImageView || child == additionalSubtitleTextView || child == avatarSearchImageView) { continue; } @@ -1476,7 +1579,7 @@ public class ActionBar extends FrameLayout { itemsColor = color; if (backButtonImageView != null) { if (itemsColor != 0) { - backButtonImageView.setColorFilter(new PorterDuffColorFilter(itemsColor, PorterDuff.Mode.MULTIPLY)); + backButtonImageView.setColorFilter(new PorterDuffColorFilter(itemsColor, colorFilterMode)); Drawable drawable = backButtonImageView.getDrawable(); if (drawable instanceof BackDrawable) { ((BackDrawable) drawable).setColor(color); @@ -1709,4 +1812,12 @@ public class ActionBar extends FrameLayout { public void setForceSkipTouches(boolean forceSkipTouches) { this.forceSkipTouches = forceSkipTouches; } + + public void setDrawBackButton(boolean b) { + this.drawBackButton = b; + if (backButtonImageView != null) { + backButtonImageView.invalidate(); + } + } + } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java index 1d745defb..5da7538bf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -1606,6 +1606,10 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F } public void closeLastFragment(boolean animated, boolean forceNoAnimation) { + BaseFragment fragment = getLastFragment(); + if (fragment != null && fragment.closeLastFragment()) { + return; + } if (delegate != null && !delegate.needCloseLastFragment(this) || checkTransitionAnimation() || fragmentsStack.isEmpty()) { return; } @@ -2188,7 +2192,9 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F oldFragment = null; Runnable endRunnable = onCloseAnimationEndRunnable; onCloseAnimationEndRunnable = null; - endRunnable.run(); + if (endRunnable != null) { + endRunnable.run(); + } checkNeedRebuild(); checkNeedRebuild(); } @@ -2346,19 +2352,19 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F } } - private View findScrollingChild(ViewGroup parent, float x, float y) { + public static View findScrollingChild(ViewGroup parent, float x, float y) { int n = parent.getChildCount(); for (int i = 0; i < n; i++) { View child = parent.getChildAt(i); if (child.getVisibility() != View.VISIBLE) { continue; } - child.getHitRect(rect); - if (rect.contains((int) x, (int) y)) { + child.getHitRect(AndroidUtilities.rectTmp2); + if (AndroidUtilities.rectTmp2.contains((int) x, (int) y)) { if (child.canScrollHorizontally(-1)) { return child; } else if (child instanceof ViewGroup) { - View v = findScrollingChild((ViewGroup) child, x - rect.left, y - rect.top); + View v = findScrollingChild((ViewGroup) child, x - AndroidUtilities.rectTmp2.left, y - AndroidUtilities.rectTmp2.top); if (v != null) { return v; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java index 254fb21c5..1ce7f3974 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java @@ -80,10 +80,10 @@ public class ActionBarMenuItem extends FrameLayout { public void setSearchPaddingStart(int padding) { searchItemPaddingStart = padding; if (searchContainer != null) { - ((MarginLayoutParams)searchContainer.getLayoutParams()).leftMargin = AndroidUtilities.dp(padding); + ((MarginLayoutParams) searchContainer.getLayoutParams()).leftMargin = AndroidUtilities.dp(padding); searchContainer.setClipChildren(searchItemPaddingStart != 0); + searchContainer.setLayoutParams(searchContainer.getLayoutParams()); } - } public static class ActionBarMenuItemSearchListener { @@ -1837,6 +1837,17 @@ public class ActionBarMenuItem extends FrameLayout { } } + public int getVisibleSubItemsCount() { + int count = 0; + for (int i = 0; i < popupLayout.getItemsCount(); ++i) { + View item = popupLayout.getItemAt(i); + if (item != null && item.getVisibility() == View.VISIBLE) { + count++; + } + } + return count; + } + public void requestFocusOnSearchView() { if (searchContainer.getWidth() != 0 && !searchField.isFocused()) { searchField.requestFocus(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java index 7a8006a6e..e7222fc4d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java @@ -1019,21 +1019,31 @@ public class ActionBarPopupWindow extends PopupWindow { Theme.ResourcesProvider resourcesProvider; String colorKey; + Drawable shadowDrawable; + + public GapView(Context context, Theme.ResourcesProvider resourcesProvider) { + this(context, resourcesProvider, Theme.key_actionBarDefaultSubmenuSeparator); + } + public GapView(Context context, Theme.ResourcesProvider resourcesProvider, String colorKey) { super(context); this.resourcesProvider = resourcesProvider; this.colorKey = colorKey; - - setBackgroundColor(getThemedColor(colorKey)); - } - - private int getThemedColor(String key) { - Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null; - return color != null ? color : Theme.getColor(key); + this.shadowDrawable = Theme.getThemedDrawable(getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow, resourcesProvider); + setBackgroundColor(Theme.getColor(colorKey, resourcesProvider)); } public void setColor(int color) { setBackgroundColor(color); } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (shadowDrawable != null) { + shadowDrawable.setBounds(0, 0, getWidth(), getHeight()); + shadowDrawable.draw(canvas); + } + } } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java index 41f79690a..4afb008ad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java @@ -44,8 +44,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LineProgressView; @@ -57,7 +59,7 @@ import org.telegram.ui.Components.spoilers.SpoilersTextView; import java.util.ArrayList; import java.util.Map; -public class AlertDialog extends Dialog implements Drawable.Callback { +public class AlertDialog extends Dialog implements Drawable.Callback, NotificationCenter.NotificationCenterDelegate { private View customView; private int customViewHeight = LayoutHelper.WRAP_CONTENT; @@ -594,7 +596,14 @@ public class AlertDialog extends Dialog implements Drawable.Callback { contentScrollView.addView(scrollContainer, new ScrollView.LayoutParams(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); } - messageTextView = new SpoilersTextView(getContext(), false); + messageTextView = new SpoilersTextView(getContext(), false) { + @Override + public void setText(CharSequence text, BufferType type) { + text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + super.setText(text, type); + } + }; + NotificationCenter.listenEmojiLoading(messageTextView); messageTextView.setTextColor(getThemedColor(topAnimationIsNew ? Theme.key_windowBackgroundWhiteGrayText : Theme.key_dialogTextBlack)); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); messageTextView.setMovementMethod(new AndroidUtilities.LinkMovementMethodMy()); @@ -955,6 +964,8 @@ public class AlertDialog extends Dialog implements Drawable.Callback { } window.setAttributes(params); + + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiLoaded); } @Override @@ -1095,8 +1106,18 @@ public class AlertDialog extends Dialog implements Drawable.Callback { return false; } + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.emojiLoaded) { + if (messageTextView != null) { + messageTextView.invalidate(); + } + } + } + @Override public void dismiss() { + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); if (onDismissListener != null) { onDismissListener.onDismiss(this); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java index a46d198bd..ddbb39f47 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -76,6 +76,7 @@ public abstract class BaseFragment { protected boolean inTransitionAnimation = false; protected boolean fragmentBeginToShow; private boolean removingFromStack; + private PreviewDelegate previewDelegate; public BaseFragment() { classGuid = ConnectionsManager.generateClassGuid(); @@ -262,7 +263,7 @@ public abstract class BaseFragment { } } - protected ActionBar createActionBar(Context context) { + public ActionBar createActionBar(Context context) { ActionBar actionBar = new ActionBar(context, getResourceProvider()); actionBar.setBackgroundColor(getThemedColor(Theme.key_actionBarDefault)); actionBar.setItemsBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSelector), false); @@ -290,7 +291,11 @@ public abstract class BaseFragment { parentDialog.dismiss(); return; } - finishFragment(true); + if (inPreviewMode && previewDelegate != null) { + previewDelegate.finishFragment(); + } else { + finishFragment(true); + } } public void finishFragment(boolean animated) { @@ -514,6 +519,10 @@ public abstract class BaseFragment { } + public void onSlideProgressFront(boolean isOpen, float progress) { + + } + public void onTransitionAnimationProgress(boolean isOpen, float progress) { } @@ -838,4 +847,25 @@ public abstract class BaseFragment { public void drawOverlay(Canvas canvas, View parent) { } + + public void setPreviewOpenedProgress(float progress) { + + } + + public void setPreviewReplaceProgress(float progress) { + + } + + public boolean closeLastFragment() { + return false; + } + + public void setPreviewDelegate(PreviewDelegate previewDelegate) { + this.previewDelegate = previewDelegate; + } + + public interface PreviewDelegate { + void finishFragment(); + } + } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java index bca7d0f60..33c586fa1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java @@ -816,7 +816,7 @@ public class BottomSheet extends Dialog { textView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - textView.setBackground(Theme.AdaptiveRipple.filledRect(getThemedColor(Theme.key_featuredStickers_addButton), 4)); + textView.setBackground(Theme.AdaptiveRipple.filledRect(getThemedColor(Theme.key_featuredStickers_addButton), 6)); addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 16, 16, 16, 16)); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/EmojiThemes.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/EmojiThemes.java index 86c81decd..9707e24d6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/EmojiThemes.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/EmojiThemes.java @@ -245,7 +245,12 @@ public class EmojiThemes { if (themeInfo == null) { int settingsIndex = getSettingsIndex(index); TLRPC.TL_theme tlTheme = getTlTheme(index); - Theme.ThemeInfo baseTheme = Theme.getTheme(Theme.getBaseThemeKey(tlTheme.settings.get(settingsIndex))); + Theme.ThemeInfo baseTheme; + if (tlTheme != null) { + baseTheme = Theme.getTheme(Theme.getBaseThemeKey(tlTheme.settings.get(settingsIndex))); + } else { + baseTheme = Theme.getTheme("Blue"); + } themeInfo = new Theme.ThemeInfo(baseTheme); accent = themeInfo.createNewAccent(tlTheme, currentAccount, true, settingsIndex); themeInfo.setCurrentAccentId(accent.id); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/INavigationLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/INavigationLayout.java index ad9fc190e..d1cc4d6d8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/INavigationLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/INavigationLayout.java @@ -385,4 +385,8 @@ public interface INavigationLayout { BACK, MENU } + + interface IBackButtonDrawable { + BackButtonState getBackButtonState(); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java index d9af7a13b..18fa3a60d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/MenuDrawable.java @@ -144,7 +144,7 @@ public class MenuDrawable extends Drawable { canvas.save(); - canvas.translate(getIntrinsicWidth() / 2 - AndroidUtilities.dp(9), getIntrinsicHeight() / 2); + canvas.translate(getIntrinsicWidth() / 2 - AndroidUtilities.dp(9) - AndroidUtilities.dp(1) * currentRotation, getIntrinsicHeight() / 2); float endYDiff; float endXDiff; float startYDiff; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java index f8cb565d5..52b57bb6e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/SimpleTextView.java @@ -34,6 +34,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; +import org.telegram.messenger.LocaleController; import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; @@ -93,7 +94,7 @@ public class SimpleTextView extends View implements Drawable.Callback { private boolean wasLayout; private boolean rightDrawableOutside; - private boolean ellipsizeByGradient; + private boolean ellipsizeByGradient, ellipsizeByGradientLeft; private int ellipsizeByGradientWidthDp = 16; private int paddingRight; @@ -218,9 +219,17 @@ public class SimpleTextView extends View implements Drawable.Callback { fadePaintBack.setShader(new LinearGradient(0, 0, AndroidUtilities.dp(6), 0, new int[]{0, 0xffffffff}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); fadePaintBack.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); } - if ((fadeEllpsizePaint == null || fadeEllpsizePaintWidth != AndroidUtilities.dp(ellipsizeByGradientWidthDp)) && ellipsizeByGradient) { - fadeEllpsizePaint = new Paint(); - fadeEllpsizePaint.setShader(new LinearGradient(0, 0, fadeEllpsizePaintWidth = AndroidUtilities.dp(ellipsizeByGradientWidthDp), 0, new int[]{0, 0xffffffff}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + boolean ellipsizeLeft = getAlignment() == Layout.Alignment.ALIGN_NORMAL && LocaleController.isRTL || getAlignment() == Layout.Alignment.ALIGN_OPPOSITE && !LocaleController.isRTL; + if ((fadeEllpsizePaint == null || fadeEllpsizePaintWidth != AndroidUtilities.dp(ellipsizeByGradientWidthDp) || ellipsizeByGradientLeft != ellipsizeLeft) && ellipsizeByGradient) { + if (fadeEllpsizePaint == null) { + fadeEllpsizePaint = new Paint(); + } + ellipsizeByGradientLeft = ellipsizeLeft; + if (ellipsizeByGradientLeft) { + fadeEllpsizePaint.setShader(new LinearGradient(0, 0, fadeEllpsizePaintWidth = AndroidUtilities.dp(ellipsizeByGradientWidthDp), 0, new int[]{0xffffffff, 0}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + } else { + fadeEllpsizePaint.setShader(new LinearGradient(0, 0, fadeEllpsizePaintWidth = AndroidUtilities.dp(ellipsizeByGradientWidthDp), 0, new int[]{0, 0xffffffff}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + } fadeEllpsizePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); } } @@ -254,6 +263,9 @@ public class SimpleTextView extends View implements Drawable.Callback { } private void calcOffset(int width) { + if (layout == null) { + return; + } if (layout.getLineCount() > 0) { textWidth = (int) Math.ceil(layout.getLineWidth(0)); if (fullLayout != null) { @@ -282,7 +294,7 @@ public class SimpleTextView extends View implements Drawable.Callback { offsetX = -AndroidUtilities.dp(8); } offsetX += getPaddingLeft(); - textDoesNotFit = textWidth > width; + textDoesNotFit = textWidth > (width - paddingRight); if (fullLayout != null && fullLayoutAdditionalWidth > 0) { fullLayoutLeftCharactersOffset = fullLayout.getPrimaryHorizontal(0) - firstLineLayout.getPrimaryHorizontal(0); @@ -659,6 +671,34 @@ public class SimpleTextView extends View implements Drawable.Callback { public void setRightPadding(int padding) { if (paddingRight != padding) { paddingRight = padding; + + int width = getMaxTextWidth() - getPaddingLeft() - getPaddingRight() - minusWidth; + if (leftDrawable != null) { + width -= leftDrawable.getIntrinsicWidth(); + width -= drawablePadding; + } + int rightDrawableWidth = 0; + if (rightDrawable != null && !rightDrawableOutside) { + rightDrawableWidth = (int) (rightDrawable.getIntrinsicWidth() * rightDrawableScale); + width -= rightDrawableWidth; + width -= drawablePadding; + } + if (replacedText != null && replacedDrawable != null) { + if ((replacingDrawableTextIndex = text.toString().indexOf(replacedText)) < 0) { + width -= replacedDrawable.getIntrinsicWidth(); + width -= drawablePadding; + } + } + if (canHideRightDrawable && rightDrawableWidth != 0 && !rightDrawableOutside) { + CharSequence string = TextUtils.ellipsize(text, textPaint, width, TextUtils.TruncateAt.END); + if (!text.equals(string)) { + rightDrawableHidden = true; + width += rightDrawableWidth; + width += drawablePadding; + } + } + calcOffset(width); + invalidate(); } } @@ -831,9 +871,12 @@ public class SimpleTextView extends View implements Drawable.Callback { canvas.translate(getMaxTextWidth() - paddingRight - AndroidUtilities.dp(6), 0); canvas.drawRect(0, 0, AndroidUtilities.dp(6), getMeasuredHeight(), fadePaintBack); canvas.restore(); - } else if (ellipsizeByGradient && (!widthWrapContent || textDoesNotFit) && fadeEllpsizePaint != null) { + } else if (ellipsizeByGradient && textDoesNotFit && fadeEllpsizePaint != null) { canvas.save(); - canvas.translate(getMaxTextWidth() - paddingRight - fadeEllpsizePaintWidth - AndroidUtilities.dp(rightDrawable != null && !(rightDrawable instanceof AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable) && rightDrawableOutside ? +2 : 0), 0); + updateFadePaints(); + if (!ellipsizeByGradientLeft) { + canvas.translate(getMaxTextWidth() - paddingRight - fadeEllpsizePaintWidth - AndroidUtilities.dp(rightDrawable != null && !(rightDrawable instanceof AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable) && rightDrawableOutside ? +2 : 0), 0); + } canvas.drawRect(0, 0, fadeEllpsizePaintWidth, getMeasuredHeight(), fadeEllpsizePaint); canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java index 346abb90d..30d74f3ab 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java @@ -2913,7 +2913,7 @@ public class Theme { public static Paint avatar_backgroundPaint; public static Drawable listSelector; - public static Drawable[] avatarDrawables = new Drawable[12]; + public static Drawable[] avatarDrawables = new Drawable[13]; public static Drawable moveUpDrawable; @@ -3011,6 +3011,7 @@ public class Theme { public static TextPaint chat_msgTextPaint; public static TextPaint chat_actionTextPaint; + public static TextPaint chat_actionTextPaint2; public static TextPaint chat_unlockExtendedMediaTextPaint; public static TextPaint chat_msgBotButtonPaint; public static TextPaint chat_msgGameTextPaint; @@ -4048,6 +4049,7 @@ public class Theme { public static final String key_paint_chatActionBackgroundSelected = "paintChatActionBackgroundSelected"; public static final String key_paint_chatMessageBackgroundSelected = "paintChatMessageBackgroundSelected"; public static final String key_paint_chatActionText = "paintChatActionText"; + public static final String key_paint_chatActionText2 = "paintChatActionText2"; public static final String key_paint_chatBotButton = "paintChatBotButton"; public static final String key_paint_chatComposeBackground = "paintChatComposeBackground"; public static final String key_paint_chatTimeBackground = "paintChatTimeBackground"; @@ -8799,6 +8801,7 @@ public class Theme { avatarDrawables[9] = resources.getDrawable(R.drawable.msg_folders_archive); avatarDrawables[10] = resources.getDrawable(R.drawable.msg_folders_private); avatarDrawables[11] = resources.getDrawable(R.drawable.chats_replies); + avatarDrawables[12] = resources.getDrawable(R.drawable.other_chats); if (dialogs_archiveAvatarDrawable != null) { @@ -9091,7 +9094,7 @@ public class Theme { chat_timePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); } - final float[] emojiSizePercents = new float[] {.7f, .52f, .37f, .28f, .25f, .19f}; + final float[] emojiSizePercents = new float[] {.68f, .46f, .34f, .28f, .22f, .19f}; for (int i = 0; i < chat_msgTextPaintEmoji.length; ++i) { chat_msgTextPaintEmoji[i] = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_msgTextPaintEmoji[i].setTextSize(AndroidUtilities.dp(emojiSizePercents[i] * 120f)); @@ -9185,6 +9188,7 @@ public class Theme { chat_statusRecordPaint.setStyle(Paint.Style.STROKE); chat_statusRecordPaint.setStrokeCap(Paint.Cap.ROUND); chat_actionTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + chat_actionTextPaint2 = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_actionTextPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); chat_unlockExtendedMediaTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_unlockExtendedMediaTextPaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); @@ -9208,6 +9212,7 @@ public class Theme { addChatPaint(key_paint_chatActionBackground, chat_actionBackgroundPaint, key_chat_serviceBackground); addChatPaint(key_paint_chatActionBackgroundSelected, chat_actionBackgroundSelectedPaint, key_chat_serviceBackgroundSelected); addChatPaint(key_paint_chatActionText, chat_actionTextPaint, key_chat_serviceText); + addChatPaint(key_paint_chatActionText2, chat_actionTextPaint2, key_chat_serviceText); addChatPaint(key_paint_chatBotButton, chat_botButtonPaint, key_chat_botButtonText); addChatPaint(key_paint_chatComposeBackground, chat_composeBackgroundPaint, key_chat_messagePanelBackground); addChatPaint(key_paint_chatTimeBackground, chat_timeBackgroundPaint, key_chat_mediaTimeBackground); @@ -9522,6 +9527,7 @@ public class Theme { chat_instantViewRectPaint.setStrokeWidth(AndroidUtilities.dp(1)); chat_pollTimerPaint.setStrokeWidth(AndroidUtilities.dp(1.1f)); chat_actionTextPaint.setTextSize(AndroidUtilities.dp(Math.max(16, SharedConfig.fontSize) - 2)); + chat_actionTextPaint2.setTextSize(AndroidUtilities.dp(Math.max(16, SharedConfig.fontSize) - 2)); chat_unlockExtendedMediaTextPaint.setTextSize(AndroidUtilities.dp(Math.max(16, SharedConfig.fontSize))); chat_contextResult_titleTextPaint.setTextSize(AndroidUtilities.dp(15)); chat_contextResult_descriptionTextPaint.setTextSize(AndroidUtilities.dp(13)); @@ -9583,6 +9589,7 @@ public class Theme { chat_statusPaint.setColor(getColor(key_chat_status)); chat_statusRecordPaint.setColor(getColor(key_chat_status)); chat_actionTextPaint.setColor(getColor(key_chat_serviceText)); + chat_actionTextPaint2.setColor(getColor(key_chat_serviceText)); chat_actionTextPaint.linkColor = getColor(key_chat_serviceLink); chat_unlockExtendedMediaTextPaint.setColor(getColor(key_chat_serviceText)); chat_contextResult_titleTextPaint.setColor(getColor(key_windowBackgroundWhiteBlackText)); @@ -9827,6 +9834,7 @@ public class Theme { setDrawableColor(chat_msgStickerViewsDrawable, 0xffffffff); setDrawableColor(chat_msgStickerRepliesDrawable, 0xffffffff); chat_actionTextPaint.setColor(0xffffffff); + chat_actionTextPaint2.setColor(0xffffffff); chat_actionTextPaint.linkColor = 0xffffffff; chat_unlockExtendedMediaTextPaint.setColor(0xffffffff); chat_botButtonPaint.setColor(0xffffffff); @@ -9848,6 +9856,7 @@ public class Theme { setDrawableColorByKey(chat_msgStickerViewsDrawable, key_chat_serviceText); setDrawableColorByKey(chat_msgStickerRepliesDrawable, key_chat_serviceText); chat_actionTextPaint.setColor(getColor(key_chat_serviceText)); + chat_actionTextPaint2.setColor(getColor(key_chat_serviceText)); chat_actionTextPaint.linkColor = getColor(key_chat_serviceLink); chat_unlockExtendedMediaTextPaint.setColor(getColor(key_chat_serviceText)); setDrawableColorByKey(chat_commentStickerDrawable, key_chat_serviceIcon); @@ -9974,6 +9983,10 @@ public class Theme { setDrawableColorByKey(profile_verifiedCheckDrawable, key_profile_verifiedCheck); } + public static Drawable getThemedDrawable(Context context, int resId, String key, Theme.ResourcesProvider resourcesProvider) { + return getThemedDrawable(context, resId, getColor(key, resourcesProvider)); + } + public static Drawable getThemedDrawable(Context context, int resId, String key) { return getThemedDrawable(context, resId, getColor(key)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java index a073c9819..c070fdf84 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java @@ -24,11 +24,12 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; @@ -57,6 +58,7 @@ import org.telegram.ui.Components.BlurredRecyclerView; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.ListView.AdapterWithDiffUtils; import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.DialogsActivity; @@ -64,23 +66,24 @@ import org.telegram.ui.DialogsActivity; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.Objects; public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements DialogCell.DialogCellDelegate { public final static int VIEW_TYPE_DIALOG = 0, - VIEW_TYPE_FLICKER = 1, - VIEW_TYPE_RECENTLY_VIEWED = 2, - VIEW_TYPE_DIVIDER = 3, - VIEW_TYPE_ME_URL = 4, - VIEW_TYPE_EMPTY = 5, - VIEW_TYPE_USER = 6, - VIEW_TYPE_HEADER = 7, - VIEW_TYPE_SHADOW = 8, - VIEW_TYPE_ARCHIVE = 9, - VIEW_TYPE_LAST_EMPTY = 10, - VIEW_TYPE_NEW_CHAT_HINT = 11, - VIEW_TYPE_TEXT = 12, - VIEW_TYPE_CONTACTS_FLICKER = 13, - VIEW_TYPE_HEADER_2 = 14; + VIEW_TYPE_FLICKER = 1, + VIEW_TYPE_RECENTLY_VIEWED = 2, + VIEW_TYPE_DIVIDER = 3, + VIEW_TYPE_ME_URL = 4, + VIEW_TYPE_EMPTY = 5, + VIEW_TYPE_USER = 6, + VIEW_TYPE_HEADER = 7, + VIEW_TYPE_SHADOW = 8, + VIEW_TYPE_ARCHIVE = 9, + VIEW_TYPE_LAST_EMPTY = 10, + VIEW_TYPE_NEW_CHAT_HINT = 11, + VIEW_TYPE_TEXT = 12, + VIEW_TYPE_CONTACTS_FLICKER = 13, + VIEW_TYPE_HEADER_2 = 14; private Context mContext; private ArchiveHintCell archiveHintCell; @@ -101,7 +104,11 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements private boolean showArchiveHint; private boolean isReordering; private long lastSortTime; + private boolean collapsedView; + RecyclerListView recyclerListView; private PullForegroundDrawable pullForegroundDrawable; + ArrayList itemInternals = new ArrayList<>(); + ArrayList oldItems = new ArrayList<>(); private Drawable arrowDrawable; @@ -109,6 +116,8 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements private boolean forceShowEmptyCell; private DialogsActivity parentFragment; + private boolean isTransitionSupport; + private boolean fromDiffUtils; public DialogsAdapter(DialogsActivity fragment, Context context, int type, int folder, boolean onlySelect, ArrayList selected, int account) { mContext = context; @@ -129,6 +138,10 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } } + public void setRecyclerListView(RecyclerListView recyclerListView) { + this.recyclerListView = recyclerListView; + } + public void setOpenedDialogId(long id) { openedDialogId = id; } @@ -152,8 +165,7 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } public boolean isDataSetChanged() { - int current = currentCount; - return current != getItemCount() || current == 1; + return true; } public void setDialogsType(int type) { @@ -171,140 +183,115 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements @Override public int getItemCount() { - MessagesController messagesController = MessagesController.getInstance(currentAccount); - ArrayList array = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); - dialogsCount = array.size(); - if (!forceUpdatingContacts && !forceShowEmptyCell && dialogsType != 7 && dialogsType != 8 && dialogsType != 11 && dialogsCount == 0 && (folderId != 0 || messagesController.isLoadingDialogs(folderId) || !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId))) { - onlineContacts = null; - if (BuildVars.LOGS_ENABLED) { - FileLog.d("DialogsAdapter dialogsCount=" + dialogsCount + " dialogsType=" + dialogsType + " isLoadingDialogs=" + messagesController.isLoadingDialogs(folderId) + " isDialogsEndReached=" + MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId)); + currentCount = itemInternals.size(); + return currentCount; + } + + public int findDialogPosition(long dialogId) { + for (int i = 0; i < itemInternals.size(); i++) { + if (itemInternals.get(i).dialog != null && itemInternals.get(i).dialog.id == dialogId) { + return i; } - if (folderId == 1 && showArchiveHint) { - return (currentCount = 2); - } - return (currentCount = 0); } - if (dialogsCount == 0 && messagesController.isLoadingDialogs(folderId)) { - return (currentCount = 0); - } - int count = dialogsCount; - if (dialogsType == 7 || dialogsType == 8) { - if (dialogsCount == 0) { - count++; - } + return -1; + } + + public int fixScrollGap(RecyclerListView animationSupportListView, int p, int offset, boolean hasHidenArchive, boolean oppened) { + int itemsToEnd = getItemCount() - p ; + int cellHeight = AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72); + int bottom = offset + animationSupportListView.getPaddingTop() + itemsToEnd * cellHeight + itemsToEnd - 1; + //fix height changed + int top = offset + animationSupportListView.getPaddingTop() - p * cellHeight - p; + if (oppened) { + bottom -= AndroidUtilities.dp(44); } else { - if (!messagesController.isDialogsEndReached(folderId) || dialogsCount == 0) { - count++; - } + bottom += AndroidUtilities.dp(44); } - boolean hasContacts = false; - if (hasHints) { - count += 2 + messagesController.hintDialogs.size(); - } else if (dialogsType == 0 && folderId == 0 && messagesController.isDialogsEndReached(folderId)) { - if (ContactsController.getInstance(currentAccount).contacts.isEmpty() && !ContactsController.getInstance(currentAccount).doneLoadingContacts && !forceUpdatingContacts) { - onlineContacts = null; - if (BuildVars.LOGS_ENABLED) { - FileLog.d("DialogsAdapter loadingContacts=" + (ContactsController.getInstance(currentAccount).contacts.isEmpty() && !ContactsController.getInstance(currentAccount).doneLoadingContacts) + "dialogsCount=" + dialogsCount + " dialogsType=" + dialogsType); - } - return (currentCount = 0); - } + if (hasHidenArchive) { + top += cellHeight; + } + if (top > animationSupportListView.getPaddingTop()) { + return offset + animationSupportListView.getPaddingTop() - top; + } + if (bottom < animationSupportListView.getMeasuredHeight()) { + return offset + (animationSupportListView.getMeasuredHeight() - bottom); + } + return offset; + } - if (messagesController.getAllFoldersDialogsCount() <= 10 && ContactsController.getInstance(currentAccount).doneLoadingContacts && !ContactsController.getInstance(currentAccount).contacts.isEmpty()) { - if (onlineContacts == null || prevDialogsCount != dialogsCount || prevContactsCount != ContactsController.getInstance(currentAccount).contacts.size()) { - onlineContacts = new ArrayList<>(ContactsController.getInstance(currentAccount).contacts); - prevContactsCount = onlineContacts.size(); - prevDialogsCount = messagesController.dialogs_dict.size(); - long selfId = UserConfig.getInstance(currentAccount).clientUserId; - for (int a = 0, N = onlineContacts.size(); a < N; a++) { - long userId = onlineContacts.get(a).user_id; - if (userId == selfId || messagesController.dialogs_dict.get(userId) != null) { - onlineContacts.remove(a); - a--; - N--; - } - } - if (onlineContacts.isEmpty()) { - onlineContacts = null; - } - sortOnlineContacts(false); + private class ItemInternal extends AdapterWithDiffUtils.Item { - if (parentFragment.getContactsAlpha() == 0f) { - registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - parentFragment.setContactsAlpha(0f); - parentFragment.animateContactsAlpha(1f); + TLRPC.Dialog dialog; + TLRPC.RecentMeUrl recentMeUrl; + TLRPC.TL_contact contact; + boolean isForumCell; + private boolean pinned; + private boolean isFolder; - unregisterAdapterDataObserver(this); - } - }); - } - } - if (onlineContacts != null) { - count += onlineContacts.size() + 2; - hasContacts = true; - } + public ItemInternal(int viewType, TLRPC.Dialog dialog) { + super(viewType, true); + this.dialog = dialog; + if (dialog != null) { + pinned = dialog.pinned; + isFolder = dialog.isFolder; + isForumCell = MessagesController.getInstance(currentAccount).isForum(dialog.id); } } - if (folderId == 0 && !hasContacts && dialogsCount == 0 && forceUpdatingContacts) { - count += 3; - } - if (folderId == 0 && onlineContacts != null) { - if (!hasContacts) { - onlineContacts = null; - } - } - if (folderId == 1 && showArchiveHint) { - count += 2; - } - if (folderId == 0 && dialogsCount != 0) { - count++; - if (dialogsCount > 10 && dialogsType == 0) { - count++; - } - } - if (dialogsType == 11 || dialogsType == 13) { - count += 2; - } else if (dialogsType == 12) { - count += 1; - } - currentCount = count; - return count; + public ItemInternal(int viewTypeMeUrl, TLRPC.RecentMeUrl recentMeUrl) { + super(viewTypeMeUrl, true); + this.recentMeUrl = recentMeUrl; + } + + public ItemInternal(int viewTypeEmpty) { + super(viewTypeEmpty, true); + } + + public ItemInternal(int viewTypeUser, TLRPC.TL_contact tl_contact) { + super(viewTypeUser, true); + contact = tl_contact; + } + + boolean compare(ItemInternal itemInternal) { + if (viewType != itemInternal.viewType) { + return false; + } + if (viewType == VIEW_TYPE_DIALOG) { + return dialog != null && itemInternal.dialog != null && dialog.id == itemInternal.dialog.id + && isFolder == itemInternal.isFolder && + isForumCell == itemInternal.isForumCell && + pinned == itemInternal.pinned; + } + if (viewType == VIEW_TYPE_HEADER_2) { + return dialog != null && itemInternal.dialog != null && dialog.id == itemInternal.dialog.id && dialog.isFolder == itemInternal.dialog.isFolder; + } + if (viewType == VIEW_TYPE_ME_URL) { + return recentMeUrl != null && itemInternal.recentMeUrl != null && recentMeUrl.url != null && recentMeUrl.url.equals(recentMeUrl.url); + } + if (viewType == VIEW_TYPE_USER) { + return contact != null && itemInternal.contact != null && contact.user_id == itemInternal.contact.user_id; + } + return true; + } + + @Override + public int hashCode() { + return Objects.hash(dialog, recentMeUrl, contact); + } } public TLObject getItem(int i) { - if (onlineContacts != null && (dialogsCount == 0 || i >= dialogsCount)) { - if (dialogsCount == 0) { - i -= 3; - } else { - i -= dialogsCount + 2; - } - if (i < 0 || i >= onlineContacts.size()) { - return null; - } - return MessagesController.getInstance(currentAccount).getUser(onlineContacts.get(i).user_id); - } - if (showArchiveHint) { - i -= 2; - } else if (dialogsType == 11 || dialogsType == 13) { - i -= 2; - } else if (dialogsType == 12) { - i -= 1; - } - ArrayList arrayList = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); - if (hasHints) { - int count = MessagesController.getInstance(currentAccount).hintDialogs.size(); - if (i < 2 + count) { - return MessagesController.getInstance(currentAccount).hintDialogs.get(i - 1); - } else { - i -= count + 2; - } - } - if (i < 0 || i >= arrayList.size()) { + if (i < 0 || i >= itemInternals.size()) { return null; } - return arrayList.get(i); + if (itemInternals.get(i).dialog != null) { + return itemInternals.get(i).dialog; + } else if (itemInternals.get(i).contact != null) { + return itemInternals.get(i).contact; + } else if (itemInternals.get(i).recentMeUrl != null) { + return itemInternals.get(i).recentMeUrl; + } + return null; } public void sortOnlineContacts(boolean notify) { @@ -367,6 +354,10 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements dialogsListFrozen = frozen; } + public boolean getDialogsListIsFrozen() { + return dialogsListFrozen; + } + public ViewPager getArchiveHintCellPager() { return archiveHintCell != null ? archiveHintCell.getViewPager() : null; } @@ -375,19 +366,71 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements hasHints = folderId == 0 && dialogsType == 0 && !isOnlySelect && !MessagesController.getInstance(currentAccount).hintDialogs.isEmpty(); } + public void updateList(RecyclerListView recyclerListView) { + oldItems.clear(); + oldItems.addAll(itemInternals); + updateItemList(); + + if (recyclerListView != null && recyclerListView.getChildCount() > 0) { + LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerListView.getLayoutManager()); + View view = null; + int position = -1; + int top = Integer.MAX_VALUE; + for (int i = 0; i < recyclerListView.getChildCount(); i++) { + int childPosition = recyclerListView.getChildAdapterPosition(recyclerListView.getChildAt(i)); + View child = recyclerListView.getChildAt(i); + if (childPosition != RecyclerListView.NO_POSITION && child.getTop() < top) { + view = child; + position = childPosition; + top = child.getTop(); + } + } + if (view != null) { + layoutManager.scrollToPositionWithOffset(position, view.getTop() - recyclerListView.getPaddingTop()); + } + } + + + fromDiffUtils = true; + DiffUtil.calculateDiff(new DiffUtil.Callback() { + @Override + public int getOldListSize() { + return oldItems.size(); + } + + @Override + public int getNewListSize() { + return itemInternals.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + return oldItems.get(oldItemPosition).compare(itemInternals.get(newItemPosition)); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return oldItems.get(oldItemPosition).viewType == itemInternals.get(newItemPosition).viewType; + } + }).dispatchUpdatesTo(this); + fromDiffUtils = false; + } + @Override public void notifyDataSetChanged() { - updateHasHints(); + updateItemList(); super.notifyDataSetChanged(); } + @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { if (holder.itemView instanceof DialogCell) { DialogCell dialogCell = (DialogCell) holder.itemView; dialogCell.onReorderStateChanged(isReordering, false); int position = fixPosition(holder.getAdapterPosition()); - dialogCell.setDialogIndex(position); + // dialogCell.setDialogIndex(position); + // dialogCell.collapsed = collapsedView; dialogCell.checkCurrentDialogIndex(dialogsListFrozen); dialogCell.setChecked(selectedDialogs.contains(dialogCell.getDialogId()), false); } @@ -413,6 +456,7 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements dialogCell.setArchivedPullAnimation(pullForegroundDrawable); dialogCell.setPreloader(preloader); dialogCell.setDialogCellDelegate(this); + dialogCell.setIsTransitionSupport(isTransitionSupport); view = dialogCell; } break; @@ -564,6 +608,7 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } public int lastDialogsEmptyType = -1; + public int dialogsEmptyType() { if (dialogsType == 7 || dialogsType == 8) { if (MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId)) { @@ -643,6 +688,11 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } cell.setChecked(selectedDialogs.contains(dialog.id), false); cell.setDialog(dialog, dialogsType, folderId); + cell.checkHeight(); + if (cell.collapsed != collapsedView) { + cell.collapsed = collapsedView; + cell.requestLayout(); + } if (preloader != null && i < 10) { preloader.add(dialog.id); } @@ -681,13 +731,8 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } case VIEW_TYPE_USER: { UserCell cell = (UserCell) holder.itemView; - int position; - if (dialogsCount == 0) { - position = i - 3; - } else { - position = i - dialogsCount - 2; - } - TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(onlineContacts.get(position).user_id); + TLRPC.TL_contact contact = (TLRPC.TL_contact) getItem(i); + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(contact.user_id); cell.setData(user, null, null, 0); break; } @@ -755,113 +800,30 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements @Override public int getItemViewType(int i) { - if (dialogsCount == 0 && forceUpdatingContacts) { - switch (i) { - case 0: - return VIEW_TYPE_EMPTY; - case 1: - return VIEW_TYPE_SHADOW; - case 2: - return VIEW_TYPE_HEADER; - case 3: - return VIEW_TYPE_CONTACTS_FLICKER; - } - } else if (onlineContacts != null) { - if (dialogsCount == 0) { - if (i == 0) { - return VIEW_TYPE_EMPTY; - } else if (i == 1) { - return VIEW_TYPE_SHADOW; - } else if (i == 2) { - return VIEW_TYPE_HEADER; - } - } else { - if (i < dialogsCount) { - return VIEW_TYPE_DIALOG; - } else if (i == dialogsCount) { - return VIEW_TYPE_SHADOW; - } else if (i == dialogsCount + 1) { - return VIEW_TYPE_HEADER; - } else if (i == currentCount - 1) { - return VIEW_TYPE_LAST_EMPTY; - } - } - return VIEW_TYPE_USER; - } else if (hasHints) { - int count = MessagesController.getInstance(currentAccount).hintDialogs.size(); - if (i < 2 + count) { - if (i == 0) { - return VIEW_TYPE_RECENTLY_VIEWED; - } else if (i == 1 + count) { - return VIEW_TYPE_DIVIDER; - } - return VIEW_TYPE_ME_URL; - } else { - i -= 2 + count; - } - } else if (showArchiveHint) { - if (i == 0) { - return VIEW_TYPE_ARCHIVE; - } else if (i == 1) { - return VIEW_TYPE_SHADOW; - } else { - i -= 2; - } - } else if (dialogsType == 11 || dialogsType == 13) { - if (i == 0) { - return VIEW_TYPE_HEADER; - } else if (i == 1) { - return VIEW_TYPE_TEXT; - } else { - i -= 2; - } - } else if (dialogsType == 12) { - if (i == 0) { - return VIEW_TYPE_HEADER; - } else { - i -= 1; - } - } - if (folderId == 0 && dialogsCount > 10 && i == currentCount - 2 && dialogsType == 0) { - return VIEW_TYPE_NEW_CHAT_HINT; - } - int size = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen).size(); - if (i == size) { - if (!forceShowEmptyCell && dialogsType != 7 && dialogsType != 8 && !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId)) { - return VIEW_TYPE_FLICKER; - } else if (size == 0) { - return VIEW_TYPE_EMPTY; - } else { - return VIEW_TYPE_LAST_EMPTY; - } - } else if (i > size) { - return VIEW_TYPE_LAST_EMPTY; - } - if (dialogsType == 2 && getItem(i) instanceof DialogsActivity.DialogsHeader) { - return VIEW_TYPE_HEADER_2; - } - return VIEW_TYPE_DIALOG; + return itemInternals.get(i).viewType; } @Override public void notifyItemMoved(int fromPosition, int toPosition) { - ArrayList dialogs = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, false); - int fromIndex = fixPosition(fromPosition); - int toIndex = fixPosition(toPosition); - TLRPC.Dialog fromDialog = dialogs.get(fromIndex); - TLRPC.Dialog toDialog = dialogs.get(toIndex); - if (dialogsType == 7 || dialogsType == 8) { - MessagesController.DialogFilter filter = MessagesController.getInstance(currentAccount).selectedDialogFilter[dialogsType == 8 ? 1 : 0]; - int idx1 = filter.pinnedDialogs.get(fromDialog.id); - int idx2 = filter.pinnedDialogs.get(toDialog.id); - filter.pinnedDialogs.put(fromDialog.id, idx2); - filter.pinnedDialogs.put(toDialog.id, idx1); - } else { - int oldNum = fromDialog.pinnedNum; - fromDialog.pinnedNum = toDialog.pinnedNum; - toDialog.pinnedNum = oldNum; + if (!fromDiffUtils) { + ArrayList dialogs = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, false); + int fromIndex = fixPosition(fromPosition); + int toIndex = fixPosition(toPosition); + TLRPC.Dialog fromDialog = dialogs.get(fromIndex); + TLRPC.Dialog toDialog = dialogs.get(toIndex); + if (dialogsType == 7 || dialogsType == 8) { + MessagesController.DialogFilter filter = MessagesController.getInstance(currentAccount).selectedDialogFilter[dialogsType == 8 ? 1 : 0]; + int idx1 = filter.pinnedDialogs.get(fromDialog.id); + int idx2 = filter.pinnedDialogs.get(toDialog.id); + filter.pinnedDialogs.put(fromDialog.id, idx2); + filter.pinnedDialogs.put(toDialog.id, idx1); + } else { + int oldNum = fromDialog.pinnedNum; + fromDialog.pinnedNum = toDialog.pinnedNum; + toDialog.pinnedNum = oldNum; + } + Collections.swap(dialogs, fromIndex, toIndex); } - Collections.swap(dialogs, fromIndex, toIndex); super.notifyItemMoved(fromPosition, toPosition); } @@ -902,6 +864,34 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements return selectedDialogs.isEmpty(); } + public void setIsTransitionSupport() { + this.isTransitionSupport = true; + } + + public void setCollapsedView(boolean collapsedView, RecyclerListView listView) { + this.collapsedView = collapsedView; + for (int i = 0; i < listView.getChildCount(); i++) { + if (listView.getChildAt(i) instanceof DialogCell) { + ((DialogCell) listView.getChildAt(i)).collapsed = collapsedView; + } + } + for (int i = 0; i < listView.getCachedChildCount(); i++) { + if (listView.getCachedChildAt(i) instanceof DialogCell) { + ((DialogCell) listView.getCachedChildAt(i)).collapsed = collapsedView; + } + } + for (int i = 0; i < listView.getHiddenChildCount(); i++) { + if (listView.getHiddenChildAt(i) instanceof DialogCell) { + ((DialogCell) listView.getHiddenChildAt(i)).collapsed = collapsedView; + } + } + for (int i = 0; i < listView.getAttachedScrapChildCount(); i++) { + if (listView.getAttachedScrapChildAt(i) instanceof DialogCell) { + ((DialogCell) listView.getAttachedScrapChildAt(i)).collapsed = collapsedView; + } + } + } + public static class DialogsPreloader { private final int MAX_REQUEST_COUNT = 4; @@ -973,7 +963,7 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements private boolean preloadIsAvilable() { return false; - // return DownloadController.getInstance(UserConfig.selectedAccount).getCurrentDownloadMask() != 0; + // return DownloadController.getInstance(UserConfig.selectedAccount).getCurrentDownloadMask() != 0; } public void updateList() { @@ -1029,7 +1019,7 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int size = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen).size(); + int size = itemInternals.size(); boolean hasArchive = dialogsType == 0 && MessagesController.getInstance(currentAccount).dialogs_dict.get(DialogObject.makeFolderDialogId(1)) != null; View parent = (View) getParent(); int height; @@ -1051,7 +1041,17 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements } height -= blurOffset; int cellHeight = AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72); - int dialogsHeight = size * cellHeight + (size - 1); + int dialogsHeight = 0; + for (int i = 0; i < size; i++) { + if (itemInternals.get(i).viewType == VIEW_TYPE_DIALOG) { + if (itemInternals.get(i).isForumCell && !collapsedView) { + dialogsHeight += AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 86 : 91); + } else { + dialogsHeight += cellHeight; + } + } + } + dialogsHeight += size - 1; if (onlineContacts != null) { dialogsHeight += onlineContacts.size() * AndroidUtilities.dp(58) + (onlineContacts.size() - 1) + AndroidUtilities.dp(52); } @@ -1079,4 +1079,108 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter implements setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height); } } + + + private void updateItemList() { + itemInternals.clear(); + updateHasHints(); + + MessagesController messagesController = MessagesController.getInstance(currentAccount); + ArrayList array = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); + dialogsCount = array.size(); + + if (!hasHints && dialogsType == 0 && folderId == 0 && messagesController.isDialogsEndReached(folderId) && !forceUpdatingContacts) { + if (messagesController.getAllFoldersDialogsCount() <= 10 && ContactsController.getInstance(currentAccount).doneLoadingContacts && !ContactsController.getInstance(currentAccount).contacts.isEmpty()) { + onlineContacts = new ArrayList<>(ContactsController.getInstance(currentAccount).contacts); + long selfId = UserConfig.getInstance(currentAccount).clientUserId; + for (int a = 0, N = onlineContacts.size(); a < N; a++) { + long userId = onlineContacts.get(a).user_id; + if (userId == selfId || messagesController.dialogs_dict.get(userId) != null) { + onlineContacts.remove(a); + a--; + N--; + } + } + if (onlineContacts.isEmpty()) { + onlineContacts = null; + } else { + sortOnlineContacts(false); + } + } else { + onlineContacts = null; + } + } + + boolean stopUpdate = false; + if (collapsedView || isTransitionSupport) { + for (int k = 0; k < array.size(); k++) { + if (dialogsType == 2 && array.get(k) instanceof DialogsActivity.DialogsHeader) { + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER_2, array.get(k))); + } else { + itemInternals.add(new ItemInternal(VIEW_TYPE_DIALOG, array.get(k))); + } + } + return; + } + + if (dialogsCount == 0 && forceUpdatingContacts) { + itemInternals.add(new ItemInternal(VIEW_TYPE_EMPTY)); + itemInternals.add(new ItemInternal(VIEW_TYPE_SHADOW)); + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER)); + itemInternals.add(new ItemInternal(VIEW_TYPE_CONTACTS_FLICKER)); + } else if (onlineContacts != null) { + if (dialogsCount == 0) { + itemInternals.add(new ItemInternal(VIEW_TYPE_EMPTY)); + itemInternals.add(new ItemInternal(VIEW_TYPE_SHADOW)); + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER)); + } else { + for (int k = 0; k < array.size(); k++) { + itemInternals.add(new ItemInternal(VIEW_TYPE_DIALOG, array.get(k))); + } + itemInternals.add(new ItemInternal(VIEW_TYPE_SHADOW)); + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER)); + for (int k = 0; k < onlineContacts.size(); k++) { + itemInternals.add(new ItemInternal(VIEW_TYPE_USER, onlineContacts.get(k))); + } + itemInternals.add(new ItemInternal(VIEW_TYPE_LAST_EMPTY)); + } + stopUpdate = true; + } else if (hasHints) { + int count = MessagesController.getInstance(currentAccount).hintDialogs.size(); + itemInternals.add(new ItemInternal(VIEW_TYPE_RECENTLY_VIEWED)); + for (int k = 0; k < count; k++) { + itemInternals.add(new ItemInternal(VIEW_TYPE_ME_URL, MessagesController.getInstance(currentAccount).hintDialogs.get(k))); + } + itemInternals.add(new ItemInternal(VIEW_TYPE_DIVIDER)); + } else if (showArchiveHint) { + itemInternals.add(new ItemInternal(VIEW_TYPE_ARCHIVE)); + itemInternals.add(new ItemInternal(VIEW_TYPE_SHADOW)); + } else if (dialogsType == 11 || dialogsType == 13) { + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER)); + itemInternals.add(new ItemInternal(VIEW_TYPE_TEXT)); + } else if (dialogsType == 12) { + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER)); + } + + if (!stopUpdate) { + for (int k = 0; k < array.size(); k++) { + if (dialogsType == 2 && array.get(k) instanceof DialogsActivity.DialogsHeader) { + itemInternals.add(new ItemInternal(VIEW_TYPE_HEADER_2, array.get(k))); + } else { + itemInternals.add(new ItemInternal(VIEW_TYPE_DIALOG, array.get(k))); + } + } + } + + if (!forceShowEmptyCell && dialogsType != 7 && dialogsType != 8 && !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId)) { + itemInternals.add(new ItemInternal(VIEW_TYPE_FLICKER)); + } else if (dialogsCount == 0) { + itemInternals.add(new ItemInternal(VIEW_TYPE_EMPTY)); + } else { + if (folderId == 0 && dialogsCount > 10 && dialogsType == 0) { + itemInternals.add(new ItemInternal(VIEW_TYPE_NEW_CHAT_HINT)); + } + itemInternals.add(new ItemInternal(VIEW_TYPE_LAST_EMPTY)); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java index 4e42ab0be..49462a918 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -49,6 +49,7 @@ import org.telegram.ui.Cells.HashtagSearchCell; import org.telegram.ui.Cells.HintDialogCell; import org.telegram.ui.Cells.ProfileSearchCell; import org.telegram.ui.Cells.TextCell; +import org.telegram.ui.Cells.TopicSearchCell; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.ForegroundColorSpanThemable; import org.telegram.ui.Components.RecyclerListView; @@ -64,25 +65,32 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { private final int VIEW_TYPE_PROFILE_CELL = 0; private final int VIEW_TYPE_GRAY_SECTION = 1; private final int VIEW_TYPE_DIALOG_CELL = 2; - private final int VIEW_TYPE_LOADING = 3; - private final int VIEW_TYPE_HASHTAG_CELL = 4; - private final int VIEW_TYPE_CATEGORY_LIST = 5; - private final int VIEW_TYPE_ADD_BY_PHONE = 6; + private final int VIEW_TYPE_TOPIC_CELL = 3; + private final int VIEW_TYPE_LOADING = 4; + private final int VIEW_TYPE_HASHTAG_CELL = 5; + private final int VIEW_TYPE_CATEGORY_LIST = 6; + private final int VIEW_TYPE_ADD_BY_PHONE = 7; private Context mContext; private Runnable searchRunnable; private Runnable searchRunnable2; private ArrayList searchResult = new ArrayList<>(); + private ArrayList searchTopics = new ArrayList<>(); private ArrayList searchResultNames = new ArrayList<>(); + private ArrayList searchForumResultMessages = new ArrayList<>(); private ArrayList searchResultMessages = new ArrayList<>(); private ArrayList searchResultHashtags = new ArrayList<>(); private String lastSearchText; private boolean searchWas; private int reqId = 0; private int lastReqId; - private DialogsSearchAdapterDelegate delegate; + private int reqForumId = 0; + private int lastForumReqId; + public DialogsSearchAdapterDelegate delegate; private int needMessagesSearch; private boolean messagesSearchEndReached; + private boolean localMessagesSearchEndReached; + public int localMessagesLoadingRow = -1; private String lastMessagesSearchString; private String currentMessagesQuery; private int nextSearchRate; @@ -105,6 +113,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { private ArrayList recentSearchObjects = new ArrayList<>(); private ArrayList filteredRecentSearchObjects = new ArrayList<>(); + private ArrayList filtered2RecentSearchObjects = new ArrayList<>(); private String filteredRecentQuery = null; private LongSparseArray recentSearchObjectsById = new LongSparseArray<>(); private ArrayList localTipDates = new ArrayList<>(); @@ -136,6 +145,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { void needClearList(); void runResultsEnterAnimation(); boolean isSelected(long dialogId); + long getSearchForumDialogId(); } public static class CategoryAdapterRecycler extends RecyclerListView.SelectionAdapter { @@ -259,20 +269,144 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } public boolean isMessagesSearchEndReached() { - return messagesSearchEndReached; + return (delegate.getSearchForumDialogId() == 0 || localMessagesSearchEndReached) && messagesSearchEndReached; } public void loadMoreSearchMessages() { - if (reqId != 0) { + if (reqForumId != 0 && reqId != 0) { return; } - searchMessagesInternal(lastMessagesSearchString, lastMessagesSearchId); + if (delegate != null && delegate.getSearchForumDialogId() != 0 && !localMessagesSearchEndReached) { + searchForumMessagesInternal(lastMessagesSearchString, lastMessagesSearchId); + } else { + searchMessagesInternal(lastMessagesSearchString, lastMessagesSearchId); + } } public String getLastSearchString() { return lastMessagesSearchString; } + private void searchForumMessagesInternal(final String query, int searchId) { + if (delegate == null || delegate.getSearchForumDialogId() == 0) { + return; + } + if (needMessagesSearch == 0 || TextUtils.isEmpty(lastMessagesSearchString) && TextUtils.isEmpty(query)) { + return; + } + if (reqForumId != 0) { + ConnectionsManager.getInstance(currentAccount).cancelRequest(reqForumId, true); + reqForumId = 0; + } + if (TextUtils.isEmpty(query)) { + filteredRecentQuery = null; + searchResultMessages.clear(); + searchForumResultMessages.clear(); + lastForumReqId = 0; + lastMessagesSearchString = null; + searchWas = false; + notifyDataSetChanged(); + return; + } + + final long dialogId = delegate.getSearchForumDialogId(); + + final TLRPC.TL_messages_search req = new TLRPC.TL_messages_search(); + req.limit = 20; + req.q = query; + req.filter = new TLRPC.TL_inputMessagesFilterEmpty(); + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(dialogId); + if (query.equals(lastMessagesSearchString) && !searchForumResultMessages.isEmpty()) { + req.add_offset = searchForumResultMessages.size(); + } + lastMessagesSearchString = query; + final int currentReqId = ++lastForumReqId; + reqForumId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> { + final ArrayList messageObjects = new ArrayList<>(); + if (error == null) { + TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; + LongSparseArray chatsMap = new LongSparseArray<>(); + LongSparseArray usersMap = new LongSparseArray<>(); + for (int a = 0; a < res.chats.size(); a++) { + TLRPC.Chat chat = res.chats.get(a); + chatsMap.put(chat.id, chat); + } + for (int a = 0; a < res.users.size(); a++) { + TLRPC.User user = res.users.get(a); + usersMap.put(user.id, user); + } + for (int a = 0; a < res.messages.size(); a++) { + TLRPC.Message message = res.messages.get(a); + MessageObject messageObject = new MessageObject(currentAccount, message, usersMap, chatsMap, false, true); + messageObjects.add(messageObject); + messageObject.setQuery(query); + } + } + AndroidUtilities.runOnUIThread(() -> { + if (currentReqId == lastForumReqId && (searchId <= 0 || searchId == lastSearchId)) { + waitingResponseCount--; + if (error == null) { + currentMessagesQuery = query; + TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; + MessagesStorage.getInstance(currentAccount).putUsersAndChats(res.users, res.chats, true, true); + MessagesController.getInstance(currentAccount).putUsers(res.users, false); + MessagesController.getInstance(currentAccount).putChats(res.chats, false); + if (req.add_offset == 0) { + searchForumResultMessages.clear(); + } + nextSearchRate = res.next_rate; + for (int a = 0; a < res.messages.size(); a++) { + TLRPC.Message message = res.messages.get(a); + long did = MessageObject.getDialogId(message); + int maxId = MessagesController.getInstance(currentAccount).deletedHistory.get(did); + if (maxId != 0 && message.id <= maxId) { + continue; + } + searchForumResultMessages.add(messageObjects.get(a)); + } + searchWas = true; + localMessagesSearchEndReached = res.messages.size() != 20; + if (searchId > 0) { + lastMessagesSearchId = searchId; + if (lastLocalSearchId != searchId) { + searchResult.clear(); + } + if (lastGlobalSearchId != searchId) { + searchAdapterHelper.clear(); + } + } + searchAdapterHelper.mergeResults(searchResult, filtered2RecentSearchObjects); + if (delegate != null) { + delegate.searchStateChanged(waitingResponseCount > 0, true); + delegate.runResultsEnterAnimation(); + } + notifyDataSetChanged(); + } + } + reqForumId = 0; + }); + }, ConnectionsManager.RequestFlagFailOnServerErrors); + } + + private void searchTopics(final String query) { + searchTopics.clear(); + if (delegate == null || delegate.getSearchForumDialogId() == 0) { + return; + } + if (!TextUtils.isEmpty(query)) { + long dialogId = delegate.getSearchForumDialogId(); + ArrayList topics = MessagesController.getInstance(currentAccount).getTopicsController().getTopics(-dialogId); + String searchTrimmed = query.trim(); + for (int i = 0; i < topics.size(); i++) { + if (topics.get(i) != null && topics.get(i).title.toLowerCase().contains(searchTrimmed)) { + searchTopics.add(topics.get(i)); + topics.get(i).searchQuery = searchTrimmed; + } + } + } + notifyDataSetChanged(); + } + private void searchMessagesInternal(final String query, int searchId) { if (needMessagesSearch == 0 || TextUtils.isEmpty(lastMessagesSearchString) && TextUtils.isEmpty(query)) { return; @@ -284,6 +418,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (TextUtils.isEmpty(query)) { filteredRecentQuery = null; searchResultMessages.clear(); + searchForumResultMessages.clear(); lastReqId = 0; lastMessagesSearchString = null; searchWas = false; @@ -291,7 +426,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { return; } else { filterRecent(query); - searchAdapterHelper.mergeResults(searchResult, filteredRecentSearchObjects); + searchAdapterHelper.mergeResults(searchResult, filtered2RecentSearchObjects); } final TLRPC.TL_messages_searchGlobal req = new TLRPC.TL_messages_searchGlobal(); @@ -354,7 +489,21 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (maxId != 0 && message.id <= maxId) { continue; } - searchResultMessages.add(messageObjects.get(a)); + MessageObject msg = messageObjects.get(a); + if (!searchForumResultMessages.isEmpty()) { + boolean foundDuplicate = false; + for (int i = 0; i < searchForumResultMessages.size(); ++i) { + MessageObject msg2 = searchForumResultMessages.get(i); + if (msg2 != null && msg != null && msg.getId() == msg2.getId() && msg.getDialogId() == msg2.getDialogId()) { + foundDuplicate = true; + break; + } + } + if (foundDuplicate) { + continue; + } + } + searchResultMessages.add(msg); long dialog_id = MessageObject.getDialogId(message); ConcurrentHashMap read_max = message.out ? MessagesController.getInstance(currentAccount).dialogs_read_outbox_max : MessagesController.getInstance(currentAccount).dialogs_read_inbox_max; Integer value = read_max.get(dialog_id); @@ -375,7 +524,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { searchAdapterHelper.clear(); } } - searchAdapterHelper.mergeResults(searchResult, filteredRecentSearchObjects); + searchAdapterHelper.mergeResults(searchResult, filtered2RecentSearchObjects); if (delegate != null) { delegate.searchStateChanged(waitingResponseCount > 0, true); delegate.runResultsEnterAnimation(); @@ -545,8 +694,8 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { public void clearRecentSearch() { StringBuilder queryFilter = null; if (searchWas) { - while (filteredRecentSearchObjects.size() > 0) { - RecentSearchObject obj = filteredRecentSearchObjects.remove(0); + while (filtered2RecentSearchObjects.size() > 0) { + RecentSearchObject obj = filtered2RecentSearchObjects.remove(0); recentSearchObjects.remove(obj); recentSearchObjectsById.remove(obj.did); if (queryFilter == null) { @@ -562,7 +711,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { queryFilter.append(")"); } } else { - filteredRecentSearchObjects.clear(); + filtered2RecentSearchObjects.clear(); recentSearchObjects.clear(); recentSearchObjectsById.clear(); queryFilter = new StringBuilder("1"); @@ -613,6 +762,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { MessagesController.getInstance(currentAccount).putEncryptedChat((TLRPC.EncryptedChat) recentSearchObject.object, true); } } + filterRecent(null); notifyDataSetChanged(); } @@ -660,7 +810,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { searchResultMessages.clear(); } searchWas = true; - final int recentCount = filteredRecentSearchObjects.size(); + final int recentCount = filtered2RecentSearchObjects.size(); for (int a = 0; a < result.size(); a++) { Object obj = result.get(a); long dialogId = 0; @@ -700,11 +850,13 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } boolean foundInRecent = false; - for (int j = 0; j < recentCount; ++j) { - RecentSearchObject o = filteredRecentSearchObjects.get(j); + if (delegate != null && delegate.getSearchForumDialogId() == dialogId) { + foundInRecent = true; + } + for (int j = 0; !foundInRecent && j < recentCount; ++j) { + RecentSearchObject o = filtered2RecentSearchObjects.get(j); if (o != null && o.did == dialogId) { foundInRecent = true; - break; } } if (foundInRecent) { @@ -716,7 +868,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { MessagesController.getInstance(currentAccount).putUsers(encUsers, true); searchResult = result; searchResultNames = names; - searchAdapterHelper.mergeResults(searchResult, filteredRecentSearchObjects); + searchAdapterHelper.mergeResults(searchResult, filtered2RecentSearchObjects); notifyDataSetChanged(); if (delegate != null) { delegate.searchStateChanged(waitingResponseCount > 0, true); @@ -757,6 +909,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } else { query = null; } + filterRecent(query); if (TextUtils.isEmpty(query)) { filteredRecentQuery = null; searchAdapterHelper.unloadRecentHashtags(); @@ -764,7 +917,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { searchResultNames.clear(); searchResultHashtags.clear(); searchAdapterHelper.mergeResults(null, null); - searchAdapterHelper.queryServerSearch(null, true, true, dialogsType != 11, dialogsType != 11, dialogsType == 2 || dialogsType == 11, 0, dialogsType == 0, 0, 0); + searchAdapterHelper.queryServerSearch(null, true, true, dialogsType != 11, dialogsType != 11, dialogsType == 2 || dialogsType == 11, 0, dialogsType == 0, 0, 0, delegate != null ? delegate.getSearchForumDialogId() : 0); searchWas = false; lastSearchId = 0; waitingResponseCount = 0; @@ -773,7 +926,9 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (delegate != null) { delegate.searchStateChanged(false, true); } + searchTopics(null); searchMessagesInternal(null, 0); + searchForumMessagesInternal(null, 0); notifyDataSetChanged(); localTipDates.clear(); localTipArchive = false; @@ -781,8 +936,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { filtersDelegate.updateFiltersView(false, null, localTipDates, localTipArchive); } } else { - filterRecent(query); - searchAdapterHelper.mergeResults(searchResult, filteredRecentSearchObjects); + searchAdapterHelper.mergeResults(searchResult, filtered2RecentSearchObjects); if (needMessagesSearch != 2 && (query.startsWith("#") && query.length() == 1)) { messagesSearchEndReached = true; if (searchAdapterHelper.loadRecentHashtags()) { @@ -822,14 +976,16 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { return; } if (needMessagesSearch != 2) { - searchAdapterHelper.queryServerSearch(query, true, dialogsType != 4, true, dialogsType != 4 && dialogsType != 11, dialogsType == 2 || dialogsType == 1, 0, dialogsType == 0, 0, searchId); + searchAdapterHelper.queryServerSearch(query, true, dialogsType != 4, true, dialogsType != 4 && dialogsType != 11, dialogsType == 2 || dialogsType == 1, 0, dialogsType == 0, 0, searchId, delegate != null ? delegate.getSearchForumDialogId() : 0); } else { waitingResponseCount -= 2; } if (needMessagesSearch == 0) { waitingResponseCount--; } else { + searchTopics(text); searchMessagesInternal(text, searchId); + searchForumMessagesInternal(text, searchId); } }); }, 300); @@ -837,12 +993,12 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } public int getRecentItemsCount() { - ArrayList recent = searchWas ? filteredRecentSearchObjects : recentSearchObjects; + ArrayList recent = searchWas ? filtered2RecentSearchObjects : filteredRecentSearchObjects; return (!recent.isEmpty() ? recent.size() + 1 : 0) + (!searchWas && !MediaDataController.getInstance(currentAccount).hints.isEmpty() ? 1 : 0); } public int getRecentResultsCount() { - ArrayList recent = searchWas ? filteredRecentSearchObjects : recentSearchObjects; + ArrayList recent = searchWas ? filtered2RecentSearchObjects : filteredRecentSearchObjects; return recent != null ? recent.size() : 0; } @@ -862,6 +1018,10 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { return count; } } + if (!searchTopics.isEmpty()) { + count++; + } + count += searchTopics.size(); int resultsCount = searchResult.size(); count += resultsCount; int localServerCount = searchAdapterHelper.getLocalServerSearch().size(); @@ -874,8 +1034,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (phoneCount > 3 && phoneCollapsed) { phoneCount = 3; } - int messagesCount = searchResultMessages.size(); - if (resultsCount + localServerCount > 0 && getRecentItemsCount() > 0) { + if (resultsCount + localServerCount > 0 && (getRecentItemsCount() > 0 || !searchTopics.isEmpty())) { count++; } if (globalCount != 0) { @@ -884,8 +1043,22 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (phoneCount != 0) { count += phoneCount; } + int localMessagesCount = searchForumResultMessages.size(); + if (localMessagesCount != 0) { + count += 1 + localMessagesCount + (localMessagesSearchEndReached ? 0 : 1); + } + if (!localMessagesSearchEndReached) { + localMessagesLoadingRow = count; + } + int messagesCount = searchResultMessages.size(); + if (!searchForumResultMessages.isEmpty() && !localMessagesSearchEndReached) { + messagesCount = 0; + } if (messagesCount != 0) { - count += messagesCount + 1 + (messagesSearchEndReached ? 0 : 1); + count += 1 + messagesCount + (messagesSearchEndReached ? 0 : 1); + } + if (localMessagesSearchEndReached) { + localMessagesLoadingRow = count; } return currentItemCount = count; } @@ -900,7 +1073,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } if (isRecentSearchDisplayed()) { int offset = (!searchWas && !MediaDataController.getInstance(currentAccount).hints.isEmpty() ? 1 : 0); - ArrayList recent = searchWas ? filteredRecentSearchObjects : recentSearchObjects; + ArrayList recent = searchWas ? filtered2RecentSearchObjects : filteredRecentSearchObjects; if (i > offset && i - 1 - offset < recent.size()) { TLObject object = recent.get(i - 1 - offset).object; if (object instanceof TLRPC.User) { @@ -919,12 +1092,18 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { i -= getRecentItemsCount(); } } + if (!searchTopics.isEmpty()) { + if (i > 0 && i <= searchTopics.size()) { + return searchTopics.get(i - 1); + } + i -= 1 + searchTopics.size(); + } ArrayList globalSearch = searchAdapterHelper.getGlobalSearch(); ArrayList localServerSearch = searchAdapterHelper.getLocalServerSearch(); ArrayList phoneSearch = searchAdapterHelper.getPhoneSearch(); int localCount = searchResult.size(); int localServerCount = localServerSearch.size(); - if (localCount + localServerCount > 0 && getRecentItemsCount() > 0) { + if (localCount + localServerCount > 0 && (getRecentItemsCount() > 0 || !searchTopics.isEmpty())) { if (i == 0) { return null; } @@ -938,7 +1117,6 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (globalCount > 4 && globalSearchCollapsed) { globalCount = 4; } - int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; if (i >= 0 && i < localCount) { return searchResult.get(i); } @@ -955,9 +1133,16 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { return globalSearch.get(i - 1); } i -= globalCount; - if (i > 0 && i < messagesCount) { + int localMessagesCount = searchForumResultMessages.isEmpty() ? 0 : searchForumResultMessages.size() + 1; + if (i > 0 && i <= searchForumResultMessages.size()) { + return searchForumResultMessages.get(i - 1); + } + i -= localMessagesCount + (!localMessagesSearchEndReached && !searchForumResultMessages.isEmpty() ? 1 : 0); + int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; + if (i > 0 && i <= searchResultMessages.size()) { return searchResultMessages.get(i - 1); } + // i -= messagesCount; return null; } @@ -970,7 +1155,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } if (isRecentSearchDisplayed()) { int offset = (!searchWas && !MediaDataController.getInstance(currentAccount).hints.isEmpty() ? 1 : 0); - ArrayList recent = searchWas ? filteredRecentSearchObjects : recentSearchObjects; + ArrayList recent = searchWas ? filtered2RecentSearchObjects : filteredRecentSearchObjects; if (i > offset && i - 1 - offset < recent.size()) { return false; } else { @@ -989,7 +1174,6 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (globalCount > 4 && globalSearchCollapsed) { globalCount = 4; } - int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; if (i >= 0 && i < localCount) { return false; @@ -1007,6 +1191,12 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { return true; } i -= globalCount; + int localMessagesCount = searchForumResultMessages.isEmpty() ? 0 : searchForumResultMessages.size() + 1; + if (i > 0 && i < localMessagesCount) { + return false; + } + i -= localMessagesCount; + int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; if (i > 0 && i < messagesCount) { return false; } @@ -1037,11 +1227,14 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { case VIEW_TYPE_DIALOG_CELL: view = new DialogCell(null, mContext, false, true) { @Override - protected boolean isForumCell() { + public boolean isForumCell() { return false; } }; break; + case VIEW_TYPE_TOPIC_CELL: + view = new TopicSearchCell(mContext); + break; case VIEW_TYPE_LOADING: FlickerLoadingView flickerLoadingView = new FlickerLoadingView(mContext); flickerLoadingView.setViewType(FlickerLoadingView.DIALOG_TYPE); @@ -1140,11 +1333,14 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } position -= getRecentItemsCount(); } + if (!searchTopics.isEmpty()) { + position -= 1 + searchTopics.size(); + } ArrayList globalSearch = searchAdapterHelper.getGlobalSearch(); ArrayList phoneSearch = searchAdapterHelper.getPhoneSearch(); int localCount = searchResult.size(); int localServerCount = searchAdapterHelper.getLocalServerSearch().size(); - if (localCount + localServerCount > 0 && getRecentItemsCount() > 0) { + if (localCount + localServerCount > 0 && (getRecentItemsCount() > 0 || !searchTopics.isEmpty())) { position--; } int phoneCount = phoneSearch.size(); @@ -1249,12 +1445,12 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { }); } else { int rawPosition = position; - if (isRecentSearchDisplayed()) { + if (isRecentSearchDisplayed() || !searchTopics.isEmpty()) { int offset = (!searchWas && !MediaDataController.getInstance(currentAccount).hints.isEmpty() ? 1 : 0); if (position < offset) { cell.setText(LocaleController.getString("ChatHints", R.string.ChatHints)); return; - } else if (position == offset) { + } else if (position == offset && isRecentSearchDisplayed()) { if (!searchWas) { cell.setText(LocaleController.getString("Recent", R.string.Recent), LocaleController.getString("ClearButton", R.string.ClearButton), v -> { if (delegate != null) { @@ -1269,7 +1465,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { }); } return; - } else if (position == getRecentItemsCount()) { + } else if (position == getRecentItemsCount() + (searchTopics.isEmpty() ? 0 : searchTopics.size() + 1)) { cell.setText(LocaleController.getString("SearchAllChatsShort", R.string.SearchAllChatsShort)); return; } else { @@ -1287,87 +1483,99 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (globalCount > 4 && globalSearchCollapsed) { globalCount = 4; } + int localMessagesCount = searchForumResultMessages.isEmpty() ? 0 : searchForumResultMessages.size() + 1; int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; - position -= localCount + localServerCount; - String title; + String title = null; boolean showMore = false; Runnable onClick = null; - if (position >= 0 && position < phoneCount) { - title = LocaleController.getString("PhoneNumberSearch", R.string.PhoneNumberSearch); - if (searchAdapterHelper.getPhoneSearch().size() > 3) { - showMore = phoneCollapsed; - onClick = () -> { - phoneCollapsed = !phoneCollapsed; - cell.setRightText(phoneCollapsed ? LocaleController.getString("ShowMore", R.string.ShowMore) : LocaleController.getString("ShowLess", R.string.ShowLess)); - notifyDataSetChanged(); - }; + if (!searchTopics.isEmpty()) { + if (position == 0) { + title = LocaleController.getString("Topics", R.string.Topics); } - } else { - position -= phoneCount; - if (position >= 0 && position < globalCount) { - title = LocaleController.getString("GlobalSearch", R.string.GlobalSearch); - if (searchAdapterHelper.getGlobalSearch().size() > 3) { - showMore = globalSearchCollapsed; + position -= 1 + searchTopics.size(); + } + if (title == null) { + position -= localCount + localServerCount; + if (position >= 0 && position < phoneCount) { + title = LocaleController.getString("PhoneNumberSearch", R.string.PhoneNumberSearch); + if (searchAdapterHelper.getPhoneSearch().size() > 3) { + showMore = phoneCollapsed; onClick = () -> { - final long now = SystemClock.elapsedRealtime(); - if (now - lastShowMoreUpdate < 300) { - return; - } - lastShowMoreUpdate = now; - - int totalGlobalCount = globalSearch.isEmpty() ? 0 : globalSearch.size(); - boolean disableRemoveAnimation = getItemCount() > rawPosition + Math.min(totalGlobalCount, globalSearchCollapsed ? 4 : Integer.MAX_VALUE) + 1; - if (itemAnimator != null) { - itemAnimator.setAddDuration(disableRemoveAnimation ? 45 : 200); - itemAnimator.setRemoveDuration(disableRemoveAnimation ? 80 : 200); - itemAnimator.setRemoveDelay(disableRemoveAnimation ? 270 : 0); - } - globalSearchCollapsed = !globalSearchCollapsed; - cell.setRightText(globalSearchCollapsed ? LocaleController.getString("ShowMore", R.string.ShowMore) : LocaleController.getString("ShowLess", R.string.ShowLess), globalSearchCollapsed); - showMoreHeader = null; - View parent = (View) cell.getParent(); - if (parent instanceof RecyclerView) { - RecyclerView listView = (RecyclerView) parent; - final int nextGraySectionPosition = !globalSearchCollapsed ? rawPosition + 4 : rawPosition + totalGlobalCount + 1; - for (int i = 0; i < listView.getChildCount(); ++i) { - View child = listView.getChildAt(i); - if (listView.getChildAdapterPosition(child) == nextGraySectionPosition) { - showMoreHeader = child; - break; - } - } - } - if (!globalSearchCollapsed) { - notifyItemChanged(rawPosition + 3); - notifyItemRangeInserted(rawPosition + 4, (totalGlobalCount - 3)); - } else { - notifyItemRangeRemoved(rawPosition + 4, (totalGlobalCount - 3)); - if (disableRemoveAnimation) { - AndroidUtilities.runOnUIThread(() -> notifyItemChanged(rawPosition + 3), 350); - } else { - notifyItemChanged(rawPosition + 3); - } - } - - if (cancelShowMoreAnimation != null) { - AndroidUtilities.cancelRunOnUIThread(cancelShowMoreAnimation); - } - if (disableRemoveAnimation) { - showMoreAnimation = true; - AndroidUtilities.runOnUIThread(cancelShowMoreAnimation = () -> { - showMoreAnimation = false; - showMoreHeader = null; - if (parent != null) { - parent.invalidate(); - } - }, 400); - } else { - showMoreAnimation = false; - } + phoneCollapsed = !phoneCollapsed; + cell.setRightText(phoneCollapsed ? LocaleController.getString("ShowMore", R.string.ShowMore) : LocaleController.getString("ShowLess", R.string.ShowLess)); + notifyDataSetChanged(); }; } } else { - title = LocaleController.getString("SearchMessages", R.string.SearchMessages); + position -= phoneCount; + if (position >= 0 && position < globalCount) { + title = LocaleController.getString("GlobalSearch", R.string.GlobalSearch); + if (searchAdapterHelper.getGlobalSearch().size() > 3) { + showMore = globalSearchCollapsed; + onClick = () -> { + final long now = SystemClock.elapsedRealtime(); + if (now - lastShowMoreUpdate < 300) { + return; + } + lastShowMoreUpdate = now; + + int totalGlobalCount = globalSearch.isEmpty() ? 0 : globalSearch.size(); + boolean disableRemoveAnimation = getItemCount() > rawPosition + Math.min(totalGlobalCount, globalSearchCollapsed ? 4 : Integer.MAX_VALUE) + 1; + if (itemAnimator != null) { + itemAnimator.setAddDuration(disableRemoveAnimation ? 45 : 200); + itemAnimator.setRemoveDuration(disableRemoveAnimation ? 80 : 200); + itemAnimator.setRemoveDelay(disableRemoveAnimation ? 270 : 0); + } + globalSearchCollapsed = !globalSearchCollapsed; + cell.setRightText(globalSearchCollapsed ? LocaleController.getString("ShowMore", R.string.ShowMore) : LocaleController.getString("ShowLess", R.string.ShowLess), globalSearchCollapsed); + showMoreHeader = null; + View parent = (View) cell.getParent(); + if (parent instanceof RecyclerView) { + RecyclerView listView = (RecyclerView) parent; + final int nextGraySectionPosition = !globalSearchCollapsed ? rawPosition + 4 : rawPosition + totalGlobalCount + 1; + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + if (listView.getChildAdapterPosition(child) == nextGraySectionPosition) { + showMoreHeader = child; + break; + } + } + } + if (!globalSearchCollapsed) { + notifyItemChanged(rawPosition + 3); + notifyItemRangeInserted(rawPosition + 4, (totalGlobalCount - 3)); + } else { + notifyItemRangeRemoved(rawPosition + 4, (totalGlobalCount - 3)); + if (disableRemoveAnimation) { + AndroidUtilities.runOnUIThread(() -> notifyItemChanged(rawPosition + 3), 350); + } else { + notifyItemChanged(rawPosition + 3); + } + } + + if (cancelShowMoreAnimation != null) { + AndroidUtilities.cancelRunOnUIThread(cancelShowMoreAnimation); + } + if (disableRemoveAnimation) { + showMoreAnimation = true; + AndroidUtilities.runOnUIThread(cancelShowMoreAnimation = () -> { + showMoreAnimation = false; + showMoreHeader = null; + if (parent != null) { + parent.invalidate(); + } + }, 400); + } else { + showMoreAnimation = false; + } + }; + } + } else if (delegate != null && localMessagesCount > 0 && position - globalCount <= 1) { + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-delegate.getSearchForumDialogId()); + title = LocaleController.formatString("SearchMessagesIn", R.string.SearchMessagesIn, (chat == null ? "null" : chat.title)); + } else { + title = LocaleController.getString("SearchMessages", R.string.SearchMessages); + } } } @@ -1385,7 +1593,18 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { cell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); cell.useSeparator = (position != getItemCount() - 1); MessageObject messageObject = (MessageObject) getItem(position); - cell.setDialog(messageObject.getDialogId(), messageObject, messageObject.messageOwner.date, false, false); + boolean isLocalForum = searchForumResultMessages.contains(messageObject); + cell.useFromUserAsAvatar = isLocalForum; + if (messageObject == null) { + cell.setDialog(0, null, 0, false, false); + } else { + cell.setDialog(messageObject.getDialogId(), messageObject, messageObject.messageOwner.date, false, false); + } + break; + } + case VIEW_TYPE_TOPIC_CELL: { + TopicSearchCell topicSearchCell = (TopicSearchCell) holder.itemView; + topicSearchCell.setTopic((TLRPC.TL_forumTopic) getItem(position)); break; } case VIEW_TYPE_HASHTAG_CELL: { @@ -1431,10 +1650,18 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } i -= getRecentItemsCount(); } + if (!searchTopics.isEmpty()) { + if (i == 0) { + return VIEW_TYPE_GRAY_SECTION; + } else if (i <= searchTopics.size()) { + return VIEW_TYPE_TOPIC_CELL; + } + i -= 1 + searchTopics.size(); + } ArrayList globalSearch = searchAdapterHelper.getGlobalSearch(); int localCount = searchResult.size(); int localServerCount = searchAdapterHelper.getLocalServerSearch().size(); - if (localCount + localServerCount > 0 && getRecentItemsCount() > 0) { + if (localCount + localServerCount > 0 && (getRecentItemsCount() > 0 || !searchTopics.isEmpty())) { if (i == 0) { return VIEW_TYPE_GRAY_SECTION; } @@ -1449,6 +1676,10 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { globalCount = 4; } int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; + if (!searchForumResultMessages.isEmpty() && !localMessagesSearchEndReached) { + messagesCount = 0; + } + int localMessagesCount = (searchForumResultMessages.isEmpty() ? 0 : searchForumResultMessages.size() + 1); if (i >= 0 && i < localCount) { return VIEW_TYPE_PROFILE_CELL; @@ -1479,6 +1710,18 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } } i -= globalCount; + if (localMessagesCount > 0) { + if (i >= 0 && (localMessagesSearchEndReached ? i < localMessagesCount : i <= localMessagesCount)) { + if (i == 0) { + return VIEW_TYPE_GRAY_SECTION; + } else if (i == localMessagesCount) { + return VIEW_TYPE_LOADING; + } else { + return VIEW_TYPE_DIALOG_CELL; + } + } + i -= localMessagesCount + (!localMessagesSearchEndReached ? 1 : 0); + } if (i >= 0 && i < messagesCount) { if (i == 0) { return VIEW_TYPE_GRAY_SECTION; @@ -1502,8 +1745,16 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { public void filterRecent(String query) { filteredRecentQuery = query; - filteredRecentSearchObjects.clear(); + filtered2RecentSearchObjects.clear(); if (TextUtils.isEmpty(query)) { + filteredRecentSearchObjects.clear(); + final int count = recentSearchObjects.size(); + for (int i = 0; i < count; ++i) { + if (delegate != null && delegate.getSearchForumDialogId() == recentSearchObjects.get(i).did) { + continue; + } + filteredRecentSearchObjects.add(recentSearchObjects.get(i)); + } return; } String lowerCasedQuery = query.toLowerCase(); @@ -1513,6 +1764,9 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (obj == null || obj.object == null) { continue; } + if (delegate != null && delegate.getSearchForumDialogId() == obj.did) { + continue; + } String title = null, username = null; if (obj.object instanceof TLRPC.Chat) { title = ((TLRPC.Chat) obj.object).title; @@ -1525,9 +1779,9 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { } if (title != null && wordStartsWith(title.toLowerCase(), lowerCasedQuery) || username != null && wordStartsWith(username.toLowerCase(), lowerCasedQuery)) { - filteredRecentSearchObjects.add(obj); + filtered2RecentSearchObjects.add(obj); } - if (filteredRecentSearchObjects.size() >= 5) { + if (filtered2RecentSearchObjects.size() >= 5) { break; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapterHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapterHelper.java index 642f12472..1e8eac772 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapterHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapterHelper.java @@ -10,6 +10,8 @@ package org.telegram.ui.Adapters; import android.util.Pair; +import androidx.collection.LongSparseArray; + import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.SQLite.SQLiteCursor; import org.telegram.SQLite.SQLitePreparedStatement; @@ -28,7 +30,6 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ChatUsersActivity; import org.telegram.ui.Components.ShareAlert; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -36,8 +37,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; -import androidx.collection.LongSparseArray; - public class SearchAdapterHelper { public static class HashtagObject { @@ -108,9 +107,12 @@ public class SearchAdapterHelper { return pendingRequestIds.size() > 0; } public void queryServerSearch(String query, boolean allowUsername, boolean allowChats, boolean allowBots, boolean allowSelf, boolean canAddGroupsOnly, long channelId, boolean phoneNumbers, int type, int searchId) { - queryServerSearch(query, allowUsername, allowChats, allowBots, allowSelf, canAddGroupsOnly, channelId, phoneNumbers, type, searchId, null); + queryServerSearch(query, allowUsername, allowChats, allowBots, allowSelf, canAddGroupsOnly, channelId, phoneNumbers, type, searchId, 0, null); } - public void queryServerSearch(String query, boolean allowUsername, boolean allowChats, boolean allowBots, boolean allowSelf, boolean canAddGroupsOnly, long channelId, boolean phoneNumbers, int type, int searchId, Runnable onEnd) { + public void queryServerSearch(String query, boolean allowUsername, boolean allowChats, boolean allowBots, boolean allowSelf, boolean canAddGroupsOnly, long channelId, boolean phoneNumbers, int type, int searchId, long exceptDialogId) { + queryServerSearch(query, allowUsername, allowChats, allowBots, allowSelf, canAddGroupsOnly, channelId, phoneNumbers, type, searchId, exceptDialogId, null); + } + public void queryServerSearch(String query, boolean allowUsername, boolean allowChats, boolean allowBots, boolean allowSelf, boolean canAddGroupsOnly, long channelId, boolean phoneNumbers, int type, int searchId, long exceptDialogId, Runnable onEnd) { for (int reqId : pendingRequestIds) { ConnectionsManager.getInstance(currentAccount).cancelRequest(reqId, true); } @@ -248,13 +250,13 @@ public class SearchAdapterHelper { chat = chatsMap.get(peer.channel_id); } if (chat != null) { - if (!allowChats || canAddGroupsOnly && !ChatObject.canAddBotsToChat(chat)) { + if (!allowChats || canAddGroupsOnly && !ChatObject.canAddBotsToChat(chat) || -chat.id == exceptDialogId) { continue; } localServerSearch.add(chat); globalSearchMap.put(-chat.id, chat); } else if (user != null) { - if (canAddGroupsOnly || !allowBots && user.bot || !allowSelf && user.self) { + if (canAddGroupsOnly || !allowBots && user.bot || !allowSelf && user.self || user.id == exceptDialogId) { continue; } localServerSearch.add(user); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AutoDeleteMessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/AutoDeleteMessagesActivity.java new file mode 100644 index 000000000..588504609 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/AutoDeleteMessagesActivity.java @@ -0,0 +1,334 @@ +package org.telegram.ui; + +import android.content.Context; +import android.transition.ChangeBounds; +import android.transition.Fade; +import android.transition.TransitionManager; +import android.transition.TransitionSet; +import android.view.Gravity; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.ScrollView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.tgnet.RequestDelegate; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Cells.RadioCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.StickerImageView; + +import java.util.ArrayList; + +public class AutoDeleteMessagesActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + + private final static int ONE_DAY = 60 * 24; + private final static int ONE_WEEK = 60 * 24 * 7; + private final static int ONE_MONTH = 60 * 24 * 31; + + RadioCellInternal offCell; + RadioCellInternal afterOneDay; + RadioCellInternal afterOneWeek; + RadioCellInternal afterOneMonth; + RadioCellInternal customTimeButton; + LinearLayout checkBoxContainer; + + ArrayList arrayList = new ArrayList<>(); + + public int startFromTtl = 0; + + @Override + public boolean onFragmentCreate() { + startFromTtl = getUserConfig().getGlobalTTl(); + if (startFromTtl < 0) { + startFromTtl = 0; + } + getUserConfig().loadGlobalTTl(); + getNotificationCenter().addObserver(this, NotificationCenter.didUpdateGlobalAutoDeleteTimer); + return super.onFragmentCreate(); + } + + @Override + public void onFragmentDestroy() { + super.onFragmentDestroy(); + getNotificationCenter().removeObserver(this, NotificationCenter.didUpdateGlobalAutoDeleteTimer); + } + + @Override + public View createView(Context context) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("AutoDeleteMessages", R.string.AutoDeleteMessages)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + fragmentView = new FrameLayout(context); + FrameLayout frameLayout = (FrameLayout) fragmentView; + frameLayout.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); + + ScrollView scrollView = new ScrollView(getContext()); + LinearLayout mainContainer = new LinearLayout(getContext()); + mainContainer.setOrientation(LinearLayout.VERTICAL); + scrollView.addView(mainContainer); + frameLayout.addView(scrollView); + + + FrameLayout stickerHeaderCell = new FrameLayout(context); + StickerImageView backupImageView = new StickerImageView(context, currentAccount); + backupImageView.setStickerNum(10); + stickerHeaderCell.addView(backupImageView, LayoutHelper.createFrame(130, 130, Gravity.CENTER)); + + mainContainer.addView(stickerHeaderCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 170)); + + checkBoxContainer = new LinearLayout(getContext()); + checkBoxContainer.setOrientation(LinearLayout.VERTICAL); + checkBoxContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + mainContainer.addView(checkBoxContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + + HeaderCell headerCell = new HeaderCell(getContext()); + headerCell.setText(LocaleController.getString("MessageLifetime", R.string.MessageLifetime)); + checkBoxContainer.addView(headerCell); + + offCell = new RadioCellInternal(getContext()); + offCell.setText(LocaleController.getString("ShortMessageLifetimeForever", R.string.ShortMessageLifetimeForever), false, true); + offCell.time = 0; + checkBoxContainer.addView(offCell); + + afterOneDay = new RadioCellInternal(getContext()); + afterOneDay.setText(LocaleController.getString("AutoDeleteAfter1Day", R.string.AutoDeleteAfter1Day), false, true); + afterOneDay.time = ONE_DAY; + checkBoxContainer.addView(afterOneDay); + + afterOneWeek = new RadioCellInternal(getContext()); + afterOneWeek.setText(LocaleController.getString("AutoDeleteAfter1Week", R.string.AutoDeleteAfter1Week), false, true); + afterOneWeek.time = ONE_WEEK; + checkBoxContainer.addView(afterOneWeek); + + afterOneMonth = new RadioCellInternal(getContext()); + afterOneMonth.setText(LocaleController.getString("AutoDeleteAfter1Month", R.string.AutoDeleteAfter1Month), false, true); + afterOneMonth.time = ONE_MONTH; + checkBoxContainer.addView(afterOneMonth); + + customTimeButton = new RadioCellInternal(getContext()); + customTimeButton.setText(LocaleController.getString("SetCustomTime", R.string.SetCustomTime), false, false); + customTimeButton.hideRadioButton(); + checkBoxContainer.addView(customTimeButton); + + arrayList.add(offCell); + arrayList.add(afterOneDay); + arrayList.add(afterOneWeek); + arrayList.add(afterOneMonth); + arrayList.add(customTimeButton); + + updateItems(); + + TextInfoPrivacyCell textInfoPrivacyCell = new TextInfoPrivacyCell(context); + CharSequence infoText = AndroidUtilities.replaceSingleTag(LocaleController.getString("GlobalAutoDeleteInfo", R.string.GlobalAutoDeleteInfo), new Runnable() { + @Override + public void run() { + UsersSelectActivity usersSelectActivity = new UsersSelectActivity(UsersSelectActivity.TYPE_AUTO_DELETE_EXISTING_CHATS); + usersSelectActivity.setTtlPeriod(getSelectedTime()); + usersSelectActivity.setDelegate((ids, flags) -> { + AndroidUtilities.runOnUIThread(() -> { + if (!ids.isEmpty()) { + for (int i = 0; i < ids.size(); i++) { + getMessagesController().setDialogHistoryTTL(ids.get(i), getSelectedTime() * 60); + } + if (getSelectedTime() > 0) { + BulletinFactory.of(AutoDeleteMessagesActivity.this).createSimpleBulletin(R.raw.fire_on, AndroidUtilities.replaceTags(LocaleController.formatString("AutodeleteTimerEnabledForChats", R.string.AutodeleteTimerEnabledForChats, + LocaleController.formatTTLString(getSelectedTime() * 60), + LocaleController.formatPluralString("Chats", ids.size(), ids.size()) + ))).show(); + } else { + BulletinFactory.of(AutoDeleteMessagesActivity.this).createSimpleBulletin(R.raw.fire_off, LocaleController.formatString("AutodeleteTimerDisabledForChats", R.string.AutodeleteTimerDisabledForChats, + LocaleController.formatPluralString("Chats", ids.size(), ids.size()) + )).show(); + } + } + }, 100); + + + }); + presentFragment(usersSelectActivity); + } + }); + textInfoPrivacyCell.setText(infoText); + mainContainer.addView(textInfoPrivacyCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + + selectDate(startFromTtl, false); + return fragmentView; + } + + private void updateItems() { + for (int i = 0; i < arrayList.size(); i++) { + arrayList.get(i).setBackground(Theme.createSelectorWithBackgroundDrawable(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(Theme.key_listSelector))); + arrayList.get(i).setOnClickListener(v -> { + if (v == customTimeButton) { + AlertsCreator.createAutoDeleteDatePickerDialog(getContext(), 1, null, new AlertsCreator.ScheduleDatePickerDelegate() { + @Override + public void didSelectDate(boolean notify, int scheduleDate) { + AndroidUtilities.runOnUIThread(() -> { + selectDate(scheduleDate, true); + }, 50); + + } + }); + } else { + int time = ((RadioCellInternal)v).time; + int selctedTime = getSelectedTime(); + if (selctedTime == 0 && time > 0) { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(LocaleController.getString("MessageLifetime", R.string.MessageLifetime)); + builder.setMessage(LocaleController.formatString("AutoDeleteConfirmMessage", R.string.AutoDeleteConfirmMessage, LocaleController.formatTTLString(time * 60))); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), (dialog, which) -> { + dialog.dismiss(); + }); + builder.setPositiveButton(LocaleController.getString("Enable", R.string.Enable), (dialog, which) -> { + dialog.dismiss(); + selectRadioButton(v, true); + }); + builder.show(); + } else { + selectRadioButton(v, true); + } + } + }); + } + } + + private int getSelectedTime() { + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i).isChecked()) { + return arrayList.get(i).time; + } + } + return startFromTtl; + } + + private void selectDate(int scheduleDate, boolean showBulletin) { + TransitionSet transition = new TransitionSet(); + ChangeBounds changeBounds = new ChangeBounds(); + changeBounds.setDuration(150); + Fade in = new Fade(Fade.IN); + in.setDuration(150); + transition + .addTransition(new Fade(Fade.OUT).setDuration(150)) + .addTransition(changeBounds) + .addTransition(in); + transition.setOrdering(TransitionSet.ORDERING_TOGETHER); + transition.setInterpolator(CubicBezierInterpolator.DEFAULT); + TransitionManager.beginDelayedTransition(checkBoxContainer, transition); + + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i).time == scheduleDate) { + selectRadioButton(arrayList.get(i), showBulletin); + return; + } + } + + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i).custom) { + checkBoxContainer.removeView(arrayList.get(i)); + arrayList.remove(i); + i--; + } + } + + int position = arrayList.size(); + for (int i = 0; i < arrayList.size(); i++) { + if (scheduleDate < arrayList.get(i).time) { + position = i + 1; + break; + } + } + RadioCellInternal customTimeButton = new RadioCellInternal(getContext()); + customTimeButton.custom = true; + customTimeButton.time = scheduleDate; + + customTimeButton.setText(LocaleController.formatString("AutoDeleteAfterShort", R.string.AutoDeleteAfterShort, LocaleController.formatTTLString(scheduleDate * 60)), false, true); + arrayList.add(position, customTimeButton); + checkBoxContainer.addView(customTimeButton, position); + updateItems(); + selectRadioButton(customTimeButton, showBulletin); + } + + private void selectRadioButton(View v, boolean showBulletin) { + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i) == v) { + arrayList.get(i).setChecked(true, fragmentBeginToShow); + } else { + arrayList.get(i).setChecked(false, fragmentBeginToShow); + } + } + if (showBulletin) { + int time = ((RadioCellInternal) v).time; + if (time > 0) { + String text = LocaleController.formatString("AutoDeleteGlobalTimerEnabled", R.string.AutoDeleteGlobalTimerEnabled, LocaleController.formatTTLString(time * 60)); + BulletinFactory.of(this).createSimpleBulletin(R.raw.fire_on, AndroidUtilities.replaceTags(text)).show(); + } else { +// String text = LocaleController.formatString("AutoDeleteGlobalTimerDisabled", R.string.AutoDeleteGlobalTimerDisabled); +// BulletinFactory.of(this).createSimpleBulletin(R.raw.fire_off, text).show(); + } + } + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { +// int newTTl = getUserConfig().getGlobalTTl(); +// if (newTTl != startFromTtl) { +// startFromTtl = newTTl; +// selectDate(startFromTtl, false); +// } + } + + private class RadioCellInternal extends RadioCell { + + boolean custom; + int time; + + public RadioCellInternal(Context context) { + super(context); + } + } + + @Override + public void onPause() { + super.onPause(); + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i).isChecked()) { + if (arrayList.get(i).time != startFromTtl) { + startFromTtl = arrayList.get(i).time; + TLRPC.TL_messages_setDefaultHistoryTTL setDefaultHistoryTTL = new TLRPC.TL_messages_setDefaultHistoryTTL(); + setDefaultHistoryTTL.period = arrayList.get(i).time * 60; + getConnectionsManager().sendRequest(setDefaultHistoryTTL, new RequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + } + }); + getUserConfig().setGlobalTtl(startFromTtl); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.didUpdateGlobalAutoDeleteTimer); + } + break; + } + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java index 43cc611e2..6a60aa59a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CacheControlActivity.java @@ -8,11 +8,15 @@ package org.telegram.ui; +import android.animation.Animator; +import android.animation.ObjectAnimator; import android.content.Context; import android.content.DialogInterface; -import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.graphics.Canvas; +import android.graphics.Color; import android.os.Build; +import android.os.Bundle; import android.os.Environment; import android.os.StatFs; import android.text.TextUtils; @@ -20,19 +24,28 @@ import android.transition.ChangeBounds; import android.transition.Fade; import android.transition.TransitionManager; import android.transition.TransitionSet; +import android.util.LongSparseArray; +import android.util.SparseArray; +import android.util.TypedValue; import android.view.Gravity; +import android.view.HapticFeedbackConstants; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.RequiresApi; import androidx.core.widget.NestedScrollView; +import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BotWebViewVibrationEffect; +import org.telegram.messenger.DialogObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.FilesMigrationService; @@ -45,8 +58,13 @@ import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenu; +import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BackDrawable; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; @@ -56,19 +74,40 @@ import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.TextCheckBoxCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.ListView.AdapterWithDiffUtils; +import org.telegram.ui.Components.MediaActivity; +import org.telegram.ui.Components.NumberTextView; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.SlideChooseView; import org.telegram.ui.Components.StorageDiagramView; -import org.telegram.ui.Components.StroageUsageView; +import org.telegram.ui.Components.StorageUsageView; import org.telegram.ui.Components.UndoView; import java.io.File; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; public class CacheControlActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + private static final int VIEW_TYPE_INFO = 1; + private static final int VIEW_TYPE_STORAGE = 2; + private static final int VIEW_TYPE_HEADER = 3; + private static final int VIEW_TYPE_CHOOSER = 4; + private static final int VIEW_TYPE_CHAT = 5; + private static final int VIEW_FLICKER_LOADING_DIALOG = 6; + private static final int VIEW_TYPE_TEXT_SETTINGS = 0; + + public static final long UNKNOWN_CHATS_DIALOG_ID = Long.MAX_VALUE; + private ListAdapter listAdapter; private RecyclerListView listView; @SuppressWarnings("FieldCanBeLocal") @@ -83,7 +122,11 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe private int deviseStorageHeaderRow; private int storageUsageRow; private int keepMediaChooserRow; + private int chatsHeaderRow; + private int chatsStartRow; + private int chatsEndRow; private int rowCount; + private int dialogsStartRow, dialogsEndRow; private long databaseSize = -1; private long cacheSize = -1; @@ -111,18 +154,31 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe long fragmentCreateTime; private boolean updateDatabaseSize; + private final int TYPE_PHOTOS = 0; + private final int TYPE_VIDEOS = 1; + private final int TYPE_DOCUMENTS = 2; + private final int TYPE_MUSIC = 3; + private final int TYPE_VOICE = 4; + private final int TYPE_ANIMATED_STICKERS_CACHE = 5; + private final int TYPE_OTHER = 6; + + HashSet selectedDialogs = new HashSet(); + private static final int delete_id = 1; + private boolean loadingDialogs; @Override public boolean onFragmentCreate() { super.onFragmentCreate(); getNotificationCenter().addObserver(this, NotificationCenter.didClearDatabase); databaseSize = MessagesStorage.getInstance(currentAccount).getDatabaseSize(); + loadingDialogs = true; Utilities.globalQueue.postRunnable(() -> { cacheSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), 0); if (canceled) { return; } + photoSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE), 0); photoSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE_PUBLIC), 0); if (canceled) { @@ -170,19 +226,19 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe StatFs stat = new StatFs(path.getPath()); long blockSize; long blockSizeExternal; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { blockSize = stat.getBlockSizeLong(); } else { blockSize = stat.getBlockSize(); } long availableBlocks; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { availableBlocks = stat.getAvailableBlocksLong(); } else { availableBlocks = stat.getAvailableBlocks(); } long blocksTotal; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { blocksTotal = stat.getBlockCountLong(); } else { blocksTotal = stat.getBlockCount(); @@ -195,9 +251,11 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe } AndroidUtilities.runOnUIThread(() -> { + resumeDelayedFragmentAnimation(); calculating = false; updateStorageUsageRow(); }); + loadDialogEntities(); }); fragmentCreateTime = System.currentTimeMillis(); @@ -205,30 +263,175 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe return true; } + private void loadDialogEntities() { + getFileLoader().getFileDatabase().getQueue().postRunnable(() -> { + LongSparseArray dilogsFilesEntities = new LongSparseArray<>(); + + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), TYPE_OTHER, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE), TYPE_PHOTOS, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_AUDIO), TYPE_VOICE, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE_PUBLIC), TYPE_PHOTOS, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_VIDEO), TYPE_VIDEOS, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_VIDEO_PUBLIC), TYPE_VIDEOS, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_DOCUMENT), TYPE_DOCUMENTS, dilogsFilesEntities); + fillDialogsEntitiesRecursive(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES), TYPE_DOCUMENTS, dilogsFilesEntities); + + ArrayList entities = new ArrayList<>(); + ArrayList unknownUsers = new ArrayList<>(); + ArrayList unknownChats = new ArrayList<>(); + for (int i = 0; i < dilogsFilesEntities.size(); i++) { + DialogFileEntities dialogEntities = dilogsFilesEntities.valueAt(i); + entities.add(dialogEntities); + if (getMessagesController().getUserOrChat(entities.get(i).dialogId) == null) { + if (dialogEntities.dialogId > 0) { + unknownUsers.add(dialogEntities.dialogId); + } else { + unknownChats.add(dialogEntities.dialogId); + } + } + } + getMessagesStorage().getStorageQueue().postRunnable(() -> { + ArrayList users = new ArrayList<>(); + ArrayList chats = new ArrayList<>(); + if (!unknownUsers.isEmpty()) { + try { + getMessagesStorage().getUsersInternal(TextUtils.join(",", unknownUsers), users); + } catch (Exception e) { + FileLog.e(e); + } + } + if (!unknownChats.isEmpty()) { + try { + getMessagesStorage().getChatsInternal(TextUtils.join(",", unknownChats), chats); + } catch (Exception e) { + FileLog.e(e); + } + } + for (int i = 0; i < entities.size(); i++) { + if (entities.get(i).totalSize <= 0) { + entities.remove(i); + i--; + } + } + Collections.sort(entities, (o1, o2) -> (int) (o2.totalSize - o1.totalSize)); + AndroidUtilities.runOnUIThread(() -> { + loadingDialogs = false; + getMessagesController().putUsers(users, true); + getMessagesController().putChats(chats, true); + DialogFileEntities unknownChatsEntity = null; + for (int i = 0; i < entities.size(); i++) { + DialogFileEntities dialogEntities = entities.get(i); + boolean changed = false; + if (getMessagesController().getUserOrChat(dialogEntities.dialogId) == null) { + dialogEntities.dialogId = UNKNOWN_CHATS_DIALOG_ID; + if (unknownChatsEntity != null) { + changed = true; + unknownChatsEntity.merge(dialogEntities); + entities.remove(i); + i--; + } else { + unknownChatsEntity = dialogEntities; + } + if (changed) { + Collections.sort(entities, (o1, o2) -> (int) (o2.totalSize - o1.totalSize)); + } + } + } + if (!canceled) { + this.dialogsFilesEntities = entities; + updateRows(); + } + }); + }); + }); + } + + + ArrayList dialogsFilesEntities = null; + + public void fillDialogsEntitiesRecursive(final File fromFolder, int type, LongSparseArray dilogsFilesEntities) { + if (fromFolder == null) { + return; + } + File[] files = fromFolder.listFiles(); + if (files == null) { + return; + } + for (final File fileEntry : files) { + if (canceled) { + return; + } + if (fileEntry.isDirectory()) { + fillDialogsEntitiesRecursive(fileEntry, type, dilogsFilesEntities); + } else { + long dialogId = getFileLoader().getFileDatabase().getFileDialogId(fileEntry); + if (dialogId != 0) { + DialogFileEntities dilogEntites = dilogsFilesEntities.get(dialogId, null); + if (dilogEntites == null) { + dilogEntites = new DialogFileEntities(dialogId); + dilogsFilesEntities.put(dialogId, dilogEntites); + } + int addToType = type; + String fileName = fileEntry.getName().toLowerCase(); + if (fileName.endsWith(".mp3") || fileName.endsWith(".m4a") ) { + addToType = TYPE_MUSIC; + } + dilogEntites.addFile(fileEntry, addToType); + } + } + } + } + + private ArrayList oldItems = new ArrayList<>(); + private ArrayList itemInners = new ArrayList<>(); + private void updateRows() { rowCount = 0; + oldItems.clear(); + oldItems.addAll(itemInners); - keepMediaHeaderRow = rowCount++; - keepMediaChooserRow = rowCount++; - keepMediaInfoRow = rowCount++; - deviseStorageHeaderRow = rowCount++; - storageUsageRow = rowCount++; + itemInners.clear(); + itemInners.add(new ItemInner(VIEW_TYPE_HEADER, LocaleController.getString("KeepMedia", R.string.KeepMedia), null)); + itemInners.add(new ItemInner(VIEW_TYPE_CHOOSER, null, null)); + keepMediaInfoRow = itemInners.size(); + itemInners.add(new ItemInner(VIEW_TYPE_INFO, "keep media", null)); + itemInners.add(new ItemInner(VIEW_TYPE_HEADER, LocaleController.getString("DeviceStorage", R.string.DeviceStorage), null)); + storageUsageRow = itemInners.size(); + itemInners.add(new ItemInner(VIEW_TYPE_STORAGE, null, null)); +// cacheInfoRow = itemInners.size(); +// itemInners.add(new ItemInner(VIEW_TYPE_INFO, "cache", null)); + databaseRow = itemInners.size(); + itemInners.add(new ItemInner(VIEW_TYPE_TEXT_SETTINGS, null, null)); + databaseInfoRow = itemInners.size(); + itemInners.add(new ItemInner(VIEW_TYPE_INFO, "database", null)); - cacheInfoRow = rowCount++; - databaseRow = rowCount++; - databaseInfoRow = rowCount++; + if (loadingDialogs) { + itemInners.add(new ItemInner(VIEW_TYPE_HEADER, LocaleController.getString("DataUsageByChats", R.string.DataUsageByChats), 15, 4, null)); + itemInners.add(new ItemInner(VIEW_FLICKER_LOADING_DIALOG, null, null)); + } else if (dialogsFilesEntities != null && dialogsFilesEntities.size() > 0) { + itemInners.add(new ItemInner(VIEW_TYPE_HEADER, LocaleController.getString("DataUsageByChats", R.string.DataUsageByChats), 15, 4, null)); + dialogsStartRow = itemInners.size(); + for (int i = 0; i < dialogsFilesEntities.size(); i++) { + itemInners.add(new ItemInner(VIEW_TYPE_CHAT, null, dialogsFilesEntities.get(i))); + } + dialogsEndRow = itemInners.size() - 1; + itemInners.add(new ItemInner(VIEW_TYPE_INFO, null, null)); + } + if (listAdapter != null) { + listAdapter.setItems(oldItems, itemInners); + } } private void updateStorageUsageRow() { View view = layoutManager.findViewByPosition(storageUsageRow); - if (view instanceof StroageUsageView) { - StroageUsageView stroageUsageView = ((StroageUsageView) view); + if (view instanceof StorageUsageView) { + StorageUsageView storageUsageView = ((StorageUsageView) view); long currentTime = System.currentTimeMillis(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && currentTime - fragmentCreateTime > 250) { + if (currentTime - fragmentCreateTime > 150) { TransitionSet transition = new TransitionSet(); ChangeBounds changeBounds = new ChangeBounds(); changeBounds.setDuration(250); - changeBounds.excludeTarget(stroageUsageView.legendLayout, true); + changeBounds.excludeTarget(storageUsageView.legendLayout, true); Fade in = new Fade(Fade.IN); in.setDuration(290); transition @@ -239,16 +442,21 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe transition.setInterpolator(CubicBezierInterpolator.EASE_OUT); TransitionManager.beginDelayedTransition(listView, transition); } - stroageUsageView.setStorageUsage(calculating, databaseSize, totalSize, totalDeviceFreeSize, totalDeviceSize); + storageUsageView.setStorageUsage(calculating, databaseSize, totalSize, totalDeviceFreeSize, totalDeviceSize); RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(storageUsageRow); if (holder != null) { - stroageUsageView.setEnabled(listAdapter.isEnabled(holder)); + storageUsageView.setEnabled(listAdapter.isEnabled(holder)); } } else { - listAdapter.notifyDataSetChanged(); + updateRows(); } } + @Override + public boolean needDelayOpenAnimation() { + return true; + } + @Override public void onFragmentDestroy() { super.onFragmentDestroy(); @@ -279,167 +487,224 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe } private void cleanupFolders() { - final AlertDialog progressDialog = new AlertDialog(getParentActivity(), 3); + if (selectedDialogs.size() > 0) { + actionBar.hideActionMode(); + selectedDialogs.clear(); + } + progressDialog = new AlertDialog(getParentActivity(), 3); progressDialog.setCanCancel(false); progressDialog.showDelayed(500); - Utilities.globalQueue.postRunnable(() -> { - boolean imagesCleared = false; - long clearedSize = 0; - boolean allItemsClear = true; - for (int a = 0; a < 7; a++) { - if (clearViewData[a] == null || !clearViewData[a].clear) { - if (clearViewData[a] != null) { - allItemsClear = false; - } - continue; + getFileLoader().cancelLoadAllFiles(); + getFileLoader().getFileLoaderQueue().postRunnable(() -> Utilities.globalQueue.postRunnable(() -> { + cleanupFoldersInternal(); + })); + dialogsFilesEntities = null; + loadingDialogs = true; + updateRows(); + + } + + private void cleanupFoldersInternal() { + boolean imagesCleared = false; + long clearedSize = 0; + boolean allItemsClear = true; + for (int a = 0; a < 7; a++) { + if (clearViewData[a] == null || !clearViewData[a].clear) { + if (clearViewData[a] != null) { + allItemsClear = false; } - int type = -1; - int documentsMusicType = 0; - if (a == 0) { - type = FileLoader.MEDIA_DIR_IMAGE; - clearedSize += photoSize; - } else if (a == 1) { - type = FileLoader.MEDIA_DIR_VIDEO; - clearedSize += videoSize; - } else if (a == 2) { - type = FileLoader.MEDIA_DIR_DOCUMENT; - documentsMusicType = 1; - clearedSize += documentsSize; - } else if (a == 3) { - type = FileLoader.MEDIA_DIR_DOCUMENT; - documentsMusicType = 2; - clearedSize += musicSize; - } else if (a == 4) { - type = FileLoader.MEDIA_DIR_AUDIO; - clearedSize += audioSize; - } else if (a == 5) { - type = 100; - clearedSize += stickersSize; - } else if (a == 6) { - clearedSize += cacheSize; - type = FileLoader.MEDIA_DIR_CACHE; - } - if (type == -1) { - continue; - } - File file; - if (type == 100) { - file = new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache"); + continue; + } + int type = -1; + int documentsMusicType = 0; + if (a == 0) { + type = FileLoader.MEDIA_DIR_IMAGE; + clearedSize += photoSize; + } else if (a == 1) { + type = FileLoader.MEDIA_DIR_VIDEO; + clearedSize += videoSize; + } else if (a == 2) { + type = FileLoader.MEDIA_DIR_DOCUMENT; + documentsMusicType = 1; + clearedSize += documentsSize; + } else if (a == 3) { + type = FileLoader.MEDIA_DIR_DOCUMENT; + documentsMusicType = 2; + clearedSize += musicSize; + } else if (a == 4) { + type = FileLoader.MEDIA_DIR_AUDIO; + clearedSize += audioSize; + } else if (a == 5) { + type = 100; + clearedSize += stickersSize; + } else if (a == 6) { + clearedSize += cacheSize; + type = FileLoader.MEDIA_DIR_CACHE; + } + if (type == -1) { + continue; + } + File file; + if (type == 100) { + file = new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache"); + } else { + file = FileLoader.checkDirectory(type); + } + if (file != null) { + Utilities.clearDir(file.getAbsolutePath(), documentsMusicType, Long.MAX_VALUE, false); + } + if (type == FileLoader.MEDIA_DIR_IMAGE || type == FileLoader.MEDIA_DIR_VIDEO) { + int publicDirectoryType; + if (type == FileLoader.MEDIA_DIR_IMAGE) { + publicDirectoryType = FileLoader.MEDIA_DIR_IMAGE_PUBLIC; } else { - file = FileLoader.checkDirectory(type); + publicDirectoryType = FileLoader.MEDIA_DIR_VIDEO_PUBLIC; } + file = FileLoader.checkDirectory(publicDirectoryType); + if (file != null) { Utilities.clearDir(file.getAbsolutePath(), documentsMusicType, Long.MAX_VALUE, false); } - if (type == FileLoader.MEDIA_DIR_IMAGE || type == FileLoader.MEDIA_DIR_VIDEO) { - int publicDirectoryType; - if (type == FileLoader.MEDIA_DIR_IMAGE) { - publicDirectoryType = FileLoader.MEDIA_DIR_IMAGE_PUBLIC; - } else { - publicDirectoryType = FileLoader.MEDIA_DIR_VIDEO_PUBLIC; - } - file = FileLoader.checkDirectory(publicDirectoryType); - - if (file != null) { - Utilities.clearDir(file.getAbsolutePath(), documentsMusicType, Long.MAX_VALUE, false); - } - } - if (type == FileLoader.MEDIA_DIR_DOCUMENT) { - file = FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES); - if (file != null) { - Utilities.clearDir(file.getAbsolutePath(), documentsMusicType, Long.MAX_VALUE, false); - } - } - - if (type == FileLoader.MEDIA_DIR_CACHE) { - cacheSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), documentsMusicType); - imagesCleared = true; - } else if (type == FileLoader.MEDIA_DIR_AUDIO) { - audioSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_AUDIO), documentsMusicType); - } else if (type == FileLoader.MEDIA_DIR_DOCUMENT) { - if (documentsMusicType == 1) { - documentsSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_DOCUMENT), documentsMusicType); - documentsSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES), documentsMusicType); - } else { - musicSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_DOCUMENT), documentsMusicType); - musicSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES), documentsMusicType); - } - } else if (type == FileLoader.MEDIA_DIR_IMAGE) { - imagesCleared = true; - photoSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE), documentsMusicType); - photoSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE_PUBLIC), documentsMusicType); - } else if (type == FileLoader.MEDIA_DIR_VIDEO) { - videoSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_VIDEO), documentsMusicType); - videoSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_VIDEO_PUBLIC), documentsMusicType); - } else if (type == 100) { - imagesCleared = true; - stickersSize = getDirectorySize(new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache"), documentsMusicType); + } + if (type == FileLoader.MEDIA_DIR_DOCUMENT) { + file = FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES); + if (file != null) { + Utilities.clearDir(file.getAbsolutePath(), documentsMusicType, Long.MAX_VALUE, false); } } - final boolean imagesClearedFinal = imagesCleared; - totalSize = cacheSize + videoSize + audioSize + photoSize + documentsSize + musicSize + stickersSize; - File path = Environment.getDataDirectory(); - StatFs stat = new StatFs(path.getPath()); - long blockSize; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - blockSize = stat.getBlockSizeLong(); - } else { - blockSize = stat.getBlockSize(); - } - long availableBlocks; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - availableBlocks = stat.getAvailableBlocksLong(); - } else { - availableBlocks = stat.getAvailableBlocks(); - } - long blocksTotal; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { - blocksTotal = stat.getBlockCountLong(); - } else { - blocksTotal = stat.getBlockCount(); - } - - totalDeviceSize = blocksTotal * blockSize; - totalDeviceFreeSize = availableBlocks * blockSize; - long finalClearedSize = clearedSize; - - if (allItemsClear) { - FileLoader.getInstance(currentAccount).clearFilePaths(); - } - FileLoader.getInstance(currentAccount).checkCurrentDownloadsFiles(); - - AndroidUtilities.runOnUIThread(() -> { - if (imagesClearedFinal) { - ImageLoader.getInstance().clearMemory(); + if (type == FileLoader.MEDIA_DIR_CACHE) { + cacheSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), documentsMusicType); + imagesCleared = true; + } else if (type == FileLoader.MEDIA_DIR_AUDIO) { + audioSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_AUDIO), documentsMusicType); + } else if (type == FileLoader.MEDIA_DIR_DOCUMENT) { + if (documentsMusicType == 1) { + documentsSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_DOCUMENT), documentsMusicType); + documentsSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES), documentsMusicType); + } else { + musicSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_DOCUMENT), documentsMusicType); + musicSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_FILES), documentsMusicType); } - if (listAdapter != null) { - updateStorageUsageRow(); - } - try { + } else if (type == FileLoader.MEDIA_DIR_IMAGE) { + imagesCleared = true; + photoSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE), documentsMusicType); + photoSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_IMAGE_PUBLIC), documentsMusicType); + } else if (type == FileLoader.MEDIA_DIR_VIDEO) { + videoSize = getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_VIDEO), documentsMusicType); + videoSize += getDirectorySize(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_VIDEO_PUBLIC), documentsMusicType); + } else if (type == 100) { + imagesCleared = true; + stickersSize = getDirectorySize(new File(FileLoader.checkDirectory(FileLoader.MEDIA_DIR_CACHE), "acache"), documentsMusicType); + } + } + final boolean imagesClearedFinal = imagesCleared; + totalSize = cacheSize + videoSize + audioSize + photoSize + documentsSize + musicSize + stickersSize; + + File path = Environment.getDataDirectory(); + StatFs stat = new StatFs(path.getPath()); + long blockSize; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { + blockSize = stat.getBlockSizeLong(); + } else { + blockSize = stat.getBlockSize(); + } + long availableBlocks; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { + availableBlocks = stat.getAvailableBlocksLong(); + } else { + availableBlocks = stat.getAvailableBlocks(); + } + long blocksTotal; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { + blocksTotal = stat.getBlockCountLong(); + } else { + blocksTotal = stat.getBlockCount(); + } + + totalDeviceSize = blocksTotal * blockSize; + totalDeviceFreeSize = availableBlocks * blockSize; + long finalClearedSize = clearedSize; + + if (allItemsClear) { + FileLoader.getInstance(currentAccount).clearFilePaths(); + } + FileLoader.getInstance(currentAccount).checkCurrentDownloadsFiles(); + + AndroidUtilities.runOnUIThread(() -> { + if (imagesClearedFinal) { + ImageLoader.getInstance().clearMemory(); + } + if (listAdapter != null) { + updateStorageUsageRow(); + } + try { + if (progressDialog != null) { progressDialog.dismiss(); - } catch (Exception e) { - FileLog.e(e); + progressDialog = null; } + } catch (Exception e) { + FileLog.e(e); + } - getMediaDataController().ringtoneDataStore.checkRingtoneSoundsLoaded(); - cacheRemovedTooltip.setInfoText(LocaleController.formatString("CacheWasCleared", R.string.CacheWasCleared, AndroidUtilities.formatFileSize(finalClearedSize))); - cacheRemovedTooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null); - MediaDataController.getInstance(currentAccount).chekAllMedia(true); - }); + getMediaDataController().ringtoneDataStore.checkRingtoneSoundsLoaded(); + cacheRemovedTooltip.setInfoText(LocaleController.formatString("CacheWasCleared", R.string.CacheWasCleared, AndroidUtilities.formatFileSize(finalClearedSize))); + cacheRemovedTooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null); + MediaDataController.getInstance(currentAccount).chekAllMedia(true); + + loadDialogEntities(); }); } @Override public View createView(Context context) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setBackButtonDrawable(new BackDrawable(false)); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("StorageUsage", R.string.StorageUsage)); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { if (id == -1) { + if (selectedDialogs.size() > 0) { + selectedDialogs.clear(); + actionBar.hideActionMode(); + listAdapter.notifyItemRangeChanged(0, listAdapter.getItemCount()); + return; + } finishFragment(); + } else if (id == delete_id) { + if (selectedDialogs.isEmpty() || getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(LocaleController.getString("ClearCache", R.string.ClearCache)); + builder.setMessage(LocaleController.getString("ClearCacheForChats", R.string.ClearCacheForChats)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + DialogFileEntities mergedEntities = new DialogFileEntities(0); + for (int i = 0; i < dialogsFilesEntities.size(); i++) { + if (selectedDialogs.contains(dialogsFilesEntities.get(i).dialogId)) { + mergedEntities.merge(dialogsFilesEntities.get(i)); + dialogsFilesEntities.remove(i); + i--; + } + } + if (mergedEntities.totalSize > 0) { + cleanupDialogFiles(mergedEntities, null); + } + selectedDialogs.clear(); + actionBar.hideActionMode(); + updateRows(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + AlertDialog dialog = builder.create(); + showDialog(dialog); + TextView button = (TextView) dialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (button != null) { + button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2)); + } } } }); @@ -455,125 +720,34 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe listView.setLayoutManager(layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setAdapter(listAdapter); + DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); + itemAnimator.setDelayAnimations(false); + itemAnimator.setSupportsChangeAnimations(false); + listView.setItemAnimator(itemAnimator); listView.setOnItemClickListener((view, position) -> { if (getParentActivity() == null) { return; } - if (position == migrateOldFolderRow) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - migrateOldFolder(); - } - } else if (position == databaseRow) { + if (position == databaseRow) { clearDatabase(); } else if (position == storageUsageRow) { - if (totalSize <= 0 || getParentActivity() == null) { + showClearCacheDialog(null); + } else if (itemInners.get(position).entities != null) { + if (view instanceof UserCell && selectedDialogs.size() > 0) { + selectDialog((UserCell) view, itemInners.get(position).entities.dialogId); return; } - bottomSheet = new BottomSheet(getParentActivity(), false) { - @Override - protected boolean canDismissWithSwipe() { - return false; - } - }; - bottomSheet.fixNavigationBar(); - bottomSheet.setAllowNestedScroll(true); - bottomSheet.setApplyBottomPadding(false); - LinearLayout linearLayout = new LinearLayout(getParentActivity()); - bottomSheetView = linearLayout; - linearLayout.setOrientation(LinearLayout.VERTICAL); - StorageDiagramView circleDiagramView = new StorageDiagramView(context); - linearLayout.addView(circleDiagramView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 16)); - CheckBoxCell lastCreatedCheckbox = null; - for (int a = 0; a < 7; a++) { - long size; - String name; - String color; - if (a == 0) { - size = photoSize; - name = LocaleController.getString("LocalPhotoCache", R.string.LocalPhotoCache); - color = Theme.key_statisticChartLine_blue; - } else if (a == 1) { - size = videoSize; - name = LocaleController.getString("LocalVideoCache", R.string.LocalVideoCache); - color = Theme.key_statisticChartLine_golden; - } else if (a == 2) { - size = documentsSize; - name = LocaleController.getString("LocalDocumentCache", R.string.LocalDocumentCache); - color = Theme.key_statisticChartLine_green; - } else if (a == 3) { - size = musicSize; - name = LocaleController.getString("LocalMusicCache", R.string.LocalMusicCache); - color = Theme.key_statisticChartLine_indigo; - } else if (a == 4) { - size = audioSize; - name = LocaleController.getString("LocalAudioCache", R.string.LocalAudioCache); - color = Theme.key_statisticChartLine_red; - } else if (a == 5) { - size = stickersSize; - name = LocaleController.getString("AnimatedStickers", R.string.AnimatedStickers); - color = Theme.key_statisticChartLine_lightgreen; - } else { - size = cacheSize; - name = LocaleController.getString("LocalCache", R.string.LocalCache); - color = Theme.key_statisticChartLine_lightblue; - } - if (size > 0) { - clearViewData[a] = new StorageDiagramView.ClearViewData(circleDiagramView); - clearViewData[a].size = size; - clearViewData[a].color = color; - CheckBoxCell checkBoxCell = new CheckBoxCell(getParentActivity(), 4, 21, null); - lastCreatedCheckbox = checkBoxCell; - checkBoxCell.setTag(a); - checkBoxCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - linearLayout.addView(checkBoxCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50)); - checkBoxCell.setText(name, AndroidUtilities.formatFileSize(size), true, true); - checkBoxCell.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); - checkBoxCell.setCheckBoxColor(color, Theme.key_windowBackgroundWhiteGrayIcon, Theme.key_checkboxCheck); - checkBoxCell.setOnClickListener(v -> { - int enabledCount = 0; - for (int i = 0; i < clearViewData.length; i++) { - if (clearViewData[i] != null && clearViewData[i].clear) { - enabledCount++; - } - } - CheckBoxCell cell = (CheckBoxCell) v; - int num = (Integer) cell.getTag(); - if (enabledCount == 1 && clearViewData[num].clear) { - AndroidUtilities.shakeView(((CheckBoxCell) v).getCheckBoxView()); - return; - } - - - clearViewData[num].setClear(!clearViewData[num].clear); - cell.setChecked(clearViewData[num].clear, true); - }); - } else { - clearViewData[a] = null; - } + showClearCacheDialog(itemInners.get(position).entities); + } + }); + listView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() { + @Override + public boolean onItemClick(View view, int position) { + if (view instanceof UserCell && itemInners.get(position).entities != null) { + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + selectDialog((UserCell) view, itemInners.get(position).entities.dialogId); } - if (lastCreatedCheckbox != null) { - lastCreatedCheckbox.setNeedDivider(false); - } - circleDiagramView.setData(clearViewData); - BottomSheet.BottomSheetCell cell = new BottomSheet.BottomSheetCell(getParentActivity(), 2); - cell.setTextAndIcon(LocaleController.getString("ClearMediaCache", R.string.ClearMediaCache), 0); - actionTextView = cell.getTextView(); - cell.getTextView().setOnClickListener(v -> { - try { - if (visibleDialog != null) { - visibleDialog.dismiss(); - } - } catch (Exception e) { - FileLog.e(e); - } - cleanupFolders(); - }); - linearLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50)); - NestedScrollView scrollView = new NestedScrollView(context); - scrollView.setVerticalScrollBarEnabled(false); - scrollView.addView(linearLayout); - bottomSheet.setCustomView(scrollView); - showDialog(bottomSheet); + return false; } }); @@ -583,6 +757,240 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe return fragmentView; } + private void selectDialog(UserCell userCell, long dialogId) { + boolean selected = false; + if (selectedDialogs.contains(dialogId)) { + selectedDialogs.remove(dialogId); + } else { + selectedDialogs.add(dialogId); + selected = true; + } + userCell.setChecked(selected, true); + + if (selectedDialogs.size() > 0) { + checkActionMode(); + actionBar.showActionMode(true); + selectedDialogsCountTextView.setNumber(selectedDialogs.size(), true); + } else { + actionBar.hideActionMode(); + return; + } + + } + + private void showClearCacheDialog(DialogFileEntities entities) { + if (totalSize <= 0 || getParentActivity() == null) { + return; + } + + bottomSheet = new BottomSheet(getParentActivity(), false) { + @Override + protected boolean canDismissWithSwipe() { + return false; + } + }; + bottomSheet.fixNavigationBar(); + bottomSheet.setAllowNestedScroll(true); + bottomSheet.setApplyBottomPadding(false); + LinearLayout linearLayout = new LinearLayout(getParentActivity()); + bottomSheetView = linearLayout; + linearLayout.setOrientation(LinearLayout.VERTICAL); + StorageDiagramView circleDiagramView; + if (entities != null) { + circleDiagramView = new StorageDiagramView(getContext(), entities.dialogId) { + @Override + protected void onAvatarClick() { + bottomSheet.dismiss(); + Bundle args = new Bundle(); +// if (UserConfig.getInstance(currentAccount).getClientUserId() == entities.dialogId) { + args.putLong("dialog_id", entities.dialogId); + MediaActivity fragment = new MediaActivity(args, null); + fragment.setChatInfo(null); + presentFragment(fragment); +// } else { +// if (entities.dialogId < 0) { +// args.putLong("chat_id", -entities.dialogId); +// } else { +// args.putLong("user_id", entities.dialogId); +// } +// presentFragment(new ProfileActivity(args)); +// } + } + }; + } else { + circleDiagramView = new StorageDiagramView(getContext()); + } + linearLayout.addView(circleDiagramView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 16)); + CheckBoxCell lastCreatedCheckbox = null; + for (int a = 0; a < 7; a++) { + long size; + String name; + String color; + + if (a == TYPE_PHOTOS) { + size = photoSize; + name = LocaleController.getString("LocalPhotoCache", R.string.LocalPhotoCache); + color = Theme.key_statisticChartLine_blue; + } else if (a == TYPE_VIDEOS) { + size = videoSize; + name = LocaleController.getString("LocalVideoCache", R.string.LocalVideoCache); + color = Theme.key_statisticChartLine_golden; + } else if (a == TYPE_DOCUMENTS) { + size = documentsSize; + name = LocaleController.getString("LocalDocumentCache", R.string.LocalDocumentCache); + color = Theme.key_statisticChartLine_green; + } else if (a == TYPE_MUSIC) { + size = musicSize; + name = LocaleController.getString("LocalMusicCache", R.string.LocalMusicCache); + color = Theme.key_statisticChartLine_indigo; + } else if (a == TYPE_VOICE) { + size = audioSize; + name = LocaleController.getString("LocalAudioCache", R.string.LocalAudioCache); + color = Theme.key_statisticChartLine_red; + } else if (a == TYPE_ANIMATED_STICKERS_CACHE) { + size = stickersSize; + name = LocaleController.getString("AnimatedStickers", R.string.AnimatedStickers); + color = Theme.key_statisticChartLine_lightgreen; + } else { + size = cacheSize; + name = LocaleController.getString("LocalCache", R.string.LocalCache); + color = Theme.key_statisticChartLine_lightblue; + } + if (entities != null) { + FileEntities fileEntities = entities.entitiesByType.get(a); + if (fileEntities != null) { + size = fileEntities.totalSize; + } else { + size = 0; + } + } + if (size > 0) { + clearViewData[a] = new StorageDiagramView.ClearViewData(circleDiagramView); + clearViewData[a].size = size; + clearViewData[a].color = color; + CheckBoxCell checkBoxCell = new CheckBoxCell(getParentActivity(), 4, 21, null); + lastCreatedCheckbox = checkBoxCell; + checkBoxCell.setTag(a); + checkBoxCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); + linearLayout.addView(checkBoxCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50)); + checkBoxCell.setText(name, AndroidUtilities.formatFileSize(size), true, true); + checkBoxCell.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + checkBoxCell.setCheckBoxColor(color, Theme.key_windowBackgroundWhiteGrayIcon, Theme.key_checkboxCheck); + checkBoxCell.setOnClickListener(v -> { + int enabledCount = 0; + for (int i = 0; i < clearViewData.length; i++) { + if (clearViewData[i] != null && clearViewData[i].clear) { + enabledCount++; + } + } + CheckBoxCell cell = (CheckBoxCell) v; + int num = (Integer) cell.getTag(); + if (enabledCount == 1 && clearViewData[num].clear) { + BotWebViewVibrationEffect.APP_ERROR.vibrate(); + AndroidUtilities.shakeViewSpring(((CheckBoxCell) v).getCheckBoxView(), -3); + return; + } + + clearViewData[num].setClear(!clearViewData[num].clear); + cell.setChecked(clearViewData[num].clear, true); + }); + } else { + clearViewData[a] = null; + } + } + if (lastCreatedCheckbox != null) { + lastCreatedCheckbox.setNeedDivider(false); + } + circleDiagramView.setData(clearViewData); + BottomSheet.BottomSheetCell cell = new BottomSheet.BottomSheetCell(getParentActivity(), 2); + cell.setTextAndIcon(LocaleController.getString("ClearMediaCache", R.string.ClearMediaCache), 0); + actionTextView = cell.getTextView(); + cell.getTextView().setOnClickListener(v -> { + try { + if (visibleDialog != null) { + visibleDialog.dismiss(); + } + } catch (Exception e) { + FileLog.e(e); + } + if (entities == null) { + cleanupFolders(); + } else { + cleanupDialogFiles(entities, clearViewData); + } + }); + linearLayout.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50)); + NestedScrollView scrollView = new NestedScrollView(getContext()); + scrollView.setVerticalScrollBarEnabled(false); + scrollView.addView(linearLayout); + bottomSheet.setCustomView(scrollView); + showDialog(bottomSheet); + } + + private void cleanupDialogFiles(DialogFileEntities dialogEntities, StorageDiagramView.ClearViewData[] clearViewData) { + final AlertDialog progressDialog = new AlertDialog(getParentActivity(), 3); + progressDialog.setCanCancel(false); + progressDialog.showDelayed(500); + + ArrayList filesToRemove = new ArrayList<>(); + long totalSizeBefore = totalSize; + for (int a = 0; a < 7; a++) { + if (clearViewData != null) { + if (clearViewData[a] == null || !clearViewData[a].clear) { + continue; + } + } + FileEntities entitiesToDelete = dialogEntities.entitiesByType.get(a); + if (entitiesToDelete == null) { + continue; + } + filesToRemove.addAll(entitiesToDelete.files); + dialogEntities.totalSize -= entitiesToDelete.totalSize; + totalSize -= entitiesToDelete.totalSize; + totalDeviceFreeSize += entitiesToDelete.totalSize; + dialogEntities.entitiesByType.delete(a); + if (a == TYPE_PHOTOS) { + photoSize -= entitiesToDelete.totalSize; + } else if (a == TYPE_VIDEOS) { + videoSize -= entitiesToDelete.totalSize; + } else if (a == TYPE_DOCUMENTS) { + documentsSize -= entitiesToDelete.totalSize; + } else if (a == TYPE_MUSIC) { + musicSize -= entitiesToDelete.totalSize; + } else if (a == TYPE_VOICE) { + audioSize -= entitiesToDelete.totalSize; + } else if (a == TYPE_ANIMATED_STICKERS_CACHE) { + stickersSize -= entitiesToDelete.totalSize; + } else { + cacheSize -= entitiesToDelete.totalSize; + } + } + if (dialogEntities.entitiesByType.size() == 0) { + dialogsFilesEntities.remove(dialogEntities); + } + updateRows(); + + cacheRemovedTooltip.setInfoText(LocaleController.formatString("CacheWasCleared", R.string.CacheWasCleared, AndroidUtilities.formatFileSize(totalSizeBefore - totalSize))); + cacheRemovedTooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null); + + getFileLoader().getFileDatabase().removeFiles(filesToRemove); + getFileLoader().cancelLoadAllFiles(); + getFileLoader().getFileLoaderQueue().postRunnable(() -> { + for (int i = 0; i < filesToRemove.size(); i++) { + filesToRemove.get(i).delete(); + } + + AndroidUtilities.runOnUIThread(() -> { + FileLoader.getInstance(currentAccount).checkCurrentDownloadsFiles(); + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e(e); + } + }); + }); + } + @RequiresApi(api = Build.VERSION_CODES.R) private void migrateOldFolder() { FilesMigrationService.checkBottomSheet(this); @@ -614,9 +1022,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe @Override public void onResume() { super.onResume(); - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } + loadDialogEntities(); } @Override @@ -633,12 +1039,12 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe if (listAdapter != null) { databaseSize = MessagesStorage.getInstance(currentAccount).getDatabaseSize(); updateDatabaseSize = true; - listAdapter.notifyDataSetChanged(); + updateRows(); } } } - private class ListAdapter extends RecyclerListView.SelectionAdapter { + private class ListAdapter extends AdapterWithDiffUtils { private Context mContext; @@ -649,35 +1055,34 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int position = holder.getAdapterPosition(); - return position == migrateOldFolderRow || position == databaseRow || (position == storageUsageRow && (totalSize > 0) && !calculating); + return position == migrateOldFolderRow || position == databaseRow || (holder.getItemViewType() == VIEW_TYPE_STORAGE && (totalSize > 0) && !calculating) || holder.getItemViewType() == VIEW_TYPE_CHAT; } @Override public int getItemCount() { - return rowCount; + return itemInners.size(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { - case 0: + case VIEW_TYPE_TEXT_SETTINGS: view = new TextSettingsCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; - case 2: - view = new StroageUsageView(mContext); + case VIEW_TYPE_STORAGE: + view = new StorageUsageView(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; - case 3: + case VIEW_TYPE_HEADER: view = new HeaderCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; - case 4: + case VIEW_TYPE_CHOOSER: SlideChooseView slideChooseView = new SlideChooseView(mContext); view = slideChooseView; view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); - SharedPreferences preferences = MessagesController.getGlobalMainSettings(); slideChooseView.setCallback(index -> { if (index == 0) { SharedConfig.setKeepMedia(3); @@ -698,7 +1103,21 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe } slideChooseView.setOptions(index, LocaleController.formatPluralString("Days", 3), LocaleController.formatPluralString("Weeks", 1), LocaleController.formatPluralString("Months", 1), LocaleController.getString("KeepMediaForever", R.string.KeepMediaForever)); break; - case 1: + case VIEW_TYPE_CHAT: + UserCell userCell = new UserCell(getContext(), getResourceProvider()); + userCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + view = userCell; + break; + case VIEW_FLICKER_LOADING_DIALOG: + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(getContext()); + flickerLoadingView.setIsSingleCell(true); + flickerLoadingView.setItemsCount(3); + flickerLoadingView.setIgnoreHeightCheck(true); + flickerLoadingView.setViewType(FlickerLoadingView.DIALOG_CACHE_CONTROL); + flickerLoadingView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + view = flickerLoadingView; + break; + case VIEW_TYPE_INFO: default: view = new TextInfoPrivacyCell(mContext); break; @@ -709,7 +1128,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { - case 0: + case VIEW_TYPE_TEXT_SETTINGS: TextSettingsCell textCell = (TextSettingsCell) holder.itemView; if (position == databaseRow) { textCell.setTextAndValue(LocaleController.getString("ClearLocalDatabase", R.string.ClearLocalDatabase), AndroidUtilities.formatFileSize(databaseSize), updateDatabaseSize, false); @@ -718,49 +1137,53 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe textCell.setTextAndValue(LocaleController.getString("MigrateOldFolder", R.string.MigrateOldFolder), null, false); } break; - case 1: + case VIEW_TYPE_INFO: TextInfoPrivacyCell privacyCell = (TextInfoPrivacyCell) holder.itemView; if (position == databaseInfoRow) { privacyCell.setText(LocaleController.getString("LocalDatabaseInfo", R.string.LocalDatabaseInfo)); privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); - } else if (position == cacheInfoRow) { - privacyCell.setText(""); - privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); } else if (position == keepMediaInfoRow) { privacyCell.setText(AndroidUtilities.replaceTags(LocaleController.getString("KeepMediaInfo", R.string.KeepMediaInfo))); privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + } else { + privacyCell.setText(""); + privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); } break; - case 2: - StroageUsageView stroageUsageView = (StroageUsageView) holder.itemView; - stroageUsageView.setStorageUsage(calculating, databaseSize, totalSize, totalDeviceFreeSize, totalDeviceSize); + case VIEW_TYPE_STORAGE: + StorageUsageView storageUsageView = (StorageUsageView) holder.itemView; + storageUsageView.setStorageUsage(calculating, databaseSize, totalSize, totalDeviceFreeSize, totalDeviceSize); break; - case 3: + case VIEW_TYPE_HEADER: HeaderCell headerCell = (HeaderCell) holder.itemView; - if (position == keepMediaHeaderRow) { - headerCell.setText(LocaleController.getString("KeepMedia", R.string.KeepMedia)); - } else if (position == deviseStorageHeaderRow) { - headerCell.setText(LocaleController.getString("DeviceStorage", R.string.DeviceStorage)); + headerCell.setText(itemInners.get(position).headerName); + headerCell.setTopMargin(itemInners.get(position).headerTopMargin); + headerCell.setBottomMargin(itemInners.get(position).headerBottomMargin); + break; + case VIEW_TYPE_CHAT: + UserCell userCell = (UserCell) holder.itemView; + DialogFileEntities dialogFileEntities = itemInners.get(position).entities; + TLObject object = getMessagesController().getUserOrChat(dialogFileEntities.dialogId); + String title; + boolean animated = userCell.dialogFileEntities != null && userCell.dialogFileEntities.dialogId == dialogFileEntities.dialogId; + if (dialogFileEntities.dialogId == UNKNOWN_CHATS_DIALOG_ID) { + title = LocaleController.getString("CacheOtherChats", R.string.CacheOtherChats); + userCell.getImageView().getAvatarDrawable().setAvatarType(AvatarDrawable.AVATAR_TYPE_OTHER_CHATS); + userCell.getImageView().setForUserOrChat(null, userCell.getImageView().getAvatarDrawable()); + } else { + title = DialogObject.setDialogPhotoTitle(userCell.getImageView(), object); } + userCell.dialogFileEntities = dialogFileEntities; + userCell.getImageView().setRoundRadius(AndroidUtilities.dp(object instanceof TLRPC.Chat && ((TLRPC.Chat) object).forum ? 12 : 19)); + userCell.setTextAndValue(title, AndroidUtilities.formatFileSize(dialogFileEntities.totalSize), position < getItemCount() - 2); + userCell.setChecked(selectedDialogs.contains(dialogFileEntities.dialogId), animated); break; } } @Override public int getItemViewType(int i) { - if (i == databaseInfoRow || i == cacheInfoRow || i == keepMediaInfoRow) { - return 1; - } - if (i == storageUsageRow) { - return 2; - } - if (i == keepMediaHeaderRow || i == deviseStorageHeaderRow) { - return 3; - } - if (i == keepMediaChooserRow) { - return 4; - } - return 0; + return itemInners.get(i).viewType; } } @@ -777,7 +1200,7 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe }; ArrayList arrayList = new ArrayList<>(); - arrayList.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextSettingsCell.class, SlideChooseView.class, StroageUsageView.class, HeaderCell.class}, null, null, null, Theme.key_windowBackgroundWhite)); + arrayList.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextSettingsCell.class, SlideChooseView.class, StorageUsageView.class, HeaderCell.class}, null, null, null, Theme.key_windowBackgroundWhite)); arrayList.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray)); arrayList.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault)); @@ -794,12 +1217,12 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe arrayList.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); arrayList.add(new ThemeDescription(listView, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); arrayList.add(new ThemeDescription(listView, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); - arrayList.add(new ThemeDescription(listView, 0, new Class[]{StroageUsageView.class}, new String[]{"paintFill"}, null, null, null, Theme.key_player_progressBackground)); - arrayList.add(new ThemeDescription(listView, 0, new Class[]{StroageUsageView.class}, new String[]{"paintProgress"}, null, null, null, Theme.key_player_progress)); - arrayList.add(new ThemeDescription(listView, 0, new Class[]{StroageUsageView.class}, new String[]{"telegramCacheTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); - arrayList.add(new ThemeDescription(listView, 0, new Class[]{StroageUsageView.class}, new String[]{"freeSizeTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); - arrayList.add(new ThemeDescription(listView, 0, new Class[]{StroageUsageView.class}, new String[]{"calculationgTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); - arrayList.add(new ThemeDescription(listView, 0, new Class[]{StroageUsageView.class}, new String[]{"paintProgress2"}, null, null, null, Theme.key_player_progressBackground2)); + arrayList.add(new ThemeDescription(listView, 0, new Class[]{StorageUsageView.class}, new String[]{"paintFill"}, null, null, null, Theme.key_player_progressBackground)); + arrayList.add(new ThemeDescription(listView, 0, new Class[]{StorageUsageView.class}, new String[]{"paintProgress"}, null, null, null, Theme.key_player_progress)); + arrayList.add(new ThemeDescription(listView, 0, new Class[]{StorageUsageView.class}, new String[]{"telegramCacheTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); + arrayList.add(new ThemeDescription(listView, 0, new Class[]{StorageUsageView.class}, new String[]{"freeSizeTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); + arrayList.add(new ThemeDescription(listView, 0, new Class[]{StorageUsageView.class}, new String[]{"calculationgTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); + arrayList.add(new ThemeDescription(listView, 0, new Class[]{StorageUsageView.class}, new String[]{"paintProgress2"}, null, null, null, Theme.key_player_progressBackground2)); arrayList.add(new ThemeDescription(listView, 0, new Class[]{SlideChooseView.class}, null, null, null, Theme.key_switchTrack)); arrayList.add(new ThemeDescription(listView, 0, new Class[]{SlideChooseView.class}, null, null, null, Theme.key_switchTrackChecked)); @@ -825,6 +1248,203 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe return arrayList; } + public class UserCell extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { + + public DialogFileEntities dialogFileEntities; + private Theme.ResourcesProvider resourcesProvider; + private TextView textView; + private AnimatedTextView valueTextView; + private BackupImageView imageView; + private boolean needDivider; + private boolean canDisable; + + protected CheckBox2 checkBox; + + public UserCell(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + + textView = new TextView(context); + textView.setSingleLine(); + textView.setLines(1); + textView.setMaxLines(1); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + textView.setEllipsize(TextUtils.TruncateAt.END); +// textView.setEllipsizeByGradient(true); + textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 21 : 72, 0, LocaleController.isRTL ? 72 : 21, 0)); + + valueTextView = new AnimatedTextView(context, true, true, !LocaleController.isRTL); + valueTextView.setAnimationProperties(.55f, 0, 320, CubicBezierInterpolator.EASE_OUT_QUINT); + valueTextView.setTextSize(AndroidUtilities.dp(16)); + valueTextView.setGravity((LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL); + valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteValueText, resourcesProvider)); + addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP, LocaleController.isRTL ? 21 : 72, 0, LocaleController.isRTL ? 72 : 21, 0)); + + imageView = new BackupImageView(context); + imageView.getAvatarDrawable().setScaleSize(.8f); + addView(imageView, LayoutHelper.createFrame(38, 38, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, 17, 0, 17, 0)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(50) + (needDivider ? 1 : 0)); + + int availableWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - AndroidUtilities.dp(34); + int width = availableWidth / 2; + + if (imageView.getVisibility() == VISIBLE) { + imageView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(38), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(38), MeasureSpec.EXACTLY)); + } + + if (valueTextView.getVisibility() == VISIBLE) { + valueTextView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); + width = availableWidth - valueTextView.getMeasuredWidth() - AndroidUtilities.dp(8); + } else { + width = availableWidth; + } + int padding = valueTextView.getMeasuredWidth() + AndroidUtilities.dp(12); + if (LocaleController.isRTL) { + ((MarginLayoutParams) textView.getLayoutParams()).leftMargin = padding; + } else { + ((MarginLayoutParams) textView.getLayoutParams()).rightMargin = padding; + } + textView.measure(MeasureSpec.makeMeasureSpec(width - padding, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); + + if (checkBox != null) { + checkBox.measure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24), MeasureSpec.EXACTLY) + ); + } + } + + public BackupImageView getImageView() { + return imageView; + } + + public TextView getTextView() { + return textView; + } + + public void setCanDisable(boolean value) { + canDisable = value; + } + + public AnimatedTextView getValueTextView() { + return valueTextView; + } + + public void setTextColor(int color) { + textView.setTextColor(color); + } + + public void setTextValueColor(int color) { + valueTextView.setTextColor(color); + } + + public void setText(CharSequence text, boolean divider) { + text = Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16), false); + textView.setText(text); + valueTextView.setVisibility(INVISIBLE); + needDivider = divider; + setWillNotDraw(!divider); + } + + public void setTextAndValue(CharSequence text, CharSequence value, boolean divider) { + setTextAndValue(text, value, false, divider); + } + + public void setTextAndValue(CharSequence text, CharSequence value, boolean animated, boolean divider) { + text = Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16), false); + textView.setText(text); + if (value != null) { + valueTextView.setText(value, animated); + valueTextView.setVisibility(VISIBLE); + } else { + valueTextView.setVisibility(INVISIBLE); + } + needDivider = divider; + setWillNotDraw(!divider); + requestLayout(); + } + + public void setEnabled(boolean value, ArrayList animators) { + setEnabled(value); + if (animators != null) { + animators.add(ObjectAnimator.ofFloat(textView, "alpha", value ? 1.0f : 0.5f)); + if (valueTextView.getVisibility() == VISIBLE) { + animators.add(ObjectAnimator.ofFloat(valueTextView, "alpha", value ? 1.0f : 0.5f)); + } + } else { + textView.setAlpha(value ? 1.0f : 0.5f); + if (valueTextView.getVisibility() == VISIBLE) { + valueTextView.setAlpha(value ? 1.0f : 0.5f); + } + } + } + + @Override + public void setEnabled(boolean value) { + super.setEnabled(value); + textView.setAlpha(value || !canDisable ? 1.0f : 0.5f); + if (valueTextView.getVisibility() == VISIBLE) { + valueTextView.setAlpha(value || !canDisable ? 1.0f : 0.5f); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (needDivider) { + canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(72), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(72) : 0), getMeasuredHeight() - 1, Theme.dividerPaint); + } + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setText(textView.getText() + (valueTextView != null && valueTextView.getVisibility() == View.VISIBLE ? "\n" + valueTextView.getText() : "")); + info.setEnabled(isEnabled()); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiLoaded); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.emojiLoaded) { + if (textView != null) { + textView.invalidate(); + } + } + } + + public void setChecked(boolean checked, boolean animated) { + if (checkBox == null && !checked) { + return; + } + if (checkBox == null) { + checkBox = new CheckBox2(getContext(), 21, resourcesProvider); + checkBox.setColor(null, Theme.key_windowBackgroundWhite, Theme.key_checkboxCheck); + checkBox.setDrawUnchecked(false); + checkBox.setDrawBackgroundAsArc(3); + addView(checkBox, LayoutHelper.createFrame(24, 24, 0, 38, 25, 0, 0)); + } + checkBox.setChecked(checked, animated); + } + } + @Override public void onRequestPermissionsResultFragment(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == 4) { @@ -841,4 +1461,114 @@ public class CacheControlActivity extends BaseFragment implements NotificationCe } } + + private class DialogFileEntities { + + long dialogId; + long totalSize; + SparseArray entitiesByType = new SparseArray<>(); + + public DialogFileEntities(long dialogId) { + this.dialogId = dialogId; + } + + public void addFile(File file, int type) { + FileEntities entities = entitiesByType.get(type, null); + if (entities == null) { + entities = new FileEntities(); + entitiesByType.put(type, entities); + } + entities.count++; + long fileSize = file.length(); + entities.totalSize += fileSize; + totalSize += fileSize; + entities.files.add(file); + } + + public void merge(DialogFileEntities dialogEntities) { + for (int i = 0; i < dialogEntities.entitiesByType.size(); i++) { + int type = dialogEntities.entitiesByType.keyAt(i); + FileEntities entitesToMerge = dialogEntities.entitiesByType.valueAt(i); + FileEntities entities = entitiesByType.get(type, null); + if (entities == null) { + entities = new FileEntities(); + entitiesByType.put(type, entities); + } + entities.count += entitesToMerge.count; + entities.totalSize += entitesToMerge.totalSize; + totalSize += entitesToMerge.totalSize; + entities.files.addAll(entitesToMerge.files); + } + } + } + + private class FileEntities { + long totalSize; + int count; + ArrayList files = new ArrayList<>(); + } + + private class ItemInner extends AdapterWithDiffUtils.Item { + + int headerTopMargin = 15; + int headerBottomMargin = 0; + String headerName; + DialogFileEntities entities; + + public ItemInner(int viewType, String headerName, DialogFileEntities dialogFileEntities) { + super(viewType, true); + this.headerName = headerName; + this.entities = dialogFileEntities; + } + + public ItemInner(int viewType, String headerName, int headerTopMargin, int headerBottomMargin, DialogFileEntities dialogFileEntities) { + super(viewType, true); + this.headerName = headerName; + this.headerTopMargin = headerTopMargin; + this.headerBottomMargin = headerBottomMargin; + this.entities = dialogFileEntities; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ItemInner itemInner = (ItemInner) o; + if (viewType == itemInner.viewType) { + if (viewType == VIEW_TYPE_CHAT && entities != null && itemInner.entities != null) { + return entities.dialogId == itemInner.entities.dialogId; + } + if (viewType == VIEW_TYPE_CHOOSER || viewType == VIEW_TYPE_STORAGE || viewType == VIEW_TYPE_TEXT_SETTINGS) { + return true; + } + if (viewType == VIEW_TYPE_HEADER || viewType == VIEW_TYPE_INFO) { + return Objects.equals(headerName, itemInner.headerName); + } + return false; + } + return false; + } + } + + NumberTextView selectedDialogsCountTextView; + private void checkActionMode() { + if (actionBar.actionModeIsExist(null)) { + return; + } + final ActionBarMenu actionMode = actionBar.createActionMode(false, null); + + if (inPreviewMode) { + actionMode.setBackgroundColor(Color.TRANSPARENT); + actionMode.drawBlur = false; + } + selectedDialogsCountTextView = new NumberTextView(actionMode.getContext()); + selectedDialogsCountTextView.setTextSize(18); + selectedDialogsCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + selectedDialogsCountTextView.setTextColor(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon)); + actionMode.addView(selectedDialogsCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f, 72, 0, 0, 0)); + selectedDialogsCountTextView.setOnTouchListener((v, event) -> true); + + + ActionBarMenuItem deleteItem = actionMode.addItemWithWidth(delete_id, R.drawable.msg_delete, AndroidUtilities.dp(54), LocaleController.getString("ClearCache", R.string.ClearCache)); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java index 74d0c35dc..5dada7cf9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java @@ -33,6 +33,8 @@ import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.DotDividerSpan; import org.telegram.ui.Components.MediaActionDrawable; import org.telegram.ui.Components.RadialProgress2; @@ -49,9 +51,11 @@ public class AudioPlayerCell extends View implements DownloadController.FileDown private int buttonY; private int titleY = AndroidUtilities.dp(9); + private AnimatedEmojiSpan.EmojiGroupedSpans titleLayoutEmojis; private StaticLayout titleLayout; private int descriptionY = AndroidUtilities.dp(29); + private AnimatedEmojiSpan.EmojiGroupedSpans descriptionLayoutEmojis; private StaticLayout descriptionLayout; private MessageObject currentMessageObject; @@ -100,6 +104,7 @@ public class AudioPlayerCell extends View implements DownloadController.FileDown int width = (int) Math.ceil(Theme.chat_contextResult_titleTextPaint.measureText(title)); CharSequence titleFinal = TextUtils.ellipsize(title.replace('\n', ' '), Theme.chat_contextResult_titleTextPaint, Math.min(width, maxWidth), TextUtils.TruncateAt.END); titleLayout = new StaticLayout(titleFinal, Theme.chat_contextResult_titleTextPaint, maxWidth + AndroidUtilities.dp(4), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + titleLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, titleLayoutEmojis, titleLayout); } catch (Exception e) { FileLog.e(e); } @@ -111,6 +116,7 @@ public class AudioPlayerCell extends View implements DownloadController.FileDown } CharSequence authorFinal = TextUtils.ellipsize(author, Theme.chat_contextResult_descriptionTextPaint, maxWidth, TextUtils.TruncateAt.END); descriptionLayout = new StaticLayout(authorFinal, Theme.chat_contextResult_descriptionTextPaint, maxWidth + AndroidUtilities.dp(4), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + descriptionLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, descriptionLayoutEmojis, descriptionLayout); } catch (Exception e) { FileLog.e(e); } @@ -145,12 +151,18 @@ public class AudioPlayerCell extends View implements DownloadController.FileDown super.onDetachedFromWindow(); radialProgress.onDetachedFromWindow(); DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this); + + AnimatedEmojiSpan.release(this, titleLayoutEmojis); + AnimatedEmojiSpan.release(this, descriptionLayoutEmojis); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); radialProgress.onAttachedToWindow(); + + titleLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, titleLayoutEmojis, titleLayout); + descriptionLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, descriptionLayoutEmojis, descriptionLayout); } public MessageObject getMessageObject() { @@ -268,6 +280,7 @@ public class AudioPlayerCell extends View implements DownloadController.FileDown canvas.save(); canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), titleY); titleLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, titleLayout, titleLayoutEmojis, 0, null, 0, 0, 0, 1f); canvas.restore(); } @@ -276,6 +289,7 @@ public class AudioPlayerCell extends View implements DownloadController.FileDown canvas.save(); canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), descriptionY); descriptionLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, descriptionLayout, descriptionLayoutEmojis, 0, null, 0, 0, 0, 1f); canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java index 4c0e2c5d4..62ff1b31c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java @@ -761,7 +761,13 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD private void createLayout(CharSequence text, int width) { int maxWidth = width - AndroidUtilities.dp(30); invalidatePath = true; - textLayout = new StaticLayout(text, (TextPaint) getThemedPaint(Theme.key_paint_chatActionText), maxWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + TextPaint paint; + if (currentMessageObject != null && currentMessageObject.drawServiceWithDefaultTypeface) { + paint = (TextPaint) getThemedPaint(Theme.key_paint_chatActionText2); + } else { + paint = (TextPaint) getThemedPaint(Theme.key_paint_chatActionText); + } + textLayout = new StaticLayout(text, paint, maxWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); spoilersPool.addAll(spoilers); spoilers.clear(); @@ -845,7 +851,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD MessageObject messageObject = currentMessageObject; if (messageObject != null) { if (delegate.getTopicId() == 0 && MessageObject.isTopicActionMessage(messageObject)) { - TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-messageObject.getDialogId(), MessageObject.getTopicId(messageObject.messageOwner)); + TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-messageObject.getDialogId(), MessageObject.getTopicId(messageObject.messageOwner, true)); text = ForumUtilities.createActionTextWithTopic(topic, messageObject); } if (text == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 4718d5acf..48d0a46a7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -53,7 +53,6 @@ import android.text.TextUtils; import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; import android.text.style.URLSpan; -import android.util.Log; import android.util.Property; import android.util.SparseArray; import android.util.StateSet; @@ -75,7 +74,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; -import androidx.core.math.MathUtils; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AccountInstance; @@ -113,7 +111,6 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; -import org.telegram.ui.Components.AnimatedColor; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AnimatedFileDrawable; @@ -128,7 +125,6 @@ import org.telegram.ui.Components.ClipRoundedDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EmptyStubSpan; import org.telegram.ui.Components.FloatSeekBarAccessibilityDelegate; -import org.telegram.ui.Components.Forum.ForumUtilities; import org.telegram.ui.Components.Forum.MessageTopicButton; import org.telegram.ui.Components.InfiniteProgress; import org.telegram.ui.Components.LinkPath; @@ -224,6 +220,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate setAvatar(currentMessageObject); } } + } else if (id == NotificationCenter.emojiLoaded) { + invalidate(); } } @@ -522,11 +520,15 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate return true; } - default boolean didPressAnimatedEmoji(AnimatedEmojiSpan span) { + default boolean didPressAnimatedEmoji(ChatMessageCell cell, AnimatedEmojiSpan span) { return false; } default void didPressTopicButton(ChatMessageCell cell) {} + + default boolean shouldShowTopicButton() { + return false; + } } private final static int DOCUMENT_ATTACH_TYPE_NONE = 0; @@ -672,6 +674,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private StaticLayout authorLayout; private StaticLayout instantViewLayout; private boolean drawInstantView; + private boolean pollInstantViewTouchesBottom; private int drawInstantViewType; private int imageBackgroundColor; private float imageBackgroundIntensity; @@ -997,7 +1000,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private int timeWidth; private int timeTextWidth; private int timeX; - private String currentTimeString; + private CharSequence currentTimeString; private boolean drawTime = true; private boolean forceNotDrawTime; private Paint drillHolePaint; @@ -1440,7 +1443,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate return true; } else { if (link[0] instanceof AnimatedEmojiSpan && pressedEmoji == link[0]) { - if (delegate.didPressAnimatedEmoji(pressedEmoji)) { + if (delegate.didPressAnimatedEmoji(this, pressedEmoji)) { resetPressedLink(1); pressedEmoji = null; return true; @@ -1523,7 +1526,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } else if (pressedLinkType == 3) { if (pressedEmoji != null) { - if (delegate.didPressAnimatedEmoji(pressedEmoji)) { + if (delegate.didPressAnimatedEmoji(this, pressedEmoji)) { resetPressedLink(3); pressedEmoji = null; return true; @@ -1769,7 +1772,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate ((ClickableSpan) pressedLink.getSpan()).onClick(this); } resetPressedLink(2); - } else if (pressedEmoji != null && delegate.didPressAnimatedEmoji(pressedEmoji)) { + } else if (pressedEmoji != null && delegate.didPressAnimatedEmoji(this, pressedEmoji)) { pressedEmoji = null; resetPressedLink(2); } else { @@ -3031,6 +3034,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (currentMessageObject.hasValidGroupId() && currentMessagesGroup != null && !currentMessagesGroup.isDocuments) { ViewGroup parent = (ViewGroup) getParent(); + if (parent == null) { + return false; + } for (int i = 0; i < parent.getChildCount(); i++) { View v = parent.getChildAt(i); if (v instanceof ChatMessageCell) { @@ -3656,6 +3662,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.startSpoilers); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.stopSpoilers); + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.userInfoDidLoad); cancelShakeAnimation(); @@ -3714,6 +3721,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.startSpoilers); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.stopSpoilers); + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiLoaded); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.userInfoDidLoad); // if (currentMessageObject != null) { @@ -4594,8 +4602,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photo = null; author = null; document = null; - if (invoice.photo instanceof TLRPC.TL_webDocument) { - webDocument = WebFile.createWithWebDocument(invoice.photo); + if (invoice.webPhoto instanceof TLRPC.TL_webDocument) { + webDocument = WebFile.createWithWebDocument(invoice.webPhoto); } else { webDocument = null; } @@ -5657,7 +5665,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate lastPoll = media.poll; lastPollResults = media.results.results; lastPollResultsVoters = media.results.total_voters; - if (media.poll.multiple_choice && !pollVoted && !pollClosed || !isBot && (media.poll.public_voters && pollVoted || pollClosed && media.results != null && media.results.total_voters != 0 && media.poll.public_voters)) { + if ( + media.poll.multiple_choice && !pollVoted && !pollClosed || + !isBot && media.poll.public_voters && ( + pollVoted || + pollClosed && media.results != null && media.results.total_voters != 0 + ) + ) { drawInstantView = true; drawInstantViewType = 8; createInstantViewButton(); @@ -5815,10 +5829,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate setMessageObjectInternal(messageObject); - + pollInstantViewTouchesBottom = false; if (isBot && !drawInstantView) { height -= AndroidUtilities.dp(10); } else if (media.poll.public_voters || media.poll.multiple_choice) { + pollInstantViewTouchesBottom = true; height += AndroidUtilities.dp(13); } totalHeight = AndroidUtilities.dp(46 + 27) + namesOffset + height; @@ -7580,7 +7595,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } if (pressedEmoji != null) { // hadLongPress = true; -// if (delegate.didPressAnimatedEmoji(pressedEmoji)) { +// if (delegate.didPressAnimatedEmoji(this, pressedEmoji)) { // pressedEmoji = null; // resetPressedLink(-1); // return true; @@ -8316,7 +8331,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } radii[a * 2] = radii[a * 2 + 1] = 0; } - if (!out && !drawPinnedBottom && currentPosition == null && (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_POLL)) { + if (!out && !drawPinnedBottom && currentPosition == null && (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_POLL || pollInstantViewTouchesBottom)) { path.moveTo(rect.left + AndroidUtilities.dp(6), rect.top); path.lineTo(rect.left + AndroidUtilities.dp(6), rect.bottom - AndroidUtilities.dp(6) - AndroidUtilities.dp(2 + 3)); AndroidUtilities.rectTmp.set( @@ -9020,7 +9035,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (currentMessageObject.isOutOwner()) { textX = getCurrentBackgroundLeft() + AndroidUtilities.dp(11) + getExtraTextX(); } else { - textX = getCurrentBackgroundLeft() + AndroidUtilities.dp(!mediaBackground && drawPinnedBottom ? 11 : 17) + getExtraTextX(); + textX = getCurrentBackgroundLeft() + (currentMessageObject.type == MessageObject.TYPE_EMOJIS ? 0 : AndroidUtilities.dp(!mediaBackground && drawPinnedBottom ? 11 : 17)) + getExtraTextX(); } if (hasGamePreview) { textX += AndroidUtilities.dp(11); @@ -9063,13 +9078,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate Rect r = currentBackgroundDrawable.getBounds(); if (currentMessageObject.isOutOwner() && !mediaBackground && !pinnedBottom) { canvas.clipRect( - r.left + AndroidUtilities.dp(4), r.top + AndroidUtilities.dp(4), - r.right - AndroidUtilities.dp(10), r.bottom - AndroidUtilities.dp(4) + r.left + AndroidUtilities.dp(4), r.top + AndroidUtilities.dp(4), + r.right - AndroidUtilities.dp(10), r.bottom - AndroidUtilities.dp(4) ); } else { canvas.clipRect( - r.left + AndroidUtilities.dp(4), r.top + AndroidUtilities.dp(4), - r.right - AndroidUtilities.dp(4), r.bottom - AndroidUtilities.dp(4) + r.left + AndroidUtilities.dp(4), r.top + AndroidUtilities.dp(4), + r.right - AndroidUtilities.dp(4), r.bottom - AndroidUtilities.dp(4) ); } } @@ -9114,21 +9129,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate Theme.chat_docBackPaint.setColor(getThemedColor(currentMessageObject.isOutOwner() ? Theme.key_chat_outBubble : Theme.key_chat_inBubble)); canvas.drawCircle(photoImage.getCenterX(), photoImage.getCenterY(), photoImage.getImageWidth() / 2, Theme.chat_docBackPaint); } - } else if (currentMessageObject.type == MessageObject.TYPE_GEO) { -// rect.set(photoImage.getImageX(), photoImage.getImageY(), photoImage.getImageX2(), photoImage.getImageY2()); -// Theme.chat_docBackPaint.setColor(getThemedColor(currentMessageObject.isOutOwner() ? Theme.key_chat_outLocationBackground : Theme.key_chat_inLocationBackground)); -// int[] rad = photoImage.getRoundRadius(); -// rectPath.reset(); -// for (int a = 0; a < rad.length; a++) { -// radii[a * 2] = radii[a * 2 + 1] = rad[a]; -// } -// rectPath.addRoundRect(rect, radii, Path.Direction.CW); -// rectPath.close(); -// canvas.drawPath(rectPath, Theme.chat_docBackPaint); -// -// Drawable iconDrawable = Theme.chat_locationDrawable[currentMessageObject.isOutOwner() ? 1 : 0]; -// setDrawableBounds(iconDrawable, rect.centerX() - iconDrawable.getIntrinsicWidth() / 2, rect.centerY() - iconDrawable.getIntrinsicHeight() / 2); -// iconDrawable.draw(canvas); } drawMediaCheckBox = mediaCheckBox != null && (checkBoxVisible || mediaCheckBox.getProgress() != 0 || checkBoxAnimationInProgress) && currentMessagesGroup != null; if (drawMediaCheckBox && (mediaCheckBox.isChecked() || mediaCheckBox.getProgress() != 0 || checkBoxAnimationInProgress) && (!textIsSelectionMode())) { @@ -9237,7 +9237,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } if (documentAttachType == DOCUMENT_ATTACH_TYPE_GIF) { - if (photoImage.getVisible() && !hasGamePreview && !currentMessageObject.needDrawBluredPreview()) { + if (drawPhotoImage && photoImage.getVisible() && !hasGamePreview && !currentMessageObject.needDrawBluredPreview()) { int oldAlpha = ((BitmapDrawable) Theme.chat_msgMediaMenuDrawable).getPaint().getAlpha(); Theme.chat_msgMediaMenuDrawable.setAlpha((int) (oldAlpha * controlsAlpha)); setDrawableBounds(Theme.chat_msgMediaMenuDrawable, otherX = (int) (photoImage.getImageX() + photoImage.getImageWidth() - AndroidUtilities.dp(14)), otherY = (int) (photoImage.getImageY() + AndroidUtilities.dp(8.1f))); @@ -10498,7 +10498,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } return firstLineWidth - AndroidUtilities.dp(31 + (isAvatarVisible ? 48 : 0)); } else if (currentMessageObject.type == MessageObject.TYPE_EMOJIS) { - return AndroidUtilities.displaySize.x - (currentMessageObject.textWidth + AndroidUtilities.dp(14)) - AndroidUtilities.dp(52) - (isAvatarVisible ? AndroidUtilities.dp(48) : 0); + return Math.max(currentMessageObject.textWidth, (int) ((AndroidUtilities.displaySize.x - AndroidUtilities.dp(52) - (isAvatarVisible ? AndroidUtilities.dp(48) : 0)) * .5f)); } else { return backgroundWidth - AndroidUtilities.dp(mediaBackground ? 22 : 31); } @@ -11534,7 +11534,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } else { currentTimeString = timeString; } - timeTextWidth = timeWidth = (int) Math.ceil(Theme.chat_timePaint.measureText(currentTimeString)); + timeTextWidth = timeWidth = (int) Math.ceil(Theme.chat_timePaint.measureText(currentTimeString, 0, currentTimeString == null ? 0 : currentTimeString.length())); if (currentMessageObject.scheduled && currentMessageObject.messageOwner.date == 0x7FFFFFFE) { timeWidth -= AndroidUtilities.dp(8); } @@ -11583,6 +11583,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate widthForSign -= AndroidUtilities.dp(96); } } + signString = Emoji.replaceEmoji(signString, Theme.chat_timePaint.getFontMetricsInt(), AndroidUtilities.dp(10), false); int width = (int) Math.ceil(Theme.chat_timePaint.measureText(signString, 0, signString.length())); if (width > widthForSign) { if (widthForSign <= 0) { @@ -11593,7 +11594,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate width = widthForSign; } } - currentTimeString = signString + currentTimeString; + SpannableStringBuilder currentTimeStringBuilder = new SpannableStringBuilder(signString); + currentTimeStringBuilder.append(currentTimeString); + currentTimeString = currentTimeStringBuilder; timeTextWidth += width; timeWidth += width; } @@ -11907,9 +11910,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate lastLine = TextUtils.ellipsize(lastLine, Theme.chat_forwardNamePaint, forwardedNameWidth, TextUtils.TruncateAt.END); try { lastLine = Emoji.replaceEmoji(lastLine, Theme.chat_forwardNamePaint.getFontMetricsInt(), AndroidUtilities.dp(14), false); - } catch (Exception ignore) { - } - ; + } catch (Exception ignore) {} try { forwardedNameLayout[1] = new StaticLayout(lastLine, Theme.chat_forwardNamePaint, forwardedNameWidth + AndroidUtilities.dp(2), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); lastLine = TextUtils.ellipsize(AndroidUtilities.replaceTags(forwardedString), Theme.chat_forwardNamePaint, forwardedNameWidth, TextUtils.TruncateAt.END); @@ -11920,8 +11921,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } forwardNameOffsetX[0] = forwardedNameLayout[0].getLineLeft(0); forwardNameOffsetX[1] = forwardedNameLayout[1].getLineLeft(0); - if (messageObject.type != MessageObject.TYPE_ROUND_VIDEO && !messageObject.isAnyKindOfSticker()) { + if (messageObject.type != MessageObject.TYPE_ROUND_VIDEO && !messageObject.isAnyKindOfSticker() || messageObject.type == MessageObject.TYPE_EMOJIS) { namesOffset += AndroidUtilities.dp(8) + Theme.chat_forwardNamePaint.getTextSize() * 2; + if (messageObject.type == MessageObject.TYPE_EMOJIS) { + namesOffset += AndroidUtilities.dp(8); + } } } catch (Exception e) { FileLog.e(e); @@ -11930,9 +11934,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } drawTopic = false; - if (!isThreadChat && !pinnedTop && (MessageObject.getTopicId(messageObject.messageOwner) != 0 || messageObject.replyToForumTopic != null)) { + if (!isThreadChat && (delegate != null && delegate.shouldShowTopicButton()) && !pinnedTop && (MessageObject.getTopicId(messageObject.messageOwner, ChatObject.isForum(currentChat)) != 0 || messageObject.replyToForumTopic != null)) { if (currentPosition == null || currentPosition.minY == 0) { - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = messageObject.replyToForumTopic == null ? MessageObject.getTopicId(messageObject.messageOwner, ChatObject.isForum(currentChat)) : messageObject.replyToForumTopic.id; TLRPC.TL_forumTopic topic = messageObject.replyToForumTopic == null ? MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-messageObject.getDialogId(), topicId) : messageObject.replyToForumTopic; if (topic != null) { drawTopic = true; @@ -11967,9 +11971,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if ((!isThreadChat || messageObject.getReplyTopMsgId() != 0) && messageObject.hasValidReplyMessageObject() || messageObject.messageOwner.fwd_from != null && messageObject.isDice()) { if (currentPosition == null || currentPosition.minY == 0) { - if (!messageObject.isAnyKindOfSticker() && messageObject.type != MessageObject.TYPE_ROUND_VIDEO) { + if (!messageObject.isAnyKindOfSticker() && messageObject.type != MessageObject.TYPE_ROUND_VIDEO || messageObject.type == MessageObject.TYPE_EMOJIS) { namesOffset += AndroidUtilities.dp(14) + (Theme.chat_replyTextPaint.getTextSize() + Theme.chat_replyNamePaint.getTextSize()); - if (messageObject.type != MessageObject.TYPE_TEXT) { + if (messageObject.type == MessageObject.TYPE_EMOJIS && !drawForwardedName) { + namesOffset += AndroidUtilities.dp(12); + } else if (messageObject.type != MessageObject.TYPE_TEXT) { namesOffset += AndroidUtilities.dp(5); } } @@ -12511,7 +12517,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (replyNameLayout != null) { replyHeight = AndroidUtilities.dp(7) + Theme.chat_replyNamePaint.getTextSize() + Theme.chat_replyTextPaint.getTextSize(); - if (currentMessageObject.shouldDrawWithoutBackground()) { + if (currentMessageObject.shouldDrawWithoutBackground() && currentMessageObject.type != MessageObject.TYPE_EMOJIS) { if (currentMessageObject.isOutOwner()) { replyStartX = AndroidUtilities.dp(23); if (isPlayingRound) { @@ -12534,6 +12540,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } else { if (currentMessageObject.isOutOwner()) { replyStartX = backgroundDrawableLeft + AndroidUtilities.dp(12) + getExtraTextX(); + if (currentMessageObject.type == MessageObject.TYPE_EMOJIS) { + replyStartX -= Math.max(0, replyStartX + Math.max(replyNameWidth, replyTextWidth) + AndroidUtilities.dp(14) - AndroidUtilities.displaySize.x); + } } else { if (mediaBackground) { replyStartX = backgroundDrawableLeft + AndroidUtilities.dp(12) + getExtraTextX(); @@ -12541,6 +12550,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate replyStartX = backgroundDrawableLeft + AndroidUtilities.dp(drawPinnedBottom ? 12 : 18) + getExtraTextX(); } } + if (currentMessageObject.type == MessageObject.TYPE_EMOJIS) { + replyStartX -= AndroidUtilities.dp(7); + } forwardHeight = AndroidUtilities.dp(4) + (int) Theme.chat_forwardNamePaint.getTextSize() * 2; replyStartY = AndroidUtilities.dp(12) + (drawNameLayout && nameLayout != null ? AndroidUtilities.dp(6) + (int) Theme.chat_namePaint.getTextSize() : 0) + (drawForwardedName && forwardedNameLayout[0] != null ? AndroidUtilities.dp(4) + forwardHeight : 0); if (drawTopic && topicButton != null) { @@ -12819,37 +12831,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } if (checkBoxVisible || checkBoxAnimationInProgress) { - if (checkBoxVisible && checkBoxAnimationProgress == 1.0f || !checkBoxVisible && checkBoxAnimationProgress == 0.0f) { - checkBoxAnimationInProgress = false; - } - Interpolator interpolator = checkBoxVisible ? CubicBezierInterpolator.EASE_OUT : CubicBezierInterpolator.EASE_IN; - checkBoxTranslation = (int) Math.ceil(interpolator.getInterpolation(checkBoxAnimationProgress) * AndroidUtilities.dp(35)); - if (!currentMessageObject.isOutOwner()) { - updateTranslation(); - } - + animateCheckboxTranslation(); int size = AndroidUtilities.dp(21); checkBox.setBounds(AndroidUtilities.dp(8 - 35) + checkBoxTranslation, currentBackgroundDrawable.getBounds().bottom - AndroidUtilities.dp(8) - size, size, size); - - if (checkBoxAnimationInProgress) { - long newTime = SystemClock.elapsedRealtime(); - long dt = newTime - lastCheckBoxAnimationTime; - lastCheckBoxAnimationTime = newTime; - - if (checkBoxVisible) { - checkBoxAnimationProgress += dt / 200.0f; - if (checkBoxAnimationProgress > 1.0f) { - checkBoxAnimationProgress = 1.0f; - } - } else { - checkBoxAnimationProgress -= dt / 200.0f; - if (checkBoxAnimationProgress <= 0.0f) { - checkBoxAnimationProgress = 0.0f; - } - } - invalidate(); - ((View) getParent()).invalidate(); - } } if (!fromParent && drawBackgroundInParent()) { @@ -12992,6 +12976,39 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.restoreToCount(restoreCount); } + private void animateCheckboxTranslation() { + if (checkBoxVisible || checkBoxAnimationInProgress) { + if (checkBoxVisible && checkBoxAnimationProgress == 1.0f || !checkBoxVisible && checkBoxAnimationProgress == 0.0f) { + checkBoxAnimationInProgress = false; + } + Interpolator interpolator = checkBoxVisible ? CubicBezierInterpolator.EASE_OUT : CubicBezierInterpolator.EASE_IN; + checkBoxTranslation = (int) Math.ceil(interpolator.getInterpolation(checkBoxAnimationProgress) * AndroidUtilities.dp(35)); + if (!currentMessageObject.isOutOwner()) { + updateTranslation(); + } + + if (checkBoxAnimationInProgress) { + long newTime = SystemClock.elapsedRealtime(); + long dt = newTime - lastCheckBoxAnimationTime; + lastCheckBoxAnimationTime = newTime; + + if (checkBoxVisible) { + checkBoxAnimationProgress += dt / 200.0f; + if (checkBoxAnimationProgress > 1.0f) { + checkBoxAnimationProgress = 1.0f; + } + } else { + checkBoxAnimationProgress -= dt / 200.0f; + if (checkBoxAnimationProgress <= 0.0f) { + checkBoxAnimationProgress = 0.0f; + } + } + invalidate(); + ((View) getParent()).invalidate(); + } + } + } + public boolean drawBackgroundInParent() { if (canDrawBackgroundInParent && currentMessageObject != null && currentMessageObject.isOutOwner()) { if (resourcesProvider != null) { @@ -13331,6 +13348,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } sideStartY = layoutHeight + transitionParams.deltaBottom - AndroidUtilities.dp(41); + if (currentMessageObject.type == MessageObject.TYPE_EMOJIS && currentMessageObject.textWidth < timeTextWidth) { + sideStartY -= AndroidUtilities.dp(22); + } if (currentMessagesGroup != null) { sideStartY += currentMessagesGroup.transitionParams.offsetBottom; if (currentMessagesGroup.transitionParams.backgroundChangeBounds) { @@ -13536,6 +13556,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate currentBackgroundDrawable.drawCached(canvas, backgroundCacheParams); currentBackgroundDrawable.setAlpha(255); } + + animateCheckboxTranslation(); } public boolean hasNameLayout() { @@ -13761,7 +13783,25 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (drawForwardedNameLocal && forwardedNameLayoutLocal[0] != null && forwardedNameLayoutLocal[1] != null && (currentPosition == null || currentPosition.minY == 0 && currentPosition.minX == 0)) { if (currentMessageObject.type == MessageObject.TYPE_ROUND_VIDEO || currentMessageObject.isAnyKindOfSticker()) { Theme.chat_forwardNamePaint.setColor(getThemedColor(Theme.key_chat_stickerReplyNameText)); - if (currentMessageObject.needDrawForwarded()) { + if (currentMessageObject.type == MessageObject.TYPE_EMOJIS) { + if (currentMessageObject.isOutOwner()) { + if (currentMessageObject.needDrawForwarded()) { + forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(11) + getExtraTextX(); + forwardNameXLocal += transitionParams.deltaLeft; + } else { + forwardNameXLocal = transitionParams.animateForwardNameX; + } + int width = Math.max(forwardedNameWidthLocal + AndroidUtilities.dp(14), hasReply ? Math.max(replyNameWidth, replyTextWidth) + AndroidUtilities.dp(14) : 0); + forwardNameXLocal -= Math.max(0, forwardNameXLocal + width - AndroidUtilities.displaySize.x); + } else { + if (currentMessageObject.needDrawForwarded()) { + forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(mediaBackground || drawPinnedBottom ? 11 : 17) + getExtraTextX(); + } else { + forwardNameXLocal = transitionParams.animateForwardNameX; + } + } + forwardNameXLocal -= AndroidUtilities.dp(7); + } else if (currentMessageObject.needDrawForwarded()) { if (currentMessageObject.isOutOwner()) { forwardNameXLocal = forwardNameX = AndroidUtilities.dp(23); } else { @@ -13808,11 +13848,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate forwardNameY = AndroidUtilities.dp(10) + (drawNameLayout ? AndroidUtilities.dp(5) + (int) Theme.chat_namePaint.getTextSize() : 0) + (drawTopic && topicButton != null ? topicButton.height() + AndroidUtilities.dp(7 + (currentMessageObject.type != MessageObject.TYPE_TEXT ? 3 : 0)) : 0); forwardHeight = AndroidUtilities.dp(4) + (int) Theme.chat_forwardNamePaint.getTextSize() * 2; if (currentMessageObject.isOutOwner()) { - if (hasPsaHint) { - Theme.chat_forwardNamePaint.setColor(getThemedColor(Theme.key_chat_outPsaNameText)); - } else { - Theme.chat_forwardNamePaint.setColor(getThemedColor(Theme.key_chat_outForwardedNameText)); - } + Theme.chat_forwardNamePaint.setColor(getThemedColor(hasPsaHint ? Theme.key_chat_outPsaNameText : Theme.key_chat_outForwardedNameText)); if (currentMessageObject.needDrawForwarded()) { forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(11) + getExtraTextX(); forwardNameXLocal += transitionParams.deltaLeft; @@ -13820,17 +13856,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate forwardNameXLocal = transitionParams.animateForwardNameX; } } else { - if (hasPsaHint) { - Theme.chat_forwardNamePaint.setColor(getThemedColor(Theme.key_chat_inPsaNameText)); - } else { - Theme.chat_forwardNamePaint.setColor(getThemedColor(Theme.key_chat_inForwardedNameText)); - } + Theme.chat_forwardNamePaint.setColor(getThemedColor(hasPsaHint ? Theme.key_chat_inPsaNameText : Theme.key_chat_inForwardedNameText)); if (currentMessageObject.needDrawForwarded()) { - if (mediaBackground) { - forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(11) + getExtraTextX(); - } else { - forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(drawPinnedBottom ? 11 : 17) + getExtraTextX(); - } + forwardNameXLocal = forwardNameX = backgroundDrawableLeft + AndroidUtilities.dp(mediaBackground || drawPinnedBottom ? 11 : 17) + getExtraTextX(); } else { forwardNameXLocal = transitionParams.animateForwardNameX; } @@ -13911,7 +13939,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (drawTopic && topicButton != null && (animatingAlpha > 0 && replyForwardAlpha > 0) && (currentPosition == null || currentPosition.minY == 0 && currentPosition.minX == 0)) { float x, y; - if (currentMessageObject.shouldDrawWithoutBackground()) { + if (currentMessageObject.shouldDrawWithoutBackground() && currentMessageObject.type != MessageObject.TYPE_EMOJIS) { if (currentMessageObject.isOutOwner()) { x = AndroidUtilities.dp(23); if (isPlayingRound) { @@ -14011,9 +14039,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate int offset = (int) Math.min(AndroidUtilities.dp(10), (replyHeight - AndroidUtilities.dp(35)) / 1.5f + AndroidUtilities.dp(10)); forwardNameX = replyStartX - replyTextOffset + offset + (needReplyImage ? offset - AndroidUtilities.dp(1) + replyHeight : 0); if ((currentPosition == null || currentPosition.minY == 0 && currentPosition.minX == 0) && !(enterTransitionInProgress && !currentMessageObject.isVoice())) { + int restoreToCount = -1; if (getAlpha() * replyForwardAlpha != 1f) { AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); - canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (0xFF * getAlpha() * replyForwardAlpha), Canvas.ALL_SAVE_FLAG); + restoreToCount = canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (0xFF * getAlpha() * replyForwardAlpha), Canvas.ALL_SAVE_FLAG); } int leftRad, rightRad, bottomRad = AndroidUtilities.dp(Math.min(2, SharedConfig.bubbleRadius)); @@ -14084,8 +14113,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.restore(); } - if (getAlpha() * replyForwardAlpha != 1f) { - canvas.restore(); + if (restoreToCount >= 0) { + canvas.restoreToCount(restoreToCount); } } } @@ -14302,7 +14331,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate buttonX -= AndroidUtilities.dp(10); } commentButtonRect.set( - buttonX - AndroidUtilities.dp((currentMessageObject == null || !currentMessageObject.isOut()) && !drawPinnedBottom && currentPosition == null && (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_POLL) ? 6 : 0), + buttonX - AndroidUtilities.dp((currentMessageObject == null || !currentMessageObject.isOut()) && !drawPinnedBottom && currentPosition == null && (currentMessageObject == null || currentMessageObject.type != MessageObject.TYPE_POLL || pollInstantViewTouchesBottom) ? 6 : 0), (int) buttonY, endX - AndroidUtilities.dp(14), layoutHeight - AndroidUtilities.dp(h) @@ -16240,7 +16269,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate instantButtonRect.set(textX, instantY, textX + instantWidth, instantY + AndroidUtilities.dp(44)); if (selectorDrawable[0] != null && selectorDrawableMaskType[0] == 2) { - selectorDrawable[0].setBounds(textX, instantY, textX + instantWidth, instantY + AndroidUtilities.dp(44)); + selectorDrawable[0].setBounds(textX - AndroidUtilities.dp(pollInstantViewTouchesBottom ? 6 : 0), instantY, textX + instantWidth, instantY + AndroidUtilities.dp(44)); selectorDrawable[0].draw(canvas); } if (instantViewLayout != null) { @@ -18014,14 +18043,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } if (edited && !lastDrawingEdited && timeLayout != null) { String editedStr = LocaleController.getString("EditedMessage", R.string.EditedMessage); - String text = timeLayout.getText().toString(); - int i = text.indexOf(editedStr); + CharSequence text = timeLayout.getText(); + int i = text.toString().indexOf(editedStr); if (i >= 0) { if (i == 0) { animateEditedLayout = new StaticLayout(editedStr, Theme.chat_timePaint, timeTextWidth + AndroidUtilities.dp(100), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); spannableStringBuilder.append(editedStr); - spannableStringBuilder.append(text.substring(editedStr.length())); + spannableStringBuilder.append(text.subSequence(editedStr.length(), text.length())); spannableStringBuilder.setSpan(new EmptyStubSpan(), 0, editedStr.length(), 0); animateTimeLayout = new StaticLayout(spannableStringBuilder, Theme.chat_timePaint, timeTextWidth + AndroidUtilities.dp(100), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); animateEditedWidthDiff = timeWidth - lastTimeWidth; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java index 4d7b637f6..8af9ecbef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java @@ -68,7 +68,7 @@ public class CheckBoxCell extends FrameLayout { } else { textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); if (type == 2) { - addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : 29), 0, (LocaleController.isRTL ? 29 : 0), 0)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 8 : 29), 0, (LocaleController.isRTL ? 29 : 8), 0)); } else { int offset = type == 4 ? 56 : 46; addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? padding : offset + (padding - 17)), 0, (LocaleController.isRTL ? offset + (padding - 17) : padding), 0)); @@ -238,7 +238,7 @@ public class CheckBoxCell extends FrameLayout { @Override protected void onDraw(Canvas canvas) { if (needDivider) { - int offset = currentType == TYPE_CHECK_BOX_ROUND ? 50 : 20; + int offset = currentType == TYPE_CHECK_BOX_ROUND ? 60 : 20; canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(offset), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(offset) : 0), getMeasuredHeight() - 1, Theme.dividerPaint); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxUserCell.java index f6e2010a9..dbcfd62d2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxUserCell.java @@ -10,28 +10,27 @@ package org.telegram.ui.Cells; import android.content.Context; import android.graphics.Canvas; -import android.text.TextUtils; -import android.util.TypedValue; +import android.graphics.drawable.Drawable; import android.view.Gravity; import android.widget.FrameLayout; -import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; -import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; -import org.telegram.ui.Components.CheckBoxSquare; +import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.Switch; public class CheckBoxUserCell extends FrameLayout { - private TextView textView; + private SimpleTextView textView; private BackupImageView imageView; - private CheckBoxSquare checkBox; + private Switch checkBox; private AvatarDrawable avatarDrawable; private boolean needDivider; @@ -40,23 +39,21 @@ public class CheckBoxUserCell extends FrameLayout { public CheckBoxUserCell(Context context, boolean alert) { super(context); - textView = new TextView(context); + textView = new SimpleTextView(context); textView.setTextColor(Theme.getColor(alert ? Theme.key_dialogTextBlack : Theme.key_windowBackgroundWhiteBlackText)); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - textView.setLines(1); - textView.setMaxLines(1); - textView.setSingleLine(true); - textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setTextSize(16); + textView.setEllipsizeByGradient(true); textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); - addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 21 : 94), 0, (LocaleController.isRTL ? 94 : 21), 0)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 21 : 69), 0, (LocaleController.isRTL ? 69 : 21), 0)); avatarDrawable = new AvatarDrawable(); imageView = new BackupImageView(context); imageView.setRoundRadius(AndroidUtilities.dp(36)); - addView(imageView, LayoutHelper.createFrame(36, 36, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 48, 7, 48, 0)); + addView(imageView, LayoutHelper.createFrame(36, 36, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 23, 7, 23, 0)); - checkBox = new CheckBoxSquare(context, alert, null); - addView(checkBox, LayoutHelper.createFrame(18, 18, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : 21), 16, (LocaleController.isRTL ? 21 : 0), 0)); + checkBox = new Switch(context, null); + checkBox.setColors(Theme.key_switchTrack, Theme.key_switchTrackChecked, Theme.key_windowBackgroundWhite, Theme.key_windowBackgroundWhite); + addView(checkBox, LayoutHelper.createFrame(37, 20, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 22, 0, 22, 0)); } @Override @@ -72,9 +69,22 @@ public class CheckBoxUserCell extends FrameLayout { return currentUser; } + private static Drawable verifiedDrawable; + private Drawable getVerifiedDrawable() { + if (verifiedDrawable == null) { + verifiedDrawable = new CombinedDrawable(Theme.dialogs_verifiedDrawable, Theme.dialogs_verifiedCheckDrawable); + } + return verifiedDrawable; + } + public void setUser(TLRPC.User user, boolean checked, boolean divider) { currentUser = user; - textView.setText(ContactsController.formatName(user.first_name, user.last_name)); + if (user != null) { + textView.setText(ContactsController.formatName(user.first_name, user.last_name)); + } else { + textView.setText(""); + } + textView.setRightDrawable(user != null && user.verified ? getVerifiedDrawable() : null); checkBox.setChecked(checked, false); avatarDrawable.setInfo(user); imageView.setForUserOrChat(user, avatarDrawable); @@ -90,11 +100,11 @@ public class CheckBoxUserCell extends FrameLayout { return checkBox.isChecked(); } - public TextView getTextView() { + public SimpleTextView getTextView() { return textView; } - public CheckBoxSquare getCheckBox() { + public Switch getCheckBox() { return checkBox; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java index d096e8806..a540792e1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -14,6 +14,7 @@ import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.PorterDuff; @@ -24,7 +25,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.os.SystemClock; import android.text.Layout; import android.text.Spannable; import android.text.SpannableStringBuilder; @@ -43,6 +43,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.Interpolator; import android.view.animation.OvershootInterpolator; +import androidx.collection.LongSparseArray; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; @@ -52,6 +53,7 @@ import org.telegram.messenger.ChatObject; import org.telegram.messenger.ChatThemeController; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; +import org.telegram.messenger.DownloadController; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; @@ -66,6 +68,7 @@ import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; @@ -79,8 +82,10 @@ import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EmptyStubSpan; import org.telegram.ui.Components.ForegroundColorSpanThemable; +import org.telegram.ui.Components.Forum.ForumBubbleDrawable; import org.telegram.ui.Components.Forum.ForumUtilities; import org.telegram.ui.Components.Premium.PremiumGradient; +import org.telegram.ui.Components.Premium.PremiumLockIconView; import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble; @@ -88,21 +93,25 @@ import org.telegram.ui.Components.StaticLayoutEx; import org.telegram.ui.Components.StatusDrawable; import org.telegram.ui.Components.SwipeGestureSettingsView; import org.telegram.ui.Components.TextStyleSpan; +import org.telegram.ui.Components.TimerDrawable; import org.telegram.ui.Components.TypefaceSpan; import org.telegram.ui.Components.URLSpanNoUnderline; import org.telegram.ui.Components.URLSpanNoUnderlineBold; import org.telegram.ui.Components.spoilers.SpoilerEffect; import org.telegram.ui.DialogsActivity; +import org.telegram.ui.RightSlidingDialogContainer; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Stack; public class DialogCell extends BaseCell { public boolean drawingForBlur; + public boolean collapsed; boolean moving; private RLottieDrawable lastDrawTranslationDrawable; private int lastDrawSwipeMessageStringId; @@ -116,10 +125,12 @@ public class DialogCell extends BaseCell { public int heightDefault = 72; public int heightThreeLines = 78; public TLRPC.TL_forumTopic forumTopic; + public boolean useFromUserAsAvatar; private boolean isTopic; private boolean twoLinesForName; private boolean nameIsEllipsized; private Paint topicCounterPaint; + private Paint counterPaintOutline; public float chekBoxPaddingTop = 42; private boolean needEmoji; private boolean hasNameInMessage; @@ -129,6 +140,18 @@ public class DialogCell extends BaseCell { DialogCellDelegate delegate; private boolean applyName; private boolean lastTopicMessageUnread; + private boolean showTopicIconInName; + protected Drawable topicIconInName[]; + private float rightFragmentOpenedProgress; + public boolean isTransitionSupport; + public boolean drawAvatarSelector; + public boolean inPreviewMode; + private boolean buttonCreated; + private int ttlPeriod; + private float ttlProgress; + private TimerDrawable timerDrawable; + private Paint timerPaint; + private Paint timerPaint2; public void setMoving(boolean moving) { this.moving = moving; @@ -138,19 +161,20 @@ public class DialogCell extends BaseCell { return moving; } - public void setForumTopic(TLRPC.TL_forumTopic topic, long dialog_id, MessageObject messageObject, boolean animated) { + public void setForumTopic(TLRPC.TL_forumTopic topic, long dialog_id, MessageObject messageObject, boolean showTopicIconInName, boolean animated) { forumTopic = topic; isTopic = forumTopic != null; if (currentDialogId != dialog_id) { lastStatusDrawableParams = -1; } - if (messageObject.topicIconDrawable[0] != null) { - messageObject.topicIconDrawable[0].setColor(topic.icon_color); + if (messageObject.topicIconDrawable[0] instanceof ForumBubbleDrawable) { + ((ForumBubbleDrawable) messageObject.topicIconDrawable[0]).setColor(topic.icon_color); } currentDialogId = dialog_id; lastDialogChangedTime = System.currentTimeMillis(); message = messageObject; isDialogCell = false; + this.showTopicIconInName = showTopicIconInName; if (messageObject != null) { lastMessageDate = messageObject.messageOwner.date; currentEditDate = messageObject != null ? messageObject.messageOwner.edit_date : 0; @@ -167,9 +191,33 @@ public class DialogCell extends BaseCell { if (topic != null) { groupMessages = topic.groupedMessages; } + if (forumTopic != null && forumTopic.id == 1) { + if (archivedChatsDrawable != null) { + archivedChatsDrawable.setCell(this); + } + } update(0, animated); } + public void setRightFragmentOpenedProgress(float rightFragmentOpenedProgress) { + if (this.rightFragmentOpenedProgress != rightFragmentOpenedProgress) { + this.rightFragmentOpenedProgress = rightFragmentOpenedProgress; + invalidate(); + } + } + + public void setIsTransitionSupport(boolean isTransitionSupport) { + this.isTransitionSupport = isTransitionSupport; + } + + public float collapseOffset = 0; + + public void checkHeight() { + if (getMeasuredHeight() > 0 && getMeasuredHeight() != computeHeight()) { + requestLayout(); + } + } + public static class FixedWidthSpan extends ReplacementSpan { private int width; @@ -237,7 +285,6 @@ public class DialogCell extends BaseCell { private ArrayList groupMessages; private boolean clearingDialog; private CharSequence lastMessageString; - private int index; private int dialogsType; private int folderId; private int messageId; @@ -255,7 +302,7 @@ public class DialogCell extends BaseCell { private float clipProgress; private int topClip; private int bottomClip; - private float translationX; + protected float translationX; private boolean isSliding; private RLottieDrawable translationDrawable; private boolean translationAnimationStarted; @@ -264,8 +311,16 @@ public class DialogCell extends BaseCell { private float currentRevealBounceProgress; private float archiveBackgroundProgress; + protected boolean overrideSwipeAction = false; + protected String overrideSwipeActionBackgroundColorKey; + protected String overrideSwipeActionRevealBackgroundColorKey; + protected String overrideSwipeActionStringKey; + protected int overrideSwipeActionStringId; + protected RLottieDrawable overrideSwipeActionDrawable; + private int thumbsCount; private boolean hasVideoThumb; + private Paint thumbBackgroundPaint; private ImageReceiver[] thumbImage = new ImageReceiver[3]; private boolean[] drawPlay = new boolean[3]; @@ -274,7 +329,7 @@ public class DialogCell extends BaseCell { private boolean animatingArchiveAvatar; private float animatingArchiveAvatarProgress; private BounceInterpolator interpolator = new BounceInterpolator(); - private PullForegroundDrawable archivedChatsDrawable; + protected PullForegroundDrawable archivedChatsDrawable; private TLRPC.User user; private TLRPC.Chat chat; @@ -283,7 +338,7 @@ public class DialogCell extends BaseCell { private int printingStringType; private TLRPC.DraftMessage draftMessage; - private CheckBox2 checkBox; + protected CheckBox2 checkBox; public boolean useForceThreeLines; public boolean useSeparator; @@ -293,6 +348,7 @@ public class DialogCell extends BaseCell { private boolean useMeForMyMessages; private boolean hasCall; + private boolean showTtl; private int nameLeft; private int nameWidth; @@ -327,7 +383,9 @@ public class DialogCell extends BaseCell { private int messageTop; private int messageLeft; + private int typingLeft; private StaticLayout messageLayout; + private StaticLayout typingLayout; private int buttonTop; private StaticLayout buttonLayout; @@ -336,7 +394,7 @@ public class DialogCell extends BaseCell { private List spoilers = new ArrayList<>(); private Stack spoilersPool2 = new Stack<>(); private List spoilers2 = new ArrayList<>(); - private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiStack, animatedEmojiStack2, animatedEmojiStack3; + private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmojiStack, animatedEmojiStack2, animatedEmojiStack3, animatedEmojiStackName; private int messageNameTop; private int messageNameLeft; @@ -356,6 +414,7 @@ public class DialogCell extends BaseCell { private int pinTop; private int pinLeft; protected int translateY; + protected float xOffset; private boolean drawCount; private boolean drawCount2 = true; @@ -407,6 +466,7 @@ public class DialogCell extends BaseCell { private int swipeMessageTextId; private int swipeMessageWidth; private int readOutboxMaxId = -1; + private final DialogUpdateHelper updateHelper = new DialogUpdateHelper(); public static class BounceInterpolator implements Interpolator { @@ -473,20 +533,19 @@ public class DialogCell extends BaseCell { dialogsType = type; folderId = folder; messageId = 0; - update(0, false); + if (update(0, false)) { + requestLayout(); + } checkOnline(); checkGroupCall(); checkChatTheme(); + checkTtl(); } protected boolean drawLock2() { return false; } - public void setDialogIndex(int i) { - index = i; - } - public void setDialog(CustomDialog dialog) { customDialog = dialog; messageId = 0; @@ -494,6 +553,7 @@ public class DialogCell extends BaseCell { checkOnline(); checkGroupCall(); checkChatTheme(); + checkTtl(); } private void checkOnline() { @@ -530,6 +590,11 @@ public class DialogCell extends BaseCell { chatCallProgress = hasCall ? 1.0f : 0.0f; } + private void checkTtl() { + showTtl = ttlPeriod > 0 && !hasCall && !isOnline(); + ttlProgress = showTtl ? 1.0f : 0.0f; + } + private void checkChatTheme() { if (message != null && message.messageOwner != null && message.messageOwner.action instanceof TLRPC.TL_messageActionSetChatTheme && lastUnreadState) { TLRPC.TL_messageActionSetChatTheme setThemeAction = (TLRPC.TL_messageActionSetChatTheme) message.messageOwner.action; @@ -564,10 +629,6 @@ public class DialogCell extends BaseCell { return currentDialogId; } - public int getDialogIndex() { - return index; - } - public int getMessageId() { return messageId; } @@ -604,6 +665,7 @@ public class DialogCell extends BaseCell { AnimatedEmojiSpan.release(this, animatedEmojiStack); AnimatedEmojiSpan.release(this, animatedEmojiStack2); AnimatedEmojiSpan.release(this, animatedEmojiStack3); + AnimatedEmojiSpan.release(this, animatedEmojiStackName); } @Override @@ -617,6 +679,7 @@ public class DialogCell extends BaseCell { animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack, messageLayout); animatedEmojiStack2 = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack2, messageNameLayout); animatedEmojiStack3 = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack3, buttonLayout); + animatedEmojiStackName = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStackName, nameLayout); } public void resetPinnedArchiveState() { @@ -647,15 +710,24 @@ public class DialogCell extends BaseCell { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? heightThreeLines : heightDefault) + (useSeparator ? 1 : 0)); checkTwoLinesForName(); } - if (isForumCell()) { - setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 86 : 91 + (useSeparator ? 1 : 0))); - } else { - setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? heightThreeLines : heightDefault) + (useSeparator ? 1 : 0) + (twoLinesForName ? AndroidUtilities.dp(20) : 0)); - } + + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), computeHeight()); topClip = 0; bottomClip = getMeasuredHeight(); } + private int computeHeight() { + if (isForumCell() && !isTransitionSupport && !collapsed) { + return AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 86 : 91 + (useSeparator ? 1 : 0)); + } else { + return getCollapsedHeight(); + } + } + + private int getCollapsedHeight() { + return AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? heightThreeLines : heightDefault) + (useSeparator ? 1 : 0) + (twoLinesForName ? AndroidUtilities.dp(20) : 0); + } + private void checkTwoLinesForName() { twoLinesForName = false; if (isTopic) { @@ -675,8 +747,14 @@ public class DialogCell extends BaseCell { } if (checkBox != null) { int paddingStart = AndroidUtilities.dp(messagePaddingStart - (useForceThreeLines || SharedConfig.useThreeLinesLayout ? 29 : 27)); - int x = LocaleController.isRTL ? (right - left) - paddingStart : paddingStart; - int y = AndroidUtilities.dp(chekBoxPaddingTop + (useForceThreeLines || SharedConfig.useThreeLinesLayout ? 6 : 0)); + int x, y; + if (inPreviewMode) { + x = AndroidUtilities.dp(8);//LocaleController.isRTL ? (right - left) - paddingStart : paddingStart; + y = (getMeasuredHeight() - checkBox.getMeasuredHeight()) >> 1; + } else { + x = LocaleController.isRTL ? (right - left) - paddingStart : paddingStart; + y = AndroidUtilities.dp(chekBoxPaddingTop + (useForceThreeLines || SharedConfig.useThreeLinesLayout ? 6 : 0)); + } checkBox.layout(x, y, x + checkBox.getMeasuredWidth(), y + checkBox.getMeasuredHeight()); } int size = getMeasuredHeight() + getMeasuredWidth() << 16; @@ -765,6 +843,15 @@ public class DialogCell extends BaseCell { int thumbSize; public void buildLayout() { + if (isTransitionSupport) { + return; + } + if (isDialogCell) { + if (!updateHelper.update()) { + return; + } + } + if (useForceThreeLines || SharedConfig.useThreeLinesLayout) { Theme.dialogs_namePaint[1].setTextSize(AndroidUtilities.dp(16)); Theme.dialogs_nameEncryptedPaint[1].setTextSize(AndroidUtilities.dp(16)); @@ -786,11 +873,12 @@ public class DialogCell extends BaseCell { } currentDialogFolderDialogsCount = 0; - String nameString = ""; + CharSequence nameString = ""; String timeString = ""; String countString = null; String mentionString = null; CharSequence messageString = ""; + CharSequence typingString = ""; CharSequence messageNameString = null; CharSequence printingString = null; CharSequence buttonString = null; @@ -1055,31 +1143,33 @@ public class DialogCell extends BaseCell { buttonString = spannableStringBuilder; } currentMessagePaint = Theme.dialogs_messagePaint[paintIndex]; - } else if (printingString != null) { - lastPrintString = printingString; - printingStringType = MessagesController.getInstance(currentAccount).getPrintingStringType(currentDialogId, getTopicId()); - StatusDrawable statusDrawable = Theme.getChatStatusDrawable(printingStringType); - int startPadding = 0; - if (statusDrawable != null) { - startPadding = statusDrawable.getIntrinsicWidth() + AndroidUtilities.dp(3); - } - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); - - printingString = TextUtils.replace(printingString, new String[]{"..."}, new String[]{""}); - if (printingStringType == 5) { - printingStringReplaceIndex = printingString.toString().indexOf("**oo**"); - } - if (printingStringReplaceIndex >= 0) { - spannableStringBuilder.append(printingString).setSpan(new FixedWidthSpan(Theme.getChatStatusDrawable(printingStringType).getIntrinsicWidth()), printingStringReplaceIndex, printingStringReplaceIndex + 6, 0); - } else { - spannableStringBuilder.append(" ").append(printingString).setSpan(new FixedWidthSpan(startPadding), 0, 1, 0); - } - - messageString = spannableStringBuilder; - currentMessagePaint = Theme.dialogs_messagePrintingPaint[paintIndex]; - checkMessage = false; } else { - lastPrintString = null; + if (printingString != null) { + lastPrintString = printingString; + printingStringType = MessagesController.getInstance(currentAccount).getPrintingStringType(currentDialogId, getTopicId()); + StatusDrawable statusDrawable = Theme.getChatStatusDrawable(printingStringType); + int startPadding = 0; + if (statusDrawable != null) { + startPadding = statusDrawable.getIntrinsicWidth() + AndroidUtilities.dp(3); + } + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + + printingString = TextUtils.replace(printingString, new String[]{"..."}, new String[]{""}); + if (printingStringType == 5) { + printingStringReplaceIndex = printingString.toString().indexOf("**oo**"); + } + if (printingStringReplaceIndex >= 0) { + spannableStringBuilder.append(printingString).setSpan(new FixedWidthSpan(Theme.getChatStatusDrawable(printingStringType).getIntrinsicWidth()), printingStringReplaceIndex, printingStringReplaceIndex + 6, 0); + } else { + spannableStringBuilder.append(" ").append(printingString).setSpan(new FixedWidthSpan(startPadding), 0, 1, 0); + } + + typingString = spannableStringBuilder; + checkMessage = false; + } else { + lastPrintString = null; + printingStringType = -1; + } if (draftMessage != null) { checkMessage = false; messageNameString = LocaleController.getString("Draft", R.string.Draft); @@ -1222,7 +1312,7 @@ public class DialogCell extends BaseCell { updateMessageThumbs(); if (chat != null && chat.id > 0 && fromChat == null && (!ChatObject.isChannel(chat) || ChatObject.isMegagroup(chat)) && !ForumUtilities.isTopicCreateMessage(message)) { messageNameString = getMessageNameString(); - if (chat.forum && !isTopic) { + if (chat.forum && !isTopic && !useFromUserAsAvatar) { CharSequence topicName = MessagesController.getInstance(currentAccount).getTopicsController().getTopicIconName(chat, message, currentMessagePaint); if (!TextUtils.isEmpty(topicName)) { SpannableStringBuilder arrowSpan = new SpannableStringBuilder("-"); @@ -1238,7 +1328,7 @@ public class DialogCell extends BaseCell { SpannableStringBuilder stringBuilder = getMessageStringFormatted(messageFormat, restrictionReason, messageNameString, false); int thumbInsertIndex = 0; - if (!useForceThreeLines && !SharedConfig.useThreeLinesLayout || currentDialogFolderId != 0 && stringBuilder.length() > 0) { + if (!useFromUserAsAvatar && (!useForceThreeLines && !SharedConfig.useThreeLinesLayout || currentDialogFolderId != 0 && stringBuilder.length() > 0)) { try { stringBuilder.setSpan(new ForegroundColorSpanThemable(Theme.key_chats_nameMessage, resourcesProvider), 0, thumbInsertIndex = messageNameString.length() + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); offsetName = thumbInsertIndex; @@ -1276,10 +1366,10 @@ public class DialogCell extends BaseCell { } else { messageString = message.messageText; } - if (message.topicIconDrawable[0] != null) { - TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-message.getDialogId(), MessageObject.getTopicId(message.messageOwner)); + if (message.topicIconDrawable[0] instanceof ForumBubbleDrawable) { + TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-message.getDialogId(), MessageObject.getTopicId(message.messageOwner, true)); if (topic != null) { - message.topicIconDrawable[0].setColor(topic.icon_color); + ((ForumBubbleDrawable) message.topicIconDrawable[0]).setColor(topic.icon_color); } } } else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && message.messageOwner.media.photo instanceof TLRPC.TL_photoEmpty && message.messageOwner.media.ttl_seconds != 0) { @@ -1518,8 +1608,21 @@ public class DialogCell extends BaseCell { nameString = LocaleController.getString("ArchivedChats", R.string.ArchivedChats); } else { if (chat != null) { - if (isTopic) { - nameString = forumTopic.title; + if (useFromUserAsAvatar) { + if (topicIconInName == null) { + topicIconInName = new Drawable[1]; + } + topicIconInName[0] = null; + nameString = MessagesController.getInstance(currentAccount).getTopicsController().getTopicIconName(chat, message, currentMessagePaint, topicIconInName); + if (nameString == null) { + nameString = ""; + } + } else if (isTopic) { + if (topicIconInName == null) { + topicIconInName = new Drawable[1]; + } + topicIconInName[0] = null; + nameString = showTopicIconInName ? ForumUtilities.getTopicSpannedName(forumTopic, Theme.dialogs_namePaint[paintIndex], topicIconInName) : forumTopic.title; } else { nameString = chat.title; } @@ -1648,7 +1751,10 @@ public class DialogCell extends BaseCell { if (ellipsizeWidth < 0) { ellipsizeWidth = 0; } - CharSequence nameStringFinal = nameString.replace('\n', ' '); + if (nameString instanceof String) { + nameString = ((String) nameString).replace('\n', ' '); + } + CharSequence nameStringFinal = nameString; if (nameLayoutEllipsizeByGradient) { nameLayoutFits = nameStringFinal.length() == TextUtils.ellipsize(nameStringFinal, Theme.dialogs_namePaint[paintIndex], ellipsizeWidth, TextUtils.TruncateAt.END).length(); ellipsizeWidth += AndroidUtilities.dp(48); @@ -1675,6 +1781,9 @@ public class DialogCell extends BaseCell { FileLog.e(e); } + animatedEmojiStackName = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStackName, nameLayout); + + int messageWidth; int avatarLeft; int avatarTop; @@ -1690,11 +1799,11 @@ public class DialogCell extends BaseCell { messageWidth = getMeasuredWidth() - AndroidUtilities.dp(messagePaddingStart + 21); if (LocaleController.isRTL) { - messageLeft = messageNameLeft = AndroidUtilities.dp(16); + typingLeft = messageLeft = messageNameLeft = AndroidUtilities.dp(16); avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(66); thumbLeft = avatarLeft - AndroidUtilities.dp(13 + 18); } else { - messageLeft = messageNameLeft = AndroidUtilities.dp(messagePaddingStart + 6); + typingLeft = messageLeft = messageNameLeft = AndroidUtilities.dp(messagePaddingStart + 6); avatarLeft = AndroidUtilities.dp(10); thumbLeft = avatarLeft + AndroidUtilities.dp(56 + 13); } @@ -1713,11 +1822,11 @@ public class DialogCell extends BaseCell { messageWidth = getMeasuredWidth() - AndroidUtilities.dp(messagePaddingStart + 23 - (LocaleController.isRTL ? 0 : 12)); if (LocaleController.isRTL) { - messageLeft = messageNameLeft = AndroidUtilities.dp(22); + typingLeft = messageLeft = messageNameLeft = AndroidUtilities.dp(22); avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(64); thumbLeft = avatarLeft - AndroidUtilities.dp(11 + (thumbsCount * (thumbSize + 2) - 2)); } else { - messageLeft = messageNameLeft = AndroidUtilities.dp(messagePaddingStart + 4); + typingLeft = messageLeft = messageNameLeft = AndroidUtilities.dp(messagePaddingStart + 4); avatarLeft = AndroidUtilities.dp(10); thumbLeft = avatarLeft + AndroidUtilities.dp(56 + 11); } @@ -1744,6 +1853,7 @@ public class DialogCell extends BaseCell { } else { errorLeft = AndroidUtilities.dp(11); messageLeft += w; + typingLeft += w; messageNameLeft += w; } } else if (countString != null || mentionString != null || drawReactionMention) { @@ -1757,6 +1867,7 @@ public class DialogCell extends BaseCell { } else { countLeft = AndroidUtilities.dp(20); messageLeft += w; + typingLeft += w; messageNameLeft += w; } drawCount = true; @@ -1777,6 +1888,7 @@ public class DialogCell extends BaseCell { } else { mentionLeft = AndroidUtilities.dp(20) + (countWidth != 0 ? countWidth + AndroidUtilities.dp(18) : 0); messageLeft += w; + typingLeft += w; messageNameLeft += w; } drawMention = true; @@ -1803,6 +1915,7 @@ public class DialogCell extends BaseCell { reactionMentionLeft += (countWidth != 0 ? (countWidth + AndroidUtilities.dp(18)) : 0); } messageLeft += w; + typingLeft += w; messageNameLeft += w; } } @@ -1812,6 +1925,7 @@ public class DialogCell extends BaseCell { messageWidth -= w; if (LocaleController.isRTL) { messageLeft += w; + typingLeft += w; messageNameLeft += w; } } @@ -1888,11 +2002,11 @@ public class DialogCell extends BaseCell { try { + buttonCreated = false; if (!TextUtils.isEmpty(buttonString)) { buttonString = Emoji.replaceEmoji(buttonString, currentMessagePaint.getFontMetricsInt(), AndroidUtilities.dp(17), false); CharSequence buttonStringFinal = TextUtils.ellipsize(buttonString, currentMessagePaint, messageWidth - AndroidUtilities.dp(26), TextUtils.TruncateAt.END); buttonLayout = new StaticLayout(buttonStringFinal, currentMessagePaint, messageWidth - AndroidUtilities.dp(20), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); - spoilersPool2.addAll(spoilers2); spoilers2.clear(); SpoilerEffect.addSpoilers(this, buttonLayout, spoilersPool2, spoilers2); @@ -1950,6 +2064,18 @@ public class DialogCell extends BaseCell { messageLayout = null; FileLog.e(e); } + + try { + if (!TextUtils.isEmpty(typingString)) { + if (useForceThreeLines || SharedConfig.useThreeLinesLayout) { + typingLayout = StaticLayoutEx.createStaticLayout(typingString, Theme.dialogs_messagePrintingPaint[paintIndex], messageWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, AndroidUtilities.dp(1), false, TextUtils.TruncateAt.END, messageWidth, typingString != null ? 1 : 2); + } else { + typingLayout = new StaticLayout(typingString, Theme.dialogs_messagePrintingPaint[paintIndex], messageWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + } + } + } catch (Exception e) { + FileLog.e(e); + } animatedEmojiStack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, animatedEmojiStack, messageLayout); double widthpx; @@ -1996,6 +2122,25 @@ public class DialogCell extends BaseCell { } } } + if (typingLayout != null) { + int lineCount = typingLayout.getLineCount(); + if (lineCount > 0) { + int w = Integer.MAX_VALUE; + for (int a = 0; a < lineCount; a++) { + left = typingLayout.getLineLeft(a); + if (left == 0) { + widthpx = Math.ceil(typingLayout.getLineWidth(a)); + w = Math.min(w, (int) (messageWidth - widthpx)); + } else { + w = 0; + break; + } + } + if (w != Integer.MAX_VALUE) { + typingLeft += w; + } + } + } if (messageNameLayout != null && messageNameLayout.getLineCount() > 0) { left = messageNameLayout.getLineLeft(0); if (left == 0) { @@ -2036,23 +2181,33 @@ public class DialogCell extends BaseCell { messageLeft -= left; } } + if (typingLayout != null) { + int lineCount = typingLayout.getLineCount(); + if (lineCount > 0) { + left = Integer.MAX_VALUE; + for (int a = 0; a < lineCount; a++) { + left = Math.min(left, typingLayout.getLineLeft(a)); + } + typingLeft -= left; + } + } if (messageNameLayout != null && messageNameLayout.getLineCount() > 0) { messageNameLeft -= messageNameLayout.getLineLeft(0); } } - if (messageLayout != null && printingStringType >= 0 && messageLayout.getText().length() > 0) { + if (typingLayout != null && printingStringType >= 0 && typingLayout.getText().length() > 0) { float x1, x2; - if (printingStringReplaceIndex >= 0 && printingStringReplaceIndex + 1 < messageLayout.getText().length() ){ - x1 = messageLayout.getPrimaryHorizontal(printingStringReplaceIndex); - x2 = messageLayout.getPrimaryHorizontal(printingStringReplaceIndex + 1); + if (printingStringReplaceIndex >= 0 && printingStringReplaceIndex + 1 < typingLayout.getText().length() ){ + x1 = typingLayout.getPrimaryHorizontal(printingStringReplaceIndex); + x2 = typingLayout.getPrimaryHorizontal(printingStringReplaceIndex + 1); } else { - x1 = messageLayout.getPrimaryHorizontal(0); - x2 = messageLayout.getPrimaryHorizontal(1); + x1 = typingLayout.getPrimaryHorizontal(0); + x2 = typingLayout.getPrimaryHorizontal(1); } if (x1 < x2) { - statusDrawableLeft = (int) (messageLeft + x1); + statusDrawableLeft = (int) (typingLeft + x1); } else { - statusDrawableLeft = (int) (messageLeft + x2 + AndroidUtilities.dp(3)); + statusDrawableLeft = (int) (typingLeft + x2 + AndroidUtilities.dp(3)); } } updateThumbsPosition(); @@ -2118,7 +2273,7 @@ public class DialogCell extends BaseCell { int topMessageTopicId = 0; int boldLen = 0; if (message != null) { - topMessageTopicId = MessageObject.getTopicId(message.messageOwner); + topMessageTopicId = MessageObject.getTopicId(message.messageOwner, true); TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(chat.id, topMessageTopicId); if (topic != null) { CharSequence topicString = ForumUtilities.getTopicSpannedName(topic, currentMessagePaint); @@ -2134,6 +2289,8 @@ public class DialogCell extends BaseCell { } else { lastTopicMessageUnread = topic.unread_count > 0; } + } else { + lastTopicMessageUnread = false; } if (lastTopicMessageUnread) { spannableStringBuilder.append(" "); @@ -2179,7 +2336,7 @@ public class DialogCell extends BaseCell { return null; } - protected boolean isForumCell() { + public boolean isForumCell() { return !isDialogFolder() && chat != null && chat.forum && !isTopic; } @@ -2267,75 +2424,7 @@ public class DialogCell extends BaseCell { } public boolean checkCurrentDialogIndex(boolean frozen) { - if (parentFragment == null) { - return false; - } - ArrayList dialogsArray = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, frozen); - boolean requestLayout = false; - if (index < dialogsArray.size()) { - TLRPC.Dialog dialog = dialogsArray.get(index); - TLRPC.Dialog nextDialog = index + 1 < dialogsArray.size() ? dialogsArray.get(index + 1) : null; - TLRPC.DraftMessage newDraftMessage = MediaDataController.getInstance(currentAccount).getDraft(currentDialogId, 0); - MessageObject newMessageObject; - if (currentDialogFolderId != 0) { - newMessageObject = findFolderTopMessage(); - groupMessages = null; - } else { - groupMessages = MessagesController.getInstance(currentAccount).dialogMessage.get(dialog.id); - newMessageObject = groupMessages != null && groupMessages.size() > 0 ? groupMessages.get(0) : null; - } - if (currentDialogId != dialog.id || - message != null && message.getId() != dialog.top_message || - newMessageObject != null && newMessageObject.messageOwner.edit_date != currentEditDate || - unreadCount != dialog.unread_count || - mentionCount != dialog.unread_mentions_count || - markUnread != dialog.unread_mark || - message != newMessageObject || - newDraftMessage != draftMessage || drawPin != dialog.pinned) { - boolean dialogChanged = currentDialogId != dialog.id; - - if (isForum != MessagesController.getInstance(currentAccount).isForum(dialog.id)) { - requestLayout = true; - } - isForum = MessagesController.getInstance(currentAccount).isForum(dialog.id); - - currentDialogId = dialog.id; - if (dialogChanged) { - lastDialogChangedTime = System.currentTimeMillis(); - if (statusDrawableAnimator != null) { - statusDrawableAnimator.removeAllListeners(); - statusDrawableAnimator.cancel(); - } - statusDrawableAnimationInProgress = false; - lastStatusDrawableParams = -1; - } - if (dialog instanceof TLRPC.TL_dialogFolder) { - TLRPC.TL_dialogFolder dialogFolder = (TLRPC.TL_dialogFolder) dialog; - currentDialogFolderId = dialogFolder.folder.id; - } else { - currentDialogFolderId = 0; - } - if (dialogsType == 7 || dialogsType == 8) { - MessagesController.DialogFilter filter = MessagesController.getInstance(currentAccount).selectedDialogFilter[dialogsType == 8 ? 1 : 0]; - fullSeparator = dialog instanceof TLRPC.TL_dialog && nextDialog != null && filter != null && filter.pinnedDialogs.indexOfKey(dialog.id) >= 0 && filter.pinnedDialogs.indexOfKey(nextDialog.id) < 0; - fullSeparator2 = false; - } else { - fullSeparator = dialog instanceof TLRPC.TL_dialog && dialog.pinned && nextDialog != null && !nextDialog.pinned; - fullSeparator2 = dialog instanceof TLRPC.TL_dialogFolder && nextDialog != null && !nextDialog.pinned; - } - update(0, !dialogChanged); - if (dialogChanged) { - reorderIconProgress = drawPin && drawReorder ? 1.0f : 0.0f; - } - checkOnline(); - checkGroupCall(); - checkChatTheme(); - } - } - if (requestLayout) { - requestLayout(); - } - return requestLayout; + return false; } public void animateArchiveAvatar() { @@ -2350,8 +2439,17 @@ public class DialogCell extends BaseCell { } public void setChecked(boolean checked, boolean animated) { + if (checkBox == null && !checked) { + return; + } if (checkBox == null) { - checkBox = new CheckBox2(getContext(), 21, resourcesProvider); + checkBox = new CheckBox2(getContext(), 21, resourcesProvider) { + @Override + public void invalidate() { + super.invalidate(); + DialogCell.this.invalidate(); + } + }; checkBox.setColor(null, Theme.key_windowBackgroundWhite, Theme.key_checkboxCheck); checkBox.setDrawUnchecked(false); checkBox.setDrawBackgroundAsArc(3); @@ -2364,18 +2462,21 @@ public class DialogCell extends BaseCell { if (parentFragment == null) { return null; } - ArrayList dialogs = parentFragment.getDialogsArray(currentAccount, dialogsType, currentDialogFolderId, false); MessageObject maxMessage = null; - if (!dialogs.isEmpty()) { + ArrayList dialogs = parentFragment.getDialogsArray(currentAccount, dialogsType, currentDialogFolderId, false); + if (dialogs != null && !dialogs.isEmpty()) { for (int a = 0, N = dialogs.size(); a < N; a++) { TLRPC.Dialog dialog = dialogs.get(a); - ArrayList groupMessages = MessagesController.getInstance(currentAccount).dialogMessage.get(dialog.id); - MessageObject object = groupMessages != null && groupMessages.size() > 0 ? groupMessages.get(0) : null; - if (object != null && (maxMessage == null || object.messageOwner.date > maxMessage.messageOwner.date)) { - maxMessage = object; - } - if (dialog.pinnedNum == 0 && maxMessage != null) { - break; + LongSparseArray> dialogMessage = MessagesController.getInstance(currentAccount).dialogMessage; + if (dialogMessage != null) { + ArrayList groupMessages = dialogMessage.get(dialog.id); + MessageObject object = groupMessages != null && !groupMessages.isEmpty() ? groupMessages.get(0) : null; + if (object != null && (maxMessage == null || object.messageOwner.date > maxMessage.messageOwner.date)) { + maxMessage = object; + } + if (dialog.pinnedNum == 0 && maxMessage != null) { + break; + } } } } @@ -2392,6 +2493,9 @@ public class DialogCell extends BaseCell { public boolean update(int mask, boolean animated) { boolean requestLayout = false; + boolean oldIsForumCell = isForumCell(); + drawAvatarSelector = false; + ttlPeriod = 0; if (customDialog != null) { lastMessageDate = customDialog.date; lastUnreadState = customDialog.unread_count != 0; @@ -2410,13 +2514,13 @@ public class DialogCell extends BaseCell { int oldUnreadCount = unreadCount; boolean oldHasReactionsMentions = reactionMentionCount != 0; boolean oldMarkUnread = markUnread; - boolean oldIsForumCell = isForumCell(); hasUnmutedTopics = false; readOutboxMaxId = -1; if (isDialogCell) { TLRPC.Dialog dialog = MessagesController.getInstance(currentAccount).dialogs_dict.get(currentDialogId); if (dialog != null) { readOutboxMaxId = dialog.read_outbox_max_id; + ttlPeriod = dialog.ttl_period; if (mask == 0) { clearingDialog = MessagesController.getInstance(currentAccount).isClearingDialog(dialog.id); groupMessages = MessagesController.getInstance(currentAccount).dialogMessage.get(dialog.id); @@ -2424,9 +2528,6 @@ public class DialogCell extends BaseCell { lastUnreadState = message != null && message.isUnread(); TLRPC.Chat localChat = MessagesController.getInstance(currentAccount).getChat(-dialog.id); boolean isForumCell = localChat != null && localChat.forum && !isTopic; - if (isForumCell != oldIsForumCell) { - requestLayout = true; - } if (localChat != null && localChat.forum) { int[] counts = MessagesController.getInstance(currentAccount).getTopicsController().getForumUnreadCount(localChat.id); unreadCount = counts[0]; @@ -2463,6 +2564,7 @@ public class DialogCell extends BaseCell { lastMessageDate = 0; clearingDialog = false; } + drawAvatarSelector = currentDialogId != 0 && currentDialogId == RightSlidingDialogContainer.fragmentDialogId; } else { drawPin = false; } @@ -2646,7 +2748,10 @@ public class DialogCell extends BaseCell { avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_ARCHIVED); avatarImage.setImage(null, null, avatarDrawable, null, user, 0); } else { - if (user != null) { + if (useFromUserAsAvatar && message != null) { + avatarDrawable.setInfo(message.getFromPeerObject()); + avatarImage.setForUserOrChat(message.getFromPeerObject(), avatarDrawable); + } else if (user != null) { avatarDrawable.setInfo(user); if (UserObject.isReplyUser(user)) { avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); @@ -2751,12 +2856,12 @@ public class DialogCell extends BaseCell { reactionsMentionsAnimator.start(); } - avatarImage.setRoundRadius(chat != null && chat.forum && currentDialogFolderId == 0 ? AndroidUtilities.dp(16) : AndroidUtilities.dp(28)); + avatarImage.setRoundRadius(chat != null && chat.forum && currentDialogFolderId == 0 && !useFromUserAsAvatar ? AndroidUtilities.dp(16) : AndroidUtilities.dp(28)); } if (!isTopic && (getMeasuredWidth() != 0 || getMeasuredHeight() != 0)) { buildLayout(); } else { - requestLayout(); + //requestLayout(); } if (!animated) { @@ -2767,6 +2872,9 @@ public class DialogCell extends BaseCell { } invalidate(); + if (isForumCell() != oldIsForumCell) { + requestLayout = true; + } return requestLayout; } @@ -2805,9 +2913,7 @@ public class DialogCell extends BaseCell { if (prevValue != drawRevealBackground && archiveHidden == SharedConfig.archiveHidden) { try { performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - - } + } catch (Exception ignore) {} } } invalidate(); @@ -2822,9 +2928,10 @@ public class DialogCell extends BaseCell { boolean needInvalidate = false; - if (currentDialogFolderId != 0 && archivedChatsDrawable != null && archivedChatsDrawable.outProgress == 0.0f && translationX == 0.0f) { + if ((currentDialogFolderId != 0 || isTopic && forumTopic != null && forumTopic.id == 1) && archivedChatsDrawable != null && archivedChatsDrawable.outProgress == 0.0f && translationX == 0.0f) { if (!drawingForBlur) { canvas.save(); + canvas.translate(0, -translateY); canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight()); archivedChatsDrawable.draw(canvas); canvas.restore(); @@ -2832,13 +2939,6 @@ public class DialogCell extends BaseCell { return; } - long newTime = SystemClock.elapsedRealtime(); - long dt = newTime - lastUpdateTime; - if (dt > 17) { - dt = 17; - } - lastUpdateTime = newTime; - if (clipProgress != 0.0f && Build.VERSION.SDK_INT != 24) { canvas.save(); canvas.clipRect(0, topClip * clipProgress, getMeasuredWidth(), getMeasuredHeight() - (int) (bottomClip * clipProgress)); @@ -2847,10 +2947,16 @@ public class DialogCell extends BaseCell { int backgroundColor = 0; if (translationX != 0 || cornerProgress != 0.0f) { canvas.save(); + canvas.translate(0, -translateY); String swipeMessage; int revealBackgroundColor; int swipeMessageStringId; - if (currentDialogFolderId != 0) { + if (overrideSwipeAction) { + backgroundColor = Theme.getColor(overrideSwipeActionBackgroundColorKey, resourcesProvider); + revealBackgroundColor = Theme.getColor(overrideSwipeActionRevealBackgroundColorKey, resourcesProvider); + swipeMessage = LocaleController.getString(overrideSwipeActionStringKey, swipeMessageStringId = overrideSwipeActionStringId); + translationDrawable = overrideSwipeActionDrawable; + } else if (currentDialogFolderId != 0) { if (archiveHidden) { backgroundColor = Theme.getColor(Theme.key_chats_archivePinBackground, resourcesProvider); revealBackgroundColor = Theme.getColor(Theme.key_chats_archiveBackground, resourcesProvider); @@ -2946,7 +3052,7 @@ public class DialogCell extends BaseCell { } } int drawableX = getMeasuredWidth() - AndroidUtilities.dp(43) - translationDrawable.getIntrinsicWidth() / 2; - int drawableY = AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12 : 9); + int drawableY = (getMeasuredHeight() - AndroidUtilities.dp(54)) / 2; int drawableCx = drawableX + translationDrawable.getIntrinsicWidth() / 2; int drawableCy = drawableY + translationDrawable.getIntrinsicHeight() / 2; @@ -3000,7 +3106,7 @@ public class DialogCell extends BaseCell { if (swipeMessageTextLayout != null) { canvas.save(); float yOffset = swipeMessageTextLayout.getLineCount() > 1 ? -AndroidUtilities.dp(4) : 0; - canvas.translate(getMeasuredWidth() - AndroidUtilities.dp(43) - swipeMessageTextLayout.getWidth() / 2f, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 50 : 47) + yOffset); + canvas.translate(getMeasuredWidth() - AndroidUtilities.dp(43) - swipeMessageTextLayout.getWidth() / 2f, drawableY + AndroidUtilities.dp(54 - 16) + yOffset); swipeMessageTextLayout.draw(canvas); canvas.restore(); } @@ -3020,516 +3126,525 @@ public class DialogCell extends BaseCell { float cornersRadius = AndroidUtilities.dp(8) * cornerProgress; if (isSelected) { - rect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); + rect.set(0, 0, getMeasuredWidth(), AndroidUtilities.lerp(getMeasuredHeight(), getCollapsedHeight(), rightFragmentOpenedProgress)); + rect.offset(0, -translateY + collapseOffset); canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_tabletSeletedPaint); } + if (currentDialogFolderId != 0 && (!SharedConfig.archiveHidden || archiveBackgroundProgress != 0)) { Theme.dialogs_pinnedPaint.setColor(AndroidUtilities.getOffsetColor(0, Theme.getColor(Theme.key_chats_pinnedOverlay, resourcesProvider), archiveBackgroundProgress, 1.0f)); - canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - translateY, Theme.dialogs_pinnedPaint); + Theme.dialogs_pinnedPaint.setAlpha((int) (Theme.dialogs_pinnedPaint.getAlpha() * (1f - rightFragmentOpenedProgress))); + canvas.drawRect(-xOffset, 0, getMeasuredWidth(), getMeasuredHeight() - translateY, Theme.dialogs_pinnedPaint); } else if (getIsPinned() || drawPinBackground) { Theme.dialogs_pinnedPaint.setColor(Theme.getColor(Theme.key_chats_pinnedOverlay, resourcesProvider)); - canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - translateY, Theme.dialogs_pinnedPaint); + Theme.dialogs_pinnedPaint.setAlpha((int) (Theme.dialogs_pinnedPaint.getAlpha() * (1f - rightFragmentOpenedProgress))); + canvas.drawRect(-xOffset, 0, getMeasuredWidth(), getMeasuredHeight() - translateY, Theme.dialogs_pinnedPaint); } - if (translationX != 0 || cornerProgress != 0.0f) { + updateHelper.updateAnimationValues(); + + if (collapseOffset != 0) { canvas.save(); - - Theme.dialogs_pinnedPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); - rect.set(getMeasuredWidth() - AndroidUtilities.dp(64), 0, getMeasuredWidth(), getMeasuredHeight()); - canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_pinnedPaint); - - if (isSelected) { - canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_tabletSeletedPaint); - } - - if (currentDialogFolderId != 0 && (!SharedConfig.archiveHidden || archiveBackgroundProgress != 0)) { - Theme.dialogs_pinnedPaint.setColor(AndroidUtilities.getOffsetColor(0, Theme.getColor(Theme.key_chats_pinnedOverlay, resourcesProvider), archiveBackgroundProgress, 1.0f)); - canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_pinnedPaint); - } else if (getIsPinned() || drawPinBackground) { - Theme.dialogs_pinnedPaint.setColor(Theme.getColor(Theme.key_chats_pinnedOverlay, resourcesProvider)); - canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_pinnedPaint); - } - canvas.restore(); + canvas.translate(0, collapseOffset); } - if (translationX != 0) { - if (cornerProgress < 1.0f) { - cornerProgress += dt / 150.0f; - if (cornerProgress > 1.0f) { - cornerProgress = 1.0f; + if (rightFragmentOpenedProgress != 1) { + int restoreToCount = -1; + if (rightFragmentOpenedProgress != 0) { + float startAnimationProgress = Utilities.clamp(rightFragmentOpenedProgress / 0.4f, 1f, 0); + if (SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH) { + restoreToCount = canvas.saveLayerAlpha(AndroidUtilities.dp(RightSlidingDialogContainer.getRightPaddingSize() + 1) - AndroidUtilities.dp(8) * (1f - startAnimationProgress), 0, getMeasuredWidth(), getMeasuredHeight(), (int) (255 * (1f - rightFragmentOpenedProgress)), Canvas.ALL_SAVE_FLAG); + } else { + restoreToCount = canvas.save(); + canvas.clipRect(AndroidUtilities.dp(RightSlidingDialogContainer.getRightPaddingSize() + 1) - AndroidUtilities.dp(8) * (1f - startAnimationProgress), 0, getMeasuredWidth(), getMeasuredHeight()); + } + canvas.translate(-(getMeasuredWidth() - AndroidUtilities.dp(74)) * 0.7f * rightFragmentOpenedProgress, 0); + } + + if (translationX != 0 || cornerProgress != 0.0f) { + canvas.save(); + + Theme.dialogs_pinnedPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); + rect.set(getMeasuredWidth() - AndroidUtilities.dp(64), 0, getMeasuredWidth(), getMeasuredHeight()); + rect.offset(0, -translateY); + canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_pinnedPaint); + + if (isSelected) { + canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_tabletSeletedPaint); + } + + if (currentDialogFolderId != 0 && (!SharedConfig.archiveHidden || archiveBackgroundProgress != 0)) { + Theme.dialogs_pinnedPaint.setColor(AndroidUtilities.getOffsetColor(0, Theme.getColor(Theme.key_chats_pinnedOverlay, resourcesProvider), archiveBackgroundProgress, 1.0f)); + Theme.dialogs_pinnedPaint.setAlpha((int) (Theme.dialogs_pinnedPaint.getAlpha() * (1f - rightFragmentOpenedProgress))); + canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_pinnedPaint); + } else if (getIsPinned() || drawPinBackground) { + Theme.dialogs_pinnedPaint.setColor(Theme.getColor(Theme.key_chats_pinnedOverlay, resourcesProvider)); + Theme.dialogs_pinnedPaint.setAlpha((int) (Theme.dialogs_pinnedPaint.getAlpha() * (1f - rightFragmentOpenedProgress))); + canvas.drawRoundRect(rect, cornersRadius, cornersRadius, Theme.dialogs_pinnedPaint); + } + canvas.restore(); + } + + if (translationX != 0) { + if (cornerProgress < 1.0f) { + cornerProgress += 16f / 150.0f; + if (cornerProgress > 1.0f) { + cornerProgress = 1.0f; + } + needInvalidate = true; + } + } else if (cornerProgress > 0.0f) { + cornerProgress -= 16f / 150.0f; + if (cornerProgress < 0.0f) { + cornerProgress = 0.0f; } needInvalidate = true; } - } else if (cornerProgress > 0.0f) { - cornerProgress -= dt / 150.0f; - if (cornerProgress < 0.0f) { - cornerProgress = 0.0f; - } - needInvalidate = true; - } - if (drawNameLock) { - setDrawableBounds(Theme.dialogs_lockDrawable, nameLockLeft, nameLockTop); - Theme.dialogs_lockDrawable.draw(canvas); - } - if (nameLayout != null) { - if (nameLayoutEllipsizeByGradient && !nameLayoutFits) { - if (nameLayoutEllipsizeLeft && fadePaint == null) { - fadePaint = new Paint(); - fadePaint.setShader(new LinearGradient(0, 0, AndroidUtilities.dp(24), 0, new int[]{0xffffffff, 0}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); - fadePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); - } else if (fadePaintBack == null) { - fadePaintBack = new Paint(); - fadePaintBack.setShader(new LinearGradient(0, 0, AndroidUtilities.dp(24), 0, new int[]{0, 0xffffffff}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); - fadePaintBack.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); - } - canvas.saveLayerAlpha(0, 0, getMeasuredWidth(), getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG); - canvas.clipRect(nameLeft, 0, nameLeft + nameWidth, getMeasuredHeight()); + if (drawNameLock) { + setDrawableBounds(Theme.dialogs_lockDrawable, nameLockLeft, nameLockTop); + Theme.dialogs_lockDrawable.draw(canvas); } - if (currentDialogFolderId != 0) { - Theme.dialogs_namePaint[paintIndex].setColor(Theme.dialogs_namePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_nameArchived, resourcesProvider)); - } else if (encryptedChat != null || customDialog != null && customDialog.type == 2) { - Theme.dialogs_namePaint[paintIndex].setColor(Theme.dialogs_namePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_secretName, resourcesProvider)); - } else { - Theme.dialogs_namePaint[paintIndex].setColor(Theme.dialogs_namePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_name, resourcesProvider)); - } - canvas.save(); - canvas.translate(nameLeft + nameLayoutTranslateX, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 10 : 13)); - nameLayout.draw(canvas); - canvas.restore(); - if (nameLayoutEllipsizeByGradient && !nameLayoutFits) { - canvas.save(); - if (nameLayoutEllipsizeLeft) { - canvas.translate(nameLeft , 0); - canvas.drawRect(0, 0, AndroidUtilities.dp(24), getMeasuredHeight(), fadePaint); - } else { - canvas.translate(nameLeft + nameWidth - AndroidUtilities.dp(24), 0); - canvas.drawRect(0, 0, AndroidUtilities.dp(24), getMeasuredHeight(), fadePaintBack); - } - canvas.restore(); - canvas.restore(); - } - } - if (timeLayout != null && currentDialogFolderId == 0) { - canvas.save(); - canvas.translate(timeLeft, timeTop); - timeLayout.draw(canvas); - canvas.restore(); - } - - if (drawLock2()) { - Theme.dialogs_lock2Drawable.setBounds( - lock2Left, - timeTop + (timeLayout.getHeight() - Theme.dialogs_lock2Drawable.getIntrinsicHeight()) / 2, - lock2Left + Theme.dialogs_lock2Drawable.getIntrinsicWidth(), - timeTop + (timeLayout.getHeight() - Theme.dialogs_lock2Drawable.getIntrinsicHeight()) / 2 + Theme.dialogs_lock2Drawable.getIntrinsicHeight() - ); - Theme.dialogs_lock2Drawable.draw(canvas); - } - - if (messageNameLayout != null && !isForumCell()) { - if (currentDialogFolderId != 0) { - Theme.dialogs_messageNamePaint.setColor(Theme.dialogs_messageNamePaint.linkColor = Theme.getColor(Theme.key_chats_nameMessageArchived_threeLines, resourcesProvider)); - } else if (draftMessage != null) { - Theme.dialogs_messageNamePaint.setColor(Theme.dialogs_messageNamePaint.linkColor = Theme.getColor(Theme.key_chats_draft, resourcesProvider)); - } else { - Theme.dialogs_messageNamePaint.setColor(Theme.dialogs_messageNamePaint.linkColor = Theme.getColor(Theme.key_chats_nameMessage_threeLines, resourcesProvider)); - } - canvas.save(); - canvas.translate(messageNameLeft, messageNameTop); - try { - messageNameLayout.draw(canvas); - AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageNameLayout, animatedEmojiStack2, -.075f, null, 0, 0, 0, 1f); - } catch (Exception e) { - FileLog.e(e); - } - canvas.restore(); - } - - if (messageLayout != null) { - if (currentDialogFolderId != 0) { - if (chat != null) { - Theme.dialogs_messagePaint[paintIndex].setColor(Theme.dialogs_messagePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_nameMessageArchived, resourcesProvider)); - } else { - Theme.dialogs_messagePaint[paintIndex].setColor(Theme.dialogs_messagePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_messageArchived, resourcesProvider)); - } - } else { - Theme.dialogs_messagePaint[paintIndex].setColor(Theme.dialogs_messagePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_message, resourcesProvider)); - } - canvas.save(); - canvas.translate(messageLeft, messageTop); - if (!spoilers.isEmpty()) { - try { - canvas.save(); - SpoilerEffect.clipOutCanvas(canvas, spoilers); - messageLayout.draw(canvas); - AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageLayout, animatedEmojiStack, -.075f, spoilers, 0, 0, 0, 1f); - canvas.restore(); - - for (int i = 0; i < spoilers.size(); i++) { - SpoilerEffect eff = spoilers.get(i); - eff.setColor(messageLayout.getPaint().getColor()); - eff.draw(canvas); + if (nameLayout != null) { + if (nameLayoutEllipsizeByGradient && !nameLayoutFits) { + if (nameLayoutEllipsizeLeft && fadePaint == null) { + fadePaint = new Paint(); + fadePaint.setShader(new LinearGradient(0, 0, AndroidUtilities.dp(24), 0, new int[]{0xffffffff, 0}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + fadePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + } else if (fadePaintBack == null) { + fadePaintBack = new Paint(); + fadePaintBack.setShader(new LinearGradient(0, 0, AndroidUtilities.dp(24), 0, new int[]{0, 0xffffffff}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + fadePaintBack.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); } + canvas.saveLayerAlpha(0, 0, getMeasuredWidth(), getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG); + canvas.clipRect(nameLeft, 0, nameLeft + nameWidth, getMeasuredHeight()); + } + if (currentDialogFolderId != 0) { + Theme.dialogs_namePaint[paintIndex].setColor(Theme.dialogs_namePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_nameArchived, resourcesProvider)); + } else if (encryptedChat != null || customDialog != null && customDialog.type == 2) { + Theme.dialogs_namePaint[paintIndex].setColor(Theme.dialogs_namePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_secretName, resourcesProvider)); + } else { + Theme.dialogs_namePaint[paintIndex].setColor(Theme.dialogs_namePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_name, resourcesProvider)); + } + canvas.save(); + canvas.translate(nameLeft + nameLayoutTranslateX, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 10 : 13)); + nameLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, nameLayout, animatedEmojiStackName, -.075f, null, 0, 0, 0, 1f); + canvas.restore(); + if (nameLayoutEllipsizeByGradient && !nameLayoutFits) { + canvas.save(); + if (nameLayoutEllipsizeLeft) { + canvas.translate(nameLeft, 0); + canvas.drawRect(0, 0, AndroidUtilities.dp(24), getMeasuredHeight(), fadePaint); + } else { + canvas.translate(nameLeft + nameWidth - AndroidUtilities.dp(24), 0); + canvas.drawRect(0, 0, AndroidUtilities.dp(24), getMeasuredHeight(), fadePaintBack); + } + canvas.restore(); + canvas.restore(); + } + } + + if (timeLayout != null && currentDialogFolderId == 0) { + canvas.save(); + canvas.translate(timeLeft, timeTop); + timeLayout.draw(canvas); + canvas.restore(); + } + + if (drawLock2()) { + Theme.dialogs_lock2Drawable.setBounds( + lock2Left, + timeTop + (timeLayout.getHeight() - Theme.dialogs_lock2Drawable.getIntrinsicHeight()) / 2, + lock2Left + Theme.dialogs_lock2Drawable.getIntrinsicWidth(), + timeTop + (timeLayout.getHeight() - Theme.dialogs_lock2Drawable.getIntrinsicHeight()) / 2 + Theme.dialogs_lock2Drawable.getIntrinsicHeight() + ); + Theme.dialogs_lock2Drawable.draw(canvas); + } + + if (messageNameLayout != null && !isForumCell()) { + if (currentDialogFolderId != 0) { + Theme.dialogs_messageNamePaint.setColor(Theme.dialogs_messageNamePaint.linkColor = Theme.getColor(Theme.key_chats_nameMessageArchived_threeLines, resourcesProvider)); + } else if (draftMessage != null) { + Theme.dialogs_messageNamePaint.setColor(Theme.dialogs_messageNamePaint.linkColor = Theme.getColor(Theme.key_chats_draft, resourcesProvider)); + } else { + Theme.dialogs_messageNamePaint.setColor(Theme.dialogs_messageNamePaint.linkColor = Theme.getColor(Theme.key_chats_nameMessage_threeLines, resourcesProvider)); + } + canvas.save(); + canvas.translate(messageNameLeft, messageNameTop); + try { + messageNameLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageNameLayout, animatedEmojiStack2, -.075f, null, 0, 0, 0, 1f); } catch (Exception e) { FileLog.e(e); } - } else { - messageLayout.draw(canvas); - AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageLayout, animatedEmojiStack, -.075f, null, 0, 0, 0, 1f); + canvas.restore(); } - canvas.restore(); - if (printingStringType >= 0) { - StatusDrawable statusDrawable = Theme.getChatStatusDrawable(printingStringType); - if (statusDrawable != null) { - canvas.save(); - if (printingStringType == 1 || printingStringType == 4) { - canvas.translate(statusDrawableLeft, messageTop + (printingStringType == 1 ? AndroidUtilities.dp(1) : 0)); + if (messageLayout != null) { + if (currentDialogFolderId != 0) { + if (chat != null) { + Theme.dialogs_messagePaint[paintIndex].setColor(Theme.dialogs_messagePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_nameMessageArchived, resourcesProvider)); } else { - canvas.translate(statusDrawableLeft, messageTop + (AndroidUtilities.dp(18) - statusDrawable.getIntrinsicHeight()) / 2f); + Theme.dialogs_messagePaint[paintIndex].setColor(Theme.dialogs_messagePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_messageArchived, resourcesProvider)); } - statusDrawable.draw(canvas); - invalidate(statusDrawableLeft, messageTop, statusDrawableLeft + statusDrawable.getIntrinsicWidth(), messageTop + statusDrawable.getIntrinsicHeight()); + } else { + Theme.dialogs_messagePaint[paintIndex].setColor(Theme.dialogs_messagePaint[paintIndex].linkColor = Theme.getColor(Theme.key_chats_message, resourcesProvider)); + } + float top; + float typingAnimationOffset = AndroidUtilities.dp(14); + if (updateHelper.typingOutToTop) { + top = messageTop - typingAnimationOffset * updateHelper.typingProgres; + } else { + top = messageTop + typingAnimationOffset * updateHelper.typingProgres; + } + if (updateHelper.typingProgres != 1f) { + canvas.save(); + canvas.translate(messageLeft, top); + int oldAlpha = messageLayout.getPaint().getAlpha(); + messageLayout.getPaint().setAlpha((int) (oldAlpha * (1f - updateHelper.typingProgres))); + if (!spoilers.isEmpty()) { + try { + canvas.save(); + SpoilerEffect.clipOutCanvas(canvas, spoilers); + messageLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageLayout, animatedEmojiStack, -.075f, spoilers, 0, 0, 0, 1f); + canvas.restore(); + + for (int i = 0; i < spoilers.size(); i++) { + SpoilerEffect eff = spoilers.get(i); + eff.setColor(messageLayout.getPaint().getColor()); + eff.draw(canvas); + } + } catch (Exception e) { + FileLog.e(e); + } + } else { + messageLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, messageLayout, animatedEmojiStack, -.075f, null, 0, 0, 0, 1f); + } + messageLayout.getPaint().setAlpha(oldAlpha); canvas.restore(); } - } - } - if (buttonLayout != null) { - canvas.save(); - if (buttonBackgroundPaint == null) { - buttonBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - } - if (canvasButton == null) { - canvasButton = new CanvasButton(this); - canvasButton.setDelegate(() -> { - delegate.onButtonClicked(this); - }); - canvasButton.setLongPress(() -> { - delegate.onButtonLongPress(this); - }); + canvas.save(); + if (updateHelper.typingOutToTop) { + top = messageTop + typingAnimationOffset * (1f - updateHelper.typingProgres); + } else { + top = messageTop - typingAnimationOffset * (1f - updateHelper.typingProgres); + } + canvas.translate(typingLeft, top); + if (typingLayout != null && updateHelper.typingProgres > 0) { + int oldAlpha = typingLayout.getPaint().getAlpha(); + typingLayout.getPaint().setAlpha((int) (oldAlpha * updateHelper.typingProgres)); + typingLayout.draw(canvas); + typingLayout.getPaint().setAlpha(oldAlpha); + } + canvas.restore(); + + if (typingLayout != null && (printingStringType >= 0 || (updateHelper.typingProgres > 0 && updateHelper.lastKnownTypingType >= 0))) { + int type = printingStringType >= 0 ? printingStringType : updateHelper.lastKnownTypingType; + StatusDrawable statusDrawable = Theme.getChatStatusDrawable(type); + if (statusDrawable != null) { + canvas.save(); + int color = Theme.getColor(Theme.key_chats_actionMessage); + statusDrawable.setColor(ColorUtils.setAlphaComponent(color, (int) (Color.alpha(color) * updateHelper.typingProgres))); + if (updateHelper.typingOutToTop) { + top = messageTop + typingAnimationOffset * (1f - updateHelper.typingProgres); + } else { + top = messageTop - typingAnimationOffset * (1f - updateHelper.typingProgres); + } + if (type == 1 || type == 4) { + canvas.translate(statusDrawableLeft, top + (type == 1 ? AndroidUtilities.dp(1) : 0)); + } else { + canvas.translate(statusDrawableLeft, top + (AndroidUtilities.dp(18) - statusDrawable.getIntrinsicHeight()) / 2f); + } + statusDrawable.draw(canvas); + invalidate(); + canvas.restore(); + } + } } - if (lastTopicMessageUnread) { - canvasButton.setColor(ColorUtils.setAlphaComponent(currentMessagePaint.getColor(), Theme.isCurrentThemeDark() ? 36 : 26)); - canvasButton.rewind(); - if (topMessageTopicEndIndex != topMessageTopicStartIndex && topMessageTopicEndIndex > 0) { - AndroidUtilities.rectTmp.set(messageLeft + AndroidUtilities.dp(2), messageTop, messageLeft + messageLayout.getPrimaryHorizontal(Math.min(messageLayout.getText().length(), topMessageTopicEndIndex)) - AndroidUtilities.dp(3), buttonTop - AndroidUtilities.dp(4)); - AndroidUtilities.rectTmp.inset(-AndroidUtilities.dp(8), -AndroidUtilities.dp(4)); - if (AndroidUtilities.rectTmp.right > AndroidUtilities.rectTmp.left) { + if (buttonLayout != null) { + canvas.save(); + if (buttonBackgroundPaint == null) { + buttonBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + } + if (canvasButton == null) { + canvasButton = new CanvasButton(this); + canvasButton.setDelegate(() -> { + if (delegate != null) { + delegate.onButtonClicked(this); + } + }); + canvasButton.setLongPress(() -> { + if (delegate != null) { + delegate.onButtonLongPress(this); + } + }); + } + + if (lastTopicMessageUnread && topMessageTopicEndIndex != topMessageTopicStartIndex) { + canvasButton.setColor(ColorUtils.setAlphaComponent(currentMessagePaint.getColor(), Theme.isCurrentThemeDark() ? 36 : 26)); + if (!buttonCreated) { + canvasButton.rewind(); + if (topMessageTopicEndIndex != topMessageTopicStartIndex && topMessageTopicEndIndex > 0) { + AndroidUtilities.rectTmp.set(messageLeft + AndroidUtilities.dp(2), messageTop, messageLeft + messageLayout.getPrimaryHorizontal(Math.min(messageLayout.getText().length(), topMessageTopicEndIndex)) - AndroidUtilities.dp(3), buttonTop - AndroidUtilities.dp(4)); + AndroidUtilities.rectTmp.inset(-AndroidUtilities.dp(8), -AndroidUtilities.dp(4)); + if (AndroidUtilities.rectTmp.right > AndroidUtilities.rectTmp.left) { + canvasButton.addRect(AndroidUtilities.rectTmp); + } + } + + AndroidUtilities.rectTmp.set(messageLeft + AndroidUtilities.dp(2), buttonTop + AndroidUtilities.dp(2), messageLeft + buttonLayout.getLineWidth(0) + AndroidUtilities.dp(12), buttonTop + buttonLayout.getHeight()); + AndroidUtilities.rectTmp.inset(-AndroidUtilities.dp(8), -AndroidUtilities.dp(3)); canvasButton.addRect(AndroidUtilities.rectTmp); } + canvasButton.draw(canvas); + + Theme.dialogs_forum_arrowDrawable.setAlpha(125); + setDrawableBounds(Theme.dialogs_forum_arrowDrawable, AndroidUtilities.rectTmp.right - AndroidUtilities.dp(18), AndroidUtilities.rectTmp.top + (AndroidUtilities.rectTmp.height() - Theme.dialogs_forum_arrowDrawable.getIntrinsicHeight()) / 2f); + Theme.dialogs_forum_arrowDrawable.draw(canvas); } - AndroidUtilities.rectTmp.set(messageLeft + AndroidUtilities.dp(2), buttonTop + AndroidUtilities.dp(2), messageLeft + buttonLayout.getLineWidth(0) + AndroidUtilities.dp(12), buttonTop + buttonLayout.getHeight()); - AndroidUtilities.rectTmp.inset(-AndroidUtilities.dp(8), -AndroidUtilities.dp(3)); - canvasButton.addRect(AndroidUtilities.rectTmp); - canvasButton.draw(canvas); - Theme.dialogs_forum_arrowDrawable.setAlpha(125); - setDrawableBounds(Theme.dialogs_forum_arrowDrawable, AndroidUtilities.rectTmp.right - AndroidUtilities.dp(18), AndroidUtilities.rectTmp.top + (AndroidUtilities.rectTmp.height() - Theme.dialogs_forum_arrowDrawable.getIntrinsicHeight()) / 2f); - Theme.dialogs_forum_arrowDrawable.draw(canvas); - } + canvas.translate(messageLeft - buttonLayout.getLineLeft(0), buttonTop); + if (!spoilers2.isEmpty()) { + try { + canvas.save(); + SpoilerEffect.clipOutCanvas(canvas, spoilers2); + buttonLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, buttonLayout, animatedEmojiStack3, -.075f, spoilers2, 0, 0, 0, 1f); + canvas.restore(); - - canvas.translate(messageLeft - buttonLayout.getLineLeft(0), buttonTop); - if (!spoilers2.isEmpty()) { - try { - canvas.save(); - SpoilerEffect.clipOutCanvas(canvas, spoilers2); - buttonLayout.draw(canvas); - AnimatedEmojiSpan.drawAnimatedEmojis(canvas, buttonLayout, animatedEmojiStack3, -.075f, spoilers2, 0, 0, 0, 1f); - canvas.restore(); - - for (int i = 0; i < spoilers2.size(); i++) { - SpoilerEffect eff = spoilers2.get(i); - eff.setColor(buttonLayout.getPaint().getColor()); - eff.draw(canvas); - } - } catch (Exception e) { - FileLog.e(e); - } - } else { - buttonLayout.draw(canvas); - AnimatedEmojiSpan.drawAnimatedEmojis(canvas, buttonLayout, animatedEmojiStack3, -.075f, null, 0, 0, 0, 1f); - } - canvas.restore(); - } - - - if (currentDialogFolderId == 0) { - int currentStatus = (drawClock ? 1 : 0) + (drawCheck1 ? 2 : 0) + (drawCheck2 ? 4 : 0); - if (lastStatusDrawableParams >= 0 && lastStatusDrawableParams != currentStatus && !statusDrawableAnimationInProgress) { - createStatusDrawableAnimator(lastStatusDrawableParams, currentStatus); - } - if (statusDrawableAnimationInProgress) { - currentStatus = animateToStatusDrawableParams; - } - - boolean drawClock = (currentStatus & 1) != 0; - boolean drawCheck1 = (currentStatus & 2) != 0; - boolean drawCheck2 = (currentStatus & 4) != 0; - - if (statusDrawableAnimationInProgress) { - boolean outDrawClock = (animateFromStatusDrawableParams & 1) != 0; - boolean outDrawCheck1 = (animateFromStatusDrawableParams & 2) != 0; - boolean outDrawCheck2 = (animateFromStatusDrawableParams & 4) != 0; - if (!drawClock && !outDrawClock && outDrawCheck2 && !outDrawCheck1 && drawCheck1 && drawCheck2) { - drawCheckStatus(canvas, drawClock, drawCheck1, drawCheck2, true, statusDrawableProgress); - } else { - drawCheckStatus(canvas, outDrawClock, outDrawCheck1, outDrawCheck2, false, 1f - statusDrawableProgress); - drawCheckStatus(canvas, drawClock, drawCheck1, drawCheck2, false, statusDrawableProgress); - } - } else { - drawCheckStatus(canvas, drawClock, drawCheck1, drawCheck2, false,1f); - } - lastStatusDrawableParams = (this.drawClock ? 1 : 0) + (this.drawCheck1 ? 2 : 0) + (this.drawCheck2 ? 4 : 0); - } - - boolean drawMuted = drawUnmute || dialogMuted; - if (dialogsType != 2 && (drawMuted || dialogMutedProgress > 0) && !drawVerified && drawScam == 0 && !drawPremium) { - if (drawMuted && dialogMutedProgress != 1f) { - dialogMutedProgress += 16 / 150f; - if (dialogMutedProgress > 1f) { - dialogMutedProgress = 1f; - } else { - invalidate(); - } - } else if (!drawMuted && dialogMutedProgress != 0f) { - dialogMutedProgress -= 16 / 150f; - if (dialogMutedProgress < 0f) { - dialogMutedProgress = 0f; - } else { - invalidate(); - } - } - float muteX = nameMuteLeft - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 0 : 1); - float muteY = AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 13.5f : 17.5f); - setDrawableBounds(Theme.dialogs_muteDrawable, muteX, muteY); - setDrawableBounds(Theme.dialogs_unmuteDrawable, muteX, muteY); - if (dialogMutedProgress != 1f) { - canvas.save(); - canvas.scale(dialogMutedProgress, dialogMutedProgress, Theme.dialogs_muteDrawable.getBounds().centerX(), Theme.dialogs_muteDrawable.getBounds().centerY()); - if (drawUnmute) { - Theme.dialogs_unmuteDrawable.setAlpha((int) (255 * dialogMutedProgress)); - Theme.dialogs_unmuteDrawable.draw(canvas); - Theme.dialogs_unmuteDrawable.setAlpha(255); - } else { - Theme.dialogs_muteDrawable.setAlpha((int) (255 * dialogMutedProgress)); - Theme.dialogs_muteDrawable.draw(canvas); - Theme.dialogs_muteDrawable.setAlpha(255); - } - canvas.restore(); - } else { - if (drawUnmute) { - Theme.dialogs_unmuteDrawable.draw(canvas); - } else { - Theme.dialogs_muteDrawable.draw(canvas); - } - } - - } else if (drawVerified) { - setDrawableBounds(Theme.dialogs_verifiedDrawable, nameMuteLeft - AndroidUtilities.dp(1), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 13.5f : 16.5f)); - setDrawableBounds(Theme.dialogs_verifiedCheckDrawable, nameMuteLeft - AndroidUtilities.dp(1), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 13.5f : 16.5f)); - Theme.dialogs_verifiedDrawable.draw(canvas); - Theme.dialogs_verifiedCheckDrawable.draw(canvas); - } else if (drawPremium) { - if (emojiStatus != null) { - emojiStatus.setBounds( - nameMuteLeft - AndroidUtilities.dp(2), - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 15.5f) - AndroidUtilities.dp(4), - nameMuteLeft + AndroidUtilities.dp(20), - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 15.5f) - AndroidUtilities.dp(4) + AndroidUtilities.dp(22) - ); - emojiStatus.setColor(Theme.getColor(Theme.key_chats_verifiedBackground, resourcesProvider)); - emojiStatus.draw(canvas); - } else { - Drawable premiumDrawable = PremiumGradient.getInstance().premiumStarDrawableMini; - setDrawableBounds(premiumDrawable, nameMuteLeft - AndroidUtilities.dp(1), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 15.5f)); - premiumDrawable.draw(canvas); - } - } else if (drawScam != 0) { - setDrawableBounds((drawScam == 1 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable), nameMuteLeft, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12 : 15)); - (drawScam == 1 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable).draw(canvas); - } - - if (drawReorder || reorderIconProgress != 0) { - Theme.dialogs_reorderDrawable.setAlpha((int) (reorderIconProgress * 255)); - setDrawableBounds(Theme.dialogs_reorderDrawable, pinLeft, pinTop); - Theme.dialogs_reorderDrawable.draw(canvas); - } - if (drawError) { - Theme.dialogs_errorDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - rect.set(errorLeft, errorTop, errorLeft + AndroidUtilities.dp(23), errorTop + AndroidUtilities.dp(23)); - canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, Theme.dialogs_errorPaint); - setDrawableBounds(Theme.dialogs_errorDrawable, errorLeft + AndroidUtilities.dp(5.5f), errorTop + AndroidUtilities.dp(5)); - Theme.dialogs_errorDrawable.draw(canvas); - } else if ((drawCount || drawMention) && drawCount2 || countChangeProgress != 1f || drawReactionMention || reactionsMentionsChangeProgress != 1f) { - boolean drawCounterMuted; - if (isTopic) { - drawCounterMuted = topicMuted; - } else { - drawCounterMuted = chat != null && chat.forum && forumTopic == null ? !hasUnmutedTopics : dialogMuted; - } - if (drawCount && drawCount2 || countChangeProgress != 1f) { - final float progressFinal = (unreadCount == 0 && !markUnread) ? 1f - countChangeProgress : countChangeProgress; - Paint paint; - int fillPaintAlpha = 255; - boolean restoreCountTextPaint = false; - if (isTopic && forumTopic.read_inbox_max_id == 0) { - if (topicCounterPaint == null) { - topicCounterPaint = new Paint(); - } - paint = topicCounterPaint; - int color = Theme.getColor(drawCounterMuted ? Theme.key_topics_unreadCounterMuted : Theme.key_topics_unreadCounter, resourcesProvider); - paint.setColor(color); - Theme.dialogs_countTextPaint.setColor(color); - fillPaintAlpha = drawCounterMuted ? 30 : 40; - restoreCountTextPaint = true; - } else { - paint = drawCounterMuted || currentDialogFolderId != 0 ? Theme.dialogs_countGrayPaint : Theme.dialogs_countPaint; - } - - if (countOldLayout == null || unreadCount == 0) { - StaticLayout drawLayout = unreadCount == 0 ? countOldLayout : countLayout; - paint.setAlpha((int) ((1.0f - reorderIconProgress) * fillPaintAlpha)); - Theme.dialogs_countTextPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - - int x = countLeft - AndroidUtilities.dp(5.5f); - rect.set(x, countTop, x + countWidth + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); - - if (progressFinal != 1f) { - if (getIsPinned()) { - Theme.dialogs_pinnedDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - setDrawableBounds(Theme.dialogs_pinnedDrawable, pinLeft, pinTop); - canvas.save(); - canvas.scale(1f - progressFinal, 1f - progressFinal, Theme.dialogs_pinnedDrawable.getBounds().centerX(), Theme.dialogs_pinnedDrawable.getBounds().centerY()); - Theme.dialogs_pinnedDrawable.draw(canvas); - canvas.restore(); + for (int i = 0; i < spoilers2.size(); i++) { + SpoilerEffect eff = spoilers2.get(i); + eff.setColor(buttonLayout.getPaint().getColor()); + eff.draw(canvas); } - canvas.save(); - canvas.scale(progressFinal, progressFinal, rect.centerX(), rect.centerY()); - } - - canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); - if (drawLayout != null) { - canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); - drawLayout.draw(canvas); - canvas.restore(); - } - - if (progressFinal != 1f) { - canvas.restore(); + } catch (Exception e) { + FileLog.e(e); } } else { - paint.setAlpha((int) ((1.0f - reorderIconProgress) * fillPaintAlpha)); - Theme.dialogs_countTextPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - - float progressHalf = progressFinal * 2; - if (progressHalf > 1f) { - progressHalf = 1f; - } - - float countLeft = this.countLeft * progressHalf + countLeftOld * (1f - progressHalf); - float x = countLeft - AndroidUtilities.dp(5.5f); - rect.set(x, countTop, x + (countWidth * progressHalf) + (countWidthOld * (1f - progressHalf)) + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); - - float scale = 1f; - if (progressFinal <= 0.5f) { - scale += 0.1f * CubicBezierInterpolator.EASE_OUT.getInterpolation(progressFinal * 2); - } else { - scale += 0.1f * CubicBezierInterpolator.EASE_IN.getInterpolation((1f - (progressFinal - 0.5f) * 2)); - } - - - canvas.save(); - canvas.scale(scale, scale, rect.centerX(), rect.centerY()); - canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); - - if (countAnimationStableLayout != null) { - canvas.save(); - canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); - countAnimationStableLayout.draw(canvas); - canvas.restore(); - } - - int textAlpha = Theme.dialogs_countTextPaint.getAlpha(); - Theme.dialogs_countTextPaint.setAlpha((int) (textAlpha * progressHalf)); - if (countAnimationInLayout != null) { - canvas.save(); - canvas.translate(countLeft, (countAnimationIncrement ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - progressHalf) + countTop + AndroidUtilities.dp(4)); - countAnimationInLayout.draw(canvas); - canvas.restore(); - } else if (countLayout != null) { - canvas.save(); - canvas.translate(countLeft, (countAnimationIncrement ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - progressHalf) + countTop + AndroidUtilities.dp(4)); - countLayout.draw(canvas); - canvas.restore(); - } - - if (countOldLayout != null) { - Theme.dialogs_countTextPaint.setAlpha((int) (textAlpha * (1f - progressHalf))); - canvas.save(); - canvas.translate(countLeft, (countAnimationIncrement ? -AndroidUtilities.dp(13) : AndroidUtilities.dp(13)) * progressHalf + countTop + AndroidUtilities.dp(4)); - countOldLayout.draw(canvas); - canvas.restore(); - } - Theme.dialogs_countTextPaint.setAlpha(textAlpha); - canvas.restore(); + buttonLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, buttonLayout, animatedEmojiStack3, -.075f, null, 0, 0, 0, 1f); } - if (restoreCountTextPaint) { - Theme.dialogs_countTextPaint.setColor(Theme.getColor(Theme.key_chats_unreadCounterText)); - } - } - if (drawMention) { - Theme.dialogs_countPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - - int x = mentionLeft - AndroidUtilities.dp(5.5f); - rect.set(x, countTop, x + mentionWidth + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); - Paint paint = drawCounterMuted && folderId != 0 ? Theme.dialogs_countGrayPaint : Theme.dialogs_countPaint; - canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); - if (mentionLayout != null) { - Theme.dialogs_countTextPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - - canvas.save(); - canvas.translate(mentionLeft, countTop + AndroidUtilities.dp(4)); - mentionLayout.draw(canvas); - canvas.restore(); - } else { - Theme.dialogs_mentionDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - - setDrawableBounds(Theme.dialogs_mentionDrawable, mentionLeft - AndroidUtilities.dp(2), countTop + AndroidUtilities.dp(3.2f), AndroidUtilities.dp(16), AndroidUtilities.dp(16)); - Theme.dialogs_mentionDrawable.draw(canvas); - } - } - - if (drawReactionMention || reactionsMentionsChangeProgress != 1f) { - - Theme.dialogs_reactionsCountPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - - int x = reactionMentionLeft - AndroidUtilities.dp(5.5f); - rect.set(x, countTop, x + AndroidUtilities.dp(23), countTop + AndroidUtilities.dp(23)); - Paint paint = Theme.dialogs_reactionsCountPaint; - - canvas.save(); - if (reactionsMentionsChangeProgress != 1f) { - float s = drawReactionMention ? reactionsMentionsChangeProgress : (1f - reactionsMentionsChangeProgress); - canvas.scale(s, s, rect.centerX(), rect.centerY()); - } - canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); - Theme.dialogs_reactionsMentionDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - setDrawableBounds(Theme.dialogs_reactionsMentionDrawable, reactionMentionLeft - AndroidUtilities.dp(2), countTop + AndroidUtilities.dp(3.8f), AndroidUtilities.dp(16), AndroidUtilities.dp(16)); - Theme.dialogs_reactionsMentionDrawable.draw(canvas); canvas.restore(); } - } else if (getIsPinned()) { - Theme.dialogs_pinnedDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); - setDrawableBounds(Theme.dialogs_pinnedDrawable, pinLeft, pinTop); - Theme.dialogs_pinnedDrawable.draw(canvas); + + if (currentDialogFolderId == 0) { + int currentStatus = (drawClock ? 1 : 0) + (drawCheck1 ? 2 : 0) + (drawCheck2 ? 4 : 0); + if (lastStatusDrawableParams >= 0 && lastStatusDrawableParams != currentStatus && !statusDrawableAnimationInProgress) { + createStatusDrawableAnimator(lastStatusDrawableParams, currentStatus); + } + if (statusDrawableAnimationInProgress) { + currentStatus = animateToStatusDrawableParams; + } + + boolean drawClock = (currentStatus & 1) != 0; + boolean drawCheck1 = (currentStatus & 2) != 0; + boolean drawCheck2 = (currentStatus & 4) != 0; + + if (statusDrawableAnimationInProgress) { + boolean outDrawClock = (animateFromStatusDrawableParams & 1) != 0; + boolean outDrawCheck1 = (animateFromStatusDrawableParams & 2) != 0; + boolean outDrawCheck2 = (animateFromStatusDrawableParams & 4) != 0; + if (!drawClock && !outDrawClock && outDrawCheck2 && !outDrawCheck1 && drawCheck1 && drawCheck2) { + drawCheckStatus(canvas, drawClock, drawCheck1, drawCheck2, true, statusDrawableProgress); + } else { + drawCheckStatus(canvas, outDrawClock, outDrawCheck1, outDrawCheck2, false, 1f - statusDrawableProgress); + drawCheckStatus(canvas, drawClock, drawCheck1, drawCheck2, false, statusDrawableProgress); + } + } else { + drawCheckStatus(canvas, drawClock, drawCheck1, drawCheck2, false,1f); + } + lastStatusDrawableParams = (this.drawClock ? 1 : 0) + (this.drawCheck1 ? 2 : 0) + (this.drawCheck2 ? 4 : 0); + } + + boolean drawMuted = drawUnmute || dialogMuted; + if (dialogsType != 2 && (drawMuted || dialogMutedProgress > 0) && !drawVerified && drawScam == 0 && !drawPremium) { + if (drawMuted && dialogMutedProgress != 1f) { + dialogMutedProgress += 16 / 150f; + if (dialogMutedProgress > 1f) { + dialogMutedProgress = 1f; + } else { + invalidate(); + } + } else if (!drawMuted && dialogMutedProgress != 0f) { + dialogMutedProgress -= 16 / 150f; + if (dialogMutedProgress < 0f) { + dialogMutedProgress = 0f; + } else { + invalidate(); + } + } + float muteX = nameMuteLeft - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 0 : 1); + float muteY = AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 13.5f : 17.5f); + setDrawableBounds(Theme.dialogs_muteDrawable, muteX, muteY); + setDrawableBounds(Theme.dialogs_unmuteDrawable, muteX, muteY); + if (dialogMutedProgress != 1f) { + canvas.save(); + canvas.scale(dialogMutedProgress, dialogMutedProgress, Theme.dialogs_muteDrawable.getBounds().centerX(), Theme.dialogs_muteDrawable.getBounds().centerY()); + if (drawUnmute) { + Theme.dialogs_unmuteDrawable.setAlpha((int) (255 * dialogMutedProgress)); + Theme.dialogs_unmuteDrawable.draw(canvas); + Theme.dialogs_unmuteDrawable.setAlpha(255); + } else { + Theme.dialogs_muteDrawable.setAlpha((int) (255 * dialogMutedProgress)); + Theme.dialogs_muteDrawable.draw(canvas); + Theme.dialogs_muteDrawable.setAlpha(255); + } + canvas.restore(); + } else { + if (drawUnmute) { + Theme.dialogs_unmuteDrawable.draw(canvas); + } else { + Theme.dialogs_muteDrawable.draw(canvas); + } + } + + } else if (drawVerified) { + setDrawableBounds(Theme.dialogs_verifiedDrawable, nameMuteLeft - AndroidUtilities.dp(1), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 13.5f : 16.5f)); + setDrawableBounds(Theme.dialogs_verifiedCheckDrawable, nameMuteLeft - AndroidUtilities.dp(1), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 13.5f : 16.5f)); + Theme.dialogs_verifiedDrawable.draw(canvas); + Theme.dialogs_verifiedCheckDrawable.draw(canvas); + } else if (drawPremium) { + if (emojiStatus != null) { + emojiStatus.setBounds( + nameMuteLeft - AndroidUtilities.dp(2), + AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 15.5f) - AndroidUtilities.dp(4), + nameMuteLeft + AndroidUtilities.dp(20), + AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 15.5f) - AndroidUtilities.dp(4) + AndroidUtilities.dp(22) + ); + emojiStatus.setColor(Theme.getColor(Theme.key_chats_verifiedBackground, resourcesProvider)); + emojiStatus.draw(canvas); + } else { + Drawable premiumDrawable = PremiumGradient.getInstance().premiumStarDrawableMini; + setDrawableBounds(premiumDrawable, nameMuteLeft - AndroidUtilities.dp(1), AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 15.5f)); + premiumDrawable.draw(canvas); + } + } else if (drawScam != 0) { + setDrawableBounds((drawScam == 1 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable), nameMuteLeft, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12 : 15)); + (drawScam == 1 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable).draw(canvas); + } + + if (drawReorder || reorderIconProgress != 0) { + Theme.dialogs_reorderDrawable.setAlpha((int) (reorderIconProgress * 255)); + setDrawableBounds(Theme.dialogs_reorderDrawable, pinLeft, pinTop); + Theme.dialogs_reorderDrawable.draw(canvas); + } + if (drawError) { + Theme.dialogs_errorDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + rect.set(errorLeft, errorTop, errorLeft + AndroidUtilities.dp(23), errorTop + AndroidUtilities.dp(23)); + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, Theme.dialogs_errorPaint); + setDrawableBounds(Theme.dialogs_errorDrawable, errorLeft + AndroidUtilities.dp(5.5f), errorTop + AndroidUtilities.dp(5)); + Theme.dialogs_errorDrawable.draw(canvas); + } else if ((drawCount || drawMention) && drawCount2 || countChangeProgress != 1f || drawReactionMention || reactionsMentionsChangeProgress != 1f) { + boolean drawCounterMuted; + if (isTopic) { + drawCounterMuted = topicMuted; + } else { + drawCounterMuted = chat != null && chat.forum && forumTopic == null ? !hasUnmutedTopics : dialogMuted; + } + drawCounter(canvas, drawCounterMuted, countTop, countLeft, countLeftOld, 1f, false); + if (drawMention) { + Theme.dialogs_countPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + + int x = mentionLeft - AndroidUtilities.dp(5.5f); + rect.set(x, countTop, x + mentionWidth + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); + Paint paint = drawCounterMuted && folderId != 0 ? Theme.dialogs_countGrayPaint : Theme.dialogs_countPaint; + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); + if (mentionLayout != null) { + Theme.dialogs_countTextPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + + canvas.save(); + canvas.translate(mentionLeft, countTop + AndroidUtilities.dp(4)); + mentionLayout.draw(canvas); + canvas.restore(); + } else { + Theme.dialogs_mentionDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + + setDrawableBounds(Theme.dialogs_mentionDrawable, mentionLeft - AndroidUtilities.dp(2), countTop + AndroidUtilities.dp(3.2f), AndroidUtilities.dp(16), AndroidUtilities.dp(16)); + Theme.dialogs_mentionDrawable.draw(canvas); + } + } + + if (drawReactionMention || reactionsMentionsChangeProgress != 1f) { + + Theme.dialogs_reactionsCountPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + + int x = reactionMentionLeft - AndroidUtilities.dp(5.5f); + rect.set(x, countTop, x + AndroidUtilities.dp(23), countTop + AndroidUtilities.dp(23)); + Paint paint = Theme.dialogs_reactionsCountPaint; + + canvas.save(); + if (reactionsMentionsChangeProgress != 1f) { + float s = drawReactionMention ? reactionsMentionsChangeProgress : (1f - reactionsMentionsChangeProgress); + canvas.scale(s, s, rect.centerX(), rect.centerY()); + } + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); + Theme.dialogs_reactionsMentionDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + setDrawableBounds(Theme.dialogs_reactionsMentionDrawable, reactionMentionLeft - AndroidUtilities.dp(2), countTop + AndroidUtilities.dp(3.8f), AndroidUtilities.dp(16), AndroidUtilities.dp(16)); + Theme.dialogs_reactionsMentionDrawable.draw(canvas); + canvas.restore(); + } + } else if (getIsPinned()) { + Theme.dialogs_pinnedDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + setDrawableBounds(Theme.dialogs_pinnedDrawable, pinLeft, pinTop); + Theme.dialogs_pinnedDrawable.draw(canvas); + } + + if (thumbsCount > 0 && updateHelper.typingProgres != 1f) { + float alpha = 1f; + if (updateHelper.typingProgres > 0) { + alpha = (1f - updateHelper.typingProgres); + canvas.saveLayerAlpha(0, 0, getWidth(), getHeight(), (int) (255 * alpha), Canvas.ALL_SAVE_FLAG); + float top; + if (updateHelper.typingOutToTop) { + top = -AndroidUtilities.dp(14) * updateHelper.typingProgres; + } else { + top = AndroidUtilities.dp(14) * updateHelper.typingProgres; + } + canvas.translate(0, top); + } + for (int i = 0; i < thumbsCount; ++i) { + if (thumbBackgroundPaint == null) { + thumbBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + thumbBackgroundPaint.setShadowLayer(AndroidUtilities.dp(1.34f), 0, AndroidUtilities.dp(0.34f), 0x18000000); + thumbBackgroundPaint.setColor(0x00000000); + } + AndroidUtilities.rectTmp.set( + thumbImage[i].getImageX(), + thumbImage[i].getImageY(), + thumbImage[i].getImageX2(), + thumbImage[i].getImageY2() + ); + canvas.drawRoundRect( + AndroidUtilities.rectTmp, + thumbImage[i].getRoundRadius()[0], + thumbImage[i].getRoundRadius()[1], + thumbBackgroundPaint + ); + thumbImage[i].draw(canvas); + if (drawPlay[i]) { + int x = (int) (thumbImage[i].getCenterX() - Theme.dialogs_playDrawable.getIntrinsicWidth() / 2); + int y = (int) (thumbImage[i].getCenterY() - Theme.dialogs_playDrawable.getIntrinsicHeight() / 2); + setDrawableBounds(Theme.dialogs_playDrawable, x, y); + Theme.dialogs_playDrawable.draw(canvas); + } + } + + if (updateHelper.typingProgres > 0) { + canvas.restore(); + } + } + + if (restoreToCount != -1) { + canvas.restoreToCount(restoreToCount); + } } if (animatingArchiveAvatar) { @@ -3538,27 +3653,60 @@ public class DialogCell extends BaseCell { canvas.scale(scale, scale, avatarImage.getCenterX(), avatarImage.getCenterY()); } - if (drawAvatar && (currentDialogFolderId == 0 || archivedChatsDrawable == null || !archivedChatsDrawable.isDraw())) { + if (drawAvatar && (!(currentDialogFolderId != 0 || isTopic && forumTopic != null && forumTopic.id == 1) || archivedChatsDrawable == null || !archivedChatsDrawable.isDraw())) { avatarImage.draw(canvas); } - if (thumbsCount > 0) { - for (int i = 0; i < thumbsCount; ++i) { - thumbImage[i].draw(canvas); - if (drawPlay[i]) { - int x = (int) (thumbImage[i].getCenterX() - Theme.dialogs_playDrawable.getIntrinsicWidth() / 2); - int y = (int) (thumbImage[i].getCenterY() - Theme.dialogs_playDrawable.getIntrinsicHeight() / 2); - setDrawableBounds(Theme.dialogs_playDrawable, x, y); - Theme.dialogs_playDrawable.draw(canvas); - } - } - } - if (animatingArchiveAvatar) { canvas.restore(); } if (isDialogCell && currentDialogFolderId == 0) { + showTtl = ttlPeriod > 0 && !isOnline() && !hasCall; + if (rightFragmentOpenedProgress != 1f && (showTtl || ttlProgress > 0)) { + if (timerDrawable == null || (timerDrawable.getTime() != ttlPeriod && ttlPeriod > 0)) { + timerDrawable = TimerDrawable.getTtlIconForDialogs(ttlPeriod); + } + if (timerPaint == null) { + timerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + timerPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG); + timerPaint2.setColor(0x32000000); + } + int top = (int) (avatarImage.getImageY2() - AndroidUtilities.dp(9)); + int left; + if (LocaleController.isRTL) { + left = (int) (avatarImage.getImageX() + AndroidUtilities.dp(9)); + } else { + left = (int) (avatarImage.getImageX2() - AndroidUtilities.dp(9)); + } + timerDrawable.setBounds( + 0, 0, AndroidUtilities.dp(22), AndroidUtilities.dp(22) + ); + + timerDrawable.setTime(ttlPeriod); + if (avatarImage.updateThumbShaderMatrix()) { + if (avatarImage.thumbShader != null) { + timerPaint.setShader(avatarImage.thumbShader); + } + } else { + timerPaint.setShader(null); + if (avatarImage.getBitmap() != null && !avatarImage.getBitmap().isRecycled()) { + timerPaint.setColor(PremiumLockIconView.getDominantColor(avatarImage.getBitmap())); + } else { + timerPaint.setColor(avatarDrawable.getColor2()); + } + } + canvas.save(); + float s = ttlProgress * (1f - rightFragmentOpenedProgress); + canvas.scale(s, s, left, top); + canvas.drawCircle(left, top, AndroidUtilities.dpf2(11f), timerPaint); + canvas.drawCircle(left, top, AndroidUtilities.dpf2(11f), timerPaint2); + canvas.save(); + canvas.translate(left - AndroidUtilities.dpf2(11f), top - AndroidUtilities.dpf2(11f)); + timerDrawable.draw(canvas); + canvas.restore(); + canvas.restore(); + } if (user != null && !MessagesController.isSupportUser(user) && !user.bot) { boolean isOnline = isOnline(); if (isOnline || onlineProgress != 0) { @@ -3576,7 +3724,7 @@ public class DialogCell extends BaseCell { canvas.drawCircle(left, top, AndroidUtilities.dp(5) * onlineProgress, Theme.dialogs_onlineCirclePaint); if (isOnline) { if (onlineProgress < 1.0f) { - onlineProgress += dt / 150.0f; + onlineProgress += 16f / 150.0f; if (onlineProgress > 1.0f) { onlineProgress = 1.0f; } @@ -3584,7 +3732,7 @@ public class DialogCell extends BaseCell { } } else { if (onlineProgress > 0.0f) { - onlineProgress -= dt / 150.0f; + onlineProgress -= 16f / 150.0f; if (onlineProgress < 0.0f) { onlineProgress = 0.0f; } @@ -3594,7 +3742,7 @@ public class DialogCell extends BaseCell { } } else if (chat != null) { hasCall = chat.call_active && chat.call_not_empty; - if (hasCall || chatCallProgress != 0) { + if ((hasCall || chatCallProgress != 0) && rightFragmentOpenedProgress < 1f) { float checkProgress = checkBox != null && checkBox.isChecked() ? 1.0f - checkBox.getProgress() : 1.0f; int top = (int) (avatarImage.getImageY2() - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 6 : 8)); int left; @@ -3604,6 +3752,11 @@ public class DialogCell extends BaseCell { left = (int) (avatarImage.getImageX2() - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 10 : 6)); } + if (rightFragmentOpenedProgress != 0) { + canvas.save(); + float scale = 1f - rightFragmentOpenedProgress; + canvas.scale(scale, scale, left, top); + } Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); canvas.drawCircle(left, top, AndroidUtilities.dp(11) * chatCallProgress * checkProgress, Theme.dialogs_onlineCirclePaint); Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_chats_onlineCircle, resourcesProvider)); @@ -3654,7 +3807,7 @@ public class DialogCell extends BaseCell { canvas.restore(); } - innerProgress += dt / 400.0f; + innerProgress += 16f / 400.0f; if (innerProgress >= 1.0f) { innerProgress = 0.0f; progressStage++; @@ -3666,28 +3819,64 @@ public class DialogCell extends BaseCell { if (hasCall) { if (chatCallProgress < 1.0f) { - chatCallProgress += dt / 150.0f; + chatCallProgress += 16f / 150.0f; if (chatCallProgress > 1.0f) { chatCallProgress = 1.0f; } } } else { if (chatCallProgress > 0.0f) { - chatCallProgress -= dt / 150.0f; + chatCallProgress -= 16f / 150.0f; if (chatCallProgress < 0.0f) { chatCallProgress = 0.0f; } } } + + + if (rightFragmentOpenedProgress != 0) { + canvas.restore(); + } } } + + if (showTtl) { + if (ttlProgress < 1.0f) { + ttlProgress += 16f / 150.0f; + needInvalidate = true; + } + } else { + if (ttlProgress > 0.0f) { + ttlProgress -= 16f / 150.0f; + needInvalidate = true; + } + } + ttlProgress = Utilities.clamp(ttlProgress, 1f, 0); + } + + if (rightFragmentOpenedProgress > 0 && currentDialogFolderId == 0) { + boolean drawCounterMuted; + if (isTopic) { + drawCounterMuted = topicMuted; + } else { + drawCounterMuted = chat != null && chat.forum && forumTopic == null ? !hasUnmutedTopics : dialogMuted; + } + int countLeftLocal = (int) (avatarImage.getImageX() + avatarImage.getImageWidth() - countWidth - AndroidUtilities.dp(5f)); + int countLeftOld = (int) (avatarImage.getImageX() + avatarImage.getImageWidth() - countWidthOld - AndroidUtilities.dp(5f)); + int countTop = (int) (avatarImage.getImageY() + avatarImage.getImageHeight() - AndroidUtilities.dp(22)); + drawCounter(canvas, drawCounterMuted, countTop, countLeftLocal, countLeftOld, rightFragmentOpenedProgress, true); + } + + if (collapseOffset != 0) { + canvas.restore(); } if (translationX != 0) { canvas.restore(); } - if (currentDialogFolderId != 0 && translationX == 0 && archivedChatsDrawable != null) { + if ((currentDialogFolderId != 0 || isTopic && forumTopic != null && forumTopic.id == 1) && translationX == 0 && archivedChatsDrawable != null) { canvas.save(); + canvas.translate(0, -translateY); canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight()); archivedChatsDrawable.draw(canvas); canvas.restore(); @@ -3700,10 +3889,20 @@ public class DialogCell extends BaseCell { } else { left = AndroidUtilities.dp(messagePaddingStart); } - if (LocaleController.isRTL) { - canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - left, getMeasuredHeight() - 1, Theme.dividerPaint); - } else { - canvas.drawLine(left, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint); + + if (rightFragmentOpenedProgress != 1) { + int alpha = Theme.dividerPaint.getAlpha(); + if (rightFragmentOpenedProgress != 0) { + Theme.dividerPaint.setAlpha((int) (alpha * (1f - rightFragmentOpenedProgress))); + } + if (LocaleController.isRTL) { + canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - left, getMeasuredHeight() - 1, Theme.dividerPaint); + } else { + canvas.drawLine(left, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint); + } + if (rightFragmentOpenedProgress != 0) { + Theme.dividerPaint.setAlpha(alpha); + } } } @@ -3720,7 +3919,7 @@ public class DialogCell extends BaseCell { if (drawReorder || reorderIconProgress != 0.0f) { if (drawReorder) { if (reorderIconProgress < 1.0f) { - reorderIconProgress += dt / 170.0f; + reorderIconProgress += 16f / 170.0f; if (reorderIconProgress > 1.0f) { reorderIconProgress = 1.0f; } @@ -3728,7 +3927,7 @@ public class DialogCell extends BaseCell { } } else { if (reorderIconProgress > 0.0f) { - reorderIconProgress -= dt / 170.0f; + reorderIconProgress -= 16f / 170.0f; if (reorderIconProgress < 0.0f) { reorderIconProgress = 0.0f; } @@ -3739,7 +3938,7 @@ public class DialogCell extends BaseCell { if (archiveHidden) { if (archiveBackgroundProgress > 0.0f) { - archiveBackgroundProgress -= dt / 230.0f; + archiveBackgroundProgress -= 16f / 230.0f; if (archiveBackgroundProgress < 0.0f) { archiveBackgroundProgress = 0.0f; } @@ -3750,7 +3949,7 @@ public class DialogCell extends BaseCell { } } else { if (archiveBackgroundProgress < 1.0f) { - archiveBackgroundProgress += dt / 230.0f; + archiveBackgroundProgress += 16f / 230.0f; if (archiveBackgroundProgress > 1.0f) { archiveBackgroundProgress = 1.0f; } @@ -3762,7 +3961,7 @@ public class DialogCell extends BaseCell { } if (animatingArchiveAvatar) { - animatingArchiveAvatarProgress += dt; + animatingArchiveAvatarProgress += 16f; if (animatingArchiveAvatarProgress >= 170.0f) { animatingArchiveAvatarProgress = 170.0f; animatingArchiveAvatar = false; @@ -3771,14 +3970,14 @@ public class DialogCell extends BaseCell { } if (drawRevealBackground) { if (currentRevealBounceProgress < 1.0f) { - currentRevealBounceProgress += dt / 170.0f; + currentRevealBounceProgress += 16f / 170.0f; if (currentRevealBounceProgress > 1.0f) { currentRevealBounceProgress = 1.0f; needInvalidate = true; } } if (currentRevealProgress < 1.0f) { - currentRevealProgress += dt / 300.0f; + currentRevealProgress += 16f / 300.0f; if (currentRevealProgress > 1.0f) { currentRevealProgress = 1.0f; } @@ -3790,18 +3989,158 @@ public class DialogCell extends BaseCell { needInvalidate = true; } if (currentRevealProgress > 0.0f) { - currentRevealProgress -= dt / 300.0f; + currentRevealProgress -= 16f / 300.0f; if (currentRevealProgress < 0.0f) { currentRevealProgress = 0.0f; } needInvalidate = true; } } + if (needInvalidate) { invalidate(); } } + private void drawCounter(Canvas canvas, boolean drawCounterMuted, int countTop, int countLeftLocal, int countLeftOld, float globalScale, boolean outline) { + if (drawCount && drawCount2 || countChangeProgress != 1f) { + final float progressFinal = (unreadCount == 0 && !markUnread) ? 1f - countChangeProgress : countChangeProgress; + Paint paint; + int fillPaintAlpha = 255; + boolean restoreCountTextPaint = false; + if (outline) { + if (counterPaintOutline == null) { + counterPaintOutline = new Paint(); + counterPaintOutline.setStyle(Paint.Style.STROKE); + counterPaintOutline.setStrokeWidth(AndroidUtilities.dp(2)); + } + int color = Theme.getColor(Theme.key_chats_pinnedOverlay); + counterPaintOutline.setColor(ColorUtils.blendARGB( + Theme.getColor(Theme.key_windowBackgroundWhite), + ColorUtils.setAlphaComponent(color, 255), + Color.alpha(color) / 255f + )); + } + if (isTopic && forumTopic.read_inbox_max_id == 0) { + if (topicCounterPaint == null) { + topicCounterPaint = new Paint(); + } + paint = topicCounterPaint; + int color = Theme.getColor(drawCounterMuted ? Theme.key_topics_unreadCounterMuted : Theme.key_topics_unreadCounter, resourcesProvider); + paint.setColor(color); + Theme.dialogs_countTextPaint.setColor(color); + fillPaintAlpha = drawCounterMuted ? 30 : 40; + restoreCountTextPaint = true; + } else { + paint = drawCounterMuted || currentDialogFolderId != 0 ? Theme.dialogs_countGrayPaint : Theme.dialogs_countPaint; + } + + if (countOldLayout == null || unreadCount == 0) { + StaticLayout drawLayout = unreadCount == 0 ? countOldLayout : countLayout; + paint.setAlpha((int) ((1.0f - reorderIconProgress) * fillPaintAlpha)); + Theme.dialogs_countTextPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + + int x = countLeftLocal - AndroidUtilities.dp(5.5f); + rect.set(x, countTop, x + countWidth + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); + + if (globalScale != 1f) { + canvas.save(); + canvas.scale(globalScale, globalScale, rect.centerX(), rect.centerY()); + } + if (progressFinal != 1f) { + if (getIsPinned()) { + Theme.dialogs_pinnedDrawable.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + setDrawableBounds(Theme.dialogs_pinnedDrawable, pinLeft, pinTop); + canvas.save(); + canvas.scale(1f - progressFinal, 1f - progressFinal, Theme.dialogs_pinnedDrawable.getBounds().centerX(), Theme.dialogs_pinnedDrawable.getBounds().centerY()); + Theme.dialogs_pinnedDrawable.draw(canvas); + canvas.restore(); + } + canvas.save(); + canvas.scale(progressFinal, progressFinal, rect.centerX(), rect.centerY()); + } + + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); + if (outline) { + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, counterPaintOutline); + } + if (drawLayout != null) { + canvas.save(); + canvas.translate(countLeftLocal, countTop + AndroidUtilities.dp(4)); + drawLayout.draw(canvas); + canvas.restore(); + } + + if (progressFinal != 1f) { + canvas.restore(); + } + if (globalScale != 1f) { + canvas.restore(); + } + } else { + paint.setAlpha((int) ((1.0f - reorderIconProgress) * fillPaintAlpha)); + Theme.dialogs_countTextPaint.setAlpha((int) ((1.0f - reorderIconProgress) * 255)); + + float progressHalf = progressFinal * 2; + if (progressHalf > 1f) { + progressHalf = 1f; + } + + float countLeft = countLeftLocal * progressHalf + countLeftOld * (1f - progressHalf); + float x = countLeft - AndroidUtilities.dp(5.5f); + rect.set(x, countTop, x + (countWidth * progressHalf) + (countWidthOld * (1f - progressHalf)) + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); + + float scale = 1f; + if (progressFinal <= 0.5f) { + scale += 0.1f * CubicBezierInterpolator.EASE_OUT.getInterpolation(progressFinal * 2); + } else { + scale += 0.1f * CubicBezierInterpolator.EASE_IN.getInterpolation((1f - (progressFinal - 0.5f) * 2)); + } + + + canvas.save(); + canvas.scale(scale * globalScale, scale * globalScale, rect.centerX(), rect.centerY()); + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, paint); + if (outline) { + canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, counterPaintOutline); + } + if (countAnimationStableLayout != null) { + canvas.save(); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); + countAnimationStableLayout.draw(canvas); + canvas.restore(); + } + + int textAlpha = Theme.dialogs_countTextPaint.getAlpha(); + Theme.dialogs_countTextPaint.setAlpha((int) (textAlpha * progressHalf)); + if (countAnimationInLayout != null) { + canvas.save(); + canvas.translate(countLeft, (countAnimationIncrement ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - progressHalf) + countTop + AndroidUtilities.dp(4)); + countAnimationInLayout.draw(canvas); + canvas.restore(); + } else if (countLayout != null) { + canvas.save(); + canvas.translate(countLeft, (countAnimationIncrement ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - progressHalf) + countTop + AndroidUtilities.dp(4)); + countLayout.draw(canvas); + canvas.restore(); + } + + if (countOldLayout != null) { + Theme.dialogs_countTextPaint.setAlpha((int) (textAlpha * (1f - progressHalf))); + canvas.save(); + canvas.translate(countLeft, (countAnimationIncrement ? -AndroidUtilities.dp(13) : AndroidUtilities.dp(13)) * progressHalf + countTop + AndroidUtilities.dp(4)); + countOldLayout.draw(canvas); + canvas.restore(); + } + Theme.dialogs_countTextPaint.setAlpha(textAlpha); + canvas.restore(); + } + if (restoreCountTextPaint) { + Theme.dialogs_countTextPaint.setColor(Theme.getColor(Theme.key_chats_unreadCounterText)); + } + } + } + private void createStatusDrawableAnimator(int lastStatusDrawableParams, int currentStatus) { statusDrawableProgress = 0f; statusDrawableAnimator = ValueAnimator.ofFloat(0,1f); @@ -3833,10 +4172,17 @@ public class DialogCell extends BaseCell { public void startOutAnimation() { if (archivedChatsDrawable != null) { - archivedChatsDrawable.outCy = avatarImage.getCenterY(); - archivedChatsDrawable.outCx = avatarImage.getCenterX(); - archivedChatsDrawable.outRadius = avatarImage.getImageWidth() / 2.0f; - archivedChatsDrawable.outImageSize = avatarImage.getBitmapWidth(); + if (isTopic) { + archivedChatsDrawable.outCy = AndroidUtilities.dp(10 + 14); + archivedChatsDrawable.outCx = AndroidUtilities.dp(10 + 14); + archivedChatsDrawable.outRadius = 0; + archivedChatsDrawable.outImageSize = 0; + } else { + archivedChatsDrawable.outCy = avatarImage.getCenterY(); + archivedChatsDrawable.outCx = avatarImage.getCenterX(); + archivedChatsDrawable.outRadius = avatarImage.getImageWidth() / 2.0f; + archivedChatsDrawable.outImageSize = avatarImage.getBitmapWidth(); + } archivedChatsDrawable.startOutAnimation(); } } @@ -3915,7 +4261,12 @@ public class DialogCell extends BaseCell { sb.append(LocaleController.getString("AccDescrSecretChat", R.string.AccDescrSecretChat)); sb.append(". "); } - if (user != null) { + if (isTopic && forumTopic != null) { + sb.append(LocaleController.getString("AccDescrTopic", R.string.AccDescrTopic)); + sb.append(". "); + sb.append(forumTopic.title); + sb.append(". "); + } else if (user != null) { if (UserObject.isReplyUser(user)) { sb.append(LocaleController.getString("RepliesTitle", R.string.RepliesTitle)); } else { @@ -3988,7 +4339,7 @@ public class DialogCell extends BaseCell { if (messageString.length() > 0) { messageString.append(". "); } - messageString.append(captionMessage); + messageString.append(captionMessage.caption); } } int len = messageLayout == null ? -1 : messageLayout.getText().length(); @@ -4042,27 +4393,12 @@ public class DialogCell extends BaseCell { thumbsCount = 0; hasVideoThumb = false; Collections.sort(groupMessages, (a, b) -> a.getId() - b.getId()); - for (int i = 0; i < groupMessages.size(); ++i) { + for (int i = 0; i < Math.min(3, groupMessages.size()); ++i) { MessageObject message = groupMessages.get(i); if (message != null && !message.needDrawBluredPreview() && (message.isPhoto() || message.isNewGif() || message.isVideo() || message.isRoundVideo())) { String type = message.isWebpage() ? message.messageOwner.media.webpage.type : null; if (!("app".equals(type) || "profile".equals(type) || "article".equals(type) || type != null && type.startsWith("telegram_"))) { - TLRPC.PhotoSize smallThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 40); - TLRPC.PhotoSize bigThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize()); - if (smallThumb == bigThumb) { - bigThumb = null; - } - if (smallThumb != null) { - hasVideoThumb = hasVideoThumb || (message.isVideo() || message.isRoundVideo()); - if (i < 2) { - thumbsCount++; - drawPlay[i] = message.isVideo() || message.isRoundVideo(); - int size = message.type == MessageObject.TYPE_PHOTO && bigThumb != null ? bigThumb.size : 0; - thumbImage[i].setImage(ImageLocation.getForObject(bigThumb, message.photoThumbsObject), "20_20", ImageLocation.getForObject(smallThumb, message.photoThumbsObject), "20_20", size, null, message, 0); - thumbImage[i].setRoundRadius(message.isRoundVideo() ? AndroidUtilities.dp(18) : AndroidUtilities.dp(2)); - needEmoji = false; - } - } + setThumb(i, message); } } } @@ -4072,27 +4408,36 @@ public class DialogCell extends BaseCell { if (!message.needDrawBluredPreview() && (message.isPhoto() || message.isNewGif() || message.isVideo() || message.isRoundVideo())) { String type = message.isWebpage() ? message.messageOwner.media.webpage.type : null; if (!("app".equals(type) || "profile".equals(type) || "article".equals(type) || type != null && type.startsWith("telegram_"))) { - TLRPC.PhotoSize smallThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 40); - TLRPC.PhotoSize bigThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize()); - if (smallThumb == bigThumb) { - bigThumb = null; - } - if (smallThumb != null) { - hasVideoThumb = hasVideoThumb || (message.isVideo() || message.isRoundVideo()); - if (thumbsCount < 3) { - thumbsCount++; - drawPlay[0] = message.isVideo() || message.isRoundVideo(); - int size = message.type == MessageObject.TYPE_PHOTO && bigThumb != null ? bigThumb.size : 0; - thumbImage[0].setImage(ImageLocation.getForObject(bigThumb, message.photoThumbsObject), "20_20", ImageLocation.getForObject(smallThumb, message.photoThumbsObject), "20_20", size, null, message, 0); - thumbImage[0].setRoundRadius(message.isRoundVideo() ? AndroidUtilities.dp(18) : AndroidUtilities.dp(2)); - needEmoji = false; - } - } + setThumb(0, message); } } } } + private void setThumb(int index, MessageObject message) { + TLRPC.PhotoSize smallThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 40); + TLRPC.PhotoSize bigThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, AndroidUtilities.getPhotoSize()); + if (smallThumb == bigThumb) { + bigThumb = null; + } + TLRPC.PhotoSize selectedThumb = bigThumb; + if (selectedThumb == null || DownloadController.getInstance(currentAccount).canDownloadMedia(message.messageOwner) == 0) { + selectedThumb = smallThumb; + } + + if (smallThumb != null) { + hasVideoThumb = hasVideoThumb || (message.isVideo() || message.isRoundVideo()); + if (thumbsCount < 3) { + thumbsCount++; + drawPlay[index] = message.isVideo() || message.isRoundVideo(); + int size = message.type == MessageObject.TYPE_PHOTO && selectedThumb != null ? selectedThumb.size : 0; + thumbImage[index].setImage(ImageLocation.getForObject(selectedThumb, message.photoThumbsObject), "20_20", ImageLocation.getForObject(smallThumb, message.photoThumbsObject), "20_20", size, null, message, 0); + thumbImage[index].setRoundRadius(message.isRoundVideo() ? AndroidUtilities.dp(18) : AndroidUtilities.dp(2)); + needEmoji = false; + } + } + } + public String getMessageNameString() { if (message == null) { return null; @@ -4146,10 +4491,10 @@ public class DialogCell extends BaseCell { } if (MessageObject.isTopicActionMessage(message)) { stringBuilder = AndroidUtilities.formatSpannable(messageFormat, mess, messageNameString); - if (message.topicIconDrawable[0] != null) { - TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-message.getDialogId(), MessageObject.getTopicId(message.messageOwner)); + if (message.topicIconDrawable[0] instanceof ForumBubbleDrawable) { + TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(-message.getDialogId(), MessageObject.getTopicId(message.messageOwner, true)); if (topic != null) { - message.topicIconDrawable[0].setColor(topic.icon_color); + ((ForumBubbleDrawable) message.topicIconDrawable[0]).setColor(topic.icon_color); } } } else { @@ -4344,4 +4689,128 @@ public class DialogCell extends BaseCell { boolean canClickButtonInside(); } + private class DialogUpdateHelper { + + public long lastDrawnDialogId; + public long lastDrawnMessageId; + public boolean lastDrawnDialogIsFolder; + public long lastDrawnReadState; + public int lastDrawnDraftHash; + public Integer lastDrawnPrintingType; + public int lastDrawnSizeHash; + public int lastTopicsCount; + public boolean lastDrawnPinned; + public boolean lastDrawnHasCall; + + + public float typingProgres; + public boolean typingOutToTop; + public int lastKnownTypingType; + boolean waitngNewMessageFroTypingAnimation = false; + long startWaitingTime; + + + public boolean update() { + TLRPC.Dialog dialog = MessagesController.getInstance(currentAccount).dialogs_dict.get(currentDialogId); + if (dialog == null) { + return false; + } + int messageHash = message == null ? 0 : message.getId(); + Integer printingType = null; + long readHash = dialog.read_inbox_max_id + ((long) dialog.read_outbox_max_id << 8) + ((long) dialog.unread_count << 16); + if (!isForumCell() && (isDialogCell || isTopic)) { + if (!TextUtils.isEmpty(MessagesController.getInstance(currentAccount).getPrintingString(currentDialogId, getTopicId(), true))) { + printingType = MessagesController.getInstance(currentAccount).getPrintingStringType(currentDialogId, getTopicId()); + } else { + printingType = null; + } + } + int sizeHash = getMeasuredWidth() + (getMeasuredHeight() << 16); + int topicCount = 0; + if (isForumCell()) { + ArrayList topics = MessagesController.getInstance(currentAccount).getTopicsController().getTopics(-currentDialogId); + topicCount = topics == null ? -1 : topics.size(); + if (topicCount == -1 && MessagesController.getInstance(currentAccount).getTopicsController().endIsReached(-currentDialogId)) { + topicCount = 0; + } + } + + TLRPC.DraftMessage draftMessage = null; + if (isTopic) { + draftMessage = MediaDataController.getInstance(currentAccount).getDraft(currentDialogId, getTopicId()); + if (draftMessage != null && TextUtils.isEmpty(draftMessage.message)) { + draftMessage = null; + } + } else if (isDialogCell) { + draftMessage = MediaDataController.getInstance(currentAccount).getDraft(currentDialogId, 0); + } + int draftHash = draftMessage == null ? 0 : draftMessage.message.hashCode() + (draftMessage.reply_to_msg_id << 16); + boolean hasCall = chat != null && chat.call_active && chat.call_not_empty; + if (lastDrawnSizeHash == sizeHash && + lastDrawnMessageId == messageHash && + lastDrawnDialogId == currentDialogId && + lastDrawnDialogIsFolder == dialog.isFolder && + lastDrawnReadState == readHash && + Objects.equals(lastDrawnPrintingType, printingType) && + lastTopicsCount == topicCount && + draftHash == lastDrawnDraftHash && + lastDrawnPinned == drawPin && + lastDrawnHasCall == hasCall) { + return false; + } + + if (lastDrawnDialogId != currentDialogId) { + typingProgres = printingType == null ? 0f : 1f; + waitngNewMessageFroTypingAnimation = false; + } else { + if (!Objects.equals(lastDrawnPrintingType, printingType) || waitngNewMessageFroTypingAnimation) { + if (!waitngNewMessageFroTypingAnimation && printingType == null) { + waitngNewMessageFroTypingAnimation = true; + startWaitingTime = System.currentTimeMillis(); + } else if (waitngNewMessageFroTypingAnimation && lastDrawnMessageId != messageHash) { + waitngNewMessageFroTypingAnimation = false; + } + if (lastDrawnMessageId != messageHash) { + typingOutToTop = false; + } else { + typingOutToTop = true; + } + } + } + if (printingType != null) { + lastKnownTypingType = printingType; + } + lastDrawnDialogId = currentDialogId; + lastDrawnMessageId = messageHash; + lastDrawnDialogIsFolder = dialog.isFolder; + lastDrawnReadState = readHash; + lastDrawnPrintingType = printingType; + lastDrawnSizeHash = sizeHash; + lastDrawnDraftHash = draftHash; + lastTopicsCount = topicCount; + lastDrawnPinned = drawPin; + lastDrawnHasCall = hasCall; + + return true; + } + + public void updateAnimationValues() { + if (!waitngNewMessageFroTypingAnimation) { + if (lastDrawnPrintingType != null && typingLayout != null && typingProgres != 1f) { + typingProgres += 16f / 200f; + invalidate(); + } else if (lastDrawnPrintingType == null && typingProgres != 0) { + typingProgres -= 16f / 200f; + invalidate(); + } + typingProgres = Utilities.clamp(typingProgres, 1f, 0f); + } else { + if (System.currentTimeMillis() - startWaitingTime > 100) { + waitngNewMessageFroTypingAnimation = false; + } + invalidate(); + } + } + } + } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java index 0314fe763..a539862f3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java @@ -21,8 +21,10 @@ import android.widget.FrameLayout; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; @@ -86,7 +88,14 @@ public class GroupCreateUserCell extends FrameLayout { avatarImageView.setRoundRadius(AndroidUtilities.dp(24)); addView(avatarImageView, LayoutHelper.createFrame(46, 46, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 0 : (13 + padding), 6, LocaleController.isRTL ? (13 + padding) : 0, 0)); - nameTextView = new SimpleTextView(context); + nameTextView = new SimpleTextView(context) { + @Override + public boolean setText(CharSequence value, boolean force) { + value = Emoji.replaceEmoji(value, getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + return super.setText(value, force); + } + }; + NotificationCenter.listenEmojiLoading(nameTextView); nameTextView.setTextColor(Theme.getColor(forceDarkTheme ? Theme.key_voipgroup_nameText : Theme.key_windowBackgroundWhiteBlackText)); nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); nameTextView.setTextSize(16); @@ -203,6 +212,7 @@ public class GroupCreateUserCell extends FrameLayout { TLRPC.FileLocation photo = null; String newName = null; + TLRPC.Chat currentChat = null; if (currentObject instanceof String) { ((LayoutParams) nameTextView.getLayoutParams()).topMargin = AndroidUtilities.dp(15); avatarImageView.getLayoutParams().width = avatarImageView.getLayoutParams().height = AndroidUtilities.dp(38); @@ -332,7 +342,7 @@ public class GroupCreateUserCell extends FrameLayout { avatarImageView.setForUserOrChat(currentUser, avatarDrawable); } else { - TLRPC.Chat currentChat = (TLRPC.Chat) currentObject; + currentChat = (TLRPC.Chat) currentObject; if (currentChat.photo != null) { photo = currentChat.photo.photo_small; } @@ -394,6 +404,8 @@ public class GroupCreateUserCell extends FrameLayout { } } + + avatarImageView.setRoundRadius(currentChat != null && currentChat.forum ? AndroidUtilities.dp(14) : AndroidUtilities.dp(24)); if (currentStatus != null) { statusTextView.setText(currentStatus, true); statusTextView.setTag(Theme.key_windowBackgroundWhiteGrayText); @@ -435,4 +447,8 @@ public class GroupCreateUserCell extends FrameLayout { info.setChecked(true); } } + + public SimpleTextView getStatusTextView() { + return statusTextView; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HeaderCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HeaderCell.java index b0d999323..75afc21dc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HeaderCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HeaderCell.java @@ -89,6 +89,18 @@ public class HeaderCell extends FrameLayout { textView.setMinHeight(AndroidUtilities.dp(height = value) - ((LayoutParams) textView.getLayoutParams()).topMargin); } + public void setTopMargin(int topMargin) { + ((LayoutParams) textView.getLayoutParams()).topMargin = AndroidUtilities.dp(topMargin); + setHeight(height); + } + + public void setBottomMargin(int bottomMargin) { + ((LayoutParams) textView.getLayoutParams()).bottomMargin = AndroidUtilities.dp(bottomMargin); + if (textView2 != null) { + ((LayoutParams) textView2.getLayoutParams()).bottomMargin = AndroidUtilities.dp(bottomMargin); + } + } + public void setEnabled(boolean value, ArrayList animators) { if (animators != null) { animators.add(ObjectAnimator.ofFloat(textView, View.ALPHA, value ? 1.0f : 0.5f)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java index 44772c36a..19b5045ae 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java @@ -20,7 +20,9 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DialogObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.tgnet.ConnectionsManager; @@ -59,7 +61,14 @@ public class HintDialogCell extends FrameLayout { imageView.setRoundRadius(AndroidUtilities.dp(27)); addView(imageView, LayoutHelper.createFrame(54, 54, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 7, 0, 0)); - nameTextView = new TextView(context); + nameTextView = new TextView(context) { + @Override + public void setText(CharSequence text, BufferType type) { + text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), AndroidUtilities.dp(10), false); + super.setText(text, type); + } + }; + NotificationCenter.listenEmojiLoading(nameTextView); nameTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); nameTextView.setMaxLines(1); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ManageChatUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ManageChatUserCell.java index 868e6d883..508ab8569 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ManageChatUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ManageChatUserCell.java @@ -12,14 +12,13 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.text.TextUtils; import android.view.Gravity; import android.widget.FrameLayout; import android.widget.ImageView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; -import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; @@ -242,7 +241,7 @@ public class ManageChatUserCell extends FrameLayout { nameTextView.setText(currentName); } else { lastName = newName == null ? UserObject.getUserName(currentUser) : newName; - nameTextView.setText(lastName); + nameTextView.setText(Emoji.replaceEmoji(lastName, nameTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(15), false)); } if (currrntStatus != null) { statusTextView.setTextColor(statusColor); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PaymentInfoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PaymentInfoCell.java index 1c23e9d23..ade9055b6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PaymentInfoCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PaymentInfoCell.java @@ -116,7 +116,7 @@ public class PaymentInfoCell extends FrameLayout { } public void setInvoice(TLRPC.TL_messageMediaInvoice invoice, String botname) { - setInfo(invoice.title, invoice.description, invoice.photo, botname, invoice); + setInfo(invoice.title, invoice.description, invoice.webPhoto, botname, invoice); } public void setReceipt(TLRPC.TL_payments_paymentReceipt receipt, String botname) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/RadioCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/RadioCell.java index 5e7e1f075..f99c37a3f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/RadioCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/RadioCell.java @@ -114,6 +114,9 @@ public class RadioCell extends FrameLayout { } } + public void hideRadioButton() { + radioButton.setVisibility(View.GONE); + } @Override protected void onDraw(Canvas canvas) { if (needDivider) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java index 46be5c9e2..818d17c00 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SessionCell.java @@ -10,12 +10,16 @@ package org.telegram.ui.Cells; import android.content.Context; import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.text.SpannableStringBuilder; import android.text.TextUtils; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; @@ -23,11 +27,12 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; @@ -40,15 +45,13 @@ import org.telegram.ui.Components.AnimatedFloat; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CombinedDrawable; -import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.DotDividerSpan; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; -import java.util.Locale; - public class SessionCell extends FrameLayout { + private int currentType; private TextView nameTextView; private TextView onlineTextView; private TextView detailTextView; @@ -71,6 +74,8 @@ public class SessionCell extends FrameLayout { linearLayout.setOrientation(LinearLayout.HORIZONTAL); linearLayout.setWeightSum(1); + currentType = type; + if (type == 1) { addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 30, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 15 : 49), 11, (LocaleController.isRTL ? 49 : 15), 0)); @@ -83,19 +88,19 @@ public class SessionCell extends FrameLayout { } else { placeholderImageView = new BackupImageView(context); placeholderImageView.setRoundRadius(AndroidUtilities.dp(10)); - addView(placeholderImageView, LayoutHelper.createFrame(42, 42, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : 16), 13, (LocaleController.isRTL ? 16 : 0), 0)); + addView(placeholderImageView, LayoutHelper.createFrame(42, 42, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : 16), 9, (LocaleController.isRTL ? 16 : 0), 0)); imageView = new BackupImageView(context); imageView.setRoundRadius(AndroidUtilities.dp(10)); - addView(imageView, LayoutHelper.createFrame(42, 42, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : 16), 13, (LocaleController.isRTL ? 16 : 0), 0)); + addView(imageView, LayoutHelper.createFrame(42, 42, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 0 : 16), 9, (LocaleController.isRTL ? 16 : 0), 0)); - addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 30, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 15 : 72), 11, (LocaleController.isRTL ? 72 : 15), 0)); + addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 30, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 15 : 72), 7.333f, (LocaleController.isRTL ? 72 : 15), 0)); } nameTextView = new TextView(context); nameTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, type == 0 ? 15 : 16); nameTextView.setLines(1); nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); nameTextView.setMaxLines(1); @@ -104,7 +109,7 @@ public class SessionCell extends FrameLayout { nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); onlineTextView = new TextView(context); - onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, type == 0 ? 12 : 13); onlineTextView.setGravity((LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.TOP); if (LocaleController.isRTL) { @@ -127,23 +132,23 @@ public class SessionCell extends FrameLayout { detailTextView = new TextView(context); detailTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - detailTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + detailTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, type == 0 ? 13 : 14); detailTextView.setLines(1); detailTextView.setMaxLines(1); detailTextView.setSingleLine(true); detailTextView.setEllipsize(TextUtils.TruncateAt.END); detailTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); - addView(detailTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, leftMargin, 36, rightMargin, 0)); + addView(detailTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, leftMargin, type == 0 ? 28 : 36, rightMargin, 0)); detailExTextView = new TextView(context); detailExTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText3)); - detailExTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + detailExTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, type == 0 ? 13 : 14); detailExTextView.setLines(1); detailExTextView.setMaxLines(1); detailExTextView.setSingleLine(true); detailExTextView.setEllipsize(TextUtils.TruncateAt.END); detailExTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); - addView(detailExTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, leftMargin, 59, rightMargin, 0)); + addView(detailExTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, leftMargin, type == 0 ? 46 : 59, rightMargin, 0)); } private void setContentAlpha(float alpha) { @@ -172,7 +177,7 @@ public class SessionCell extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(90) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(currentType == 0 ? 70 : 90) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY)); } public void setSession(TLObject object, boolean divider) { @@ -288,52 +293,106 @@ public class SessionCell extends FrameLayout { } String deviceModel = session.device_model.toLowerCase(); int iconId; - String colorKey; + String colorKey, colorKey2; if (deviceModel.contains("safari")) { iconId = R.drawable.device_web_safari; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("edge")) { iconId = R.drawable.device_web_edge; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("chrome")) { iconId = R.drawable.device_web_chrome; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("opera")) { iconId = R.drawable.device_web_opera; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("firefox")) { iconId = R.drawable.device_web_firefox; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("vivaldi")) { iconId = R.drawable.device_web_other; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (platform.contains("ios")) { iconId = deviceModel.contains("ipad") ? R.drawable.device_tablet_ios : R.drawable.device_phone_ios; colorKey = Theme.key_avatar_backgroundBlue; + colorKey2 = Theme.key_avatar_background2Blue; } else if (platform.contains("windows")) { iconId = R.drawable.device_desktop_win; colorKey = Theme.key_avatar_backgroundCyan; + colorKey2 = Theme.key_avatar_background2Cyan; } else if (platform.contains("macos")) { iconId = R.drawable.device_desktop_osx; colorKey = Theme.key_avatar_backgroundCyan; + colorKey2 = Theme.key_avatar_background2Cyan; } else if (platform.contains("android")) { iconId = deviceModel.contains("tab") ? R.drawable.device_tablet_android : R.drawable.device_phone_android; colorKey = Theme.key_avatar_backgroundGreen; + colorKey2 = Theme.key_avatar_background2Green; } else { if (session.app_name.toLowerCase().contains("desktop")) { iconId = R.drawable.device_desktop_other; colorKey = Theme.key_avatar_backgroundCyan; + colorKey2 = Theme.key_avatar_background2Cyan; } else { iconId = R.drawable.device_web_other; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } } Drawable iconDrawable = ContextCompat.getDrawable(ApplicationLoader.applicationContext, iconId).mutate(); iconDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_avatar_text), PorterDuff.Mode.SRC_IN)); - CombinedDrawable combinedDrawable = new CombinedDrawable(Theme.createCircleDrawable(AndroidUtilities.dp(42), Theme.getColor(colorKey)), iconDrawable); + Drawable bgDrawable = new CircleGradientDrawable(AndroidUtilities.dp(42), Theme.getColor(colorKey), Theme.getColor(colorKey2)); + CombinedDrawable combinedDrawable = new CombinedDrawable(bgDrawable, iconDrawable); return combinedDrawable; } + public static class CircleGradientDrawable extends Drawable { + + private Paint paint; + private int size, colorTop, colorBottom; + public CircleGradientDrawable(int size, int colorTop, int colorBottom) { + this.size = size; + this.colorTop = colorTop; + this.colorBottom = colorBottom; + paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setShader(new LinearGradient(0, 0, 0, size, new int[] {colorTop, colorBottom}, new float[] {0, 1}, Shader.TileMode.CLAMP)); + } + + @Override + public void draw(@NonNull Canvas canvas) { + canvas.drawCircle(getBounds().centerX(), getBounds().centerY(), Math.min(getBounds().width(), getBounds().height()) / 2f, paint); + } + + @Override + public void setAlpha(int i) { + paint.setAlpha(i); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) {} + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + + @Override + public int getIntrinsicHeight() { + return size; + } + + @Override + public int getIntrinsicWidth() { + return size; + } + } + @Override protected void onDraw(Canvas canvas) { float stubAlpha = showStubValue.set(showStub ? 1 : 0); @@ -381,7 +440,7 @@ public class SessionCell extends FrameLayout { this.globalGradient = globalGradient; showStub = true; - Drawable iconDrawable = ContextCompat.getDrawable(ApplicationLoader.applicationContext, AndroidUtilities.isTablet() ? R.drawable.device_tablet_android : R.drawable.device_phone_android).mutate(); + Drawable iconDrawable = ContextCompat.getDrawable(ApplicationLoader.applicationContext, AndroidUtilities.isTablet() ? R.drawable.device_tablet_android : R.drawable.device_phone_android).mutate(); iconDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_avatar_text), PorterDuff.Mode.SRC_IN)); CombinedDrawable combinedDrawable = new CombinedDrawable(Theme.createCircleDrawable(AndroidUtilities.dp(42), Theme.getColor(Theme.key_avatar_backgroundGreen)), iconDrawable); if (placeholderImageView != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ShareDialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ShareDialogCell.java index 5dabeee80..e6afdec21 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ShareDialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ShareDialogCell.java @@ -27,8 +27,10 @@ import androidx.dynamicanimation.animation.SpringForce; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; @@ -80,7 +82,14 @@ public class ShareDialogCell extends FrameLayout { addView(imageView, LayoutHelper.createFrame(56, 56, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 7, 0, 0)); } - nameTextView = new TextView(context); + nameTextView = new TextView(context) { + @Override + public void setText(CharSequence text, BufferType type) { + text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), AndroidUtilities.dp(10), false); + super.setText(text, type); + } + }; + NotificationCenter.listenEmojiLoading(nameTextView); nameTextView.setTextColor(getThemedColor(type == TYPE_CALL ? Theme.key_voipgroup_nameText : Theme.key_dialogTextBlack)); nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); nameTextView.setMaxLines(2); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java index 55ebee31a..0f09dd5fc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java @@ -32,6 +32,8 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.DotDividerSpan; import org.telegram.ui.Components.FlickerLoadingView; @@ -55,11 +57,14 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F private int titleY = AndroidUtilities.dp(9); private StaticLayout titleLayout; + AnimatedEmojiSpan.EmojiGroupedSpans titleLayoutEmojis; private int descriptionY = AndroidUtilities.dp(29); + AnimatedEmojiSpan.EmojiGroupedSpans descriptionLayoutEmojis; private StaticLayout descriptionLayout; private int captionY = AndroidUtilities.dp(29); + AnimatedEmojiSpan.EmojiGroupedSpans captionLayoutEmojis; private StaticLayout captionLayout; private MessageObject currentMessageObject; @@ -159,6 +164,7 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F } CharSequence titleFinal = TextUtils.ellipsize(title, Theme.chat_contextResult_titleTextPaint, maxWidth - dateWidth, TextUtils.TruncateAt.END); titleLayout = new StaticLayout(titleFinal, Theme.chat_contextResult_titleTextPaint, maxWidth + AndroidUtilities.dp(4) - dateWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + titleLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, titleLayoutEmojis, titleLayout); } catch (Exception e) { FileLog.e(e); } @@ -170,6 +176,7 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F sequence = TextUtils.ellipsize(AndroidUtilities.ellipsizeCenterEnd(sequence, currentMessageObject.highlightedWords.get(0), maxWidth, captionTextPaint, 130), captionTextPaint, maxWidth, TextUtils.TruncateAt.END); captionLayout = new StaticLayout(sequence, captionTextPaint, maxWidth + AndroidUtilities.dp(4), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); } + captionLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, captionLayoutEmojis, captionLayout); } try { if (viewType == VIEW_TYPE_GLOBAL_SEARCH && (currentMessageObject.isVoice() || currentMessageObject.isRoundVideo())) { @@ -190,6 +197,7 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F author = TextUtils.ellipsize(author, paint, maxWidth, TextUtils.TruncateAt.END); descriptionLayout = new StaticLayout(author, paint, maxWidth + AndroidUtilities.dp(4), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); } + descriptionLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, descriptionLayoutEmojis, descriptionLayout); } catch (Exception e) { FileLog.e(e); } @@ -249,6 +257,10 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.messagePlayingDidReset); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.messagePlayingPlayStateChanged); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.messagePlayingDidStart); + + titleLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, titleLayoutEmojis, titleLayout); + descriptionLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, descriptionLayoutEmojis, descriptionLayout); + captionLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, captionLayoutEmojis, captionLayout); } @Override @@ -259,6 +271,10 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.messagePlayingDidReset); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.messagePlayingPlayStateChanged); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.messagePlayingDidStart); + + AnimatedEmojiSpan.release(this, titleLayoutEmojis); + AnimatedEmojiSpan.release(this, descriptionLayoutEmojis); + AnimatedEmojiSpan.release(this, captionLayoutEmojis); } public MessageObject getMessage() { @@ -617,6 +633,7 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F canvas.save(); canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline) + (LocaleController.isRTL && dateLayout != null ? dateLayout.getWidth() + AndroidUtilities.dp(4) : 0), titleY); titleLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, titleLayout, titleLayoutEmojis, 0, null, 0, 0, 0, 1f); canvas.restore(); } @@ -633,6 +650,7 @@ public class SharedAudioCell extends FrameLayout implements DownloadController.F canvas.save(); canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), descriptionY); descriptionLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, descriptionLayout, descriptionLayoutEmojis, 0, null, 0, 0, 0, 1f); canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java index e103e14e1..fbd5c28ed 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java @@ -42,6 +42,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -63,7 +64,7 @@ public class SharedDocumentCell extends FrameLayout implements DownloadControlle private BackupImageView thumbImageView; private TextView nameTextView; private TextView extTextView; - private TextView dateTextView; + private AnimatedEmojiSpan.TextViewEmojis dateTextView; private RLottieImageView statusImageView; private LineProgressView progressView; private CheckBox2 checkBox; @@ -211,7 +212,7 @@ public class SharedDocumentCell extends FrameLayout implements DownloadControlle addView(statusImageView, LayoutHelper.createFrame(14, 14, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 8 : 70, 33, LocaleController.isRTL ? 72 : 8, 0)); } - dateTextView = new TextView(context); + dateTextView = new AnimatedEmojiSpan.TextViewEmojis(context); dateTextView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText3)); dateTextView.setLines(1); dateTextView.setMaxLines(1); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java index b0f25d9d4..d32bc5b87 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java @@ -11,7 +11,6 @@ package org.telegram.ui.Cells; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; -import android.graphics.CornerPathEffect; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; @@ -34,19 +33,22 @@ import android.widget.FrameLayout; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; -import org.telegram.messenger.FileLoader; -import org.telegram.messenger.FileLog; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LetterDrawable; import org.telegram.ui.Components.LinkPath; -import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.LinkSpanDrawable; import org.telegram.ui.Components.TextStyleSpan; import org.telegram.ui.Components.spoilers.SpoilerEffect; import org.telegram.ui.FilteredSearchView; @@ -90,8 +92,8 @@ public class SharedLinkCell extends FrameLayout { if (checkingForLongPress && getParent() != null && currentPressCount == pressCount) { checkingForLongPress = false; performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - if (pressedLink >= 0) { - delegate.onLinkPress(links.get(pressedLink).toString(), true); + if (pressedLinkIndex >= 0) { + delegate.onLinkPress(links.get(pressedLinkIndex).toString(), true); } MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0); onTouchEvent(event); @@ -121,9 +123,10 @@ public class SharedLinkCell extends FrameLayout { } } + private LinkSpanDrawable.LinkCollector linksCollector = new LinkSpanDrawable.LinkCollector(this); private boolean linkPreviewPressed; - private LinkPath urlPath; - private int pressedLink; + private int pressedLinkIndex; + private LinkSpanDrawable pressedLink; private ImageReceiver linkImageView; private boolean drawLinkImageView; @@ -170,6 +173,7 @@ public class SharedLinkCell extends FrameLayout { private StaticLayout dateLayout; private int fromInfoLayoutY = AndroidUtilities.dp(30); private StaticLayout fromInfoLayout; + private AnimatedEmojiSpan.EmojiGroupedSpans fromInfoLayoutEmojis; private Theme.ResourcesProvider resourcesProvider; private int viewType; @@ -190,9 +194,6 @@ public class SharedLinkCell extends FrameLayout { this.viewType = viewType; setFocusable(true); - urlPath = new LinkPath(); - urlPath.setUseRoundRect(true); - titleTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); titleTextPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); titleTextPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); @@ -477,6 +478,7 @@ public class SharedLinkCell extends FrameLayout { if (viewType == VIEW_TYPE_GLOBAL_SEARCH) { fromInfoLayout = ChatMessageCell.generateStaticLayout(FilteredSearchView.createFromInfoString(message), description2TextPaint, maxWidth, maxWidth, 0, desctiptionLines); + fromInfoLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, fromInfoLayoutEmojis, fromInfoLayout); } int height = 0; @@ -538,6 +540,7 @@ public class SharedLinkCell extends FrameLayout { if (drawLinkImageView) { linkImageView.onDetachedFromWindow(); } + AnimatedEmojiSpan.release(this, fromInfoLayoutEmojis); } @Override @@ -546,6 +549,7 @@ public class SharedLinkCell extends FrameLayout { if (drawLinkImageView) { linkImageView.onAttachedToWindow(); } + fromInfoLayoutEmojis = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, fromInfoLayoutEmojis, fromInfoLayout); } @Override @@ -562,15 +566,18 @@ public class SharedLinkCell extends FrameLayout { if (layout.getLineCount() > 0) { int height = layout.getLineBottom(layout.getLineCount() - 1); int linkPosX = AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline); - if (x >= linkPosX + layout.getLineLeft(0) && x <= linkPosX + layout.getLineWidth(0) && y >= linkY + offset && y <= linkY + offset + height) { + if ( + x >= linkPosX + layout.getLineLeft(0) && x <= linkPosX + layout.getLineWidth(0) && + y >= linkY + offset && y <= linkY + offset + height + ) { ok = true; if (event.getAction() == MotionEvent.ACTION_DOWN) { - resetPressedLink(); spoilerPressed = null; if (linkSpoilers.get(a, null) != null) { for (SpoilerEffect eff : linkSpoilers.get(a)) { if (eff.getBounds().contains(x - linkPosX, y - linkY - offset)) { + resetPressedLink(); spoilerPressed = eff; spoilerTypePressed = SPOILER_TYPE_LINK; break; @@ -581,24 +588,30 @@ public class SharedLinkCell extends FrameLayout { if (spoilerPressed != null) { result = true; } else { - pressedLink = a; - linkPreviewPressed = true; - startCheckLongPress(); - try { - urlPath.setCurrentLayout(layout, 0, 0); - layout.getSelectionPath(0, layout.getText().length(), urlPath); - } catch (Exception e) { - FileLog.e(e); + if (pressedLinkIndex != a || pressedLink == null || !linkPreviewPressed) { + resetPressedLink(); + pressedLinkIndex = a; + pressedLink = new LinkSpanDrawable(null, resourcesProvider, x - linkPosX, y - linkY - offset); + LinkPath urlPath = pressedLink.obtainNewPath(); + linkPreviewPressed = true; + linksCollector.addLink(pressedLink); + startCheckLongPress(); + try { + urlPath.setCurrentLayout(layout, 0, linkPosX, linkY + offset); + layout.getSelectionPath(0, layout.getText().length(), urlPath); + } catch (Exception e) { + FileLog.e(e); + } } result = true; } } else if (linkPreviewPressed) { try { - TLRPC.WebPage webPage = pressedLink == 0 && message.messageOwner.media != null ? message.messageOwner.media.webpage : null; + TLRPC.WebPage webPage = pressedLinkIndex == 0 && message.messageOwner.media != null ? message.messageOwner.media.webpage : null; if (webPage != null && webPage.embed_url != null && webPage.embed_url.length() != 0) { delegate.needOpenWebView(webPage, message); } else { - delegate.onLinkPress(links.get(pressedLink).toString(), false); + delegate.onLinkPress(links.get(pressedLinkIndex).toString(), false); } } catch (Exception e) { FileLog.e(e); @@ -738,7 +751,9 @@ public class SharedLinkCell extends FrameLayout { } protected void resetPressedLink() { - pressedLink = -1; + linksCollector.clear(true); + pressedLinkIndex = -1; + pressedLink = null; linkPreviewPressed = false; cancelCheckLongPress(); invalidate(); @@ -751,8 +766,6 @@ public class SharedLinkCell extends FrameLayout { checkBox.setChecked(checked, animated); } - private Paint urlPaint; - @Override protected void onDraw(Canvas canvas) { if (viewType == VIEW_TYPE_GLOBAL_SEARCH) { @@ -815,16 +828,8 @@ public class SharedLinkCell extends FrameLayout { path.addRect(b.left, b.top, b.right, b.bottom, Path.Direction.CW); } } - if (urlPaint == null) { - urlPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - urlPaint.setPathEffect(new CornerPathEffect(AndroidUtilities.dp(4))); - } - urlPaint.setColor(Theme.getColor(Theme.key_chat_linkSelectBackground, resourcesProvider)); canvas.save(); canvas.clipPath(path, Region.Op.DIFFERENCE); - if (pressedLink == a) { - canvas.drawPath(urlPath, urlPaint); - } layout.draw(canvas); canvas.restore(); @@ -834,10 +839,6 @@ public class SharedLinkCell extends FrameLayout { if (spoilers != null && !spoilers.isEmpty()) spoilers.get(0).getRipplePath(path); canvas.clipPath(path); - - if (pressedLink == a) { - canvas.drawPath(urlPath, urlPaint); - } layout.draw(canvas); canvas.restore(); @@ -848,12 +849,17 @@ public class SharedLinkCell extends FrameLayout { offset += layout.getLineBottom(layout.getLineCount() - 1); } } + + if (linksCollector.draw(canvas)) { + invalidate(); + } } if (fromInfoLayout != null) { canvas.save(); canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), fromInfoLayoutY ); fromInfoLayout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, fromInfoLayout, fromInfoLayoutEmojis, 0, null, 0, 0, 0, 1f); canvas.restore(); } letterDrawable.draw(canvas); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java index d52aa81ac..83099899d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java @@ -33,10 +33,10 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DocumentObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; -import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; @@ -50,10 +50,7 @@ import org.telegram.ui.Components.Easings; import org.telegram.ui.Components.ForegroundColorSpanThemable; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Premium.PremiumButtonView; -import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.Components.RadialProgressView; -import org.telegram.ui.LaunchActivity; -import org.telegram.ui.PremiumPreviewFragment; import java.util.ArrayList; import java.util.Locale; @@ -182,7 +179,14 @@ public class StickerSetCell extends FrameLayout { } }); - textView = new TextView(context); + textView = new TextView(context) { + @Override + public void setText(CharSequence text, BufferType type) { + text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + super.setText(text, type); + } + }; + NotificationCenter.listenEmojiLoading(textView); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java index 75c9953ac..39b735e52 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java @@ -10,6 +10,7 @@ package org.telegram.ui.Cells; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; @@ -39,11 +40,17 @@ public class TextCell extends FrameLayout { private int leftPadding; private boolean needDivider; private int offsetFromImage = 71; + public int heightDp = 48; public int imageLeft = 21; private boolean inDialogs; private boolean prioritizeTitleOverValue; private Theme.ResourcesProvider resourcesProvider; private boolean attached; + private int loadingSize; + private boolean drawLoading; + private boolean measureDelay; + private float loadingProgress; + private float drawLoadingProgress; public TextCell(Context context) { @@ -97,6 +104,10 @@ public class TextCell extends FrameLayout { setFocusable(true); } + public boolean isChecked() { + return checkBox != null && checkBox.isChecked(); + } + public Switch getCheckBox() { return checkBox; } @@ -129,7 +140,7 @@ public class TextCell extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); - int height = AndroidUtilities.dp(48); + int height = AndroidUtilities.dp(heightDp); if (prioritizeTitleOverValue) { textView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(71 + leftPadding), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY)); @@ -301,6 +312,21 @@ public class TextCell extends FrameLayout { } } + public void setTextAndCheck(String text, boolean checked, boolean divider) { + imageLeft = 21; + offsetFromImage = 71; + textView.setText(text); + imageView.setVisibility(GONE); + valueImageView.setVisibility(GONE); + needDivider = divider; + if (checkBox != null) { + checkBox.setVisibility(VISIBLE); + checkBox.setChecked(checked, false); + } + needDivider = divider; + setWillNotDraw(!needDivider); + } + public void setTextAndCheckAndIcon(String text, boolean checked, int resId, boolean divider) { imageLeft = 21; offsetFromImage = 71; @@ -318,6 +344,23 @@ public class TextCell extends FrameLayout { setWillNotDraw(!needDivider); } + public void setTextAndCheckAndIcon(String text, boolean checked, Drawable resDrawable, boolean divider) { + imageLeft = 21; + offsetFromImage = 71; + textView.setText(text); + valueTextView.setVisibility(GONE); + valueImageView.setVisibility(GONE); + if (checkBox != null) { + checkBox.setVisibility(VISIBLE); + checkBox.setChecked(checked, false); + } + imageView.setVisibility(VISIBLE); + imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0); + imageView.setImageDrawable(resDrawable); + needDivider = divider; + setWillNotDraw(!needDivider); + } + public void setTextAndValueDrawable(String text, Drawable drawable, boolean divider) { imageLeft = 21; offsetFromImage = 71; @@ -411,4 +454,71 @@ public class TextCell extends FrameLayout { super.onDetachedFromWindow(); attached = false; } + + public void setDrawLoading(boolean drawLoading, int size, boolean animated) { + this.drawLoading = drawLoading; + this.loadingSize = size; + + if (!animated) { + drawLoadingProgress = drawLoading ? 1f : 0f; + } else { + measureDelay = true; + } + invalidate(); + } + + Paint paint; + private boolean incrementLoadingProgress; + private int changeProgressStartDelay; + + @Override + protected void dispatchDraw(Canvas canvas) { + if (drawLoading || drawLoadingProgress != 0) { + if (paint == null) { + paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setColor(Theme.getColor(Theme.key_dialogSearchBackground, resourcesProvider)); + } + //LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT; + if (incrementLoadingProgress) { + loadingProgress += 16 / 1000f; + if (loadingProgress > 1f) { + loadingProgress = 1f; + incrementLoadingProgress = false; + } + } else { + loadingProgress -= 16 / 1000f; + if (loadingProgress < 0) { + loadingProgress = 0; + incrementLoadingProgress = true; + } + } + + if (changeProgressStartDelay > 0) { + changeProgressStartDelay -= 15; + } else if (drawLoading && drawLoadingProgress != 1f) { + drawLoadingProgress += 16 / 150f; + if (drawLoadingProgress > 1f) { + drawLoadingProgress = 1f; + } + } else if (!drawLoading && drawLoadingProgress != 0) { + drawLoadingProgress -= 16 / 150f; + if (drawLoadingProgress < 0) { + drawLoadingProgress = 0; + } + } + + float alpha = (0.6f + 0.4f * loadingProgress) * drawLoadingProgress; + paint.setAlpha((int) (255 * alpha)); + int cy = getMeasuredHeight() >> 1; + AndroidUtilities.rectTmp.set(getMeasuredWidth() - AndroidUtilities.dp(11) - AndroidUtilities.dp(loadingSize), cy - AndroidUtilities.dp(3), getMeasuredWidth() - AndroidUtilities.dp(11), cy + AndroidUtilities.dp(3)); + if (LocaleController.isRTL) { + AndroidUtilities.rectTmp.left = getMeasuredWidth() - AndroidUtilities.rectTmp.left; + AndroidUtilities.rectTmp.right = getMeasuredWidth() - AndroidUtilities.rectTmp.right; + } + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(3), AndroidUtilities.dp(3), paint); + invalidate(); + } + valueTextView.setAlpha(1f - drawLoadingProgress); + super.dispatchDraw(canvas); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell2.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell2.java index 8fd240716..8e9b65466 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell2.java @@ -19,7 +19,6 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; -import org.telegram.messenger.R; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Switch; @@ -169,6 +168,10 @@ public class TextCheckCell2 extends FrameLayout { return checkBox.isChecked(); } + public Switch getCheckBox() { + return checkBox; + } + @Override protected void onDraw(Canvas canvas) { if (needDivider) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java index dd77b4b3f..988d204d1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java @@ -13,7 +13,6 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.text.TextUtils; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -27,7 +26,6 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; -import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LinkSpanDrawable; @@ -146,6 +144,9 @@ public class TextDetailCell extends FrameLayout { public void setImageClickListener(View.OnClickListener clickListener) { imageView.setOnClickListener(clickListener); + if (clickListener == null) { + imageView.setClickable(false); + } } public void setTextWithEmojiAndValue(CharSequence text, CharSequence value, boolean divider) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java index 1cfc6b39c..8af12f71f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java @@ -1800,6 +1800,10 @@ public abstract class TextSelectionHelper createMenu(view)); + chatListView.setOnItemClickListener(new RecyclerListView.OnItemClickListenerExtended() { + @Override + public void onItemClick(View view, int position, float x, float y) { + createMenu(view, x, y); + } + }); chatListView.setTag(1); chatListView.setVerticalScrollBarEnabled(true); chatListView.setAdapter(chatAdapter = new ChatActivityAdapter(context)); @@ -945,7 +973,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } } checkScrollForLoad(true); - updateMessagesVisisblePart(); + updateMessagesVisiblePart(); } }); if (scrollToPositionOnRecreate != -1) { @@ -1108,7 +1136,33 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio return fragmentView; } + private ActionBarPopupWindow scrimPopupWindow; + private int scrimPopupX, scrimPopupY; + private void closeMenu() { + if (scrimPopupWindow != null) { + scrimPopupWindow.dismiss(); + } + } + + private final static int OPTION_COPY = 3; + private final static int OPTION_SAVE_TO_GALLERY = 4; + private final static int OPTION_APPLY_FILE = 5; + private final static int OPTION_SHARE = 6; + private final static int OPTION_SAVE_TO_GALLERY2 = 7; + private final static int OPTION_SAVE_STICKER = 9; + private final static int OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC = 10; + private final static int OPTION_SAVE_TO_GIFS = 11; + private final static int OPTION_ADD_CONTACT = 15; + private final static int OPTION_COPY_PHONE = 16; + private final static int OPTION_CALL = 17; + private final static int OPTION_RESTRICT = 33; + private final static int OPTION_REPORT_FALSE_POSITIVE = 34; + private boolean createMenu(View v) { + return createMenu(v, 0, 0); + } + + private boolean createMenu(View v, float x, float y) { MessageObject message = null; if (v instanceof ChatMessageCell) { message = ((ChatMessageCell) v).getMessageObject(); @@ -1123,14 +1177,56 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio if (getParentActivity() == null) { return false; } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); ArrayList items = new ArrayList<>(); final ArrayList options = new ArrayList<>(); + final ArrayList icons = new ArrayList<>(); + + if (message.currentEvent != null && message.currentEvent.action instanceof TLRPC.TL_channelAdminLogEventActionDeleteMessage && message.currentEvent.user_id == getMessagesController().telegramAntispamUserId) { + if (v instanceof ChatActionCell) { + SpannableString arrow = new SpannableString(">"); + Drawable arrowDrawable = getContext().getResources().getDrawable(R.drawable.attach_arrow_right).mutate(); + arrowDrawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_undo_cancelColor), PorterDuff.Mode.MULTIPLY)); + arrowDrawable.setBounds(0, 0, AndroidUtilities.dp(10), AndroidUtilities.dp(10)); + arrow.setSpan(new ImageSpan(arrowDrawable, DynamicDrawableSpan.ALIGN_CENTER), 0, arrow.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + SpannableStringBuilder link = new SpannableStringBuilder(); + link + .append(LocaleController.getString("EventLogFilterGroupInfo", R.string.EventLogFilterGroupInfo)) + .append(" ") + .append(arrow) + .append(" ") + .append(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators)); + link.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull View view) { + finishFragment(); + } + + @Override + public void updateDrawState(@NonNull TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + } + }, 0, link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + CharSequence text = LocaleController.getString("ChannelAntiSpamInfo2", R.string.ChannelAntiSpamInfo2); + text = AndroidUtilities.replaceCharSequence("%s", text, link); + Bulletin bulletin = BulletinFactory.of(this).createSimpleBulletin(R.raw.msg_antispam, LocaleController.getString("ChannelAntiSpamUser", R.string.ChannelAntiSpamUser), text); + bulletin.setDuration(Bulletin.DURATION_PROLONG); + bulletin.show(); + return true; + } + items.add(LocaleController.getString("ReportFalsePositive", R.string.ReportFalsePositive)); + icons.add(R.drawable.msg_notspam); + options.add(OPTION_REPORT_FALSE_POSITIVE); + items.add(null); + icons.add(null); + options.add(null); + } if (selectedObject.type == MessageObject.TYPE_TEXT || selectedObject.caption != null) { items.add(LocaleController.getString("Copy", R.string.Copy)); - options.add(3); + icons.add(R.drawable.msg_copy); + options.add(OPTION_COPY); } if (type == 1) { if (selectedObject.currentEvent != null && selectedObject.currentEvent.action instanceof TLRPC.TL_channelAdminLogEventActionChangeStickerSet) { @@ -1162,60 +1258,79 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } else if (type == 3) { if (selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && MessageObject.isNewGifDocument(selectedObject.messageOwner.media.webpage.document)) { items.add(LocaleController.getString("SaveToGIFs", R.string.SaveToGIFs)); - options.add(11); + icons.add(R.drawable.msg_gif); + options.add(OPTION_SAVE_TO_GIFS); } } else if (type == 4) { if (selectedObject.isVideo()) { items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery)); - options.add(4); + icons.add(R.drawable.msg_gallery); + options.add(OPTION_SAVE_TO_GALLERY); items.add(LocaleController.getString("ShareFile", R.string.ShareFile)); - options.add(6); + icons.add(R.drawable.msg_share); + options.add(OPTION_SHARE); } else if (selectedObject.isMusic()) { items.add(LocaleController.getString("SaveToMusic", R.string.SaveToMusic)); - options.add(10); + icons.add(R.drawable.msg_download); + options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC); items.add(LocaleController.getString("ShareFile", R.string.ShareFile)); - options.add(6); + icons.add(R.drawable.msg_share); + options.add(OPTION_SHARE); } else if (selectedObject.getDocument() != null) { if (MessageObject.isNewGifDocument(selectedObject.getDocument())) { items.add(LocaleController.getString("SaveToGIFs", R.string.SaveToGIFs)); - options.add(11); + icons.add(R.drawable.msg_gif); + options.add(OPTION_SAVE_TO_GIFS); } items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads)); - options.add(10); + icons.add(R.drawable.msg_download); + options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC); items.add(LocaleController.getString("ShareFile", R.string.ShareFile)); - options.add(6); + icons.add(R.drawable.msg_share); + options.add(OPTION_SHARE); } else { items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery)); - options.add(4); + icons.add(R.drawable.msg_gallery); + options.add(OPTION_SAVE_TO_GALLERY); } } else if (type == 5) { items.add(LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile)); - options.add(5); + icons.add(R.drawable.msg_language); + options.add(OPTION_APPLY_FILE); items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads)); - options.add(10); + icons.add(R.drawable.msg_download); + options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC); items.add(LocaleController.getString("ShareFile", R.string.ShareFile)); - options.add(6); + icons.add(R.drawable.msg_share); + options.add(OPTION_SHARE); } else if (type == 10) { items.add(LocaleController.getString("ApplyThemeFile", R.string.ApplyThemeFile)); - options.add(5); + icons.add(R.drawable.msg_theme); + options.add(OPTION_APPLY_FILE); items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads)); - options.add(10); + icons.add(R.drawable.msg_download); + options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC); items.add(LocaleController.getString("ShareFile", R.string.ShareFile)); - options.add(6); + icons.add(R.drawable.msg_share); + options.add(OPTION_SHARE); } else if (type == 6) { items.add(LocaleController.getString("SaveToGallery", R.string.SaveToGallery)); - options.add(7); + icons.add(R.drawable.msg_gallery); + options.add(OPTION_SAVE_TO_GALLERY2); items.add(LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads)); - options.add(10); + icons.add(R.drawable.msg_download); + options.add(OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC); items.add(LocaleController.getString("ShareFile", R.string.ShareFile)); - options.add(6); + icons.add(R.drawable.msg_share); + options.add(OPTION_SHARE); } else if (type == 7) { if (selectedObject.isMask()) { items.add(LocaleController.getString("AddToMasks", R.string.AddToMasks)); } else { items.add(LocaleController.getString("AddToStickers", R.string.AddToStickers)); } - options.add(9); + icons.add(R.drawable.msg_sticker); + options.add(OPTION_SAVE_STICKER); } else if (type == 8) { long uid = selectedObject.messageOwner.media.user_id; TLRPC.User user = null; @@ -1224,29 +1339,156 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } if (user != null && user.id != UserConfig.getInstance(currentAccount).getClientUserId() && ContactsController.getInstance(currentAccount).contactsDict.get(user.id) == null) { items.add(LocaleController.getString("AddContactTitle", R.string.AddContactTitle)); - options.add(15); + icons.add(R.drawable.msg_addcontact); + options.add(OPTION_ADD_CONTACT); } if (!TextUtils.isEmpty(selectedObject.messageOwner.media.phone_number)) { items.add(LocaleController.getString("Copy", R.string.Copy)); - options.add(16); + icons.add(R.drawable.msg_copy); + options.add(OPTION_COPY_PHONE); items.add(LocaleController.getString("Call", R.string.Call)); - options.add(17); + icons.add(R.drawable.msg_calls); + options.add(OPTION_CALL); } } - if (options.isEmpty()) { - return false; - } - final CharSequence[] finalItems = items.toArray(new CharSequence[0]); - builder.setItems(finalItems, (dialogInterface, i) -> { - if (selectedObject == null || i < 0 || i >= options.size()) { + boolean callbackSent = false; + + Runnable proceed = () -> { + if (options.isEmpty()) { return; } - processSelectedOption(options.get(i)); - }); - builder.setTitle(LocaleController.getString("Message", R.string.Message)); - showDialog(builder.create()); + ActionBarPopupWindow.ActionBarPopupWindowLayout popupLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(getParentActivity(), R.drawable.popup_fixed_alert, getResourceProvider(), 0); + popupLayout.setMinimumWidth(AndroidUtilities.dp(200)); + Rect backgroundPaddings = new Rect(); + Drawable shadowDrawable = getParentActivity().getResources().getDrawable(R.drawable.popup_fixed_alert).mutate(); + shadowDrawable.getPadding(backgroundPaddings); + popupLayout.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuBackground)); + + for (int a = 0, N = items.size(); a < N; ++a) { + if (options.get(a) == null) { + popupLayout.addView(new ActionBarPopupWindow.GapView(getContext(), getResourceProvider()), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + } else { + ActionBarMenuSubItem cell = new ActionBarMenuSubItem(getParentActivity(), a == 0, a == N - 1, getResourceProvider()); + cell.setMinimumWidth(AndroidUtilities.dp(200)); + cell.setTextAndIcon(items.get(a), icons.get(a)); + final Integer option = options.get(a); + popupLayout.addView(cell); + final int i = a; + cell.setOnClickListener(v1 -> { + if (selectedObject == null || i >= options.size()) { + return; + } + processSelectedOption(option); + }); + } + } + + ChatScrimPopupContainerLayout scrimPopupContainerLayout = new ChatScrimPopupContainerLayout(contentView.getContext()) { + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { + closeMenu(); + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + boolean b = super.dispatchTouchEvent(ev); + if (ev.getAction() == MotionEvent.ACTION_DOWN && !b) { + closeMenu(); + } + return b; + } + }; + scrimPopupContainerLayout.addView(popupLayout, LayoutHelper.createLinearRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT, 0, 0, 0, 0)); + scrimPopupContainerLayout.setPopupWindowLayout(popupLayout); + + scrimPopupWindow = new ActionBarPopupWindow(scrimPopupContainerLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) { + @Override + public void dismiss() { + super.dismiss(); + if (scrimPopupWindow != this) { + return; + } + Bulletin.hideVisible(); + scrimPopupWindow = null; + } + }; + scrimPopupWindow.setPauseNotifications(true); + scrimPopupWindow.setDismissAnimationDuration(220); + scrimPopupWindow.setOutsideTouchable(true); + scrimPopupWindow.setClippingEnabled(true); + scrimPopupWindow.setAnimationStyle(R.style.PopupContextAnimation); + scrimPopupWindow.setFocusable(true); + scrimPopupContainerLayout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST)); + scrimPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED); + scrimPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); + scrimPopupWindow.getContentView().setFocusableInTouchMode(true); + popupLayout.setFitItems(true); + + int popupX = v.getLeft() + (int) x - scrimPopupContainerLayout.getMeasuredWidth() + backgroundPaddings.left - AndroidUtilities.dp(28); + if (popupX < AndroidUtilities.dp(6)) { + popupX = AndroidUtilities.dp(6); + } else if (popupX > chatListView.getMeasuredWidth() - AndroidUtilities.dp(6) - scrimPopupContainerLayout.getMeasuredWidth()) { + popupX = chatListView.getMeasuredWidth() - AndroidUtilities.dp(6) - scrimPopupContainerLayout.getMeasuredWidth(); + } + if (AndroidUtilities.isTablet()) { + int[] location = new int[2]; + fragmentView.getLocationInWindow(location); + popupX += location[0]; + } + int totalHeight = contentView.getHeight(); + int height = scrimPopupContainerLayout.getMeasuredHeight() + AndroidUtilities.dp(48); + int keyboardHeight = contentView.measureKeyboardHeight(); + if (keyboardHeight > AndroidUtilities.dp(20)) { + totalHeight += keyboardHeight; + } + int popupY; + if (height < totalHeight) { + popupY = (int) (chatListView.getY() + v.getTop() + y); + if (height - backgroundPaddings.top - backgroundPaddings.bottom > AndroidUtilities.dp(240)) { + popupY += AndroidUtilities.dp(240) - height; + } + if (popupY < chatListView.getY() + AndroidUtilities.dp(24)) { + popupY = (int) (chatListView.getY() + AndroidUtilities.dp(24)); + } else if (popupY > totalHeight - height - AndroidUtilities.dp(8)) { + popupY = totalHeight - height - AndroidUtilities.dp(8); + } + } else { + popupY = inBubbleMode ? 0 : AndroidUtilities.statusBarHeight; + } + final int finalPopupX = scrimPopupX = popupX; + final int finalPopupY = scrimPopupY = popupY; + scrimPopupContainerLayout.setMaxHeight(totalHeight - popupY); + scrimPopupWindow.showAtLocation(chatListView, Gravity.LEFT | Gravity.TOP, finalPopupX, finalPopupY); + scrimPopupWindow.dimBehind(); + }; + + if ( + ChatObject.canBlockUsers(currentChat) && + message.currentEvent != null && message.currentEvent.action instanceof TLRPC.TL_channelAdminLogEventActionDeleteMessage && message.currentEvent.user_id == getMessagesController().telegramAntispamUserId && + message.messageOwner != null && message.messageOwner.from_id != null && !UserObject.isUserSelf(getMessagesController().getUser(message.messageOwner.from_id.user_id)) + ) { + TLRPC.User user = getMessagesController().getUser(selectedObject.messageOwner.from_id.user_id); + if (user != null) { + callbackSent = true; + getMessagesController().checkIsInChat(true, currentChat, user, (isInChat, rights, rank) -> { + if (isInChat) { + items.add(LocaleController.getString("BanUser", R.string.BanUser)); + icons.add(R.drawable.msg_block2); + options.add(OPTION_RESTRICT); + } + AndroidUtilities.runOnUIThread(proceed); + }); + } + } + if (!callbackSent) { + proceed.run(); + } + return true; } @@ -1366,15 +1608,17 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } private void processSelectedOption(int option) { + closeMenu(); if (selectedObject == null) { return; } switch (option) { - case 3: { + case OPTION_COPY: { AndroidUtilities.addToClipboard(getMessageContent(selectedObject, 0, true)); + BulletinFactory.of(ChannelAdminLogActivity.this).createCopyBulletin(LocaleController.getString("MessageCopied", R.string.MessageCopied)).show(); break; } - case 4: { + case OPTION_SAVE_TO_GALLERY: { String path = selectedObject.messageOwner.attachPath; if (path != null && path.length() > 0) { File temp = new File(path); @@ -1395,7 +1639,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } break; } - case 5: { + case OPTION_APPLY_FILE: { File locFile = null; if (selectedObject.messageOwner.attachPath != null && selectedObject.messageOwner.attachPath.length() != 0) { File f = new File(selectedObject.messageOwner.attachPath); @@ -1458,7 +1702,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } break; } - case 6: { + case OPTION_SHARE: { String path = selectedObject.messageOwner.attachPath; if (path != null && path.length() > 0) { File temp = new File(path); @@ -1488,7 +1732,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } break; } - case 7: { + case OPTION_SAVE_TO_GALLERY2: { String path = selectedObject.messageOwner.attachPath; if (path != null && path.length() > 0) { File temp = new File(path); @@ -1507,11 +1751,11 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio MediaController.saveFile(path, getParentActivity(), 0, null, null); break; } - case 9: { + case OPTION_SAVE_STICKER: { showDialog(new StickersAlert(getParentActivity(), this, selectedObject.getInputStickerSet(), null, null)); break; } - case 10: { + case OPTION_SAVE_TO_DOWNLOADS_OR_MUSIC: { if (Build.VERSION.SDK_INT >= 23 && (Build.VERSION.SDK_INT <= 28 || BuildVars.NO_SCOPED_STORAGE) && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4); selectedObject = null; @@ -1534,12 +1778,12 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio MediaController.saveFile(path, getParentActivity(), selectedObject.isMusic() ? 3 : 2, fileName, selectedObject.getDocument() != null ? selectedObject.getDocument().mime_type : ""); break; } - case 11: { + case OPTION_SAVE_TO_GIFS: { TLRPC.Document document = selectedObject.getDocument(); MessagesController.getInstance(currentAccount).saveGif(selectedObject, document); break; } - case 15: { + case OPTION_ADD_CONTACT: { Bundle args = new Bundle(); args.putLong("user_id", selectedObject.messageOwner.media.user_id); args.putString("phone", selectedObject.messageOwner.media.phone_number); @@ -1547,11 +1791,12 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio presentFragment(new ContactAddActivity(args)); break; } - case 16: { + case OPTION_COPY_PHONE: { AndroidUtilities.addToClipboard(selectedObject.messageOwner.media.phone_number); + BulletinFactory.of(ChannelAdminLogActivity.this).createCopyBulletin(LocaleController.getString("PhoneCopied", R.string.PhoneCopied)).show(); break; } - case 17: { + case OPTION_CALL: { try { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + selectedObject.messageOwner.media.phone_number)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -1561,6 +1806,33 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } break; } + case OPTION_REPORT_FALSE_POSITIVE: { + TLRPC.TL_channels_reportAntiSpamFalsePositive req = new TLRPC.TL_channels_reportAntiSpamFalsePositive(); + req.channel = getMessagesController().getInputChannel(currentChat.id); + req.msg_id = selectedObject.getRealId(); + getConnectionsManager().sendRequest(req, (res, err) -> { + AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_boolTrue) { + BulletinFactory.of(this).createSimpleBulletin(R.raw.msg_antispam, LocaleController.getString("ChannelAntiSpamFalsePositiveReported", R.string.ChannelAntiSpamFalsePositiveReported)).show(); + } else if (res instanceof TLRPC.TL_boolFalse) { + BulletinFactory.of(this).createSimpleBulletin(R.raw.error, LocaleController.getString("UnknownError", R.string.UnknownError)).show(); + } else { + BulletinFactory.of(this).createSimpleBulletin(R.raw.error, LocaleController.getString("UnknownError", R.string.UnknownError)).show(); + } + }); + }); + break; + } + case OPTION_RESTRICT: { + getMessagesController().deleteParticipantFromChat(currentChat.id, getMessagesController().getInputPeer(selectedObject.messageOwner.from_id)); + if (currentChat != null && selectedObject.messageOwner.from_id instanceof TLRPC.TL_peerUser && BulletinFactory.canShowBulletin(this)) { + TLRPC.User user = getMessagesController().getUser(selectedObject.messageOwner.from_id.user_id); + if (user != null) { + BulletinFactory.createRemoveFromChatBulletin(this, user, currentChat.title).show(); + } + } + break; + } } selectedObject = null; } @@ -1640,6 +1912,16 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio getMessagesController().putUsers(res.users, false); getMessagesController().putChats(res.chats, false); admins = res.participants; + if (currentChat != null) { + TLRPC.ChatFull chatFull = getMessagesController().getChatFull(currentChat.id); + if (chatFull != null && chatFull.antispam) { + TLRPC.ChannelParticipant antispamParticipant = new TLRPC.ChannelParticipant() {}; + antispamParticipant.user_id = getMessagesController().telegramAntispamUserId; + antispamParticipant.peer = getMessagesController().getPeer(antispamParticipant.user_id); + loadAntispamUser(getMessagesController().telegramAntispamUserId); + admins.add(0, antispamParticipant); + } + } if (visibleDialog instanceof AdminLogFilterAlert) { ((AdminLogFilterAlert) visibleDialog).setCurrentAdmins(admins); } @@ -1648,6 +1930,28 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid); } + private void loadAntispamUser(long userId) { + if (getMessagesController().getUser(userId) != null) { + return; + } + TLRPC.TL_users_getUsers req = new TLRPC.TL_users_getUsers(); + TLRPC.TL_inputUser inputUser = new TLRPC.TL_inputUser(); + inputUser.user_id = userId; + req.id.add(inputUser); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> { + if (res instanceof TLRPC.Vector) { + ArrayList objects = ((TLRPC.Vector) res).objects; + ArrayList users = new ArrayList<>(); + for (int i = 0; i < objects.size(); ++i) { + if (objects.get(i) instanceof TLRPC.User) { + users.add((TLRPC.User) objects.get(i)); + } + } + getMessagesController().putUsers(users, false); + } + }); + } + @Override public void onRemoveFromParent() { MediaController.getInstance().setTextureView(videoTextureView, null, null, false); @@ -1741,7 +2045,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio } } - private void updateMessagesVisisblePart() { + private void updateMessagesVisiblePart() { if (chatListView == null) { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java index 28edacfc2..224a9e2c8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java @@ -343,7 +343,7 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC createAfterUpload = true; return; } - doneRequestId = MessagesController.getInstance(currentAccount).createChat(nameTextView.getText().toString(), new ArrayList<>(), descriptionTextView.getText().toString(), ChatObject.CHAT_TYPE_CHANNEL, false, null, null, ChannelCreateActivity.this); + doneRequestId = MessagesController.getInstance(currentAccount).createChat(nameTextView.getText().toString(), new ArrayList<>(), descriptionTextView.getText().toString(), ChatObject.CHAT_TYPE_CHANNEL, false, null, null, 0, ChannelCreateActivity.this); } else if (currentStep == 1) { if (!isPrivate) { if (descriptionTextView.length() == 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 3114d9814..f72d5df2e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -323,6 +323,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public boolean shareAlertDebugTopicsSlowMotion; public boolean justCreatedTopic = false; + public boolean justCreatedChat = false; protected TLRPC.Chat currentChat; protected TLRPC.User currentUser; protected TLRPC.EncryptedChat currentEncryptedChat; @@ -394,6 +395,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private FrameLayout mentiondownButton; private SimpleTextView mentiondownButtonCounter; private ImageView mentiondownButtonImage; + private Bulletin messageSeenPrivacyBulletin; private int reactionsMentionCount; private FrameLayout reactionsMentiondownButton; @@ -1501,6 +1503,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int migrated_to = arguments.getInt("migrated_to", 0); scrollToTopOnResume = arguments.getBoolean("scrollToTopOnResume", false); needRemovePreviousSameChatActivity = arguments.getBoolean("need_remove_previous_same_chat_activity", true); + justCreatedChat = arguments.getBoolean("just_created_chat", false); if (chatId != 0) { currentChat = getMessagesController().getChat(chatId); @@ -1705,7 +1708,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().addObserver(this, NotificationCenter.chatAvailableReactionsUpdated); getNotificationCenter().addObserver(this, NotificationCenter.dialogsUnreadReactionsCounterChanged); getNotificationCenter().addObserver(this, NotificationCenter.groupStickersDidLoad); - getNotificationCenter().addObserver(this, NotificationCenter.chatSwithcedToForum); super.onFragmentCreate(); @@ -1824,7 +1826,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } if (AndroidUtilities.isTablet() && !isComments) { - getNotificationCenter().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, false); + getNotificationCenter().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, getTopicId(), false); } if (currentUser != null && !UserObject.isReplyUser(currentUser)) { @@ -1867,6 +1869,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not }, timeout * 1000L); } + if (isTopic) { + getMessagesController().getTopicsController().getTopicRepliesCount(dialog_id, getTopicId()); + } + return true; } @@ -2030,14 +2036,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().removeObserver(this, NotificationCenter.didLoadSendAsPeers); getNotificationCenter().removeObserver(this, NotificationCenter.dialogsUnreadReactionsCounterChanged); getNotificationCenter().removeObserver(this, NotificationCenter.groupStickersDidLoad); - getNotificationCenter().removeObserver(this, NotificationCenter.chatSwithcedToForum); if (currentEncryptedChat != null) { getNotificationCenter().removeObserver(this, NotificationCenter.didVerifyMessagesStickers); } NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.needSetDayNightTheme); if (chatMode == 0 && AndroidUtilities.isTablet()) { - getNotificationCenter().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, true); + getNotificationCenter().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, getTopicId(), true); } if (currentUser != null) { MediaController.getInstance().stopMediaObserver(); @@ -2622,7 +2627,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not attachItem.setVisibility(View.GONE); } } - if (threadMessageId == 0 && !UserObject.isReplyUser(currentUser) || threadMessageObject != null && threadMessageObject.getRepliesCount() == 0) { + if (threadMessageId == 0 && !UserObject.isReplyUser(currentUser) || threadMessageObject != null && threadMessageObject.getRepliesCount() < 10) { searchItem.setVisibility(View.GONE); } searchItemVisible = false; @@ -2695,7 +2700,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } }); searchItem.setSearchFieldHint(LocaleController.getString("Search", R.string.Search)); - if (threadMessageId == 0 && !UserObject.isReplyUser(currentUser) || threadMessageObject != null && threadMessageObject.getRepliesCount() == 0) { + if (threadMessageId == 0 && !UserObject.isReplyUser(currentUser) || threadMessageObject != null && threadMessageObject.getRepliesCount() < 10) { searchItem.setVisibility(View.GONE); } searchItemVisible = false; @@ -4636,7 +4641,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (chatMode != 0 || threadMessageObjects != null && threadMessageObjects.contains(message) || getMessageType(message) == 1 && (message.getDialogId() == mergeDialogId || message.needDrawBluredPreview()) || currentEncryptedChat == null && message.getId() < 0 || - bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE && !(bottomOverlayChatWaitsReply && message != null && (MessageObject.getTopicId(message.messageOwner) != 0 || message.wasJustSent)) || + bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE && !(bottomOverlayChatWaitsReply && message != null && (MessageObject.getTopicId(message.messageOwner, ChatObject.isForum(currentChat)) != 0 || message.wasJustSent)) || currentChat != null && (ChatObject.isNotInChat(currentChat) && !isThreadChat() || ChatObject.isChannel(currentChat) && !ChatObject.canPost(currentChat) && !currentChat.megagroup || !ChatObject.canSendMessages(currentChat)) || textSelectionHelper.isSelectionMode()) { slidingView.setSlidingOffset(0); @@ -4875,7 +4880,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private boolean isSkeletonVisible() { - if (justCreatedTopic || currentUser != null || !SharedConfig.animationsEnabled()) { + if (justCreatedTopic || justCreatedChat || currentUser != null || !SharedConfig.animationsEnabled()) { return false; } int childHeight = 0; @@ -5035,6 +5040,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int wasOutlineAlpha = skeletonOutlinePaint.getAlpha(); skeletonServicePaint.setAlpha((int) (0xFF * topSkeletonAlpha)); skeletonPaint.setAlpha((int) (topSkeletonAlpha * alpha)); + skeletonOutlinePaint.setAlpha((int) (wasOutlineAlpha * alpha)); while (lastTop > blurredViewTopOffset) { lastTop -= AndroidUtilities.dp(3f); @@ -5109,6 +5115,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not skeletonColor0 = color0; skeletonColor1 = color1; skeletonGradient = new LinearGradient(0, 0, skeletonGradientWidth = AndroidUtilities.dp(200), 0, new int[]{color1, color0, color0, color1}, new float[]{0.0f, 0.4f, 0.6f, 1f}, Shader.TileMode.CLAMP); + skeletonTotalTranslation = -skeletonGradientWidth * 2; skeletonPaint.setShader(skeletonGradient); int outlineColor = Color.argb(dark ? 0x2B : 0x60, 0xFF, 0xFF, 0xFF); @@ -6000,7 +6007,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not boolean computingScroll; @Override - public int getStarForFixGap() { + public int getStartForFixGap() { int padding = (int) chatListViewPaddingTop; if (isThreadChat() && (!isTopic || topicStarterMessageObject != null) && pinnedMessageView != null && pinnedMessageView.getVisibility() == View.VISIBLE) { padding -= Math.max(0, AndroidUtilities.dp(48) + pinnedMessageEnterOffset); @@ -7769,7 +7776,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } if (ChatObject.isForum(currentChat) && !isTopic && replyingMessageObject != null) { - int topicId = replyingMessageObject.replyToForumTopic != null ? replyingMessageObject.replyToForumTopic.id : MessageObject.getTopicId(replyingMessageObject.messageOwner); + int topicId = replyingMessageObject.replyToForumTopic != null ? replyingMessageObject.replyToForumTopic.id : MessageObject.getTopicId(replyingMessageObject.messageOwner, true); if (topicId != 0) { getMediaDataController().cleanDraft(dialog_id, topicId, false); } @@ -8296,7 +8303,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not replyCloseImageView.setOnClickListener(v -> { if (forwardingMessages == null || forwardingMessages.messages.isEmpty()) { if (ChatObject.isForum(currentChat) && !isTopic && replyingMessageObject != null) { - int topicId = MessageObject.getTopicId(replyingMessageObject.messageOwner); + int topicId = MessageObject.getTopicId(replyingMessageObject.messageOwner, true); if (topicId != 0) { getMediaDataController().cleanDraft(dialog_id, topicId, false); } @@ -10345,7 +10352,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void onDismissAnimationStart() { - chatAttachAlert.setFocusable(false); + if (chatAttachAlert != null) { + chatAttachAlert.setFocusable(false); + } chatActivityEnterView.getEditField().requestFocus(); if (chatAttachAlert != null && chatAttachAlert.isShowing()) { AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); @@ -10714,6 +10723,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } + public boolean checkSlowModeAlert() { + CharSequence time = chatActivityEnterView.getSlowModeTimer(); + if (time != null) { + new AlertDialog.Builder(getContext()) + .setTitle(LocaleController.getString("Slowmode", R.string.Slowmode)) + .setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("SlowModeHint", R.string.SlowModeHint, time))) + .setPositiveButton(LocaleController.getString("OK", R.string.OK), null) + .show(); + return false; + } + return true; + } + private void hideHints(boolean scroll) { if (!scroll) { if (slowModeHint != null) { @@ -11531,8 +11553,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public void openPollCreate(Boolean quiz) { PollCreateActivity pollCreateActivity = new PollCreateActivity(ChatActivity.this, quiz); pollCreateActivity.setDelegate((poll, params, notify, scheduleDate) -> { - getSendMessagesHelper().sendMessage(poll, dialog_id, replyingMessageObject, getThreadMessage(), null, params, notify, scheduleDate); - afterMessageSend(); + if (checkSlowModeAlert()) { + getSendMessagesHelper().sendMessage(poll, dialog_id, replyingMessageObject, getThreadMessage(), null, params, notify, scheduleDate); + afterMessageSend(); + } }); presentFragment(pollCreateActivity); } @@ -11540,13 +11564,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void didSelectFiles(ArrayList files, String caption, ArrayList fmessages, boolean notify, int scheduleDate) { fillEditingMediaWithCaption(caption, null); - if (!fmessages.isEmpty() && !TextUtils.isEmpty(caption)) { - SendMessagesHelper.getInstance(currentAccount).sendMessage(caption, dialog_id, null, null, null, true, null, null, null, true, 0, null, false); - caption = null; + if (checkSlowModeAlert()) { + if (!fmessages.isEmpty() && !TextUtils.isEmpty(caption)) { + SendMessagesHelper.getInstance(currentAccount).sendMessage(caption, dialog_id, null, null, null, true, null, null, null, true, 0, null, false); + caption = null; + } + getSendMessagesHelper().sendMessage(fmessages, dialog_id, false, false, true, 0); + SendMessagesHelper.prepareSendingDocuments(getAccountInstance(), files, files, null, caption, null, dialog_id, replyingMessageObject, getThreadMessage(), null, editingMessageObject, notify, scheduleDate); + afterMessageSend(); } - getSendMessagesHelper().sendMessage(fmessages, dialog_id, false, false,true, 0); - SendMessagesHelper.prepareSendingDocuments(getAccountInstance(), files, files, null, caption, null, dialog_id, replyingMessageObject, getThreadMessage(), null, editingMessageObject, notify, scheduleDate); - afterMessageSend(); } @Override @@ -11567,6 +11593,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (photos.isEmpty()) { return; } + if (!checkSlowModeAlert()) { + return; + } boolean hasNoGifs = false; for (int a = 0; a < photos.size(); a++) { SendMessagesHelper.SendingMediaInfo info = photos.get(a); @@ -11778,6 +11807,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (arrayList == null || arrayList.isEmpty()) { return; } + if (!checkSlowModeAlert()) { + return; + } if ((scheduleDate != 0) == (chatMode == MODE_SCHEDULED)) { waitingForSendingMessageLoad = true; } @@ -14241,7 +14273,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private void updateTopicTitleIcon() { if (forumTopic != null && avatarContainer != null) { avatarContainer.getAvatarImageView().setVisibility(View.VISIBLE); - ForumUtilities.setTopicIcon(avatarContainer.getAvatarImageView(), forumTopic, true); + ForumUtilities.setTopicIcon(avatarContainer.getAvatarImageView(), forumTopic, true, themeDelegate); } } @@ -16630,7 +16662,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (forwardEndReached[0]) { forwardEndReached[0] = false; hideForwardEndReached = false; - chatAdapter.notifyItemInserted(0); + if (chatAdapter != null) { + chatAdapter.notifyItemInserted(0); + } } getMessagesController().addToViewsQueue(threadMessageObject); } else { @@ -17167,7 +17201,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (object == null && replaceObjects != null) { object = replaceObjects.get(mid); } - if (object != null && (!isTopic || getTopicId() == MessageObject.getTopicId(object.messageOwner))) { + if (object != null && (!isTopic || getTopicId() == MessageObject.getTopicId(object.messageOwner, ChatObject.isForum(currentChat)))) { pinnedMessageIds.add(mid); pinnedMessageObjects.put(mid, object); if (replaceObjects == null) { @@ -17562,7 +17596,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not i--; continue; } - int messageTopicId = MessageObject.getTopicId(pinnedMessageObjects.get(messageId).messageOwner); + int messageTopicId = MessageObject.getTopicId(pinnedMessageObjects.get(messageId).messageOwner, true); if (getTopicId() != messageTopicId) { pinnedMessageObjects.remove(messageId); pinnedMessageIds.remove(i); @@ -17809,24 +17843,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else if (id == NotificationCenter.topicsDidLoaded) { if (isTopic) { updateTopicTitleIcon(); + updateTopicHeader(); updateBottomOverlay(); updateTopPanel(true); + if (avatarContainer != null) { + avatarContainer.updateSubtitle(); + } } - } else if (id == NotificationCenter.chatSwithcedToForum) { -// long chatId = (long) args[0]; -// if (-dialog_id == chatId) { -// if (chatMode == 0 && getMessagesController().getChat(-dialog_id).forum) { -// if (getParentLayout() != null) { -// if (getParentLayout().checkTransitionAnimation()) { -// AndroidUtilities.runOnUIThread(() -> { -// TopicsFragment.prepareToSwitchAnimation(ChatActivity.this); -// }, 500); -// } else { -// TopicsFragment.prepareToSwitchAnimation(ChatActivity.this); -// } -// } - - } } @@ -18633,6 +18656,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (!isAd && placeToPaste < sponsoredMessagesCount && (currentChat == null || ChatObject.isChannelAndNotMegaGroup(currentChat))) { placeToPaste = sponsoredMessagesCount; } + if (obj.messageOwner.action instanceof TLRPC.TL_messageActionSetMessagesTTL && messages.size() == 2) { + placeToPaste = 1; + } if (dayArray == null) { dayArray = new ArrayList<>(); messagesByDays.put(obj.dateKey, dayArray); @@ -20065,7 +20091,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private void updateTopicHeader() { - avatarContainer.setTitle(forumTopic.title); + if (avatarContainer != null && forumTopic != null) { + avatarContainer.setTitle(forumTopic.title); + } updateTopicTitleIcon(); } @@ -21033,7 +21061,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int chatWithAdminDate = preferences.getInt("dialog_bar_chat_with_date" + did, 0); boolean showAddMembersToGroup = preferences.getBoolean("dialog_bar_invite" + did, false); TLRPC.EmojiStatus showEmojiStatusReport = currentUser != null && (showReport || showBlock) && (currentUser.emoji_status instanceof TLRPC.TL_emojiStatus || currentUser.emoji_status instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) currentUser.emoji_status).until > (int) (System.currentTimeMillis() / 1000)) ? currentUser.emoji_status : null; - boolean showRestartTopic = !isInPreviewMode() && forumTopic != null && forumTopic.closed && ChatObject.canManageTopic(currentAccount, currentChat, forumTopic); + boolean showRestartTopic = !isInPreviewMode() && forumTopic != null && forumTopic.closed && !forumTopic.hidden && ChatObject.canManageTopic(currentAccount, currentChat, forumTopic); if (showRestartTopic) { shownRestartTopic = true; } @@ -21630,7 +21658,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (replyMessage.replyToForumTopic != null) { draftThreadId = replyMessage.replyToForumTopic.id; } else { - draftThreadId = MessageObject.getTopicId(replyMessage.messageOwner); + draftThreadId = MessageObject.getTopicId(replyMessage.messageOwner, ChatObject.isForum(currentChat)); } } else { draftThreadId = threadMessageId; @@ -22269,7 +22297,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not message.isSponsored() || type == 1 && message.getDialogId() == mergeDialogId || message.messageOwner.action instanceof TLRPC.TL_messageActionSecureValuesSent || currentEncryptedChat == null && message.getId() < 0 || - bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE && !(bottomOverlayChatWaitsReply && selectedObject != null && (MessageObject.getTopicId(selectedObject.messageOwner) != 0 || selectedObject.wasJustSent)) || + bottomOverlayChat != null && bottomOverlayChat.getVisibility() == View.VISIBLE && !(bottomOverlayChatWaitsReply && selectedObject != null && (MessageObject.getTopicId(selectedObject.messageOwner, ChatObject.isForum(currentChat)) != 0 || selectedObject.wasJustSent)) || currentChat != null && (ChatObject.isNotInChat(currentChat) && !isThreadChat() || ChatObject.isChannel(currentChat) && !ChatObject.canPost(currentChat) && !currentChat.megagroup || !ChatObject.canSendMessages(currentChat))) { allowChatActions = false; } @@ -22322,28 +22350,31 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not undoView.showWithAction(dialog_id, action, currentUser, userInfo != null ? userInfo.ttl_period : chatInfo.ttl_period, null, null); } } - }, true, getResourceProvider()); + }, true, 0, getResourceProvider()); autoDeletePopupWrapper.updateItems(userInfo != null ? userInfo.ttl_period : chatInfo.ttl_period); optionsView = autoDeletePopupWrapper.windowLayout; } else if (type >= 0 || type == -1 && single && (message.isSending() || message.isEditing()) && currentEncryptedChat == null) { selectedObject = message; selectedObjectGroup = groupedMessages; - messageTextToTranslate = getMessageCaption(selectedObject, selectedObjectGroup); - if (messageTextToTranslate == null && selectedObject.isPoll()) { - try { - TLRPC.Poll poll = ((TLRPC.TL_messageMediaPoll) selectedObject.messageOwner.media).poll; - StringBuilder pollText = new StringBuilder(); - pollText = new StringBuilder(poll.question).append("\n"); - for (TLRPC.TL_pollAnswer answer : poll.answers) - pollText.append("\n\uD83D\uDD18 ").append(answer.text); - messageTextToTranslate = pollText.toString(); - } catch (Exception e) {} - } - if (messageTextToTranslate == null) { - messageTextToTranslate = getMessageContent(selectedObject, 0, false); - } - if (messageTextToTranslate != null && Emoji.fullyConsistsOfEmojis(messageTextToTranslate)) { - messageTextToTranslate = null; // message fully consists of emojis, do not translate + if (selectedObject.type != MessageObject.TYPE_EMOJIS && selectedObject.type != MessageObject.TYPE_ANIMATED_STICKER && selectedObject.type != MessageObject.TYPE_STICKER) { + messageTextToTranslate = getMessageCaption(selectedObject, selectedObjectGroup); + if (messageTextToTranslate == null && selectedObject.isPoll()) { + try { + TLRPC.Poll poll = ((TLRPC.TL_messageMediaPoll) selectedObject.messageOwner.media).poll; + StringBuilder pollText = new StringBuilder(); + pollText = new StringBuilder(poll.question).append("\n"); + for (TLRPC.TL_pollAnswer answer : poll.answers) + pollText.append("\n\uD83D\uDD18 ").append(answer.text); + messageTextToTranslate = pollText.toString(); + } catch (Exception e) { + } + } + if (messageTextToTranslate == null) { + messageTextToTranslate = getMessageContent(selectedObject, 0, false); + } + if (messageTextToTranslate != null && Emoji.fullyConsistsOfEmojis(messageTextToTranslate)) { + messageTextToTranslate = null; // message fully consists of emojis, do not translate + } } if (message.isSponsored() && !getMessagesController().premiumLocked) { @@ -23111,17 +23142,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } int totalHeight = contentView.getHeightWithKeyboard(); - int availableHeight = totalHeight - scrimPopupY - AndroidUtilities.dp(46 + 16) - (isReactionsAvailable ? AndroidUtilities.dp(52) : 0); -// if (SharedConfig.messageSeenHintCount > 0 && contentView.getKeyboardHeight() < AndroidUtilities.dp(20)) { - availableHeight -= AndroidUtilities.dp(52); - Bulletin bulletin = BulletinFactory.of(Bulletin.BulletinWindow.make(getContext()), themeDelegate).createErrorBulletin(AndroidUtilities.replaceTags(LocaleController.getString("MessageSeenTooltipMessage", R.string.MessageSeenTooltipMessage))); - bulletin.setDuration(4000); - bulletin.show(); + if (SharedConfig.messageSeenHintCount > 0 && contentView.getKeyboardHeight() < AndroidUtilities.dp(20)) { + messageSeenPrivacyBulletin = BulletinFactory.of(Bulletin.BulletinWindow.make(getContext()), themeDelegate).createErrorBulletin(AndroidUtilities.replaceTags(LocaleController.getString("MessageSeenTooltipMessage", R.string.MessageSeenTooltipMessage))); + messageSeenPrivacyBulletin.setDuration(4000); + messageSeenPrivacyBulletin.show(); SharedConfig.updateMessageSeenHintCount(SharedConfig.messageSeenHintCount - 1); -// } else if (contentView.getKeyboardHeight() > AndroidUtilities.dp(20)) { -// availableHeight -= contentView.getKeyboardHeight() / 3f; -// } + } listView2.requestLayout(); linearLayout.requestLayout(); @@ -23175,9 +23202,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (addGap) { - View gap = new FrameLayout(contentView.getContext()); - gap.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuSeparator)); - popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + popupLayout.addView(new ActionBarPopupWindow.GapView(contentView.getContext(), themeDelegate), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); } if (popupLayout.getSwipeBack() != null) { @@ -23331,7 +23356,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return true; }; TLRPC.InputPeer inputPeer = getMessagesController().getInputPeer(dialog_id); - int messageId = selectedObject.messageOwner.id; + int messageId = selectedObject == null || selectedObject.messageOwner == null ? 0 : selectedObject.messageOwner.id; if (LanguageDetector.hasSupport()) { final String[] fromLang = {null}; cell.setVisibility(View.GONE); @@ -23342,7 +23367,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not fromLang[0] = lang; if (fromLang[0] != null && (!fromLang[0].equals(toLang) || fromLang[0].equals("und")) && ( translateButtonEnabled && !RestrictedLanguagesSelectActivity.getRestrictedLanguages().contains(fromLang[0]) || - (currentChat != null && (currentChat.has_link || ChatObject.isPublic(currentChat))) && ("uk".equals(fromLang[0]) || "ru".equals(fromLang[0])) + (currentChat != null && (currentChat.has_link || ChatObject.isPublic(currentChat)) || selectedObject.messageOwner.fwd_from != null) && ("uk".equals(fromLang[0]) || "ru".equals(fromLang[0])) )) { cell.setVisibility(View.VISIBLE); } @@ -23573,7 +23598,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (scrimPopupWindow != this) { return; } - Bulletin.hideVisible(); + if (Bulletin.getVisibleBulletin() == messageSeenPrivacyBulletin && messageSeenPrivacyBulletin != null) { + messageSeenPrivacyBulletin.hide(); + messageSeenPrivacyBulletin = null; + } scrimPopupWindow = null; menuDeleteItem = null; scrimPopupWindowItems = null; @@ -24183,7 +24211,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else { saveMessageToGallery(selectedObject); if (getParentActivity() != null) { - BulletinFactory.createSaveToGalleryBulletin(this, selectedObject.isVideo(), themeDelegate).show(); + BulletinFactory.of(this).createDownloadBulletin(selectedObject.isVideo() ? BulletinFactory.FileType.VIDEO : BulletinFactory.FileType.PHOTO, themeDelegate).show(); } } break; @@ -24663,7 +24691,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not break; } case OPTION_VIEW_IN_TOPIC: { - int topicId = MessageObject.getTopicId(selectedObject.messageOwner); + int topicId = MessageObject.getTopicId(selectedObject.messageOwner, true); if (topicId != 0) { TLRPC.TL_forumTopic topic = getMessagesController().getTopicsController().findTopic(currentChat.id, topicId); if (topic != null) { @@ -25227,19 +25255,25 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } public void sendAudio(ArrayList audios, CharSequence caption, boolean notify, int scheduleDate) { - fillEditingMediaWithCaption(caption, null); - SendMessagesHelper.prepareSendingAudioDocuments(getAccountInstance(), audios, caption != null ? caption : null, dialog_id, replyingMessageObject, getThreadMessage(), editingMessageObject, notify, scheduleDate); - afterMessageSend(); + if (checkSlowModeAlert()) { + fillEditingMediaWithCaption(caption, null); + SendMessagesHelper.prepareSendingAudioDocuments(getAccountInstance(), audios, caption != null ? caption : null, dialog_id, replyingMessageObject, getThreadMessage(), editingMessageObject, notify, scheduleDate); + afterMessageSend(); + } } public void sendContact(TLRPC.User user, boolean notify, int scheduleDate) { - getSendMessagesHelper().sendMessage(user, dialog_id, replyingMessageObject, getThreadMessage(), null, null, notify, scheduleDate); - afterMessageSend(); + if (checkSlowModeAlert()) { + getSendMessagesHelper().sendMessage(user, dialog_id, replyingMessageObject, getThreadMessage(), null, null, notify, scheduleDate); + afterMessageSend(); + } } public void sendPoll(TLRPC.TL_messageMediaPoll poll, HashMap params, boolean notify, int scheduleDate) { - getSendMessagesHelper().sendMessage(poll, dialog_id, replyingMessageObject, getThreadMessage(), null, params, notify, scheduleDate); - afterMessageSend(); + if (checkSlowModeAlert()) { + getSendMessagesHelper().sendMessage(poll, dialog_id, replyingMessageObject, getThreadMessage(), null, params, notify, scheduleDate); + afterMessageSend(); + } } public void sendMedia(MediaController.PhotoEntry photoEntry, VideoEditedInfo videoEditedInfo, boolean notify, int scheduleDate, boolean forceDocument) { @@ -25782,7 +25816,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not username = username.toLowerCase(); if (ChatObject.hasPublicLink(currentChat, username) || currentUser != null && !TextUtils.isEmpty(currentUser.username) && username.equals(currentUser.username.toLowerCase())) { - shakeContent(); + if (avatarContainer != null) { + avatarContainer.openProfile(false); + } else { + shakeContent(); + } } else if (str.startsWith("@")) { getMessagesController().openByUserName(username, ChatActivity.this, 0); } else { @@ -26447,7 +26485,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not didPressInstantButton(cell, 10); return; } - openProfile(user); + openProfile(user, ChatObject.isForum(currentChat) || isThreadChat()); } @Override @@ -26550,9 +26588,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private void openProfile(TLRPC.User user) { + openProfile(user, false); + } + + private void openProfile(TLRPC.User user, boolean expandPhoto) { if (user != null && user.id != getUserConfig().getClientUserId()) { + if (user.photo == null || user.photo instanceof TLRPC.TL_userProfilePhotoEmpty) { + expandPhoto = false; + } Bundle args = new Bundle(); args.putLong("user_id", user.id); + args.putBoolean("expandPhoto", expandPhoto); ProfileActivity fragment = new ProfileActivity(args); fragment.setPlayProfileAnimation(currentUser != null && currentUser.id == user.id ? 1 : 0); AndroidUtilities.setAdjustResizeToNothing(getParentActivity(), classGuid); @@ -26561,9 +26607,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private void openProfile(TLRPC.Chat chat) { + openProfile(chat, false); + } + + private void openProfile(TLRPC.Chat chat, boolean expandPhoto) { if (chat != null) { Bundle args = new Bundle(); args.putLong("chat_id", chat.id); + args.putBoolean("expandPhoto", expandPhoto); presentFragment(new ProfileActivity(args)); } } @@ -26875,7 +26926,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } @Override - public boolean didPressAnimatedEmoji(AnimatedEmojiSpan span) { + public boolean didPressAnimatedEmoji(ChatMessageCell cell, AnimatedEmojiSpan span) { if (getMessagesController().premiumLocked || span == null || span.standard) { return false; } @@ -26884,29 +26935,25 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (document == null) { return false; } - TLRPC.InputStickerSet inputStickerSet = MessageObject.getInputStickerSet(document); - if (inputStickerSet == null) { - return false; - } - TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSet, false); - if (set == null || set.set == null) { - return false; - } - BulletinFactory.of(ChatActivity.this).createEmojiBulletin(document, AndroidUtilities.replaceTags(LocaleController.formatString("MessageContainsEmojiPackSingle", R.string.MessageContainsEmojiPackSingle, set.set.title)), LocaleController.getString("ViewAction", R.string.ViewAction), () -> { + Bulletin bulletin = BulletinFactory.of(ChatActivity.this).createContainsEmojiBulletin(document, false, set -> { ArrayList inputSets = new ArrayList<>(1); - inputSets.add(inputStickerSet); + inputSets.add(set); EmojiPacksAlert alert = new EmojiPacksAlert(ChatActivity.this, getParentActivity(), themeDelegate, inputSets); alert.setCalcMandatoryInsets(isKeyboardVisible()); showDialog(alert); - }).show(); - return true; + }); + if (bulletin != null) { + bulletin.show(); + return true; + } + return false; } @Override public void didPressTopicButton(ChatMessageCell cell) { MessageObject message = cell.getMessageObject(); if (message != null) { - int topicId = MessageObject.getTopicId(message.messageOwner); + int topicId = MessageObject.getTopicId(message.messageOwner, true); if (topicId != 0) { TLRPC.TL_forumTopic topic = getMessagesController().getTopicsController().findTopic(currentChat.id, topicId); if (topic != null) { @@ -26916,6 +26963,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } + @Override + public boolean shouldShowTopicButton() { + return true; + } + @Override public void didPressExtendedMediaPreview(ChatMessageCell cell, TLRPC.KeyboardButton button) { getSendMessagesHelper().sendCallback(true, cell.getMessageObject(), button, ChatActivity.this); @@ -26988,7 +27040,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } if (message.isDice()) { - undoView.showWithAction(0, chatActivityEnterView.getVisibility() == View.VISIBLE && bottomOverlay.getVisibility() != View.VISIBLE ? UndoView.ACTION_DICE_INFO : UndoView.ACTION_DICE_NO_SEND_INFO, message.getDiceEmoji(), null, () -> getSendMessagesHelper().sendMessage(message.getDiceEmoji(), dialog_id, replyingMessageObject, getThreadMessage(), null, false, null, null, null, true, 0, null, false)); + undoView.showWithAction(0, chatActivityEnterView.getVisibility() == View.VISIBLE && bottomOverlay.getVisibility() != View.VISIBLE ? UndoView.ACTION_DICE_INFO : UndoView.ACTION_DICE_NO_SEND_INFO, message.getDiceEmoji(), null, () -> { + if (checkSlowModeAlert()) { + getSendMessagesHelper().sendMessage(message.getDiceEmoji(), dialog_id, replyingMessageObject, getThreadMessage(), null, false, null, null, null, true, 0, null, false); + } + }); } else if (message.isAnimatedEmoji() && (!message.isAnimatedAnimatedEmoji() || emojiAnimationsOverlay.supports(MessageObject.findAnimatedEmojiEmoticon(message.getDocument())) && currentUser != null) || message.isPremiumSticker()) { restartSticker(cell); emojiAnimationsOverlay.onTapItem(cell, ChatActivity.this, true); @@ -28225,18 +28281,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } else { if (privateMsgUrlPattern == null) { - privateMsgUrlPattern = Pattern.compile("(https://)?t.me/c/([0-9]+)/([0-9]+)"); + privateMsgUrlPattern = Pattern.compile("(https://)?t.me/c/([0-9]+)/([0-9]+)/?([0-9]+)?"); } Matcher matcher = privateMsgUrlPattern.matcher(urlFinal); - if (matcher.find(2) && matcher.find(3)) { + if (matcher.find(2) && matcher.find(3) && !matcher.find(4)) { long channelId = Long.parseLong(matcher.group(2)); int messageId = Integer.parseInt(matcher.group(3)); if (channelId == currentChat.id && messageId != 0) { Uri data = Uri.parse(urlFinal); int threadId = Utilities.parseInt(data.getQueryParameter("thread")); + int topicId = Utilities.parseInt(data.getQueryParameter("topic")); int commentId = Utilities.parseInt(data.getQueryParameter("comment")); - if (threadId != 0 || commentId != 0) { + if (threadId != 0 || topicId != 0 || commentId != 0) { return false; } else { showScrollToMessageError = true; @@ -28868,9 +28925,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not themeDescriptions.add(new ThemeDescription(emptyView, ThemeDescription.FLAG_SERVICEBACKGROUND, null, null, null, null, Theme.key_chat_serviceBackground)); themeDescriptions.add(new ThemeDescription(bigEmptyView, ThemeDescription.FLAG_SERVICEBACKGROUND, null, null, null, null, Theme.key_chat_serviceBackground)); - themeDescriptions.add(new ThemeDescription(chatListView, ThemeDescription.FLAG_SERVICEBACKGROUND, new Class[]{ChatLoadingCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_serviceBackground)); - themeDescriptions.add(new ThemeDescription(chatListView, ThemeDescription.FLAG_PROGRESSBAR, new Class[]{ChatLoadingCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_serviceText)); - if (mentionContainer != null) { themeDescriptions.add(new ThemeDescription(mentionContainer.getListView(), ThemeDescription.FLAG_TEXTCOLOR, new Class[]{BotSwitchCell.class}, new String[]{"textView"}, null, null, null, Theme.key_chat_botSwitchToInlineText)); themeDescriptions.add(new ThemeDescription(mentionContainer.getListView(), ThemeDescription.FLAG_TEXTCOLOR, new Class[]{MentionCell.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java index 205c78a3c..325f26083 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java @@ -68,7 +68,6 @@ import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; -import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -830,7 +829,9 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image settingsSectionCell.setBackground(combinedDrawable); linearLayout1.addView(settingsSectionCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); if (forumsCell != null) { - settingsSectionCell.setText(LocaleController.getString(R.string.ForumToggleDescription)); + settingsSectionCell.setText(LocaleController.getString("ForumToggleDescription", R.string.ForumToggleDescription)); + } else { + settingsSectionCell.setText(LocaleController.getString("ChannelSignMessagesInfo", R.string.ChannelSignMessagesInfo)); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java index 24ee9efa8..b83920031 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java @@ -490,7 +490,6 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe public void onClick(@NonNull View view) { Browser.openUrl(getContext(), "https://fragment.com/username/" + username); } - @Override public void updateDrawState(@NonNull TextPaint ds) { super.updateDrawState(ds); @@ -507,6 +506,46 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe } super.setText(text); } + + ValueAnimator translateAnimator; + int prevHeight = -1; + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + if (prevHeight != -1 && linearLayout != null) { + ArrayList viewsToTranslate = new ArrayList<>(); + boolean passedMe = false; + for (int i = 0; i < linearLayout.getChildCount(); ++i) { + View child = linearLayout.getChildAt(i); + if (passedMe) { + viewsToTranslate.add(child); + } else if (child == this) { + passedMe = true; + } + } + + float diff = prevHeight - getHeight(); + if (translateAnimator != null) { + translateAnimator.cancel(); + } + translateAnimator = ValueAnimator.ofFloat(0, 1); + translateAnimator.addUpdateListener(anm -> { + float t = 1f - (float) anm.getAnimatedValue(); + for (int i = 0; i < viewsToTranslate.size(); ++i) { + View view = viewsToTranslate.get(i); + if (view != null) { + view.setTranslationY(diff * t); + } + } + }); + translateAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + translateAnimator.setDuration(350); + translateAnimator.start(); + } + prevHeight = getHeight(); + } }; checkTextView.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); checkTextView.setBottomPadding(6); @@ -846,7 +885,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe @Override protected void onMeasure(int widthSpec, int heightSpec) { - super.onMeasure(widthSpec, MeasureSpec.makeMeasureSpec(999999999, MeasureSpec.AT_MOST)); + super.onMeasure(widthSpec, MeasureSpec.makeMeasureSpec(9999999, MeasureSpec.AT_MOST)); } public class TouchHelperCallback extends ItemTouchHelper.Callback { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java index 5f12bce9f..7ea7f184f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java @@ -59,6 +59,7 @@ import org.telegram.ui.Cells.LoadingCell; import org.telegram.ui.Cells.ManageChatTextCell; import org.telegram.ui.Cells.ManageChatUserCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.TextCheckCell2; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; @@ -124,6 +125,9 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente private int gigaInfoRow; private int recentActionsRow; + private boolean antiSpamToggleLoading; + private int antiSpamRow; + private int antiSpamInfoRow; private int addNewRow; private int addNew2Row; private int removedUsersRow; @@ -233,6 +237,8 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente return; } recentActionsRow = -1; + antiSpamRow = -1; + antiSpamInfoRow = -1; addNewRow = -1; addNew2Row = -1; addNewSectionRow = -1; @@ -364,7 +370,12 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente } else if (type == TYPE_ADMIN) { if (ChatObject.isChannel(currentChat) && currentChat.megagroup && !currentChat.gigagroup && (info == null || info.participants_count <= 200 || !isChannel && info.can_set_stickers)) { recentActionsRow = rowCount++; - addNewSectionRow = rowCount++; + if (ChatObject.hasAdminRights(currentChat)) { + antiSpamRow = rowCount++; + antiSpamInfoRow = rowCount++; + } else { + addNewSectionRow = rowCount++; + } } if (ChatObject.canAddAdmins(currentChat)) { @@ -839,6 +850,36 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente } else if (position == recentActionsRow) { presentFragment(new ChannelAdminLogActivity(currentChat)); return; + } else if (position == antiSpamRow) { + final TextCell textCell = (TextCell) view; + if (info != null && !info.antispam && info.participants_count < getMessagesController().telegramAntispamGroupSizeMin) { + BulletinFactory.of(this).createSimpleBulletin(R.raw.msg_antispam, AndroidUtilities.replaceTags(LocaleController.formatPluralString("ChannelAntiSpamForbidden", getMessagesController().telegramAntispamGroupSizeMin))).show(); + } else if (info != null && ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_DELETE_MESSAGES) && !antiSpamToggleLoading) { + antiSpamToggleLoading = true; + boolean wasAntispam = info.antispam; + TLRPC.TL_channels_toggleAntiSpam req = new TLRPC.TL_channels_toggleAntiSpam(); + req.channel = getMessagesController().getInputChannel(chatId); + textCell.setChecked(req.enabled = (info.antispam = !info.antispam)); + textCell.getCheckBox().setIcon(ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_DELETE_MESSAGES) && (info == null || info.antispam || info.participants_count >= getMessagesController().telegramAntispamGroupSizeMin) ? 0 : R.drawable.permission_locked); + getConnectionsManager().sendRequest(req, (res, err) -> { + if (res != null) { + getMessagesController().processUpdates((TLRPC.Updates) res, false); + getMessagesController().putChatFull(info); + } + if (err != null && !"".equals(err.text)) { + AndroidUtilities.runOnUIThread(() -> { + if (getParentActivity() == null) { + return; + } + textCell.setChecked(info.antispam = wasAntispam); + textCell.getCheckBox().setIcon(ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_DELETE_MESSAGES) && (info == null || !info.antispam || info.participants_count >= getMessagesController().telegramAntispamGroupSizeMin) ? 0 : R.drawable.permission_locked); + BulletinFactory.of(ChatUsersActivity.this).createSimpleBulletin(R.raw.error, LocaleController.getString("UnknownError", R.string.UnknownError)).show(); + }); + } + antiSpamToggleLoading = false; + }); + } + return; } else if (position == removedUsersRow) { Bundle args = new Bundle(); args.putLong("chat_id", chatId); @@ -2551,7 +2592,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente } else { searchInProgress = false; } - searchAdapterHelper.queryServerSearch(query, selectType != SELECT_TYPE_MEMBERS, false, true, false, false, ChatObject.isChannel(currentChat) ? chatId : 0, false, type, 1, addContacts); + searchAdapterHelper.queryServerSearch(query, selectType != SELECT_TYPE_MEMBERS, false, true, false, false, ChatObject.isChannel(currentChat) ? chatId : 0, false, type, 1, 0, addContacts); }); } @@ -2869,7 +2910,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente } return true; } - return viewType == 0 || viewType == 2 || viewType == 6; + return viewType == 0 || viewType == 2 || viewType == 6 || viewType == 12 && ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_DELETE_MESSAGES); } @Override @@ -2944,6 +2985,12 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente flickerLoadingView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); view = flickerLoadingView; break; + case 12: + TextCell textCell = new TextCell(mContext, 23, false, true, getResourceProvider()); + textCell.heightDp = 50; + textCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + view = textCell; + break; case 9: default: SlideChooseView chooseView = new SlideChooseView(mContext); @@ -3068,7 +3115,10 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente break; case 1: TextInfoPrivacyCell privacyCell = (TextInfoPrivacyCell) holder.itemView; - if (position == participantsInfoRow) { + if (position == antiSpamInfoRow) { + privacyCell.setText(LocaleController.getString("ChannelAntiSpamInfo", R.string.ChannelAntiSpamInfo)); + privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + } else if (position == participantsInfoRow) { if (type == TYPE_BANNED || type == TYPE_KICKED) { if (isChannel) { privacyCell.setText(LocaleController.getString("NoBlockedChannel2", R.string.NoBlockedChannel2)); @@ -3130,7 +3180,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente } } } else if (position == recentActionsRow) { - actionCell.setText(LocaleController.getString("EventLog", R.string.EventLog), null, R.drawable.msg_log, false); + actionCell.setText(LocaleController.getString("EventLog", R.string.EventLog), null, R.drawable.msg_log, antiSpamRow > recentActionsRow); } else if (position == addNew2Row) { actionCell.setColors(Theme.key_windowBackgroundWhiteBlueIcon, Theme.key_windowBackgroundWhiteBlueButton); boolean showDivider = !(loadingUsers && !firstLoaded) && membersHeaderRow == -1 && !participants.isEmpty(); @@ -3241,6 +3291,13 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente flickerLoadingView.setItemsCount(1); } break; + case 12: + TextCell textCell = (TextCell) holder.itemView; + if (position == antiSpamRow) { + textCell.getCheckBox().setIcon(ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_DELETE_MESSAGES) && (info == null || info.antispam || info.participants_count >= getMessagesController().telegramAntispamGroupSizeMin) ? 0 : R.drawable.permission_locked); + textCell.setTextAndCheckAndIcon(LocaleController.getString("ChannelAntiSpam", R.string.ChannelAntiSpam), info != null && info.antispam, R.drawable.msg_policy, false); + } + break; } } @@ -3263,7 +3320,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente return 3; } else if (position == restricted1SectionRow || position == permissionsSectionRow || position == slowmodeRow || position == gigaHeaderRow) { return 5; - } else if (position == participantsInfoRow || position == slowmodeInfoRow || position == gigaInfoRow) { + } else if (position == participantsInfoRow || position == slowmodeInfoRow || position == gigaInfoRow || position == antiSpamInfoRow) { return 1; } else if (position == blockedEmptyRow) { return 4; @@ -3280,6 +3337,8 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente return 10; } else if (position == loadingUserCellRow) { return 11; + } else if (position == antiSpamRow) { + return 12; } return 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AdminLogFilterAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AdminLogFilterAlert.java index 544b4dbe9..c522d5974 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AdminLogFilterAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AdminLogFilterAlert.java @@ -21,6 +21,10 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.collection.LongSparseArray; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; @@ -29,18 +33,14 @@ import org.telegram.messenger.R; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; -import org.telegram.ui.Cells.CheckBoxCell; import org.telegram.ui.Cells.CheckBoxUserCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextCell; import org.telegram.ui.ContentPreviewViewer; import java.util.ArrayList; import java.util.regex.Pattern; -import androidx.collection.LongSparseArray; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - public class AdminLogFilterAlert extends BottomSheet { public interface AdminLogFilterAlertDelegate { @@ -222,10 +222,10 @@ public class AdminLogFilterAlert extends BottomSheet { } }); listView.setOnItemClickListener((view, position) -> { - if (view instanceof CheckBoxCell) { - CheckBoxCell cell = (CheckBoxCell) view; + if (view instanceof TextCell) { + TextCell cell = (TextCell) view; boolean isChecked = cell.isChecked(); - cell.setChecked(!isChecked, true); + cell.setChecked(!isChecked); if (position == 0) { if (isChecked) { currentFilter = new TLRPC.TL_channelAdminLogEventsFilter(); @@ -242,7 +242,7 @@ public class AdminLogFilterAlert extends BottomSheet { RecyclerView.ViewHolder holder = listView.findContainingViewHolder(child); int pos = holder.getAdapterPosition(); if (holder.getItemViewType() == 0 && pos > 0 && pos < allAdminsRow - 1) { - ((CheckBoxCell) child).setChecked(!isChecked, true); + ((TextCell) child).setChecked(!isChecked); } } } else if (position == allAdminsRow) { @@ -268,10 +268,6 @@ public class AdminLogFilterAlert extends BottomSheet { currentFilter.unban = currentFilter.kick = currentFilter.unkick = currentFilter.promote = currentFilter.demote = currentFilter.info = currentFilter.settings = currentFilter.pinned = currentFilter.edit = currentFilter.delete = currentFilter.group_call = currentFilter.invites = true; - RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(0); - if (holder != null) { - ((CheckBoxCell) holder.itemView).setChecked(false, true); - } } if (position == restrictionsRow) { currentFilter.kick = currentFilter.ban = currentFilter.unkick = currentFilter.unban = !currentFilter.kick; @@ -294,6 +290,16 @@ public class AdminLogFilterAlert extends BottomSheet { } else if (position == invitesRow) { currentFilter.invites = !currentFilter.invites; } + RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(0); + if (holder != null) { + boolean isAllChecked = ( + currentFilter.join && currentFilter.leave && currentFilter.invite && currentFilter.ban && + currentFilter.unban && currentFilter.kick && currentFilter.unkick && currentFilter.promote && + currentFilter.demote && currentFilter.info && currentFilter.settings && currentFilter.pinned && + currentFilter.edit && currentFilter.delete && currentFilter.group_call && currentFilter.invites + ); + ((TextCell) holder.itemView).setChecked(isAllChecked); + } } if (currentFilter != null && !currentFilter.join && !currentFilter.leave && !currentFilter.invite && !currentFilter.ban && @@ -312,7 +318,7 @@ public class AdminLogFilterAlert extends BottomSheet { selectedAdmins = new LongSparseArray<>(); RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(allAdminsRow); if (holder != null) { - ((CheckBoxCell) holder.itemView).setChecked(false, true); + ((TextCell) holder.itemView).setChecked(false); } for (int a = 0; a < currentAdmins.size(); a++) { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(MessageObject.getPeerId(currentAdmins.get(a).peer)); @@ -415,7 +421,7 @@ public class AdminLogFilterAlert extends BottomSheet { FrameLayout view = null; switch (viewType) { case 0: - view = new CheckBoxCell(context, 1, 21, resourcesProvider); + view = new TextCell(context, 23, false, true, resourcesProvider); break; case 1: ShadowSectionCell shadowSectionCell = new ShadowSectionCell(context, 18); @@ -435,35 +441,6 @@ public class AdminLogFilterAlert extends BottomSheet { public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { int position = holder.getAdapterPosition(); switch (holder.getItemViewType()) { - case 0: { - CheckBoxCell cell = (CheckBoxCell) holder.itemView; - if (position == 0) { - cell.setChecked(currentFilter == null, false); - } else if (position == restrictionsRow) { - cell.setChecked(currentFilter == null || currentFilter.kick && currentFilter.ban && currentFilter.unkick && currentFilter.unban, false); - } else if (position == adminsRow) { - cell.setChecked(currentFilter == null || currentFilter.promote && currentFilter.demote, false); - } else if (position == membersRow) { - cell.setChecked(currentFilter == null || currentFilter.invite && currentFilter.join, false); - } else if (position == infoRow) { - cell.setChecked(currentFilter == null || currentFilter.info, false); - } else if (position == deleteRow) { - cell.setChecked(currentFilter == null || currentFilter.delete, false); - } else if (position == editRow) { - cell.setChecked(currentFilter == null || currentFilter.edit, false); - } else if (position == pinnedRow) { - cell.setChecked(currentFilter == null || currentFilter.pinned, false); - } else if (position == leavingRow) { - cell.setChecked(currentFilter == null || currentFilter.leave, false); - } else if (position == callsRow) { - cell.setChecked(currentFilter == null || currentFilter.group_call, false); - } else if (position == invitesRow) { - cell.setChecked(currentFilter == null || currentFilter.invites, false); - } else if (position == allAdminsRow) { - cell.setChecked(selectedAdmins == null, false); - } - break; - } case 2: { CheckBoxUserCell userCell = (CheckBoxUserCell) holder.itemView; long userId = MessageObject.getPeerId(currentAdmins.get(position - allAdminsRow - 1).peer); @@ -477,35 +454,35 @@ public class AdminLogFilterAlert extends BottomSheet { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { case 0: { - CheckBoxCell cell = (CheckBoxCell) holder.itemView; + TextCell cell = (TextCell) holder.itemView; if (position == 0) { - cell.setText(LocaleController.getString("EventLogFilterAll", R.string.EventLogFilterAll), "", currentFilter == null, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterAll", R.string.EventLogFilterAll), currentFilter == null, true); } else if (position == restrictionsRow) { - cell.setText(LocaleController.getString("EventLogFilterNewRestrictions", R.string.EventLogFilterNewRestrictions), "", currentFilter == null || currentFilter.kick && currentFilter.ban && currentFilter.unkick && currentFilter.unban, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterNewRestrictions", R.string.EventLogFilterNewRestrictions), currentFilter == null || currentFilter.kick && currentFilter.ban && currentFilter.unkick && currentFilter.unban, true); } else if (position == adminsRow) { - cell.setText(LocaleController.getString("EventLogFilterNewAdmins", R.string.EventLogFilterNewAdmins), "", currentFilter == null || currentFilter.promote && currentFilter.demote, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterNewAdmins", R.string.EventLogFilterNewAdmins), currentFilter == null || currentFilter.promote && currentFilter.demote, true); } else if (position == membersRow) { - cell.setText(LocaleController.getString("EventLogFilterNewMembers", R.string.EventLogFilterNewMembers), "", currentFilter == null || currentFilter.invite && currentFilter.join, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterNewMembers", R.string.EventLogFilterNewMembers), currentFilter == null || currentFilter.invite && currentFilter.join, true); } else if (position == infoRow) { if (isMegagroup) { - cell.setText(LocaleController.getString("EventLogFilterGroupInfo", R.string.EventLogFilterGroupInfo), "", currentFilter == null || currentFilter.info, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterGroupInfo", R.string.EventLogFilterGroupInfo), currentFilter == null || currentFilter.info, true); } else { - cell.setText(LocaleController.getString("EventLogFilterChannelInfo", R.string.EventLogFilterChannelInfo), "", currentFilter == null || currentFilter.info, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterChannelInfo", R.string.EventLogFilterChannelInfo), currentFilter == null || currentFilter.info, true); } } else if (position == deleteRow) { - cell.setText(LocaleController.getString("EventLogFilterDeletedMessages", R.string.EventLogFilterDeletedMessages), "", currentFilter == null || currentFilter.delete, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterDeletedMessages", R.string.EventLogFilterDeletedMessages), currentFilter == null || currentFilter.delete, true); } else if (position == editRow) { - cell.setText(LocaleController.getString("EventLogFilterEditedMessages", R.string.EventLogFilterEditedMessages), "", currentFilter == null || currentFilter.edit, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterEditedMessages", R.string.EventLogFilterEditedMessages), currentFilter == null || currentFilter.edit, true); } else if (position == pinnedRow) { - cell.setText(LocaleController.getString("EventLogFilterPinnedMessages", R.string.EventLogFilterPinnedMessages), "", currentFilter == null || currentFilter.pinned, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterPinnedMessages", R.string.EventLogFilterPinnedMessages), currentFilter == null || currentFilter.pinned, true); } else if (position == leavingRow) { - cell.setText(LocaleController.getString("EventLogFilterLeavingMembers", R.string.EventLogFilterLeavingMembers), "", currentFilter == null || currentFilter.leave, callsRow != -1); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterLeavingMembers", R.string.EventLogFilterLeavingMembers), currentFilter == null || currentFilter.leave, callsRow != -1); } else if (position == callsRow) { - cell.setText(LocaleController.getString("EventLogFilterCalls", R.string.EventLogFilterCalls), "", currentFilter == null || currentFilter.group_call, false); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterCalls", R.string.EventLogFilterCalls), currentFilter == null || currentFilter.group_call, false); } else if (position == invitesRow) { - cell.setText(LocaleController.getString("EventLogFilterInvites", R.string.EventLogFilterInvites), "", currentFilter == null || currentFilter.invites, true); + cell.setTextAndCheck(LocaleController.getString("EventLogFilterInvites", R.string.EventLogFilterInvites), currentFilter == null || currentFilter.invites, true); } else if (position == allAdminsRow) { - cell.setText(LocaleController.getString("EventLogAllAdmins", R.string.EventLogAllAdmins), "", selectedAdmins == null, true); + cell.setTextAndCheck(LocaleController.getString("EventLogAllAdmins", R.string.EventLogAllAdmins), selectedAdmins == null, true); } break; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java index e9c2580a2..52e05481a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java @@ -49,7 +49,6 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; @@ -1033,6 +1032,7 @@ public class AlertsCreator { cell.setTag(a); cell.setCheckColor(Theme.getColor(Theme.key_radioBackground), Theme.getColor(Theme.key_dialogRadioBackgroundChecked)); cell.setTextAndValue(arrayList.get(a), SharedConfig.mapPreviewType == types.get(a)); + cell.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), Theme.RIPPLE_MASK_ALL)); linearLayout.addView(cell); cell.setOnClickListener(v -> { Integer which = (Integer) v.getTag(); @@ -1065,26 +1065,19 @@ public class AlertsCreator { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); + int year, month; + int currentYear = calendar.get(Calendar.YEAR); int currentMonth = calendar.get(Calendar.MONTH); int currentDay = calendar.get(Calendar.DAY_OF_MONTH); - if (currentYear > yearPicker.getValue()) { - yearPicker.setValue(currentYear); - //yearPicker.finishScroll(); - } - if (yearPicker.getValue() == currentYear) { - if (currentMonth > monthPicker.getValue()) { - monthPicker.setValue(currentMonth); - //monthPicker.finishScroll(); - } - if (currentMonth == monthPicker.getValue()) { - if (currentDay > dayPicker.getValue()) { - dayPicker.setValue(currentDay); - //dayPicker.finishScroll(); - } - } - } + yearPicker.setMinValue(currentYear); + year = yearPicker.getValue(); + + monthPicker.setMinValue(year == currentYear ? currentMonth : 0); + month = monthPicker.getValue(); + + dayPicker.setMinValue(year == currentYear && month == currentMonth ? currentDay : 1); } public static void showOpenUrlAlert(BaseFragment fragment, String url, boolean punycode, boolean ask) { @@ -1136,7 +1129,7 @@ public class AlertsCreator { if (fragment == null || fragment.getParentActivity() == null) { return null; } - final TextView message = new TextView(fragment.getParentActivity()); + final LinkSpanDrawable.LinksTextView message = new LinkSpanDrawable.LinksTextView(fragment.getParentActivity(), fragment.getResourceProvider()); Spannable spanned = new SpannableString(Html.fromHtml(LocaleController.getString("AskAQuestionInfo", R.string.AskAQuestionInfo).replace("\n", "
"))); URLSpan[] spans = spanned.getSpans(0, spanned.length(), URLSpan.class); for (int i = 0; i < spans.length; i++) { @@ -1284,15 +1277,15 @@ public class AlertsCreator { if (user != null) { if (UserObject.isReplyUser(user)) { - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); imageView.setImage(null, null, avatarDrawable, user); } else if (user.id == selfUserId) { - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); imageView.setImage(null, null, avatarDrawable, user); } else { - avatarDrawable.setSmallSize(false); + avatarDrawable.setScaleSize(1f); avatarDrawable.setInfo(user); imageView.setForUserOrChat(user, avatarDrawable); } @@ -1462,15 +1455,15 @@ public class AlertsCreator { if (user != null) { if (UserObject.isReplyUser(user)) { - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); imageView.setImage(null, null, avatarDrawable, user); } else if (user.id == selfUserId) { - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); imageView.setImage(null, null, avatarDrawable, user); } else { - avatarDrawable.setSmallSize(false); + avatarDrawable.setScaleSize(1f); avatarDrawable.setInfo(user); imageView.setForUserOrChat(user, avatarDrawable); } @@ -1745,7 +1738,7 @@ public class AlertsCreator { AvatarDrawable avatarDrawable = new AvatarDrawable(); avatarDrawable.setTextSize(AndroidUtilities.dp(12)); - avatarDrawable.setSmallSize(false); + avatarDrawable.setScaleSize(1f); avatarDrawable.setInfo(user); BackupImageView imageView = new BackupImageView(context); @@ -2276,34 +2269,50 @@ public class AlertsCreator { calendar.setTimeInMillis(systemTime); int currentYear = calendar.get(Calendar.YEAR); int currentDay = calendar.get(Calendar.DAY_OF_YEAR); + + int maxDay = 0, maxHour = 0, maxMinute = 0; if (maxDate > 0) { maxDate *= 1000; calendar.setTimeInMillis(systemTime + maxDate); - calendar.set(Calendar.HOUR_OF_DAY, 23); - calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.HOUR_OF_DAY, maxHour = 23); + calendar.set(Calendar.MINUTE, maxMinute = 59); calendar.set(Calendar.SECOND, 59); + maxDay = 7; // ??? maxDate = calendar.getTimeInMillis(); } + calendar.setTimeInMillis(systemTime + 60000L); + int minDay = 1; + int minHour = calendar.get(Calendar.HOUR_OF_DAY); + int minMinute = calendar.get(Calendar.MINUTE); + calendar.setTimeInMillis(System.currentTimeMillis() + (long) day * 24 * 3600 * 1000); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); long currentTime = calendar.getTimeInMillis(); + calendar.setTimeInMillis(currentTime); + dayPicker.setMinValue(0); + if (maxDate > 0) { + dayPicker.setMaxValue(maxDay); + } + day = dayPicker.getValue(); + + hourPicker.setMinValue(day == 0 ? minHour : 0); + if (maxDate > 0) { + hourPicker.setMaxValue(day == maxDay ? maxHour : 23); + } + hour = hourPicker.getValue(); + + minutePicker.setMinValue(day == 0 && hour == minHour ? minMinute : 0); + if (maxDate > 0) { + minutePicker.setMaxValue(day == maxDay && hour == maxHour ? maxMinute : 59); + } + minute = minutePicker.getValue(); if (currentTime <= systemTime + 60000L) { calendar.setTimeInMillis(systemTime + 60000L); - - if (currentDay != calendar.get(Calendar.DAY_OF_YEAR)) { - dayPicker.setValue(day = 1); - } - hourPicker.setValue(hour = calendar.get(Calendar.HOUR_OF_DAY)); - minutePicker.setValue(minute = calendar.get(Calendar.MINUTE)); } else if (maxDate > 0 && currentTime > maxDate) { calendar.setTimeInMillis(maxDate); - - dayPicker.setValue(day = 7); - hourPicker.setValue(hour = calendar.get(Calendar.HOUR_OF_DAY)); - minutePicker.setValue(minute = calendar.get(Calendar.MINUTE)); } int selectedYear = calendar.get(Calendar.YEAR); @@ -3019,7 +3028,7 @@ public class AlertsCreator { return builder; } - public static BottomSheet.Builder createAutoDeleteDatePickerDialog(Context context, Theme.ResourcesProvider resourcesProvider, final ScheduleDatePickerDelegate datePickerDelegate) { + public static BottomSheet.Builder createAutoDeleteDatePickerDialog(Context context, int type, Theme.ResourcesProvider resourcesProvider, final ScheduleDatePickerDelegate datePickerDelegate) { if (context == null) { return null; } @@ -3128,7 +3137,7 @@ public class AlertsCreator { linearLayout.setWeightSum(1.0f); container.addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 1f, 0, 0, 12, 0, 12)); - TextView buttonTextView = new TextView(context) { + AnimatedTextView buttonTextView = new AnimatedTextView(context, true, true, false) { @Override public CharSequence getAccessibilityClassName() { return Button.class.getName(); @@ -3137,17 +3146,22 @@ public class AlertsCreator { linearLayout.addView(numberPicker, LayoutHelper.createLinear(0, 54 * 5, 1f)); - buttonTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); + buttonTextView.setPadding(0, 0, 0, 0); buttonTextView.setGravity(Gravity.CENTER); buttonTextView.setTextColor(datePickerColors.buttonTextColor); - buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + buttonTextView.setTextSize(AndroidUtilities.dp(14)); buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(4), datePickerColors.buttonBackgroundColor, datePickerColors.buttonBackgroundPressedColor)); - buttonTextView.setText(LocaleController.getString("AutoDeleteConfirm", R.string.AutoDeleteConfirm)); container.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM, 16, 15, 16, 16)); + buttonTextView.setText(LocaleController.getString("DisableAutoDeleteTimer", R.string.DisableAutoDeleteTimer)); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { try { + if (newVal == 0) { + buttonTextView.setText(LocaleController.getString("DisableAutoDeleteTimer", R.string.DisableAutoDeleteTimer)); + } else { + buttonTextView.setText(LocaleController.getString("SetAutoDeleteTimer", R.string.SetAutoDeleteTimer)); + } container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } catch (Exception ignore) { @@ -3503,9 +3517,7 @@ public class AlertsCreator { } private static void checkCalendarDate(long minDate, NumberPicker dayPicker, NumberPicker monthPicker, NumberPicker yearPicker) { - int day = dayPicker.getValue(); - int month = monthPicker.getValue(); - int year = yearPicker.getValue(); + int month, year; Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(minDate); @@ -3517,43 +3529,20 @@ public class AlertsCreator { int maxMonth = calendar.get(Calendar.MONTH); int maxDay = calendar.get(Calendar.DAY_OF_MONTH); - if (year > maxYear) { - yearPicker.setValue(year = maxYear); - } - if (year == maxYear) { - if (month > maxMonth) { - monthPicker.setValue(month = maxMonth); - } - if (month == maxMonth) { - if (day > maxDay) { - dayPicker.setValue(day = maxDay); - } - } - } + yearPicker.setMaxValue(maxYear); + yearPicker.setMinValue(minYear); + year = yearPicker.getValue(); - if (year < minYear) { - yearPicker.setValue(year = minYear); - } - if (year == minYear) { - if (month < minMonth) { - monthPicker.setValue(month = minMonth); - } - if (month == minMonth) { - if (day < minDay) { - dayPicker.setValue(day = minDay); - } - } - } + monthPicker.setMaxValue(year == maxYear ? maxMonth : 11); + monthPicker.setMinValue(year == minYear ? minMonth : 0); + month = monthPicker.getValue(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); - dayPicker.setMaxValue(daysInMonth); - if (day > daysInMonth) { - day = daysInMonth; - dayPicker.setValue(day); - } + dayPicker.setMaxValue(year == maxYear && month == maxMonth ? Math.min(maxDay, daysInMonth) : daysInMonth); + dayPicker.setMinValue(year == minYear && month == minMonth ? minDay : 1); } public static BottomSheet.Builder createCalendarPickerDialog(Context context, long minDate, final MessagesStorage.IntCallback callback, Theme.ResourcesProvider resourcesProvider) { @@ -3653,39 +3642,17 @@ public class AlertsCreator { linearLayout.addView(monthPicker, LayoutHelper.createLinear(0, 54 * 5, 0.5f)); monthPicker.setFormatter(value -> { switch (value) { - case 0: { - return LocaleController.getString("January", R.string.January); - } - case 1: { - return LocaleController.getString("February", R.string.February); - } - case 2: { - return LocaleController.getString("March", R.string.March); - } - case 3: { - return LocaleController.getString("April", R.string.April); - } - case 4: { - return LocaleController.getString("May", R.string.May); - } - case 5: { - return LocaleController.getString("June", R.string.June); - } - case 6: { - return LocaleController.getString("July", R.string.July); - } - case 7: { - return LocaleController.getString("August", R.string.August); - } - case 8: { - return LocaleController.getString("September", R.string.September); - } - case 9: { - return LocaleController.getString("October", R.string.October); - } - case 10: { - return LocaleController.getString("November", R.string.November); - } + case 0: return LocaleController.getString("January", R.string.January); + case 1: return LocaleController.getString("February", R.string.February); + case 2: return LocaleController.getString("March", R.string.March); + case 3: return LocaleController.getString("April", R.string.April); + case 4: return LocaleController.getString("May", R.string.May); + case 5: return LocaleController.getString("June", R.string.June); + case 6: return LocaleController.getString("July", R.string.July); + case 7: return LocaleController.getString("August", R.string.August); + case 8: return LocaleController.getString("September", R.string.September); + case 9: return LocaleController.getString("October", R.string.October); + case 10: return LocaleController.getString("November", R.string.November); case 11: default: { return LocaleController.getString("December", R.string.December); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedAvatarContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedAvatarContainer.java new file mode 100644 index 000000000..860366a6d --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedAvatarContainer.java @@ -0,0 +1,75 @@ +package org.telegram.ui.Components; + +import android.content.Context; +import android.os.Build; +import android.view.Gravity; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.Theme; + +public class AnimatedAvatarContainer extends FrameLayout { + + boolean occupyStatusBar = true; + private int leftPadding = AndroidUtilities.dp(8); + AnimatedTextView titleTextView; + AnimatedTextView subtitleTextView; + public AnimatedAvatarContainer(@NonNull Context context) { + super(context); + titleTextView = new AnimatedTextView(context, true, true, true); + titleTextView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultTitle)); + titleTextView.setTextSize(AndroidUtilities.dp(18)); + titleTextView.setGravity(Gravity.LEFT); + titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + titleTextView.setPadding(0, AndroidUtilities.dp(6), 0, AndroidUtilities.dp(12)); + addView(titleTextView); + + subtitleTextView = new AnimatedTextView(context, true, true, true); + subtitleTextView.setTag(Theme.key_actionBarDefaultSubtitle); + subtitleTextView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultTitle)); + subtitleTextView.setTextSize(AndroidUtilities.dp(14)); + subtitleTextView.setGravity(Gravity.LEFT); + subtitleTextView.setPadding(0, 0, AndroidUtilities.dp(10), 0); + addView(subtitleTextView); + + titleTextView.getDrawable().setAllowCancel(true); + subtitleTextView.getDrawable().setAllowCancel(true); + titleTextView.setAnimationProperties(1f, 0, 150, CubicBezierInterpolator.DEFAULT); + subtitleTextView.setAnimationProperties(1f, 0, 150, CubicBezierInterpolator.DEFAULT); + + setClipChildren(false); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec) + titleTextView.getPaddingRight(); + int availableWidth = width - AndroidUtilities.dp( 16); + titleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24 + 8) + titleTextView.getPaddingRight(), MeasureSpec.AT_MOST)); + subtitleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.AT_MOST)); + setMeasuredDimension(width, MeasureSpec.getSize(heightMeasureSpec)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + int actionBarHeight = ActionBar.getCurrentActionBarHeight(); + int viewTop = (actionBarHeight - AndroidUtilities.dp(42)) / 2 + (Build.VERSION.SDK_INT >= 21 && occupyStatusBar ? AndroidUtilities.statusBarHeight : 0); + int l = leftPadding; + if (subtitleTextView.getVisibility() != GONE) { + titleTextView.layout(l, viewTop + AndroidUtilities.dp(1f) - titleTextView.getPaddingTop(), l + titleTextView.getMeasuredWidth(), viewTop + titleTextView.getTextHeight() + AndroidUtilities.dp(1.3f) - titleTextView.getPaddingTop() + titleTextView.getPaddingBottom()); + } else { + titleTextView.layout(l, viewTop + AndroidUtilities.dp(11) - titleTextView.getPaddingTop(), l + titleTextView.getMeasuredWidth(), viewTop + titleTextView.getTextHeight() + AndroidUtilities.dp(11) - titleTextView.getPaddingTop() + titleTextView.getPaddingBottom()); + } + subtitleTextView.layout(l, viewTop + AndroidUtilities.dp(20), l + subtitleTextView.getMeasuredWidth(), viewTop + subtitleTextView.getTextHeight() + AndroidUtilities.dp(24)); + } + + public AnimatedTextView getTitle() { + return titleTextView; + } + + public AnimatedTextView getSubtitleTextView() { + return subtitleTextView; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java index c093e2ce9..f25350b5d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java @@ -1,5 +1,6 @@ package org.telegram.ui.Components; +import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; @@ -12,6 +13,7 @@ import android.text.style.CharacterStyle; import android.text.style.ReplacementSpan; import android.util.LongSparseArray; import android.view.View; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -831,6 +833,43 @@ public class AnimatedEmojiSpan extends ReplacementSpan { return newText; } + public static class TextViewEmojis extends TextView { + public TextViewEmojis(Context context) { + super(context); + } + + AnimatedEmojiSpan.EmojiGroupedSpans stack; + @Override + public void setText(CharSequence text, TextView.BufferType type) { + super.setText(text, type); + stack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, stack, getLayout()); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + stack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, stack, getLayout()); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + stack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, stack, getLayout()); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + AnimatedEmojiSpan.release(this, stack); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, getLayout(), stack, 0, null, 0, 0, 0, 1f); + } + } + public interface InvalidateHolder { void invalidate(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java index 43738e13d..4a9a4b82a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java @@ -17,7 +17,6 @@ import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; @@ -26,7 +25,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.telegram.messenger.AndroidUtilities; -import org.telegram.ui.ActionBar.Theme; import java.util.ArrayList; import java.util.Arrays; @@ -72,6 +70,7 @@ public class AnimatedTextView extends View { private boolean startFromEnd; private Runnable onAnimationFinishListener; + private boolean allowCancel; public AnimatedTextDrawable() { this(false, false, false); @@ -83,6 +82,10 @@ public class AnimatedTextView extends View { this.startFromEnd = startFromEnd; } + public void setAllowCancel(boolean allowCancel) { + this.allowCancel = allowCancel; + } + public void setOnAnimationFinishListener(Runnable listener) { onAnimationFinishListener = listener; } @@ -93,7 +96,7 @@ public class AnimatedTextView extends View { canvas.translate(bounds.left, bounds.top); int fullWidth = bounds.width(); int fullHeight = bounds.height(); - if (currentLayout != null && oldLayout != null) { + if (currentLayout != null && oldLayout != null && t != 1) { int width = AndroidUtilities.lerp(oldWidth, currentWidth, t); int height = AndroidUtilities.lerp(oldHeight, currentHeight, t); canvas.translate(0, (fullHeight - height) / 2f); @@ -122,7 +125,7 @@ public class AnimatedTextView extends View { x += fullWidth - lwidth; } } - canvas.translate(x, y); + canvas.translate(Math.round(x), Math.round(y)); currentLayout[i].draw(canvas); canvas.restore(); } @@ -147,7 +150,7 @@ public class AnimatedTextView extends View { x += fullWidth - oldWidth; } } - canvas.translate(x, y); + canvas.translate(Math.round(x), Math.round(y)); oldLayout[i].draw(canvas); canvas.restore(); } @@ -170,7 +173,7 @@ public class AnimatedTextView extends View { x += fullWidth - currentWidth; } } - canvas.translate(x, 0); + canvas.translate(Math.round(x), 0); currentLayout[i].draw(canvas); canvas.restore(); } @@ -205,7 +208,12 @@ public class AnimatedTextView extends View { text = ""; } if (animated) { - if (isAnimating()) { + if (allowCancel) { + if (animator != null) { + animator.cancel(); + animator = null; + } + } else if (isAnimating()) { toSetText = text; toSetTextMoveDown = moveDown; return; @@ -635,6 +643,10 @@ public class AnimatedTextView extends View { textPaint.setTextSize(textSizePx); } + public float getTextSize() { + return textPaint.getTextSize(); + } + public void setTextColor(int color) { textPaint.setColor(color); } @@ -761,10 +773,17 @@ public class AnimatedTextView extends View { public void setText(CharSequence text, boolean animated, boolean moveDown) { animated = !first && animated; first = false; - if (animated && drawable.isAnimating()) { - toSetText = text; - toSetMoveDown = moveDown; - return; + if (animated) { + if (drawable.allowCancel) { + if (drawable.animator != null) { + drawable.animator.cancel(); + drawable.animator = null; + } + } else if (drawable.isAnimating()) { + toSetText = text; + toSetMoveDown = moveDown; + return; + } } int wasWidth = drawable.getWidth(); drawable.setBounds(getPaddingLeft(), getPaddingTop(), lastMaxWidth - getPaddingRight(), getMeasuredHeight() - getPaddingBottom()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AutoDeletePopupWrapper.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AutoDeletePopupWrapper.java index 2704d6bdf..0c3ad1450 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AutoDeletePopupWrapper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AutoDeletePopupWrapper.java @@ -1,6 +1,8 @@ package org.telegram.ui.Components; import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.method.LinkMovementMethod; import android.util.TypedValue; import android.view.View; import android.widget.FrameLayout; @@ -16,13 +18,17 @@ import org.telegram.ui.ActionBar.Theme; public class AutoDeletePopupWrapper { + public static final int TYPE_GROUP_CREATE = 1; + + private int type; View backItem; public ActionBarPopupWindow.ActionBarPopupWindowLayout windowLayout; private final ActionBarMenuSubItem disableItem; Callback callback; long lastDismissTime; + TextView textView; - public AutoDeletePopupWrapper(Context context, PopupSwipeBackLayout swipeBackLayout, Callback callback, boolean createBackground, Theme.ResourcesProvider resourcesProvider) { + public AutoDeletePopupWrapper(Context context, PopupSwipeBackLayout swipeBackLayout, Callback callback, boolean createBackground, int type, Theme.ResourcesProvider resourcesProvider) { windowLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(context, createBackground ? R.drawable.popup_fixed_alert : 0, resourcesProvider); windowLayout.setFitItems(true); this.callback = callback; @@ -49,10 +55,14 @@ public class AutoDeletePopupWrapper { dismiss(); callback.setAutoDeleteHistory(31 * 24 * 60 * 60, UndoView.ACTION_AUTO_DELETE_ON); }); - item = ActionBarMenuItem.addItem(windowLayout, R.drawable.msg_customize, LocaleController.getString("AutoDeleteCustom", R.string.AutoDeleteCustom), false, resourcesProvider); + String customTitle = LocaleController.getString("AutoDeleteCustom", R.string.AutoDeleteCustom); + if (type == TYPE_GROUP_CREATE) { + customTitle = LocaleController.getString("AutoDeleteCustom2", R.string.AutoDeleteCustom2); + } + item = ActionBarMenuItem.addItem(windowLayout, R.drawable.msg_customize, customTitle, false, resourcesProvider); item.setOnClickListener(view -> { dismiss(); - AlertsCreator.createAutoDeleteDatePickerDialog(context, resourcesProvider, (notify, timeInMinutes) -> { + AlertsCreator.createAutoDeleteDatePickerDialog(context, type, resourcesProvider, (notify, timeInMinutes) -> { callback.setAutoDeleteHistory(timeInMinutes * 60, timeInMinutes == 0 ? UndoView.ACTION_AUTO_DELETE_OFF : UndoView.ACTION_AUTO_DELETE_ON); }); }); @@ -61,20 +71,29 @@ public class AutoDeletePopupWrapper { dismiss(); callback.setAutoDeleteHistory(0, UndoView.ACTION_AUTO_DELETE_OFF); }); - disableItem.setColors(Theme.getColor(Theme.key_dialogTextRed2), Theme.getColor(Theme.key_dialogTextRed2)); + if (type != TYPE_GROUP_CREATE) { + disableItem.setColors(Theme.getColor(Theme.key_dialogTextRed2), Theme.getColor(Theme.key_dialogTextRed2)); + } - View gap = new FrameLayout(context); - gap.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuSeparator, resourcesProvider)); - gap.setTag(R.id.fit_width_tag, 1); - windowLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + if (type != TYPE_GROUP_CREATE) { + FrameLayout gap = new FrameLayout(context); + gap.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuSeparator, resourcesProvider)); + View gapShadow = new View(context); + gapShadow.setBackground(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow, resourcesProvider)); + gap.addView(gapShadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + gap.setTag(R.id.fit_width_tag, 1); + windowLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); - TextView textView = new TextView(context); - textView.setTag(R.id.fit_width_tag, 1); - textView.setPadding(AndroidUtilities.dp(13), AndroidUtilities.dp(8), AndroidUtilities.dp(13), AndroidUtilities.dp(8)); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - textView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem)); - textView.setText(LocaleController.getString("AutoDeletePopupDescription", R.string.AutoDeletePopupDescription)); - windowLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + textView = new LinkSpanDrawable.LinksTextView(context); + textView.setTag(R.id.fit_width_tag, 1); + textView.setPadding(AndroidUtilities.dp(13), 0, AndroidUtilities.dp(13), AndroidUtilities.dp(8)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + textView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem)); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + textView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkText)); + textView.setText(LocaleController.getString("AutoDeletePopupDescription", R.string.AutoDeletePopupDescription)); + windowLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 8, 0, 0)); + } } private void dismiss() { @@ -96,9 +115,28 @@ public class AutoDeletePopupWrapper { } } + public void allowExtenededHint() { + if (textView == null) { + return; + } + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append(LocaleController.getString("AutoDeletePopupDescription", R.string.AutoDeletePopupDescription)); + spannableStringBuilder.append("\n\n"); + spannableStringBuilder.append(AndroidUtilities.replaceSingleTag(LocaleController.getString("AutoDeletePopupDescription2", R.string.AutoDeletePopupDescription2), () -> { + callback.showGlobalAutoDeleteScreen(); + })); + textView.setText(spannableStringBuilder); + } + + void setType(int i) { + type = i; + } public interface Callback { void dismiss(); void setAutoDeleteHistory(int time, int action); + default void showGlobalAutoDeleteScreen() { + + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java index f8385856e..f1a0ebbbc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -31,6 +31,8 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import java.util.ArrayList; + public class AvatarDrawable extends Drawable { private TextPaint namePaint; @@ -45,7 +47,7 @@ public class AvatarDrawable extends Drawable { private boolean drawDeleted; private int avatarType; private float archivedAvatarProgress; - private boolean smallSize; + private float scaleSize = 1f; private StringBuilder stringBuilder = new StringBuilder(5); private int roundRadius = -1; @@ -72,6 +74,7 @@ public class AvatarDrawable extends Drawable { public static final int AVATAR_TYPE_FILTER_READ = 10; public static final int AVATAR_TYPE_FILTER_ARCHIVED = 11; public static final int AVATAR_TYPE_REGISTER = 13; + public static final int AVATAR_TYPE_OTHER_CHATS = 14; private int alpha = 255; private Theme.ResourcesProvider resourcesProvider; @@ -169,8 +172,8 @@ public class AvatarDrawable extends Drawable { } } - public void setSmallSize(boolean value) { - smallSize = value; + public void setScaleSize(float value) { + scaleSize = value; } public void setAvatarType(int value) { @@ -181,11 +184,7 @@ public class AvatarDrawable extends Drawable { } else if (avatarType == AVATAR_TYPE_ARCHIVED) { hasGradient = false; color = color2 = getThemedColor(Theme.key_avatar_backgroundArchivedHidden); - } else if (avatarType == AVATAR_TYPE_REPLIES) { - hasGradient = true; - color = getThemedColor(Theme.key_avatar_backgroundSaved); - color2 = getThemedColor(Theme.key_avatar_background2Saved); - } else if (avatarType == AVATAR_TYPE_SAVED) { + } else if (avatarType == AVATAR_TYPE_REPLIES || avatarType == AVATAR_TYPE_SAVED || avatarType == AVATAR_TYPE_OTHER_CHATS) { hasGradient = true; color = getThemedColor(Theme.key_avatar_backgroundSaved); color2 = getThemedColor(Theme.key_avatar_background2Saved); @@ -226,7 +225,7 @@ public class AvatarDrawable extends Drawable { color = getThemedColor(Theme.keys_avatar_background[getColorIndex(4)]); color2 = getThemedColor(Theme.keys_avatar_background2[getColorIndex(4)]); } - needApplyColorAccent = avatarType != AVATAR_TYPE_ARCHIVED && avatarType != AVATAR_TYPE_SAVED && avatarType != AVATAR_TYPE_REPLIES; + needApplyColorAccent = avatarType != AVATAR_TYPE_ARCHIVED && avatarType != AVATAR_TYPE_SAVED && avatarType != AVATAR_TYPE_REPLIES && avatarType != AVATAR_TYPE_OTHER_CHATS; } public void setArchivedAvatarHiddenProgress(float progress) { @@ -278,31 +277,11 @@ public class AvatarDrawable extends Drawable { } private String takeFirstCharacter(String text) { - StringBuilder sequence = new StringBuilder(16); - boolean isInJoin = false; - int codePoint; - for (int i = 0; i < text.length(); i = text.offsetByCodePoints(i, 1)) { - codePoint = text.codePointAt(i); - if (codePoint == 0x200D || codePoint == 0x1f1ea) { - isInJoin = true; - if (sequence.length() == 0) - continue; - } else { - if ((sequence.length() > 0) && (!isInJoin)) - break; - isInJoin = false; - } - sequence.appendCodePoint(codePoint); + ArrayList ranges = Emoji.parseEmojis(text); + if (ranges != null && !ranges.isEmpty() && ranges.get(0).start == 0) { + return text.substring(0, ranges.get(0).end); } - if (isInJoin) { - for (int i = sequence.length()-1; i >= 0; --i) { - if (sequence.charAt(i) == 0x200D) - sequence.deleteCharAt(i); - else - break; - } - } - return sequence.toString(); + return text.substring(0, text.offsetByCodePoints(0, Math.min(text.codePointCount(0, text.length()), 1))); } public void setInfo(long id, String firstName, String lastName, String custom) { @@ -429,12 +408,8 @@ public class AvatarDrawable extends Drawable { } else if (avatarType != 0) { Drawable drawable; - if (avatarType == AVATAR_TYPE_REPLIES) { - drawable = Theme.avatarDrawables[11]; - } else if (avatarType == AVATAR_TYPE_SAVED) { + if (avatarType == AVATAR_TYPE_SAVED) { drawable = Theme.avatarDrawables[0]; - } else if (avatarType == AVATAR_TYPE_SHARES) { - drawable = Theme.avatarDrawables[10]; } else if (avatarType == AVATAR_TYPE_FILTER_CONTACTS) { drawable = Theme.avatarDrawables[2]; } else if (avatarType == AVATAR_TYPE_FILTER_NON_CONTACTS) { @@ -449,16 +424,18 @@ public class AvatarDrawable extends Drawable { drawable = Theme.avatarDrawables[7]; } else if (avatarType == AVATAR_TYPE_FILTER_READ) { drawable = Theme.avatarDrawables[8]; + } else if (avatarType == AVATAR_TYPE_SHARES) { + drawable = Theme.avatarDrawables[10]; + } else if (avatarType == AVATAR_TYPE_REPLIES) { + drawable = Theme.avatarDrawables[11]; + } else if (avatarType == AVATAR_TYPE_OTHER_CHATS) { + drawable = Theme.avatarDrawables[12]; } else { drawable = Theme.avatarDrawables[9]; } if (drawable != null) { - int w = drawable.getIntrinsicWidth(); - int h = drawable.getIntrinsicHeight(); - if (smallSize) { - w *= 0.8f; - h *= 0.8f; - } + int w = (int) (drawable.getIntrinsicWidth() * scaleSize); + int h = (int) (drawable.getIntrinsicHeight() * scaleSize); int x = (size - w) / 2; int y = (size - h) / 2; drawable.setBounds(x, y, x + w, y + h); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackButtonMenu.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackButtonMenu.java index a54d9056e..b6637edcf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackButtonMenu.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackButtonMenu.java @@ -101,7 +101,7 @@ public class BackButtonMenu { cell.addView(titleView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 59, 0, 12, 0)); AvatarDrawable avatarDrawable = new AvatarDrawable(); - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); Drawable thumb = avatarDrawable; boolean addDivider = false; if (chat != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java index c502a65e5..e1d804a0c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java @@ -30,6 +30,7 @@ public class BackupImageView extends View { protected int width = -1; protected int height = -1; public AnimatedEmojiDrawable animatedEmojiDrawable; + private AvatarDrawable avatarDrawable; boolean attached; public BackupImageView(Context context) { @@ -171,6 +172,13 @@ public class BackupImageView extends View { invalidate(); } + public AvatarDrawable getAvatarDrawable() { + if (avatarDrawable == null) { + avatarDrawable = new AvatarDrawable(); + } + return avatarDrawable; + } + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurredRecyclerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurredRecyclerView.java index e149a1d61..cf4d4f584 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurredRecyclerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurredRecyclerView.java @@ -10,7 +10,7 @@ import org.telegram.messenger.SharedConfig; public class BlurredRecyclerView extends RecyclerListView { public int blurTopPadding; - int topPadding; + public int topPadding; boolean globalIgnoreLayout; public int additionalClipBottom; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java index ab640869f..8fab2afa2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java @@ -9,6 +9,7 @@ import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; +import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -69,7 +70,11 @@ import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.voip.CellFlickerDrawable; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; @@ -526,6 +531,21 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent if (isPageLoaded) { return; } + + try { + InputStream in = getResources().getAssets().open("bot_clipboard_wrapper.js"); + BufferedReader r = new BufferedReader(new InputStreamReader(in)); + StringBuilder script = new StringBuilder(); + String line; + while ((line = r.readLine()) != null) { + script.append(line).append("\n"); + } + in.close(); + evaluateJs(script.toString()); + } catch (IOException e) { + FileLog.e(e); + } + AnimatorSet set = new AnimatorSet(); set.playTogether( ObjectAnimator.ofFloat(webView, View.ALPHA, 1f), @@ -1336,6 +1356,13 @@ public class BotWebViewContainer extends FrameLayout implements NotificationCent public void postEvent(String eventType, String eventData) { AndroidUtilities.runOnUIThread(() -> onEventReceived(eventType, eventData)); } + + @JavascriptInterface + public String getClipboardText() { + ClipboardManager clipboardManager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + CharSequence text = clipboardManager.getText(); + return text != null ? text.toString() : null; + } } public interface WebViewScrollListener { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java index a48258968..0c1cdb5f5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java @@ -30,6 +30,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; +import android.view.WindowInsets; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; @@ -49,8 +50,10 @@ import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; @@ -131,7 +134,9 @@ public class Bulletin { private boolean showing; private boolean canHide; + private boolean loaded = true; public int currentBottomOffset; + public int lastBottomOffset; private Delegate currentDelegate; private Layout.Transition layoutTransition; @@ -144,6 +149,7 @@ public class Bulletin { private Bulletin(BaseFragment fragment, @NonNull FrameLayout containerLayout, @NonNull Layout layout, int duration) { this.layout = layout; + this.loaded = !(this.layout instanceof LoadingLayout); this.parentLayout = new ParentLayout(layout) { @Override protected void onPressedStateChanged(boolean pressed) { @@ -204,15 +210,15 @@ public class Bulletin { containerLayout.addOnLayoutChangeListener(containerLayoutListener = (v, left, top1, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { if (!top) { int newOffset = currentDelegate != null ? currentDelegate.getBottomOffset(tag) : 0; - if (currentBottomOffset != newOffset) { + if (lastBottomOffset != newOffset) { if (bottomOffsetSpring == null || !bottomOffsetSpring.isRunning()) { - bottomOffsetSpring = new SpringAnimation(new FloatValueHolder(currentBottomOffset)) + bottomOffsetSpring = new SpringAnimation(new FloatValueHolder(lastBottomOffset)) .setSpring(new SpringForce() .setFinalPosition(newOffset) .setStiffness(900f) .setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY)); bottomOffsetSpring.addUpdateListener((animation, value, velocity) -> { - currentBottomOffset = (int) value; + lastBottomOffset = (int) value; updatePosition(); }); bottomOffsetSpring.addEndListener((animation, canceled, value, velocity) -> { @@ -236,7 +242,7 @@ public class Bulletin { layout.onShow(); currentDelegate = findDelegate(containerFragment, containerLayout); if (bottomOffsetSpring == null || !bottomOffsetSpring.isRunning()) { - currentBottomOffset = currentDelegate != null ? currentDelegate.getBottomOffset(tag) : 0; + lastBottomOffset = currentDelegate != null ? currentDelegate.getBottomOffset(tag) : 0; } if (currentDelegate != null) { currentDelegate.onShow(Bulletin.this); @@ -285,7 +291,8 @@ public class Bulletin { return this; } - private void setCanHide(boolean canHide) { + public void setCanHide(boolean canHide) { + canHide = canHide && loaded; if (this.canHide != canHide && layout != null) { this.canHide = canHide; if (canHide) { @@ -783,7 +790,7 @@ public class Bulletin { public float getBottomOffset() { if (bulletin != null && bulletin.bottomOffsetSpring != null && bulletin.bottomOffsetSpring.isRunning()) { - return bulletin.currentBottomOffset; + return bulletin.lastBottomOffset; } return delegate.getBottomOffset(bulletin != null ? bulletin.tag : 0); } @@ -1132,8 +1139,8 @@ public class Bulletin { public static class TwoLineLottieLayout extends ButtonLayout { public final RLottieImageView imageView; - public final TextView titleTextView; - public final TextView subtitleTextView; + public final LinkSpanDrawable.LinksTextView titleTextView; + public final LinkSpanDrawable.LinksTextView subtitleTextView; private final int textColor; @@ -1147,20 +1154,22 @@ public class Bulletin { addView(imageView, LayoutHelper.createFrameRelatively(56, 48, Gravity.START | Gravity.CENTER_VERTICAL)); final int undoInfoColor = getThemedColor(Theme.key_undo_infoColor); - final int undoLinkColor = getThemedColor(Theme.key_voipgroup_overlayBlue1); + final int undoLinkColor = getThemedColor(Theme.key_undo_cancelColor); final LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); - addView(linearLayout, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 56, 8, 12, 8)); + addView(linearLayout, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 52, 8, 8, 8)); - titleTextView = new TextView(context); + titleTextView = new LinkSpanDrawable.LinksTextView(context); + titleTextView.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0); titleTextView.setSingleLine(); titleTextView.setTextColor(undoInfoColor); titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); linearLayout.addView(titleTextView); - subtitleTextView = new TextView(context); + subtitleTextView = new LinkSpanDrawable.LinksTextView(context); + subtitleTextView.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0); subtitleTextView.setTextColor(undoInfoColor); subtitleTextView.setLinkTextColor(undoLinkColor); subtitleTextView.setTypeface(Typeface.SANS_SERIF); @@ -1204,7 +1213,14 @@ public class Bulletin { imageView.setScaleType(ImageView.ScaleType.CENTER); addView(imageView, LayoutHelper.createFrameRelatively(56, 48, Gravity.START | Gravity.CENTER_VERTICAL)); - textView = new LinkSpanDrawable.LinksTextView(context); + textView = new LinkSpanDrawable.LinksTextView(context) { + @Override + public void setText(CharSequence text, BufferType type) { + text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), AndroidUtilities.dp(13), false); + super.setText(text, type); + } + }; + NotificationCenter.listenEmojiLoading(textView); textView.setDisablePaddingsOffset(true); textView.setSingleLine(); textView.setTypeface(Typeface.SANS_SERIF); @@ -1262,6 +1278,51 @@ public class Bulletin { } } + public static interface LoadingLayout { + void onTextLoaded(CharSequence text); + } + + public static class LoadingLottieLayout extends LottieLayout implements LoadingLayout { + + public LinkSpanDrawable.LinksTextView textLoadingView; + + public LoadingLottieLayout(@NonNull Context context, Theme.ResourcesProvider resourcesProvider) { + super(context, resourcesProvider); + + textLoadingView = new LinkSpanDrawable.LinksTextView(context); + textLoadingView.setDisablePaddingsOffset(true); + textLoadingView.setSingleLine(); + textLoadingView.setTypeface(Typeface.SANS_SERIF); + textLoadingView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textLoadingView.setEllipsize(TextUtils.TruncateAt.END); + textLoadingView.setPadding(0, AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8)); + textView.setVisibility(View.GONE); + addView(textLoadingView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 56, 0, 8, 0)); + + setTextColor(getThemedColor(Theme.key_undo_infoColor)); + } + + public LoadingLottieLayout(@NonNull Context context, Theme.ResourcesProvider resourcesProvider, int backgroundColor, int textColor) { + this(context, resourcesProvider); + setBackground(backgroundColor); + setTextColor(textColor); + } + + @Override + public void setTextColor(int textColor) { + super.setTextColor(textColor); + if (textLoadingView != null) { + textLoadingView.setTextColor(textColor); + } + } + + public void onTextLoaded(CharSequence text) { + textView.setText(text); + AndroidUtilities.updateViewShow(textLoadingView, false, false, true); + AndroidUtilities.updateViewShow(textView, true, false, true); + } + } + public static class UsersLayout extends ButtonLayout { public AvatarsImageView avatarsImageView; @@ -1275,7 +1336,14 @@ public class Bulletin { avatarsImageView.setAvatarsTextSize(AndroidUtilities.dp(18)); addView(avatarsImageView, LayoutHelper.createFrameRelatively(24 + 12 + 12 + 8, 48, Gravity.START | Gravity.CENTER_VERTICAL, 12, 0, 0, 0)); - textView = new LinkSpanDrawable.LinksTextView(context); + textView = new LinkSpanDrawable.LinksTextView(context) { + @Override + public void setText(CharSequence text, BufferType type) { + text = Emoji.replaceEmoji(text, getPaint().getFontMetricsInt(), AndroidUtilities.dp(13), false); + super.setText(text, type); + } + }; + NotificationCenter.listenEmojiLoading(textView); textView.setTypeface(Typeface.SANS_SERIF); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); textView.setEllipsize(TextUtils.TruncateAt.END); @@ -1439,6 +1507,16 @@ public class Bulletin { return color != null ? color : Theme.getColor(key); } } + + // TODO: possibility of loading icon as well + public void onLoaded(CharSequence text) { + loaded = true; + if (layout instanceof LoadingLayout) { + ((LoadingLayout) layout).onTextLoaded(text); + } + setCanHide(true); + } + //endregion public static class EmptyBulletin extends Bulletin { @@ -1577,6 +1655,23 @@ public class Bulletin { }, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) ); + if (Build.VERSION.SDK_INT >= 21) { + container.setFitsSystemWindows(true); + container.setOnApplyWindowInsetsListener((v, insets) -> { + applyInsets(insets); + v.requestLayout(); + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return insets.consumeSystemWindowInsets(); + } + }); + if (Build.VERSION.SDK_INT >= 30) { + container.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + } else { + container.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + } addDelegate(container, new Delegate() { @Override @@ -1601,7 +1696,7 @@ public class Bulletin { params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND; params.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - params.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; + params.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; } params.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; if (Build.VERSION.SDK_INT >= 21) { @@ -1615,7 +1710,19 @@ public class Bulletin { params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; } window.setAttributes(params); + AndroidUtilities.setLightNavigationBar(window, AndroidUtilities.computePerceivedBrightness(Theme.getColor(Theme.key_windowBackgroundGray)) > 0.721f); } catch (Exception ignore) {} } + + private void applyInsets(WindowInsets insets) { + if (container != null) { + container.setPadding( + insets.getSystemWindowInsetLeft(), + insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), + insets.getSystemWindowInsetBottom() + ); + } + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java index edfd45b1d..5f1517924 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Spannable; import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.TextPaint; import android.text.style.ClickableSpan; import android.util.TypedValue; @@ -14,17 +15,20 @@ import android.widget.FrameLayout; import androidx.annotation.CheckResult; import androidx.annotation.NonNull; +import androidx.core.graphics.ColorUtils; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; import org.telegram.messenger.DialogObject; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationsController; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; @@ -151,7 +155,7 @@ public final class BulletinFactory { layout.setAnimation(iconRawId, 36, 36); layout.titleTextView.setText(text); layout.subtitleTextView.setText(subtext); - return create(layout, text.length() < 20 ? Bulletin.DURATION_SHORT : Bulletin.DURATION_LONG); + return create(layout, (text.length() + subtext.length()) < 20 ? Bulletin.DURATION_SHORT : Bulletin.DURATION_LONG); } public Bulletin createSimpleBulletin(int iconRawId, CharSequence text, CharSequence button, Runnable onButtonClick) { @@ -262,6 +266,76 @@ public final class BulletinFactory { return create(layout, Bulletin.DURATION_LONG); } + public Bulletin createEmojiLoadingBulletin(TLRPC.Document document, CharSequence text, CharSequence button, Runnable onButtonClick) { + final Bulletin.LoadingLottieLayout layout = new Bulletin.LoadingLottieLayout(getContext(), resourcesProvider); + layout.setAnimation(document, 36, 36); + layout.textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(3); + layout.textLoadingView.setText(text); + layout.textLoadingView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + layout.textLoadingView.setSingleLine(false); + layout.textLoadingView.setMaxLines(3); + layout.setButton(new Bulletin.UndoButton(getContext(), true, resourcesProvider).setText(button).setUndoAction(onButtonClick)); + return create(layout, Bulletin.DURATION_LONG); + } + + public Bulletin createContainsEmojiBulletin(TLRPC.Document document, boolean inTopic, Utilities.Callback openSet) { + TLRPC.InputStickerSet inputStickerSet = MessageObject.getInputStickerSet(document); + if (inputStickerSet == null) { + return null; + } + TLRPC.TL_messages_stickerSet cachedSet = MediaDataController.getInstance(UserConfig.selectedAccount).getStickerSet(inputStickerSet, true); + if (cachedSet == null || cachedSet.set == null) { + final String loadingPlaceholder = "<{LOADING}>"; + SpannableStringBuilder stringBuilder; + if (inTopic) { + stringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatString("TopicContainsEmojiPackSingle", R.string.TopicContainsEmojiPackSingle, loadingPlaceholder))); + } else { + stringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatString("MessageContainsEmojiPackSingle", R.string.MessageContainsEmojiPackSingle, loadingPlaceholder))); + } + LoadingSpan loadingSpan = null; + int index; + if ((index = stringBuilder.toString().indexOf(loadingPlaceholder)) >= 0) { + stringBuilder.setSpan(loadingSpan = new LoadingSpan(null, AndroidUtilities.dp(100)), index, index + loadingPlaceholder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + loadingSpan.setColors( + ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_undo_infoColor, resourcesProvider), 0x20), + ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_undo_infoColor, resourcesProvider), 0x48) + ); + } + final long startTime = System.currentTimeMillis(); + final long minDuration = 750; + Bulletin bulletin = createEmojiLoadingBulletin(document, stringBuilder, LocaleController.getString("ViewAction", R.string.ViewAction), () -> openSet.run(inputStickerSet)).show(); + if (loadingSpan != null && bulletin.getLayout() instanceof Bulletin.LoadingLottieLayout) { + loadingSpan.setView(((Bulletin.LoadingLottieLayout) bulletin.getLayout()).textLoadingView); + } + MediaDataController.getInstance(UserConfig.selectedAccount).getStickerSet(inputStickerSet, false, set -> { + CharSequence message; + if (set != null && set.set != null) { + if (inTopic) { + message = AndroidUtilities.replaceTags(LocaleController.formatString("TopicContainsEmojiPackSingle", R.string.TopicContainsEmojiPackSingle, set.set.title)); + } else { + message = AndroidUtilities.replaceTags(LocaleController.formatString("MessageContainsEmojiPackSingle", R.string.MessageContainsEmojiPackSingle, set.set.title)); + } + } else { + message = LocaleController.getString("AddEmojiNotFound", R.string.AddEmojiNotFound); + } + AndroidUtilities.runOnUIThread(() -> { + bulletin.onLoaded(message); + }, Math.max(1, minDuration - (System.currentTimeMillis() - startTime))); + }); + return bulletin; + } else { + CharSequence message; + if (inTopic) { + message = AndroidUtilities.replaceTags(LocaleController.formatString("TopicContainsEmojiPackSingle", R.string.TopicContainsEmojiPackSingle, cachedSet.set.title)); + } else { + message = AndroidUtilities.replaceTags(LocaleController.formatString("MessageContainsEmojiPackSingle", R.string.MessageContainsEmojiPackSingle, cachedSet.set.title)); + } + return createEmojiBulletin(document, message, LocaleController.getString("ViewAction", R.string.ViewAction), () -> openSet.run(inputStickerSet)); + } + } + @CheckResult public Bulletin createDownloadBulletin(FileType fileType) { return createDownloadBulletin(fileType, resourcesProvider); @@ -633,9 +707,9 @@ public final class BulletinFactory { } } else { if (messagesCount <= 1) { - text = AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessageToChats", R.string.FwdMessageToChats, LocaleController.formatPluralString("Chats", dialogsCount))); + text = AndroidUtilities.replaceTags(LocaleController.formatPluralString("FwdMessageToManyChats", dialogsCount)); } else { - text = AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessagesToChats", R.string.FwdMessagesToChats, LocaleController.formatPluralString("Chats", dialogsCount))); + text = AndroidUtilities.replaceTags(LocaleController.formatPluralString("FwdMessagesToManyChats", dialogsCount)); } layout.setAnimation(R.raw.forward, 30, 30); hapticDelay = 300; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java index b60f5aa82..75a31b271 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -123,6 +123,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.Utilities; import org.telegram.messenger.VideoEditedInfo; +import org.telegram.messenger.browser.Browser; import org.telegram.messenger.camera.CameraController; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; @@ -2026,13 +2027,13 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific public boolean onTextContextMenuItem(int id) { if (id == android.R.id.paste) { isPaste = true; - } - ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clipData = clipboard.getPrimaryClip(); - if (clipData != null) { - if (clipData.getItemCount() == 1 && clipData.getDescription().hasMimeType("image/*")) { - editPhoto(clipData.getItemAt(0).getUri(), clipData.getDescription().getMimeType(0)); + ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = clipboard.getPrimaryClip(); + if (clipData != null) { + if (clipData.getItemCount() == 1 && clipData.getDescription().hasMimeType("image/*")) { + editPhoto(clipData.getItemAt(0).getUri(), clipData.getDescription().getMimeType(0)); + } } } return super.onTextContextMenuItem(id); @@ -4344,7 +4345,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } int visibility = getVisibility(); - if (showKeyboardOnResume && parentFragment.isLastFragment()) { + if (showKeyboardOnResume && parentFragment != null && parentFragment.isLastFragment()) { showKeyboardOnResume = false; if (searchingType == 0) { messageEditText.requestFocus(); @@ -7150,7 +7151,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (button instanceof TLRPC.TL_keyboardButton) { SendMessagesHelper.getInstance(currentAccount).sendMessage(button.text, dialog_id, replyMessageObject, getThreadMessage(), null, false, null, null, null, true, 0, null, false); } else if (button instanceof TLRPC.TL_keyboardButtonUrl) { - AlertsCreator.showOpenUrlAlert(parentFragment, button.url, false, true, resourcesProvider); + if (Browser.urlMustNotHaveConfirmation(button.url)) { + Browser.openUrl(parentActivity, button.url); + } else { + AlertsCreator.showOpenUrlAlert(parentFragment, button.url, false, true, resourcesProvider); + } } else if (button instanceof TLRPC.TL_keyboardButtonRequestPhone) { parentFragment.shareMyContact(2, messageObject); } else if (button instanceof TLRPC.TL_keyboardButtonRequestPoll) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityInterface.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityInterface.java index cba1817be..5d1ba021d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityInterface.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityInterface.java @@ -3,6 +3,7 @@ package org.telegram.ui.Components; import org.telegram.messenger.ChatObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.Theme; public interface ChatActivityInterface { @@ -49,4 +50,6 @@ public interface ChatActivityInterface { SizeNotifierFrameLayout getContentView(); ActionBar getActionBar(); + + Theme.ResourcesProvider getResourceProvider(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertContactsLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertContactsLayout.java index 2da21a5e6..093111d37 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertContactsLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertContactsLayout.java @@ -29,6 +29,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; @@ -99,7 +100,14 @@ public class ChatAttachAlertContactsLayout extends ChatAttachAlert.AttachAlertLa avatarImageView.setRoundRadius(AndroidUtilities.dp(23)); addView(avatarImageView, LayoutHelper.createFrame(46, 46, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 0 : 14, 9, LocaleController.isRTL ? 14 : 0, 0)); - nameTextView = new SimpleTextView(context); + nameTextView = new SimpleTextView(context) { + @Override + public boolean setText(CharSequence value, boolean force) { + value = Emoji.replaceEmoji(value, getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + return super.setText(value, force); + } + }; + NotificationCenter.listenEmojiLoading(nameTextView); nameTextView.setTextColor(getThemedColor(Theme.key_dialogTextBlack)); nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); nameTextView.setTextSize(16); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java index aa8c05907..a0d1b1a1d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java @@ -159,7 +159,6 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent titleTextView.setLeftDrawableTopPadding(-AndroidUtilities.dp(1.3f)); titleTextView.setCanHideRightDrawable(false); titleTextView.setRightDrawableOutside(true); - titleTextView.setEllipsizeByGradient(true); titleTextView.setPadding(0, AndroidUtilities.dp(6), 0, AndroidUtilities.dp(12)); addView(titleTextView); @@ -179,11 +178,6 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent } super.setTranslationY(translationY); } - - @Override - public void setVisibility(int visibility) { - super.setVisibility(visibility); - } }; subtitleTextView.setEllipsizeByGradient(true); subtitleTextView.setTextColor(getThemedColor(Theme.key_actionBarDefaultSubtitle)); @@ -294,7 +288,7 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent } } - }, true, resourcesProvider); + }, true, 0, resourcesProvider); autoDeletePopupWrapper.updateItems(ttl); scrimPopupWindow[0] = new ActionBarPopupWindow(autoDeletePopupWrapper.windowLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) { @@ -320,7 +314,7 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent return true; } - private void openProfile(boolean byAvatar) { + public void openProfile(boolean byAvatar) { if (byAvatar && (AndroidUtilities.isTablet() || AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y || !avatarImageView.getImageReceiver().hasNotThumb())) { byAvatar = false; } @@ -723,9 +717,16 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent } setTypingAnimation(false); if (parentFragment.isTopic && chat != null) { - int count = parentFragment.getThreadMessage().getRepliesCount(); - // newSubtitle = LocaleController.formatPluralString("messages", count, count); - newSubtitle = LocaleController.formatString("TopicProfileStatus", R.string.TopicProfileStatus, chat.title); + TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(chat.id, parentFragment.getTopicId()); + int count = 0; + if (topic != null) { + count = topic.totalMessagesCount - 1; + } + if (count > 0) { + newSubtitle = LocaleController.formatPluralString("messages", count, count); + } else { + newSubtitle = LocaleController.formatString("TopicProfileStatus", R.string.TopicProfileStatus, chat.title); + } } else if (chat != null) { TLRPC.ChatFull info = parentFragment.getCurrentChatInfo(); if (ChatObject.isChannel(chat)) { @@ -878,18 +879,18 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent avatarDrawable.setInfo(user); if (UserObject.isReplyUser(user)) { avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); if (avatarImageView != null) { avatarImageView.setImage(null, null, avatarDrawable, user); } } else if (UserObject.isUserSelf(user) && !showSelf) { avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); if (avatarImageView != null) { avatarImageView.setImage(null, null, avatarDrawable, user); } } else { - avatarDrawable.setSmallSize(false); + avatarDrawable.setScaleSize(1f); if (avatarImageView != null) { avatarImageView.setForUserOrChat(user, avatarDrawable); } @@ -905,19 +906,19 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent if (user != null) { avatarDrawable.setInfo(user); if (UserObject.isReplyUser(user)) { - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); if (avatarImageView != null) { avatarImageView.setImage(null, null, avatarDrawable, user); } } else if (UserObject.isUserSelf(user)) { - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); if (avatarImageView != null) { avatarImageView.setImage(null, null, avatarDrawable, user); } } else { - avatarDrawable.setSmallSize(false); + avatarDrawable.setScaleSize(1f); if (avatarImageView != null) { avatarImageView.imageReceiver.setForUserOrChat(user, avatarDrawable, null, true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java index 3156ea1a9..cddbf2c80 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java @@ -26,13 +26,29 @@ public class ColoredImageSpan extends ReplacementSpan { private int size; + public static final int ALIGN_DEFAULT = 0; + public static final int ALIGN_BASELINE = 1; + public static final int ALIGN_CENTER = 2; + private final int verticalAlignment; + public ColoredImageSpan(int imageRes) { - this(ContextCompat.getDrawable(ApplicationLoader.applicationContext, imageRes)); + this(imageRes, ALIGN_DEFAULT); } public ColoredImageSpan(Drawable drawable) { + this(drawable, ALIGN_DEFAULT); + } + + public ColoredImageSpan(int imageRes, int verticalAlignment) { + this(ContextCompat.getDrawable(ApplicationLoader.applicationContext, imageRes), verticalAlignment); + } + + public ColoredImageSpan(Drawable drawable, int verticalAlignment) { this.drawable = drawable; - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + if (drawable != null) { + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + } + this.verticalAlignment = verticalAlignment; } public void setSize(int size) { @@ -57,13 +73,23 @@ public class ColoredImageSpan extends ReplacementSpan { drawableColor = color; drawable.setColorFilter(new PorterDuffColorFilter(drawableColor, PorterDuff.Mode.MULTIPLY)); } - int lineHeight = bottom - top; - int drawableHeight = size != 0 ? size : drawable.getIntrinsicHeight(); - int padding = (lineHeight - drawableHeight) / 2; canvas.save(); - canvas.translate(x, top + padding + AndroidUtilities.dp(topOffset)); - drawable.draw(canvas); + int transY = bottom - (drawable != null ? drawable.getBounds().bottom : bottom); + if (verticalAlignment == ALIGN_BASELINE) { + transY -= paint.getFontMetricsInt().descent; + } else if (verticalAlignment == ALIGN_CENTER) { + transY = top + (bottom - top) / 2 - (drawable != null ? drawable.getBounds().height() / 2 : 0); + } else if (verticalAlignment == ALIGN_DEFAULT) { + int lineHeight = bottom - top; + int drawableHeight = size != 0 ? size : drawable.getIntrinsicHeight(); + int padding = (lineHeight - drawableHeight) / 2; + transY = top + padding + AndroidUtilities.dp(topOffset); + } + canvas.translate(x, transY); + if (drawable != null) { + drawable.draw(canvas); + } canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CombinedDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CombinedDrawable.java index 1882e348c..d723a4bea 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/CombinedDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CombinedDrawable.java @@ -8,9 +8,11 @@ package org.telegram.ui.Components; +import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.drawable.Drawable; + import androidx.annotation.NonNull; public class CombinedDrawable extends Drawable implements Drawable.Callback { @@ -26,6 +28,7 @@ public class CombinedDrawable extends Drawable implements Drawable.Callback { private int offsetX; private int offsetY; private boolean fullSize; + private boolean both; public CombinedDrawable(Drawable backgroundDrawable, Drawable iconDrawable, int leftOffset, int topOffset) { background = backgroundDrawable; @@ -42,6 +45,15 @@ public class CombinedDrawable extends Drawable implements Drawable.Callback { iconHeight = height; } + public CombinedDrawable(Context context, int backgroundDrawableResId, int iconDrawableResId) { + background = context.getResources().getDrawable(backgroundDrawableResId); + icon = context.getResources().getDrawable(iconDrawableResId); + if (icon != null) { + icon.setCallback(this); + } + both = true; + } + public CombinedDrawable(Drawable backgroundDrawable, Drawable iconDrawable) { background = backgroundDrawable; icon = iconDrawable; @@ -75,6 +87,9 @@ public class CombinedDrawable extends Drawable implements Drawable.Callback { @Override public void setColorFilter(ColorFilter colorFilter) { icon.setColorFilter(colorFilter); + if (both) { + background.setColorFilter(colorFilter); + } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsItemAnimator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsItemAnimator.java index d751f2009..88e70200b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsItemAnimator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsItemAnimator.java @@ -623,7 +623,7 @@ public class DialogsItemAnimator extends SimpleItemAnimator { return (!mPendingAdditions.isEmpty() || !mPendingChanges.isEmpty() || !mPendingMoves.isEmpty() - || !mPendingRemovals.isEmpty() + || !mPendingChanges.isEmpty() || !mMoveAnimations.isEmpty() || !mRemoveAnimations.isEmpty() || !mAddAnimations.isEmpty() diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java index 66901f4bf..d899b47ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiPacksAlert.java @@ -849,9 +849,9 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N addButtonView.setVisibility(View.VISIBLE); removeButtonView.setVisibility(View.GONE); if (canInstallPacks.size() == 1) { - addButtonView.setText(LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("EmojiCountButton", canInstallPacks.get(0).documents.size()))); + addButtonView.setText(LocaleController.formatPluralString("AddManyEmojiCount", canInstallPacks.get(0).documents.size())); } else { - addButtonView.setText(LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("EmojiPackCount", canInstallPacks.size()))); + addButtonView.setText(LocaleController.formatPluralString("AddManyEmojiCount", canInstallPacks.size())); } addButtonView.setOnClickListener(ev -> { final int count = canInstallPacks.size(); @@ -881,9 +881,9 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N addButtonView.setVisibility(View.GONE); removeButtonView.setVisibility(View.VISIBLE); if (installedPacks.size() == 1) { - removeButtonView.setText(LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("EmojiCountButton", installedPacks.get(0).documents.size()))); + removeButtonView.setText(LocaleController.formatPluralString("RemoveManyEmojiCount", installedPacks.get(0).documents.size())); } else { - removeButtonView.setText(LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("EmojiPackCount", installedPacks.size()))); + removeButtonView.setText(LocaleController.formatPluralString("RemoveManyEmojiPacksCount", installedPacks.size())); } removeButtonView.setOnClickListener(ev -> { @@ -1500,8 +1500,8 @@ public class EmojiPacksAlert extends BottomSheet implements NotificationCenter.N NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); final boolean[] failed = new boolean[1]; for (int i = 0; i < data.length; ++i) { - TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSets.get(i), false, () -> { - if (!failed[0]) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSets.get(i), false, (set) -> { + if (set == null && !failed[0]) { failed[0] = true; AndroidUtilities.runOnUIThread(() -> { dismiss(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java index 4a6570aef..b45dc416c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiTabsStrip.java @@ -188,12 +188,14 @@ public class EmojiTabsStrip extends ScrollableHorizontalScrollView { protected void dispatchDraw(Canvas canvas) { for (Map.Entry entry : removingViews.entrySet()) { View view = entry.getKey(); - Rect bounds = entry.getValue(); - canvas.save(); - canvas.translate(bounds.left, bounds.top); - canvas.scale(view.getScaleX(), view.getScaleY(), bounds.width() / 2f, bounds.height() / 2f); - view.draw(canvas); - canvas.restore(); + if (view != null) { + Rect bounds = entry.getValue(); + canvas.save(); + canvas.translate(bounds.left, bounds.top); + canvas.scale(view.getScaleX(), view.getScaleY(), bounds.width() / 2f, bounds.height() / 2f); + view.draw(canvas); + canvas.restore(); + } } int selectFrom = (int) Math.floor(selectT), selectTo = (int) Math.ceil(selectT); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java index f34e6011d..df76b4c1b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -110,6 +110,7 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.ContextLinkCell; import org.telegram.ui.Cells.EmptyCell; @@ -1091,11 +1092,10 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } } - @Override protected void onDraw(Canvas canvas) { if (isPressed() && pressedProgress != 1f) { - pressedProgress += 16f / 100f; + pressedProgress += (float) Math.min(40, 1000f / AndroidUtilities.screenRefreshRate) / 100f; pressedProgress = Utilities.clamp(pressedProgress, 1f, 0); invalidate(); } @@ -3271,7 +3271,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific installFadeAway = ValueAnimator.ofFloat(addButtonView.getAlpha(), installed ? .6f : 1f); addButtonView.setAlpha(addButtonView.getAlpha()); installFadeAway.addUpdateListener(anm -> { - addButtonView.setAlpha((float) anm.getAnimatedValue()); + if (addButtonView != null) { + addButtonView.setAlpha((float) anm.getAnimatedValue()); + } }); installFadeAway.setDuration(450); installFadeAway.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); @@ -3300,8 +3302,12 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific lockAnimator = ValueAnimator.ofFloat(lockT, show ? 1f : 0f); lockAnimator.addUpdateListener(anm -> { lockT = (float) anm.getAnimatedValue(); - addButtonView.setAlpha(1f - lockT); - premiumButtonView.setAlpha(lockT); + if (addButtonView != null) { + addButtonView.setAlpha(1f - lockT); + } + if (premiumButtonView != null) { + premiumButtonView.setAlpha(lockT); + } }); lockAnimator.addListener(new AnimatorListenerAdapter() { @Override @@ -3328,7 +3334,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific private class EmojiPackHeader extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { RLottieImageView lockView; - TextView headerView; + SimpleTextView headerView; FrameLayout buttonsView; TextView addButtonView; @@ -3348,8 +3354,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific lockView.setColorFilter(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); addView(lockView, LayoutHelper.createFrameRelatively(20, 20, Gravity.START, 10, 15, 0, 0)); - headerView = new TextView(context); - headerView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + headerView = new SimpleTextView(context); + headerView.setTextSize(15); headerView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); headerView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); headerView.setOnClickListener(e -> { @@ -3357,7 +3363,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific openEmojiPackAlert(this.pack.set); } }); - addView(headerView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.START, 15, 15, 52, 0)); + headerView.setEllipsizeByGradient(true); + addView(headerView, LayoutHelper.createFrameRelatively(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.START, 15, 15, 0, 0)); buttonsView = new FrameLayout(context); buttonsView.setPadding(AndroidUtilities.dp(11), AndroidUtilities.dp(11), AndroidUtilities.dp(11), 0); @@ -3493,6 +3500,12 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific ); } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + headerView.setRightPadding(buttonsView.getWidth() + AndroidUtilities.dp(11)); + } + public void setStickerSet(EmojiPack pack, boolean divider) { if (pack == null) { return; @@ -6381,7 +6394,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific coloredCode = null; for (int a = 0; a < EmojiData.dataColored.length; a++) { int size = EmojiData.dataColored[a].length + 1; - if (position < count + size) { + if (position - count - 1 >= 0 && position < count + size) { coloredCode = code = EmojiData.dataColored[a][position - count - 1]; String color = Emoji.emojiColor.get(code); if (color != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java index e7619961b..f9d97fa97 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java @@ -42,6 +42,7 @@ public class FlickerLoadingView extends View { public final static int LIMIT_REACHED_LINKS = 22; public final static int REACTED_TYPE_WITH_EMOJI_HINT = 23; public static final int TOPIC_CELL_TYPE = 24; + public static final int DIALOG_CACHE_CONTROL = 25; private int gradientWidth; private LinearGradient gradient; @@ -63,8 +64,8 @@ public class FlickerLoadingView extends View { private int paddingTop; private int paddingLeft; - private String colorKey1 = Theme.key_windowBackgroundWhite; - private String colorKey2 = Theme.key_windowBackgroundGray; + private String colorKey1 = Theme.key_actionBarDefaultSubmenuBackground; + private String colorKey2 = Theme.key_listSelector; private String colorKey3; private int itemsCount = 1; private final Theme.ResourcesProvider resourcesProvider; @@ -553,8 +554,8 @@ public class FlickerLoadingView extends View { if (backgroundPaint == null) { backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - backgroundPaint.setColor(Theme.getColor(Theme.key_dialogBackground)); } + backgroundPaint.setColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); AndroidUtilities.rectTmp.set(x + AndroidUtilities.dp(4), AndroidUtilities.dp(4), x + itemWidth - AndroidUtilities.dp(4), getMeasuredHeight() - AndroidUtilities.dp(4)); canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(6), AndroidUtilities.dp(6), paint); @@ -651,7 +652,7 @@ public class FlickerLoadingView extends View { break; } } - } else if (viewType == LIMIT_REACHED_LINKS) { + } else if (viewType == LIMIT_REACHED_LINKS) { int k = 0; while (h <= getMeasuredHeight()) { int r = AndroidUtilities.dp(48) >> 1; @@ -665,6 +666,22 @@ public class FlickerLoadingView extends View { checkRtl(rectF); canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + h += getCellHeight(getMeasuredWidth()); + k++; + if (isSingleCell && k >= itemsCount) { + break; + } + } + } else if (viewType == DIALOG_CACHE_CONTROL) { + int k = 0; + while (h <= getMeasuredHeight()) { + int r = AndroidUtilities.dp(38) >> 1; + canvas.drawCircle(AndroidUtilities.dp(17) + r, h + AndroidUtilities.dp(6) + r, r, paint); + + rectF.set(AndroidUtilities.dp(76), h + AndroidUtilities.dp(21), AndroidUtilities.dp(220), h + AndroidUtilities.dp(29)); + // checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + h += getCellHeight(getMeasuredWidth()); k++; if (isSingleCell && k >= itemsCount) { @@ -788,6 +805,8 @@ public class FlickerLoadingView extends View { return AndroidUtilities.dp(58); case LIMIT_REACHED_LINKS: return AndroidUtilities.dp(60); + case DIALOG_CACHE_CONTROL: + return AndroidUtilities.dp(51); } return 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/ForumUtilities.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/ForumUtilities.java index 025ef1f15..7228a09f0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/ForumUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/ForumUtilities.java @@ -1,14 +1,26 @@ package org.telegram.ui.Components.Forum; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.ColorFilter; import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; +import android.text.style.DynamicDrawableSpan; import android.text.style.ImageSpan; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; import org.telegram.messenger.LocaleController; @@ -20,6 +32,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.INavigationLayout; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; @@ -35,13 +48,16 @@ public class ForumUtilities { public static void setTopicIcon(BackupImageView backupImageView, TLRPC.TL_forumTopic forumTopic) { - setTopicIcon(backupImageView, forumTopic, false); + setTopicIcon(backupImageView, forumTopic, false, null); } - public static void setTopicIcon(BackupImageView backupImageView, TLRPC.TL_forumTopic forumTopic, boolean largeIcon) { + public static void setTopicIcon(BackupImageView backupImageView, TLRPC.TL_forumTopic forumTopic, boolean largeIcon, Theme.ResourcesProvider resourcesProvider) { if (forumTopic == null || backupImageView == null) { return; } - if (forumTopic.icon_emoji_id != 0) { + if (forumTopic.id == 1) { + backupImageView.setAnimatedEmojiDrawable(null); + backupImageView.setImageDrawable(createGeneralTopicDrawable(backupImageView.getContext(), 0.75f, Theme.getColor(Theme.key_actionBarDefaultIcon, resourcesProvider))); + } else if (forumTopic.icon_emoji_id != 0) { backupImageView.setImageDrawable(null); if (backupImageView.animatedEmojiDrawable == null || forumTopic.icon_emoji_id != backupImageView.animatedEmojiDrawable.getDocumentId()) { backupImageView.setAnimatedEmojiDrawable(new AnimatedEmojiDrawable(largeIcon ? AnimatedEmojiDrawable.CACHE_TYPE_FORUM_TOPIC_LARGE : AnimatedEmojiDrawable.CACHE_TYPE_FORUM_TOPIC, UserConfig.selectedAccount, forumTopic.icon_emoji_id)); @@ -52,6 +68,75 @@ public class ForumUtilities { } } + public static Drawable createGeneralTopicDrawable(Context context, float scale, Theme.ResourcesProvider resourcesProvider) { + return createGeneralTopicDrawable(context, scale, Theme.getColor(Theme.key_chat_inMenu, resourcesProvider)); + } + + public static GeneralTopicDrawable createGeneralTopicDrawable(Context context, float scale, int color) { + if (context == null) { + return null; + } + return new GeneralTopicDrawable(context, scale, color); + } + + public static class GeneralTopicDrawable extends Drawable { + + Drawable icon; + float scale; + int color; + + public GeneralTopicDrawable(Context context) { + this(context, 1f); + } + + public GeneralTopicDrawable(Context context, float scale) { + this.icon = context.getResources().getDrawable(R.drawable.msg_filled_general).mutate(); + this.scale = scale; + } + + public GeneralTopicDrawable(Context context, float scale, int color) { + this.icon = context.getResources().getDrawable(R.drawable.msg_filled_general).mutate(); + this.scale = scale; + setColor(color); + } + + @Override + public void draw(@NonNull Canvas canvas) { + Rect bounds = getBounds(); + if (scale == 1) { + icon.setBounds(bounds); + } else { + icon.setBounds( + (int) (bounds.centerX() - bounds.width() / 2f * scale), + (int) (bounds.centerY() - bounds.height() / 2f * scale), + (int) (bounds.centerX() + bounds.width() / 2f * scale), + (int) (bounds.centerY() + bounds.height() / 2f * scale) + ); + } + icon.draw(canvas); + } + + public void setColor(int color) { + if (this.color != color) { + setColorFilter(new PorterDuffColorFilter(this.color = color, PorterDuff.Mode.MULTIPLY)); + } + } + + @Override + public void setAlpha(int i) { + icon.setAlpha(i); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + icon.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + } public static Drawable createTopicDrawable(TLRPC.TL_forumTopic topic) { return topic == null ? null : createTopicDrawable(topic.title, topic.icon_color); @@ -62,7 +147,7 @@ public class ForumUtilities { } public static Drawable createTopicDrawable(String text, int color) { - ForumBubbleDrawable forumBubbleDrawable = new ForumBubbleDrawable(color); + Drawable forumBubbleDrawable = new ForumBubbleDrawable(color); LetterDrawable letterDrawable = new LetterDrawable(null, LetterDrawable.STYLE_TOPIC_DRAWABLE); String title = text.trim().toUpperCase(); letterDrawable.setTitle(title.length() >= 1 ? title.substring(0, 1) : ""); @@ -122,11 +207,21 @@ public class ForumUtilities { return getTopicSpannedName(topic, paint, null); } - public static CharSequence getTopicSpannedName(TLRPC.ForumTopic topic, Paint paint, ForumBubbleDrawable[] drawableToSet) { + public static CharSequence getTopicSpannedName(TLRPC.ForumTopic topic, Paint paint, Drawable[] drawableToSet) { SpannableStringBuilder sb = new SpannableStringBuilder(); if (topic instanceof TLRPC.TL_forumTopic) { TLRPC.TL_forumTopic forumTopic = (TLRPC.TL_forumTopic) topic; - if (forumTopic.icon_emoji_id != 0) { + if (forumTopic.id == 1) { + try { + Drawable drawable = createGeneralTopicDrawable(ApplicationLoader.applicationContext, 1f, paint == null ? Theme.getColor(Theme.key_chat_inMenu) : paint.getColor()); + drawable.setBounds(0, 0, paint == null ? AndroidUtilities.dp(14) : (int) (paint.getTextSize()), paint == null ? AndroidUtilities.dp(14) : (int) (paint.getTextSize())); + sb.append(" "); + if (drawableToSet != null) { + drawableToSet[0] = drawable; + } + sb.setSpan(new ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } catch (Exception e) {} + } else if (forumTopic.icon_emoji_id != 0) { sb.append(" "); AnimatedEmojiSpan span; sb.setSpan(span = new AnimatedEmojiSpan(forumTopic.icon_emoji_id, .95f, paint == null ? null : paint.getFontMetricsInt()), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -136,7 +231,7 @@ public class ForumUtilities { sb.append(" "); Drawable drawable = ForumUtilities.createTopicDrawable(forumTopic); if (drawableToSet != null) { - drawableToSet[0] = (ForumBubbleDrawable) ((CombinedDrawable) drawable).getBackgroundDrawable(); + drawableToSet[0] = ((CombinedDrawable) drawable).getBackgroundDrawable(); } drawable.setBounds(0, 0, (int) (drawable.getIntrinsicWidth() * 0.65f), (int) (drawable.getIntrinsicHeight() * 0.65f)); if (drawable instanceof CombinedDrawable && ((CombinedDrawable) drawable).getIcon() instanceof LetterDrawable) { @@ -230,9 +325,9 @@ public class ForumUtilities { if (messageObject.getDialogId() > 0) { return; } - TLRPC.TL_forumTopic topic = MessagesController.getInstance(messageObject.currentAccount).getTopicsController().findTopic(-messageObject.getDialogId(), MessageObject.getTopicId(messageObject.messageOwner)); - if (topic != null && messageObject.topicIconDrawable[0] != null) { - messageObject.topicIconDrawable[0].setColor(topic.icon_color); + TLRPC.TL_forumTopic topic = MessagesController.getInstance(messageObject.currentAccount).getTopicsController().findTopic(-messageObject.getDialogId(), MessageObject.getTopicId(messageObject.messageOwner, true)); + if (topic != null && messageObject.topicIconDrawable[0] instanceof ForumBubbleDrawable) { + ((ForumBubbleDrawable) messageObject.topicIconDrawable[0]).setColor(topic.icon_color); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/MessageTopicButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/MessageTopicButton.java index 1a39f7177..ff22c012c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/MessageTopicButton.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Forum/MessageTopicButton.java @@ -41,7 +41,9 @@ public class MessageTopicButton { private int topicWidth; private int topicHeight; private Paint topicPaint; + private boolean isGeneralTopic; private Path topicPath; + private boolean topicArrowDrawableVisible; private Drawable topicArrowDrawable; private Drawable topicSelectorDrawable; private Drawable topicIconDrawable; @@ -53,6 +55,7 @@ public class MessageTopicButton { private AnimatedColor topicBackgroundColorAnimated, topicNameColorAnimated; private boolean topicIconWaiting; private StaticLayout topicNameLayout; + private float topicNameLeft; private RectF topicHitRect; private boolean topicPressed; private MessageObject lastMessageObject; @@ -72,12 +75,13 @@ public class MessageTopicButton { public int set(ChatMessageCell cell, MessageObject messageObject, TLRPC.TL_forumTopic topic, int maxWidth) { lastMessageObject = messageObject; + isGeneralTopic = topic == null || topic.id == 1; if (cell == null || messageObject == null) { return 0; } int iconsz = AndroidUtilities.dp(7) + (int) Theme.chat_topicTextPaint.getTextSize(); - float padleft = AndroidUtilities.dp(10) + iconsz; + float padleft = AndroidUtilities.dp(isGeneralTopic ? 6 : 10) + iconsz; float padright1 = Theme.chat_topicTextPaint.getTextSize() - AndroidUtilities.dp(8); float padright = AndroidUtilities.dp(5) + Theme.chat_topicTextPaint.getTextSize(); maxWidth -= padleft + padright; @@ -96,7 +100,10 @@ public class MessageTopicButton { topicPaint = new Paint(Paint.ANTI_ALIAS_FLAG); } int iconColor; - if (topic.icon_emoji_id != 0) { + if (topic.id == 1) { + iconColor = getThemedColor(messageObject != null && messageObject.isOutOwner() ? Theme.key_chat_outReactionButtonText : Theme.key_chat_inReactionButtonText); + topicIconDrawable = ForumUtilities.createGeneralTopicDrawable(context, .65f, iconColor); + } else if (topic.icon_emoji_id != 0) { if (!(topicIconDrawable instanceof AnimatedEmojiDrawable) || topic.icon_emoji_id != ((AnimatedEmojiDrawable) topicIconDrawable).getDocumentId()) { if (topicIconDrawable instanceof AnimatedEmojiDrawable) { ((AnimatedEmojiDrawable) topicIconDrawable).removeView(cell::invalidateOutbounds); @@ -133,14 +140,16 @@ public class MessageTopicButton { int arrowsz = Math.max(1, (int) Theme.chat_topicTextPaint.getTextSize() + AndroidUtilities.dp(0)); if (lineCount == 2) { topicHeight = AndroidUtilities.dp(15) + 2 * ((int) Theme.chat_topicTextPaint.getTextSize()); - float l1w = topicNameLayout.getLineWidth(0) - topicNameLayout.getLineLeft(0); - float l2w = topicNameLayout.getLineWidth(1) - topicNameLayout.getLineLeft(1); + float l1w = Math.abs(topicNameLayout.getLineRight(0) - topicNameLayout.getLineLeft(0)); + float l2w = Math.abs(topicNameLayout.getLineRight(1) - topicNameLayout.getLineLeft(1)); + topicNameLeft = Math.min(topicNameLayout.getLineLeft(0), topicNameLayout.getLineLeft(1)); + boolean isRTL = topicNameLeft != 0; textWidth = Math.max(l1w, l2w); float r = (AndroidUtilities.dp(11) + (int) Theme.chat_topicTextPaint.getTextSize()) / 1.5f; boolean same = false; AndroidUtilities.rectTmp.set(0, 0, R, R); topicPath.arcTo(AndroidUtilities.rectTmp, 180, 90); - if (Math.abs(l1w - l2w) <= (padright - padright1)) { + if (Math.abs(l1w - l2w) <= (padright - padright1) || isRTL) { l1w = Math.max(l1w, l2w + (padright - padright1)); l2w = Math.max(l2w, l1w - (padright - padright1)); same = true; @@ -163,6 +172,7 @@ public class MessageTopicButton { topicPath.arcTo(AndroidUtilities.rectTmp, 270, 90); } } + topicArrowDrawableVisible = !isRTL; topicArrowDrawable.setBounds( (int) (padleft + padright + AndroidUtilities.dp(-4) + l2w - arrowsz), (int) ((topicHeight - AndroidUtilities.dp(11) - Theme.chat_topicTextPaint.getTextSize() + topicHeight) / 2f - arrowsz / 2), @@ -176,8 +186,10 @@ public class MessageTopicButton { topicPath.close(); } else if (lineCount == 1) { topicHeight = AndroidUtilities.dp(11) + (int) Theme.chat_topicTextPaint.getTextSize(); - textWidth = topicNameLayout.getLineWidth(0) - topicNameLayout.getLineLeft(0); + textWidth = Math.abs(topicNameLayout.getLineRight(0) - topicNameLayout.getLineLeft(0)); + topicNameLeft = topicNameLayout.getLineLeft(0); AndroidUtilities.rectTmp.set(0, 0, padleft + padright + textWidth, topicHeight); + topicArrowDrawableVisible = true; topicArrowDrawable.setBounds( (int) (padleft + padright + AndroidUtilities.dp(-4) + textWidth - arrowsz), (int) (topicHeight / 2f - arrowsz / 2), @@ -185,12 +197,27 @@ public class MessageTopicButton { (int) (topicHeight / 2f + arrowsz / 2) ); topicPath.addRoundRect(AndroidUtilities.rectTmp, R, R, Path.Direction.CW); + } else if (lineCount == 0) { + topicHeight = AndroidUtilities.dp(11) + (int) Theme.chat_topicTextPaint.getTextSize(); + textWidth = 0; + topicNameLeft = 0; + topicArrowDrawableVisible = true; + topicArrowDrawable.setBounds( + (int) (padleft + padright + AndroidUtilities.dp(-4) + textWidth - arrowsz), + (int) (topicHeight / 2f - arrowsz / 2), + (int) (padleft + padright + AndroidUtilities.dp(-4) + textWidth), + (int) (topicHeight / 2f + arrowsz / 2) + ); + AndroidUtilities.rectTmp.set(0, 0, padleft + padright + textWidth, topicHeight); + topicPath.addRoundRect(AndroidUtilities.rectTmp, R, R, Path.Direction.CW); } topicWidth = (int) (padleft + padright -AndroidUtilities.dp(1) + textWidth); int occupingHeight = 0; - if (!messageObject.isAnyKindOfSticker() && messageObject.type != MessageObject.TYPE_ROUND_VIDEO) { + if (!messageObject.isAnyKindOfSticker() && messageObject.type != MessageObject.TYPE_ROUND_VIDEO || messageObject.type == MessageObject.TYPE_EMOJIS) { occupingHeight += AndroidUtilities.dp(6) + topicHeight; - if (messageObject.type != MessageObject.TYPE_TEXT) { + if (messageObject.type == MessageObject.TYPE_EMOJIS) { + occupingHeight += AndroidUtilities.dp(16); + } else if (messageObject.type != MessageObject.TYPE_TEXT) { occupingHeight += AndroidUtilities.dp(9); } } @@ -380,7 +407,7 @@ public class MessageTopicButton { int nameColor = topicNameColor; if (topicNameLayout != null) { canvas.save(); - canvas.translate(AndroidUtilities.dp(17) + Theme.chat_topicTextPaint.getTextSize(), AndroidUtilities.dp(4.5f)); + canvas.translate(AndroidUtilities.dp(isGeneralTopic ? 13 : 17) + Theme.chat_topicTextPaint.getTextSize() - topicNameLeft, AndroidUtilities.dp(4.5f)); if (topicNameColorAnimated != null) { Theme.chat_topicTextPaint.setColor(nameColor = topicNameColorAnimated.set(topicNameColor)); } else { @@ -390,7 +417,7 @@ public class MessageTopicButton { topicNameLayout.draw(canvas); canvas.restore(); } - if (topicArrowDrawable != null) { + if (topicArrowDrawable != null && topicArrowDrawableVisible) { int arrowColor = ColorUtils.setAlphaComponent(nameColor, 140); if (topicArrowColor != arrowColor) { topicArrowDrawable.setColorFilter(new PorterDuffColorFilter(topicArrowColor = arrowColor, PorterDuff.Mode.MULTIPLY)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java index 544cea424..c4e684681 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java @@ -24,18 +24,20 @@ import android.text.TextUtils; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; +import androidx.core.graphics.ColorUtils; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; +import org.telegram.messenger.Emoji; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; -import androidx.core.graphics.ColorUtils; - public class GroupCreateSpan extends View { private long uid; @@ -76,12 +78,12 @@ public class GroupCreateSpan extends View { Object imageParent; avatarDrawable = new AvatarDrawable(); - avatarDrawable.setTextSize(AndroidUtilities.dp(12)); + avatarDrawable.setTextSize(AndroidUtilities.dp(20)); if (object instanceof String) { imageLocation = null; imageParent = null; String str = (String) object; - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); switch (str) { case "contacts": avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_FILTER_CONTACTS); @@ -130,13 +132,13 @@ public class GroupCreateSpan extends View { uid = user.id; if (UserObject.isReplyUser(user)) { firstName = LocaleController.getString("RepliesTitle", R.string.RepliesTitle); - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); imageLocation = null; imageParent = null; } else if (UserObject.isUserSelf(user)) { firstName = LocaleController.getString("SavedMessages", R.string.SavedMessages); - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); imageLocation = null; imageParent = null; @@ -178,7 +180,10 @@ public class GroupCreateSpan extends View { maxNameWidth = (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(32 + 18 + 57 * 2)) / 2; } - CharSequence name = TextUtils.ellipsize(firstName.replace('\n', ' '), textPaint, maxNameWidth, TextUtils.TruncateAt.END); + firstName = firstName.replace('\n', ' '); + CharSequence name = firstName; + name = Emoji.replaceEmoji(name, textPaint.getFontMetricsInt(), AndroidUtilities.dp(12), false); + name = TextUtils.ellipsize(name, textPaint, maxNameWidth, TextUtils.TruncateAt.END); nameLayout = new StaticLayout(name, textPaint, 1000, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); if (nameLayout.getLineCount() > 0) { textWidth = (int) Math.ceil(nameLayout.getLineWidth(0)); @@ -186,6 +191,8 @@ public class GroupCreateSpan extends View { } imageReceiver.setImage(imageLocation, "50_50", avatarDrawable, 0, null, imageParent, 1); updateColors(); + + NotificationCenter.listenEmojiLoading(this); } public void updateColors() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java index 5cbcfe1ee..320967f2d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java @@ -298,11 +298,7 @@ public class InviteMembersBottomSheet extends UsersAlertBase implements Notifica dismiss(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(activity); - if (selectedContacts.size() == 1) { - builder.setTitle(LocaleController.getString("AddOneMemberAlertTitle", R.string.AddOneMemberAlertTitle)); - } else { - builder.setTitle(LocaleController.formatString("AddMembersAlertTitle", R.string.AddMembersAlertTitle, LocaleController.formatPluralString("Members", selectedContacts.size()))); - } + builder.setTitle(LocaleController.formatPluralString("AddManyMembersAlertTitle", selectedContacts.size())); StringBuilder stringBuilder = new StringBuilder(); for (int a = 0; a < selectedContacts.size(); a++) { long uid = selectedContacts.keyAt(a); @@ -317,7 +313,7 @@ public class InviteMembersBottomSheet extends UsersAlertBase implements Notifica } TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(chatId); if (selectedContacts.size() > 5) { - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, LocaleController.formatPluralString("Members", selectedContacts.size()), chat.title))); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatPluralString("AddManyMembersAlertNamesText", selectedContacts.size(), chat.title))); String countString = String.format("%d", selectedContacts.size()); int index = TextUtils.indexOf(spannableStringBuilder, countString); if (index >= 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkPath.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkPath.java index 6be71cf69..9490fcfa1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkPath.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkPath.java @@ -10,20 +10,17 @@ package org.telegram.ui.Components; import android.graphics.CornerPathEffect; import android.graphics.Path; -import android.graphics.RectF; import android.os.Build; import android.text.Layout; import org.telegram.messenger.AndroidUtilities; -import java.util.ArrayList; - public class LinkPath extends Path { private Layout currentLayout; private int currentLine; private float lastTop = -1; - private float heightOffset; + private float xOffset, yOffset; private boolean useRoundRect; private boolean allowReset = true; private int baselineShift; @@ -52,10 +49,23 @@ public class LinkPath extends Path { } public void setCurrentLayout(Layout layout, int start, float yOffset) { + setCurrentLayout(layout, start, 0, yOffset); + } + + public void setCurrentLayout(Layout layout, int start, float xOffset, float yOffset) { + if (layout == null) { + currentLayout = null; + currentLine = 0; + lastTop = -1; + this.xOffset = xOffset; + this.yOffset = yOffset; + return; + } currentLayout = layout; currentLine = layout.getLineForOffset(start); lastTop = -1; - heightOffset = yOffset; + this.xOffset = xOffset; + this.yOffset = yOffset; if (Build.VERSION.SDK_INT >= 28) { int lineCount = layout.getLineCount(); if (lineCount > 0) { @@ -82,48 +92,58 @@ public class LinkPath extends Path { @Override public void addRect(float left, float top, float right, float bottom, Direction dir) { - top += heightOffset; - bottom += heightOffset; - if (lastTop == -1) { - lastTop = top; - } else if (lastTop != top) { - lastTop = top; - currentLine++; - } - float lineRight = currentLayout.getLineRight(currentLine); - float lineLeft = currentLayout.getLineLeft(currentLine); - if (left >= lineRight || left <= lineLeft && right <= lineLeft) { + if (currentLayout == null) { + super.addRect(left, top, right, bottom, dir); return; } - if (right > lineRight) { - right = lineRight; - } - if (left < lineLeft) { - left = lineLeft; - } - float y = top; - float y2; - if (Build.VERSION.SDK_INT >= 28) { - y2 = bottom; - if (bottom - top > lineHeight) { - y2 = heightOffset + (bottom != currentLayout.getHeight() ? (currentLayout.getLineBottom(currentLine) - currentLayout.getSpacingAdd()) : 0); + try { + top += yOffset; + bottom += yOffset; + if (lastTop == -1) { + lastTop = top; + } else if (lastTop != top) { + lastTop = top; + currentLine++; } - } else { - y2 = bottom - (bottom != currentLayout.getHeight() ? currentLayout.getSpacingAdd() : 0); - } - if (baselineShift < 0) { - y2 += baselineShift; - } else if (baselineShift > 0) { - y += baselineShift; - } - if (useRoundRect) { + float lineRight = currentLayout.getLineRight(currentLine); + float lineLeft = currentLayout.getLineLeft(currentLine); + if (left >= lineRight || left <= lineLeft && right <= lineLeft) { + return; + } + if (right > lineRight) { + right = lineRight; + } + if (left < lineLeft) { + left = lineLeft; + } + left += xOffset; + right += xOffset; + float y = top; + float y2; + if (Build.VERSION.SDK_INT >= 28) { + y2 = bottom; + if (bottom - top > lineHeight) { + y2 = yOffset + (bottom != currentLayout.getHeight() ? (currentLayout.getLineBottom(currentLine) - currentLayout.getSpacingAdd()) : 0); + } + } else { + y2 = bottom - (bottom != currentLayout.getHeight() ? currentLayout.getSpacingAdd() : 0); + } + if (baselineShift < 0) { + y2 += baselineShift; + } else if (baselineShift > 0) { + y += baselineShift; + } + if (useRoundRect) { // final CharSequence text = currentLayout.getText(); // int startOffset = currentLayout.getOffsetForHorizontal(currentLine, left), endOffset = currentLayout.getOffsetForHorizontal(currentLine, right) + 1; - boolean startsWithWhitespace = false; // startOffset >= 0 && startOffset < text.length() && text.charAt(startOffset) == ' '; - boolean endsWithWhitespace = false; // endOffset >= 0 && endOffset < text.length() && text.charAt(endOffset) == ' '; - super.addRect(left - (startsWithWhitespace ? 0 : getRadius() / 2f), y, right + (endsWithWhitespace ? 0 : getRadius() / 2f), y2, dir); - } else { - super.addRect(left, y, right, y2, dir); + boolean startsWithWhitespace = false; // startOffset >= 0 && startOffset < text.length() && text.charAt(startOffset) == ' '; + boolean endsWithWhitespace = false; // endOffset >= 0 && endOffset < text.length() && text.charAt(endOffset) == ' '; + super.addRect(left - (startsWithWhitespace ? 0 : getRadius() / 2f), y, right + (endsWithWhitespace ? 0 : getRadius() / 2f), y2, dir); + } else { + super.addRect(left, y, right, y2, dir); + } + } catch (Exception e) { + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java index 8bfd2681d..23906ebf1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java @@ -2,6 +2,7 @@ package org.telegram.ui.Components; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.CornerPathEffect; import android.graphics.Paint; import android.graphics.Path; @@ -18,7 +19,10 @@ import android.view.View; import android.view.ViewConfiguration; import android.widget.TextView; +import androidx.core.graphics.ColorUtils; + import org.telegram.messenger.AndroidUtilities; +import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ArticleViewer; @@ -26,6 +30,8 @@ import java.util.ArrayList; public class LinkSpanDrawable { + private static final int CORNER_RADIUS_DP = 4; + private int cornerRadius; private int color; private Paint mSelectionPaint, mRipplePaint; @@ -74,11 +80,11 @@ public class LinkSpanDrawable { this.color = color; if (mSelectionPaint != null) { mSelectionPaint.setColor(color); - mSelectionAlpha = mSelectionPaint.getAlpha(); + mSelectionAlpha = Color.alpha(color); } if (mRipplePaint != null) { mRipplePaint.setColor(color); - mRippleAlpha = mRipplePaint.getAlpha(); + mRippleAlpha = Color.alpha(color); } } @@ -113,20 +119,23 @@ public class LinkSpanDrawable { } public boolean draw(Canvas canvas) { - boolean cornerRadiusUpdate = cornerRadius != AndroidUtilities.dp(4); - if (mSelectionPaint == null || cornerRadiusUpdate) { + boolean cornerRadiusUpdate = cornerRadius != AndroidUtilities.dp(CORNER_RADIUS_DP); + if (mSelectionPaint == null) { mSelectionPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mSelectionPaint.setStyle(Paint.Style.FILL_AND_STROKE); mSelectionPaint.setColor(color); - mSelectionAlpha = mSelectionPaint.getAlpha(); - mSelectionPaint.setPathEffect(new CornerPathEffect(cornerRadius = AndroidUtilities.dp(4))); + mSelectionAlpha = Color.alpha(color); } - if (mRipplePaint == null || cornerRadiusUpdate) { + if (mRipplePaint == null) { mRipplePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mRipplePaint.setStyle(Paint.Style.FILL_AND_STROKE); mRipplePaint.setColor(color); - mRippleAlpha = mRipplePaint.getAlpha(); - mRipplePaint.setPathEffect(new CornerPathEffect(cornerRadius = AndroidUtilities.dp(4))); + mRippleAlpha = Color.alpha(color); + } + if (cornerRadiusUpdate) { + cornerRadius = AndroidUtilities.dp(CORNER_RADIUS_DP); + mSelectionPaint.setPathEffect(new CornerPathEffect(cornerRadius)); + mRipplePaint.setPathEffect(new CornerPathEffect(cornerRadius)); } if (mBounds == null && mPathesCount > 0) { mPathes.get(0).computeBounds(AndroidUtilities.rectTmp, false); @@ -376,6 +385,8 @@ public class LinkSpanDrawable { private OnLinkPress onLongPressListener; private boolean disablePaddingsOffset; + private boolean disablePaddingsOffsetX; + private boolean disablePaddingsOffsetY; public LinksTextView(Context context) { this(context, null); @@ -399,6 +410,14 @@ public class LinkSpanDrawable { this.disablePaddingsOffset = disablePaddingsOffset; } + public void setDisablePaddingsOffsetX(boolean disablePaddingsOffsetX) { + this.disablePaddingsOffsetX = disablePaddingsOffsetX; + } + + public void setDisablePaddingsOffsetY(boolean disablePaddingsOffsetY) { + this.disablePaddingsOffsetY = disablePaddingsOffsetY; + } + public void setOnLinkPressListener(OnLinkPress listener) { onPressListener = listener; } @@ -417,7 +436,6 @@ public class LinkSpanDrawable { final int line = textLayout.getLineForVertical(y); final int off = textLayout.getOffsetForHorizontal(line, x); final float left = getLayout().getLineLeft(line); - ClickableSpan span = null; if (left <= x && left + textLayout.getLineWidth(line) >= x && y >= 0 && y <= textLayout.getHeight()) { Spannable buffer = new SpannableString(textLayout.getText()); ClickableSpan[] spans = buffer.getSpans(off, off, ClickableSpan.class); @@ -480,7 +498,7 @@ public class LinkSpanDrawable { if (!isCustomLinkCollector) { canvas.save(); if (!disablePaddingsOffset) { - canvas.translate(getPaddingLeft(), getPaddingTop()); + canvas.translate(disablePaddingsOffsetX ? 0 : getPaddingLeft(), disablePaddingsOffsetY ? 0 : getPaddingTop()); } if (links.draw(canvas)) { invalidate(); @@ -490,4 +508,80 @@ public class LinkSpanDrawable { super.onDraw(canvas); } } + + public static class ClickableSmallTextView extends SimpleTextView { + private Theme.ResourcesProvider resourcesProvider; + public ClickableSmallTextView(Context context) { + this(context, null); + } + + public ClickableSmallTextView(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + } + + private int getLinkColor() { + return ColorUtils.setAlphaComponent(getTextColor(), (int) (Color.alpha(getTextColor()) * .1175f)); + } + + private LinkCollector links = new LinkCollector(this); + private Paint linkBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + @Override + protected void onDraw(Canvas canvas) { + if (isClickable()) { + AndroidUtilities.rectTmp.set(0, 0, getPaddingLeft() + getTextWidth() + getPaddingRight(), getHeight()); + linkBackgroundPaint.setColor(getLinkColor()); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(CORNER_RADIUS_DP), AndroidUtilities.dp(CORNER_RADIUS_DP), linkBackgroundPaint); + } + + super.onDraw(canvas); + + if (isClickable() && links.draw(canvas)) { + invalidate(); + } + } + + private LinkSpanDrawable pressedLink; + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isClickable()) { + return super.onTouchEvent(event); + } + if (links != null) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + final LinkSpanDrawable link = new LinkSpanDrawable(null, resourcesProvider, event.getX(), event.getY()); + link.setColor(getLinkColor()); + pressedLink = link; + links.addLink(pressedLink); + LinkPath path = pressedLink.obtainNewPath(); + path.setCurrentLayout(null, 0, 0, 0); + path.addRect(0, 0, getPaddingLeft() + getTextWidth() + getPaddingRight(), getHeight(), Path.Direction.CW); + AndroidUtilities.runOnUIThread(() -> { + if (pressedLink == link) { + performLongClick(); + pressedLink = null; + links.clear(); + } + }, ViewConfiguration.getLongPressTimeout()); + return true; + } + if (event.getAction() == MotionEvent.ACTION_UP) { + links.clear(); + if (pressedLink != null) { + performClick(); + } + pressedLink = null; + return true; + } + if (event.getAction() == MotionEvent.ACTION_CANCEL) { + links.clear(); + pressedLink = null; + return true; + } + } + return pressedLink != null || super.onTouchEvent(event); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingDrawable.java index e4eb205db..82ef6b8a3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingDrawable.java @@ -21,16 +21,23 @@ import org.telegram.ui.ActionBar.Theme; public class LoadingDrawable extends Drawable { - private Theme.ResourcesProvider resourcesProvider; + public Theme.ResourcesProvider resourcesProvider; public LoadingDrawable(Theme.ResourcesProvider resourcesProvider) { this.resourcesProvider = resourcesProvider; } + public LoadingDrawable(String colorKey1, String colorKey2, Theme.ResourcesProvider resourcesProvider) { + this.colorKey1 = colorKey1; + this.colorKey2 = colorKey2; + this.resourcesProvider = resourcesProvider; + } + private long start = -1; private LinearGradient gradient; private int gradientColor1, gradientColor2; public String colorKey1 = Theme.key_dialogBackground; public String colorKey2 = Theme.key_dialogBackgroundGray; + public Integer color1, color2; private int gradientWidth; public Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); @@ -48,8 +55,8 @@ public class LoadingDrawable extends Drawable { return; } int gwidth = Math.min(AndroidUtilities.dp(400), bounds.width()); - int color1 = Theme.getColor(colorKey1, resourcesProvider); - int color2 = Theme.getColor(colorKey2, resourcesProvider); + int color1 = this.color1 != null ? this.color1 : Theme.getColor(colorKey1, resourcesProvider); + int color2 = this.color2 != null ? this.color2 : Theme.getColor(colorKey2, resourcesProvider); if (gradient == null || gwidth != gradientWidth || color1 != gradientColor1 || color2 != gradientColor2) { gradientWidth = gwidth; gradientColor1 = color1; @@ -62,7 +69,7 @@ public class LoadingDrawable extends Drawable { if (start < 0) { start = now; } - float offset = gradientWidth - (((now - start) / 1000f * gradientWidth) % gradientWidth); + float offset = gradientWidth - (((now - start) / 4000f * AndroidUtilities.dp(2) * gradientWidth) % gradientWidth); canvas.save(); canvas.clipRect(bounds); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingSpan.java index 8a14320f9..84a7d60f6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingSpan.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.telegram.messenger.AndroidUtilities; +import org.telegram.ui.ActionBar.Theme; public class LoadingSpan extends ReplacementSpan { @@ -24,6 +25,26 @@ public class LoadingSpan extends ReplacementSpan { this.drawable.paint.setPathEffect(new CornerPathEffect(AndroidUtilities.dp(4))); } + public void setColorKeys(String colorKey1, String colorKey2) { + this.drawable.colorKey1 = colorKey1; + this.drawable.colorKey2 = colorKey2; + } + + public void setColorKeys(String colorKey1, String colorKey2, Theme.ResourcesProvider resourcesProvider) { + this.drawable.resourcesProvider = resourcesProvider; + this.drawable.colorKey1 = colorKey1; + this.drawable.colorKey2 = colorKey2; + } + + public void setColors(int color1, int color2) { + this.drawable.color1 = color1; + this.drawable.color2 = color2; + } + + public void setView(View view) { + this.view = view; + } + @Override public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) { return size; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java index e805ff2a4..7d268cf90 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.PorterDuff; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; @@ -78,6 +79,7 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha } } }); + actionBar.setColorFilterMode(PorterDuff.Mode.SRC_IN); FrameLayout avatarContainer = new FrameLayout(context); SizeNotifierFrameLayout fragmentView = new SizeNotifierFrameLayout(context) { @@ -256,7 +258,7 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha if (user.self) { nameTextView.setText(LocaleController.getString("SavedMessages", R.string.SavedMessages)); avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); - avatarDrawable.setSmallSize(true); + avatarDrawable.setScaleSize(.8f); } else { nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name)); avatarDrawable.setInfo(user); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java index 8bc11e338..e68fc3409 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java @@ -73,8 +73,11 @@ public class NumberPicker extends LinearLayout { private int mSelectorTextGapHeight; private String[] mDisplayedValues; private int mMinValue; + private boolean mMinValueSet; private int mMaxValue; + private boolean mMaxValueSet; private int mValue; + private int mFantomValue; private OnValueChangeListener mOnValueChangeListener; private OnScrollListener mOnScrollListener; private Formatter mFormatter; @@ -96,7 +99,7 @@ public class NumberPicker extends LinearLayout { private int mTouchSlop; private int mMinimumFlingVelocity; private int mMaximumFlingVelocity; - private boolean mWrapSelectorWheel; + private boolean mWrapSelectorWheel, mWrapSelectorWheelSetting; private int mSolidColor; private Paint mSelectionDivider; private int mSelectionDividerHeight; @@ -140,6 +143,10 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); } + public int getItemsCount() { + return SELECTOR_WHEEL_ITEM_COUNT; + } + private void init() { mSolidColor = 0; mSelectionDivider = new Paint(); @@ -625,10 +632,8 @@ public class NumberPicker extends LinearLayout { } public void setWrapSelectorWheel(boolean wrapSelectorWheel) { - final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length; - if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) { - mWrapSelectorWheel = wrapSelectorWheel; - } + final boolean wrappingAllowed = !(mMaxValueSet && mMinValueSet) || (mMaxValue - mMinValue) >= mSelectorIndices.length; + mWrapSelectorWheel = wrappingAllowed && (mWrapSelectorWheelSetting = wrapSelectorWheel); } public void setOnLongPressUpdateInterval(long intervalMillis) { @@ -651,11 +656,17 @@ public class NumberPicker extends LinearLayout { throw new IllegalArgumentException("minValue must be >= 0"); } mMinValue = minValue; + mMinValueSet = true; if (mMinValue > mValue) { - mValue = mMinValue; + if (mMinValue <= mFantomValue) { + mValue = mFantomValue; + } else { + mValue = mMinValue; + } + } + if (mWrapSelectorWheelSetting && mMaxValueSet) { + mWrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; } - boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; - setWrapSelectorWheel(wrapSelectorWheel); initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); @@ -674,11 +685,17 @@ public class NumberPicker extends LinearLayout { throw new IllegalArgumentException("maxValue must be >= 0"); } mMaxValue = maxValue; + mMaxValueSet = true; if (mMaxValue < mValue) { - mValue = mMaxValue; + if (mMaxValue >= mFantomValue) { + mValue = mFantomValue; + } else { + mValue = mMaxValue; + } + } + if (mWrapSelectorWheelSetting && mMinValueSet) { + mWrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; } - boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length; - setWrapSelectorWheel(wrapSelectorWheel); initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); @@ -856,7 +873,7 @@ public class NumberPicker extends LinearLayout { current = Math.min(current, mMaxValue); } int previous = mValue; - mValue = current; + mValue = mFantomValue = current; updateInputTextView(); if (Math.abs(previous - current) > 0.9f && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { try { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java index 48f689f00..f422a0b38 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java @@ -92,9 +92,9 @@ public class OutlineTextContainerView extends FrameLayout { } public void updateColor() { - int textSelectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteHintText), Theme.getColor(Theme.key_windowBackgroundWhiteValueText), selectionProgress); + int textSelectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteHintText), Theme.getColor(Theme.key_windowBackgroundWhiteValueText), forceUseCenter ? 0f : selectionProgress); textPaint.setColor(ColorUtils.blendARGB(textSelectionColor, Theme.getColor(Theme.key_dialogTextRed), errorProgress)); - int selectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteInputField), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), selectionProgress); + int selectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteInputField), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), forceUseCenter ? 0f : selectionProgress); setColor(ColorUtils.blendARGB(selectionColor, Theme.getColor(Theme.key_dialogTextRed), errorProgress)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerWebView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerWebView.java index 437ed7ccc..d765dda31 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerWebView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerWebView.java @@ -1,5 +1,10 @@ package org.telegram.ui.Components; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; @@ -9,6 +14,7 @@ import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.provider.Settings; +import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -21,6 +27,8 @@ import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -32,11 +40,14 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BringAppForegroundService; import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.PhotoViewer; import java.io.ByteArrayOutputStream; @@ -56,11 +67,19 @@ public class PhotoViewerWebView extends FrameLayout { YT_PLAYING = 1, YT_PAUSED = 2, YT_BUFFERING = 3; + private final static int YT_ERR_INVALID = 2, + YT_ERR_HTML = 5, + YT_ERR_NOT_FOUND = 100, + YT_ERR_NOT_AVAILABLE_IN_APP = 101, + YT_ERR_NOT_AVAILABLE_IN_APP_ALT = 150; private int currentAccount = UserConfig.selectedAccount; private PhotoViewer photoViewer; + private LinearLayout errorLayout; + private TextView errorMessage; + private TextView errorButton; private WebView webView; private View progressBarBlackBackground; private RadialProgressView progressBar; @@ -75,6 +94,7 @@ public class PhotoViewerWebView extends FrameLayout { private float playbackSpeed; private boolean setPlaybackSpeed; + private boolean hasError; private boolean isPlaying; private int videoDuration; private int currentPosition; @@ -110,6 +130,59 @@ public class PhotoViewerWebView extends FrameLayout { }); } + @JavascriptInterface + public void onPlayerError(String error) { + int errorInt = Integer.parseInt(error); + AndroidUtilities.runOnUIThread(()->{ + errorButton.setVisibility(GONE); + webView.setVisibility(GONE); + + if (errorLayout.getVisibility() == View.GONE) { + errorLayout.setVisibility(VISIBLE); + errorLayout.animate().cancel(); + errorLayout.animate().alpha(1f).setDuration(150).start(); + } + + if (progressBar.getAlpha() == 1f) { + progressBar.animate().cancel(); + progressBar.animate().alpha(0f).setDuration(150).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + progressBar.setVisibility(GONE); + } + }); + } + if (progressBarBlackBackground.getAlpha() == 1f) { + progressBarBlackBackground.animate().cancel(); + progressBarBlackBackground.animate().alpha(0f).setDuration(150).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + progressBarBlackBackground.setVisibility(GONE); + } + }); + } + + switch (errorInt) { + case YT_ERR_INVALID: + errorMessage.setText(LocaleController.getString(R.string.YouTubeVideoErrorInvalid)); + break; + case YT_ERR_HTML: + errorMessage.setText(LocaleController.getString(R.string.YouTubeVideoErrorHTML)); + break; + case YT_ERR_NOT_FOUND: + errorMessage.setText(LocaleController.getString(R.string.YouTubeVideoErrorNotFound)); + break; + case YT_ERR_NOT_AVAILABLE_IN_APP: + case YT_ERR_NOT_AVAILABLE_IN_APP_ALT: + errorMessage.setText(LocaleController.getString(R.string.YouTubeVideoErrorNotAvailableInApp)); + errorButton.setText(LocaleController.getString(R.string.YouTubeVideoErrorOpenExternal)); + errorButton.setVisibility(VISIBLE); + errorButton.setOnClickListener(v -> v.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(currentWebpage.url)))); + break; + } + }); + } + @JavascriptInterface public void onPlayerStateChange(String state) { int stateInt = Integer.parseInt(state); @@ -295,6 +368,26 @@ public class PhotoViewerWebView extends FrameLayout { addView(webView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); + errorLayout = new LinearLayout(context); + errorLayout.setOrientation(LinearLayout.VERTICAL); + errorLayout.setGravity(Gravity.CENTER); + errorLayout.setVisibility(GONE); + addView(errorLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + + errorMessage = new TextView(context); + errorMessage.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + errorMessage.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + errorMessage.setGravity(Gravity.CENTER); + errorLayout.addView(errorMessage, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL)); + + errorButton = new TextView(context); + errorButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + errorButton.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText)); + errorButton.setPadding(AndroidUtilities.dp(12), AndroidUtilities.dp(8), AndroidUtilities.dp(12), AndroidUtilities.dp(8)); + errorButton.setBackground(Theme.AdaptiveRipple.rect(Theme.key_windowBackgroundWhiteBlueText, 12)); + errorButton.setVisibility(GONE); + errorLayout.addView(errorButton, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 8, 0, 0)); + progressBarBlackBackground = new View(context) { @Override protected void onDraw(Canvas canvas) { @@ -311,6 +404,10 @@ public class PhotoViewerWebView extends FrameLayout { addView(progressBar, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); } + public boolean hasError() { + return hasError; + } + public boolean hasYoutubeStoryboards() { return !youtubeStoryboards.isEmpty(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PullForegroundDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PullForegroundDrawable.java index 6e254f98e..6deaefbdc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PullForegroundDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PullForegroundDrawable.java @@ -7,13 +7,13 @@ import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; -import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.RectF; -import android.graphics.Shader; import android.graphics.drawable.Drawable; +import android.text.Layout; +import android.text.StaticLayout; import android.text.TextPaint; import android.view.View; import android.view.ViewConfiguration; @@ -25,7 +25,9 @@ import androidx.core.graphics.ColorUtils; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.R; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.TopicsFragment; public class PullForegroundDrawable { @@ -46,8 +48,10 @@ public class PullForegroundDrawable { private final Paint paintBackgroundAccent = new Paint(Paint.ANTI_ALIAS_FLAG); private final Paint backgroundPaint = new Paint(); private final RectF rectF = new RectF(); - private final Paint tooltipTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + private final TextPaint tooltipTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); private final ArrowDrawable arrowDrawable = new ArrowDrawable(); + private int generalTopicDrawableColor; + private Drawable generalTopicDrawable; private final Path circleClipPath = new Path(); private float textSwappingProgress = 1f; @@ -84,8 +88,10 @@ public class PullForegroundDrawable { public float outImageSize; public float outOverScroll; - private String pullTooltip; - private String releaseTooltip; + private StaticLayout pullTooltipLayout; + private float pullTooltipLayoutWidth; + private StaticLayout releaseTooltipLayout; + private float releaseTooltipLayoutWidth; private boolean willDraw; private boolean isOut; @@ -106,16 +112,22 @@ public class PullForegroundDrawable { } }; - public PullForegroundDrawable(String pullText, String releaseText) { + public PullForegroundDrawable(CharSequence pullText, CharSequence releaseText) { tooltipTextPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - tooltipTextPaint.setTextAlign(Paint.Align.CENTER); +// tooltipTextPaint.setTextAlign(Paint.Align.CENTER); tooltipTextPaint.setTextSize(AndroidUtilities.dp(16)); final ViewConfiguration vc = ViewConfiguration.get(ApplicationLoader.applicationContext); touchSlop = vc.getScaledTouchSlop(); - pullTooltip = pullText; - releaseTooltip = releaseText; + pullTooltipLayout = new StaticLayout(pullText, 0, pullText.length(), tooltipTextPaint, AndroidUtilities.displaySize.x, Layout.Alignment.ALIGN_NORMAL, 1, 0, false); + pullTooltipLayoutWidth = pullTooltipLayout.getLineWidth(0); + releaseTooltipLayout = new StaticLayout(releaseText, 0, releaseText.length(), tooltipTextPaint, AndroidUtilities.displaySize.x, Layout.Alignment.ALIGN_NORMAL, 1, 0, false); + releaseTooltipLayoutWidth = releaseTooltipLayout.getLineWidth(0); + + try { + generalTopicDrawable = ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.msg_filled_general).mutate(); + } catch (Exception ignore) {} } public static int getMaxOverscroll() { @@ -166,7 +178,8 @@ public class PullForegroundDrawable { if (!willDraw || isOut || cell == null || listView == null) { return; } - int startPadding = AndroidUtilities.dp(28); + boolean isTopic = cell instanceof TopicsFragment.TopicDialogCell; + int startPadding = AndroidUtilities.dp(isTopic ? 15 : 28); int smallMargin = AndroidUtilities.dp(8); int radius = AndroidUtilities.dp(9); int diameter = AndroidUtilities.dp(18); @@ -207,11 +220,12 @@ public class PullForegroundDrawable { canvas.drawPaint(backgroundPaint); } } else { - float outBackgroundRadius = outRadius + (cell.getWidth() - outRadius) * (1f - outProgress) + (outRadius * bounceP); + float outBackgroundRadius = outRadius + (outRadius * bounceP) + (cell.getWidth() - outRadius) * (1f - outProgress); if (!(accentRevalProgress == 1f || accentRevalProgressOut == 1)) { canvas.drawCircle(cX, cY, outBackgroundRadius, backgroundPaint); } + circleClipPath.reset(); rectF.set(cX - outBackgroundRadius, cY - outBackgroundRadius, cX + outBackgroundRadius, cY + outBackgroundRadius); circleClipPath.addOval(rectF, Path.Direction.CW); @@ -261,8 +275,11 @@ public class PullForegroundDrawable { return; } - if (outProgress == 0f) { - paintWhite.setAlpha((int) (startPullProgress * 255)); + if (isTopic) { + smallCircleY -= (cell.getMeasuredHeight() - AndroidUtilities.dp(41)) * outProgress; + } + if (outProgress == 0f || isTopic) { + paintWhite.setAlpha((int) (startPullProgress * 255 * (1f - outProgress))); canvas.drawCircle(smallCircleX, smallCircleY, radius, paintWhite); int ih = arrowDrawable.getIntrinsicHeight(); @@ -279,19 +296,16 @@ public class PullForegroundDrawable { canvas.rotate(180 * rotateProgress, smallCircleX, smallCircleY); canvas.translate(0, AndroidUtilities.dpf2(1f) * 1f - rotateProgress); arrowDrawable.setColor(animateToColorize ? paintBackgroundAccent.getColor() : Theme.getColor(backgroundColorKey)); + arrowDrawable.setAlpha((int) (255 * (1f - outProgress))); arrowDrawable.draw(canvas); canvas.restore(); } - if (pullProgress > 0f) { textIn(); } float textY = cell.getHeight() - ((diameter + smallMargin * 2) / 2f) + AndroidUtilities.dp(6); - - tooltipTextPaint.setAlpha((int) (255 * textSwappingProgress * startPullProgress * textInProgress)); - float textCx = cell.getWidth() / 2f - AndroidUtilities.dp(2); if (textSwappingProgress > 0 && textSwappingProgress < 1f) { @@ -299,7 +313,10 @@ public class PullForegroundDrawable { float scale = 0.8f + 0.2f * textSwappingProgress; canvas.scale(scale, scale, textCx, textY + AndroidUtilities.dp(16) * (1f - textSwappingProgress)); } - canvas.drawText(pullTooltip, textCx, textY + AndroidUtilities.dp(8) * (1f - textSwappingProgress), tooltipTextPaint); + canvas.saveLayerAlpha(0, 0, cell.getMeasuredWidth(), cell.getMeasuredHeight(), (int) (255 * textSwappingProgress * startPullProgress * textInProgress), Canvas.ALL_SAVE_FLAG); + canvas.translate(textCx - pullTooltipLayoutWidth / 2f, textY + AndroidUtilities.dp(8) * (1f - textSwappingProgress) - tooltipTextPaint.getTextSize()); + pullTooltipLayout.draw(canvas); + canvas.restore(); if (textSwappingProgress > 0 && textSwappingProgress < 1f) { canvas.restore(); @@ -310,15 +327,17 @@ public class PullForegroundDrawable { float scale = 0.9f + 0.1f * (1f - textSwappingProgress); canvas.scale(scale, scale, textCx, textY - AndroidUtilities.dp(8) * (textSwappingProgress)); } - tooltipTextPaint.setAlpha((int) (255 * (1f - textSwappingProgress) * startPullProgress * textInProgress)); - canvas.drawText(releaseTooltip, textCx, textY - AndroidUtilities.dp(8) * (textSwappingProgress), tooltipTextPaint); + canvas.saveLayerAlpha(0, 0, cell.getMeasuredWidth(), cell.getMeasuredHeight(), (int) (255 * (1f - textSwappingProgress) * startPullProgress * textInProgress), Canvas.ALL_SAVE_FLAG); + canvas.translate(textCx - releaseTooltipLayoutWidth / 2f, textY + AndroidUtilities.dp(8) * (textSwappingProgress) - tooltipTextPaint.getTextSize()); + releaseTooltipLayout.draw(canvas); + canvas.restore(); if (textSwappingProgress > 0 && textSwappingProgress < 1f) { canvas.restore(); } canvas.restore(); - if (changeAvatarColor && outProgress > 0) { + if (!isTopic && changeAvatarColor && outProgress > 0) { canvas.save(); int iw = Theme.dialogs_archiveAvatarDrawable.getIntrinsicWidth(); @@ -347,6 +366,19 @@ public class PullForegroundDrawable { canvas.restore(); } + +// if (isTopic) { +// int color = arrowDrawable.paint.getColor(); +// if (generalTopicDrawableColor != color) { +// generalTopicDrawable.setColorFilter(new PorterDuffColorFilter(generalTopicDrawableColor = color, PorterDuff.Mode.MULTIPLY)); +// } +// +// int ih = AndroidUtilities.lerp(AndroidUtilities.dp(14), AndroidUtilities.dp(28), outProgress); +// int iw = AndroidUtilities.lerp(AndroidUtilities.dp(14), AndroidUtilities.dp(28), outProgress); +// generalTopicDrawable.setBounds(smallCircleX - (iw >> 1), smallCircleY - (ih >> 1), smallCircleX + (iw >> 1), smallCircleY + (ih >> 1)); +// generalTopicDrawable.setAlpha((int) (255 * outProgress)); +// generalTopicDrawable.draw(canvas); +// } } @@ -541,6 +573,7 @@ public class PullForegroundDrawable { Theme.dialogs_archiveAvatarDrawable.setLayerColor("Arrow1.**", color); Theme.dialogs_archiveAvatarDrawable.setLayerColor("Arrow2.**", color); Theme.dialogs_archiveAvatarDrawable.commitApplyLayerColors(); + Theme.dialogs_archiveAvatarDrawableRecolored = true; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java index 03d88bc70..1d32e2950 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java @@ -1094,7 +1094,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma @Override public void draw(Canvas canvas) { - drawInternal(canvas, false, 0, 0); + drawInternal(canvas, null, false, 0, 0); } public void drawInBackground(Canvas canvas, float x, float y, float w, float h, int alpha, ColorFilter colorFilter, int threadIndex) { @@ -1106,10 +1106,14 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma backgroundPaint[threadIndex].setAlpha(alpha); backgroundPaint[threadIndex].setColorFilter(colorFilter); dstRectBackground[threadIndex].set(x, y, x + w, y + h); - drawInternal(canvas, true, 0, threadIndex); + drawInternal(canvas, null,true, 0, threadIndex); } - public void drawInternal(Canvas canvas, boolean drawInBackground, long time, int threadIndex) { + public void draw(Canvas canvas, Paint paint) { + drawInternal(canvas, paint, false, 0, 0); + } + + public void drawInternal(Canvas canvas, Paint overridePaint, boolean drawInBackground, long time, int threadIndex) { if (!canLoadFrames() || destroyWhenDone) { return; } @@ -1118,7 +1122,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma } RectF rect = drawInBackground ? dstRectBackground[threadIndex] : dstRect; - Paint paint = drawInBackground ? backgroundPaint[threadIndex] : getPaint(); + Paint paint = overridePaint != null ? overridePaint : (drawInBackground ? backgroundPaint[threadIndex] : getPaint()); if (paint.getAlpha() == 0) { return; @@ -1298,7 +1302,7 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma return bitmap; } - void setMasterParent(View parent) { + public void setMasterParent(View parent) { masterParent = parent; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java index 05e170187..e4878ee29 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactedUsersListView.java @@ -22,6 +22,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DocumentObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; @@ -381,7 +382,14 @@ public class ReactedUsersListView extends FrameLayout { avatarView.setRoundRadius(AndroidUtilities.dp(32)); addView(avatarView, LayoutHelper.createFrameRelatively(36, 36, Gravity.START | Gravity.CENTER_VERTICAL, 8, 0, 0, 0)); - titleView = new SimpleTextView(context); + titleView = new SimpleTextView(context) { + @Override + public boolean setText(CharSequence value) { + value = Emoji.replaceEmoji(value, getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false); + return super.setText(value); + } + }; + NotificationCenter.listenEmojiLoading(titleView); titleView.setTextSize(16); titleView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem)); titleView.setEllipsizeByGradient(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/AnimatedEmojiEffect.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/AnimatedEmojiEffect.java index 0fe169524..5edb47409 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/AnimatedEmojiEffect.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/AnimatedEmojiEffect.java @@ -222,6 +222,7 @@ public class AnimatedEmojiEffect { toY2 = toY1 + bounds.height(); duration = 1800; } + duration /= 1.75f; mirror = Utilities.fastRandom.nextBoolean(); randomRotation = 20 * ((Utilities.fastRandom.nextInt() % 100) / 100f); } @@ -243,7 +244,7 @@ public class AnimatedEmojiEffect { } public void draw(Canvas canvas) { - progress += 16f / duration; + progress += (float) Math.min(40, 1000f / AndroidUtilities.screenRefreshRate) / duration; progress = Utilities.clamp(progress, 1f, 0f); float progressInternal = CubicBezierInterpolator.EASE_OUT.getInterpolation(progress); float cx = AndroidUtilities.lerp(fromX, toX, progressInternal); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java index 4d476beba..874b3443c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java @@ -54,6 +54,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.ui.ActionBar.Theme; @@ -97,6 +98,7 @@ public class RecyclerListView extends RecyclerView { private Runnable selectChildRunnable; private FastScroll fastScroll; private SectionsAdapter sectionsAdapter; + public boolean useLayoutPositionOnClick; private boolean isHidden; @@ -117,6 +119,7 @@ public class RecyclerListView extends RecyclerView { private int startSection; private int sectionsCount; private int sectionOffset; + private boolean allowStopHeaveOperations; @SectionsType private int sectionsType; @@ -1143,7 +1146,11 @@ public class RecyclerListView extends RecyclerView { } currentChildPosition = -1; if (currentChildView != null) { - currentChildPosition = view.getChildPosition(currentChildView); + if (useLayoutPositionOnClick) { + currentChildPosition = view.getChildLayoutPosition(currentChildView); + } else { + currentChildPosition = view.getChildAdapterPosition(currentChildView); + } MotionEvent childEvent = MotionEvent.obtain(0, 0, event.getActionMasked(), event.getX() - currentChildView.getLeft(), event.getY() - currentChildView.getTop(), 0); if (currentChildView.onTouchEvent(childEvent)) { interceptedByChild = true; @@ -1390,6 +1397,7 @@ public class RecyclerListView extends RecyclerView { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + checkStopHeavyOperations(newState); if (newState != SCROLL_STATE_IDLE && currentChildView != null) { if (selectChildRunnable != null) { AndroidUtilities.cancelRunOnUIThread(selectChildRunnable); @@ -1439,6 +1447,48 @@ public class RecyclerListView extends RecyclerView { addOnItemTouchListener(new RecyclerListViewItemClickListener(context)); } + private Paint backgroundPaint; + protected void drawSectionBackground(Canvas canvas, int fromAdapterPosition, int toAdapterPosition, int color) { + int top = Integer.MAX_VALUE; + int bottom = Integer.MIN_VALUE; + + for (int i = 0; i < getChildCount(); ++i) { + View child = getChildAt(i); + if (child == null) { + continue; + } + int position = getChildAdapterPosition(child); + if (position >= fromAdapterPosition && position <= toAdapterPosition) { + top = Math.min(child.getTop(), top); + bottom = Math.max(child.getBottom(), bottom); + } + } + + if (top < bottom) { + if (backgroundPaint == null) { + backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + } + backgroundPaint.setColor(color); + canvas.drawRect(0, top, getWidth(), bottom, backgroundPaint); + } + } + + private boolean stoppedAllHeavyOperations; + + private void checkStopHeavyOperations(int newState) { + if (newState == SCROLL_STATE_IDLE) { + if (stoppedAllHeavyOperations) { + stoppedAllHeavyOperations = false; + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 512); + } + } else { + if (!stoppedAllHeavyOperations && allowStopHeaveOperations) { + stoppedAllHeavyOperations = true; + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 512); + } + } + } + @Override public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) { if (attributes != null) { @@ -1976,7 +2026,7 @@ public class RecyclerListView extends RecyclerView { } } - protected boolean emptyViewIsVisible() { + public boolean emptyViewIsVisible() { if (getAdapter() == null || isFastScrollAnimationRunning()) { return false; } @@ -2417,6 +2467,11 @@ public class RecyclerListView extends RecyclerView { if (itemsEnterAnimator != null) { itemsEnterAnimator.onDetached(); } + + if (stoppedAllHeavyOperations) { + stoppedAllHeavyOperations = false; + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 512); + } } public void addOverlayView(View view, FrameLayout.LayoutParams layoutParams) { @@ -2708,4 +2763,8 @@ public class RecyclerListView extends RecyclerView { public void setAccessibilityEnabled(boolean accessibilityEnabled) { this.accessibilityEnabled = accessibilityEnabled; } + + public void setAllowStopHeaveOperations(boolean allowStopHeaveOperations) { + this.allowStopHeaveOperations = allowStopHeaveOperations; + } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java index edcdce3b5..0130de807 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java @@ -64,7 +64,7 @@ import java.util.Set; public class SearchViewPager extends ViewPagerFixed implements FilteredSearchView.UiCallback { - private final ViewPagerAdapter viewPagerAdapter; + protected final ViewPagerAdapter viewPagerAdapter; public FrameLayout searchContainer; public RecyclerListView searchListView; public StickerEmptyView emptyView; @@ -107,6 +107,9 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie private int keyboardSize; private boolean showOnlyDialogsAdapter; + protected boolean includeDownloads() { + return true; + } ChatPreviewDelegate chatPreviewDelegate; SizeNotifierFrameLayout fragmentView; @@ -190,9 +193,13 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { int firstVisibleItem = searchLayoutManager.findFirstVisibleItemPosition(); + int lastVisibleItem = searchLayoutManager.findLastVisibleItemPosition(); int visibleItemCount = Math.abs(searchLayoutManager.findLastVisibleItemPosition() - firstVisibleItem) + 1; int totalItemCount = recyclerView.getAdapter().getItemCount(); - if (visibleItemCount > 0 && searchLayoutManager.findLastVisibleItemPosition() == totalItemCount - 1 && !dialogsSearchAdapter.isMessagesSearchEndReached()) { + if (visibleItemCount > 0 && !dialogsSearchAdapter.isMessagesSearchEndReached() && ( + lastVisibleItem == totalItemCount - 1 || + dialogsSearchAdapter.delegate != null && dialogsSearchAdapter.delegate.getSearchForumDialogId() != 0 && dialogsSearchAdapter.localMessagesLoadingRow >= 0 && firstVisibleItem <= dialogsSearchAdapter.localMessagesLoadingRow && lastVisibleItem >= dialogsSearchAdapter.localMessagesLoadingRow + )) { dialogsSearchAdapter.loadMoreSearchMessages(); } fragmentView.invalidateBlur(); @@ -262,8 +269,21 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie search(view, getCurrentPosition(), text, reset); } + protected long getDialogId(String query) { + return 0; + } + + public void updateTabs() { + viewPagerAdapter.updateItems(); + fillTabs(); + if (tabsView != null) { + tabsView.finishAddingTabs(); + } + } + private void search(View view, int position, String query, boolean reset) { - long dialogId = 0; + long forumDialogId = dialogsSearchAdapter.delegate != null ? dialogsSearchAdapter.delegate.getSearchForumDialogId() : 0; + long dialogId = position == 0 ? 0 : forumDialogId; long minDate = 0; long maxDate = 0; boolean includeFolder = false; @@ -284,7 +304,7 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie } if (view == searchContainer) { - if (dialogId == 0 && minDate == 0 && maxDate == 0) { + if (dialogId == 0 && minDate == 0 && maxDate == 0 || forumDialogId != 0) { lastSearchScrolledToTop = false; dialogsSearchAdapter.searchDialogs(query, includeFolder ? 1 : 0); dialogsSearchAdapter.setFiltersDelegate(filteredSearchViewDelegate, false); @@ -332,6 +352,7 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie emptyView.setKeyboardHeight(keyboardSize, false); noMediaFiltersSearchView.setKeyboardHeight(keyboardSize, false); } else if (view instanceof FilteredSearchView) { + ((FilteredSearchView) view).setUseFromUserAsAvatar(forumDialogId != 0); ((FilteredSearchView) view).setKeyboardHeight(keyboardSize, false); ViewPagerAdapter.Item item = viewPagerAdapter.items.get(position); ((FilteredSearchView) view).search(dialogId, minDate, maxDate, FiltersView.filters[item.filterIndex], includeFolder, query, reset); @@ -391,6 +412,11 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie forwardItem = actionMode.addItemWithWidth(forwardItemId, R.drawable.msg_forward, AndroidUtilities.dp(54), LocaleController.getString("Forward", R.string.Forward)); deleteItem = actionMode.addItemWithWidth(deleteItemId, R.drawable.msg_delete, AndroidUtilities.dp(54), LocaleController.getString("Delete", R.string.Delete)); } + if (selectedMessagesCountTextView != null) { + boolean isForumSearch = dialogsSearchAdapter != null && dialogsSearchAdapter.delegate != null && dialogsSearchAdapter.delegate.getSearchForumDialogId() != 0; + ((MarginLayoutParams) selectedMessagesCountTextView.getLayoutParams()).leftMargin = AndroidUtilities.dp(72 + (isForumSearch ? 56 : 0)); + selectedMessagesCountTextView.setLayoutParams(selectedMessagesCountTextView.getLayoutParams()); + } if (parent.getActionBar().getBackButton().getDrawable() instanceof MenuDrawable) { BackDrawable backDrawable = new BackDrawable(false); parent.getActionBar().setBackButtonDrawable(backDrawable); @@ -878,12 +904,19 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie private final static int FILTER_TYPE = 2; public ViewPagerAdapter() { + updateItems(); + } + + public void updateItems() { + items.clear(); items.add(new Item(DIALOGS_TYPE)); if (!showOnlyDialogsAdapter) { Item item = new Item(FILTER_TYPE); item.filterIndex = 0; items.add(item); - items.add(new Item(DOWNLOADS_TYPE)); + if (includeDownloads()) { + items.add(new Item(DOWNLOADS_TYPE)); + } item = new Item(FILTER_TYPE); item.filterIndex = 1; items.add(item); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java index ab9ddeeee..612cedeb3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -670,7 +670,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter ArrayList arr = (ArrayList) args[1]; for (int a = 0; a < arr.size(); a++) { MessageObject obj = arr.get(a); - if (topicId != 0 && topicId != MessageObject.getTopicId(obj.messageOwner)) { + if (topicId != 0 && topicId != MessageObject.getTopicId(obj.messageOwner, true)) { continue; } if (MessageObject.getMedia(obj.messageOwner) == null || obj.needDrawBluredPreview()) { @@ -760,7 +760,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter for (int b = 0; b < sharedMediaData.length; b++) { MessageObject messageObject = sharedMediaData[b].deleteMessage(markAsDeletedMessages.get(a), 0); if (messageObject != null) { - if (messageObject.getDialogId() == dialogId && (topicId == 0 || MessageObject.getTopicId(messageObject.messageOwner) == topicId)) { + if (messageObject.getDialogId() == dialogId && (topicId == 0 || MessageObject.getTopicId(messageObject.messageOwner, true) == topicId)) { if (mediaCount[b] > 0) { mediaCount[b]--; } @@ -798,7 +798,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter for (int b = 0, N = messageObjects.size(); b < N; b++) { MessageObject messageObject = messageObjects.get(b); int mid = messageObject.getId(); - int topicId = MessageObject.getTopicId(messageObject.messageOwner); + int topicId = MessageObject.getTopicId(messageObject.messageOwner, true); int type = MediaDataController.getMediaType(messageObject.messageOwner); if (this.topicId != 0 && topicId != this.topicId) { continue; @@ -1543,7 +1543,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter actionModeViews.add(selectedMessagesCountTextView); if (!DialogObject.isEncryptedDialog(dialog_id)) { - gotoItem = new ActionBarMenuItem(context, null, getThemedColor(Theme.key_actionBarActionModeDefaultSelector), getThemedColor(Theme.key_windowBackgroundWhiteGrayText2), false); + gotoItem = new ActionBarMenuItem(context, null, getThemedColor(Theme.key_actionBarActionModeDefaultSelector), getThemedColor(Theme.key_actionBarActionModeDefaultIcon), false); gotoItem.setIcon(R.drawable.msg_message); gotoItem.setContentDescription(LocaleController.getString("AccDescrGoToMessage", R.string.AccDescrGoToMessage)); gotoItem.setDuplicateParentStateEnabled(false); @@ -1551,7 +1551,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter actionModeViews.add(gotoItem); gotoItem.setOnClickListener(v -> onActionBarItemClick(v, gotochat)); - forwardItem = new ActionBarMenuItem(context, null, getThemedColor(Theme.key_actionBarActionModeDefaultSelector), getThemedColor(Theme.key_windowBackgroundWhiteGrayText2), false); + forwardItem = new ActionBarMenuItem(context, null, getThemedColor(Theme.key_actionBarActionModeDefaultSelector), getThemedColor(Theme.key_actionBarActionModeDefaultIcon), false); forwardItem.setIcon(R.drawable.msg_forward); forwardItem.setContentDescription(LocaleController.getString("Forward", R.string.Forward)); forwardItem.setDuplicateParentStateEnabled(false); @@ -1561,7 +1561,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter updateForwardItem(); } - deleteItem = new ActionBarMenuItem(context, null, getThemedColor(Theme.key_actionBarActionModeDefaultSelector), getThemedColor(Theme.key_windowBackgroundWhiteGrayText2), false); + deleteItem = new ActionBarMenuItem(context, null, getThemedColor(Theme.key_actionBarActionModeDefaultSelector), getThemedColor(Theme.key_actionBarActionModeDefaultIcon), false); deleteItem.setIcon(R.drawable.msg_delete); deleteItem.setContentDescription(LocaleController.getString("Delete", R.string.Delete)); deleteItem.setDuplicateParentStateEnabled(false); @@ -6502,14 +6502,14 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter arrayList.add(new ThemeDescription(shadowLine, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_divider)); - arrayList.add(new ThemeDescription(deleteItem.getIconView(), ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); + arrayList.add(new ThemeDescription(deleteItem.getIconView(), ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon)); arrayList.add(new ThemeDescription(deleteItem, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_actionBarActionModeDefaultSelector)); if (gotoItem != null) { - arrayList.add(new ThemeDescription(gotoItem.getIconView(), ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); + arrayList.add(new ThemeDescription(gotoItem.getIconView(), ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon)); arrayList.add(new ThemeDescription(gotoItem, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_actionBarActionModeDefaultSelector)); } if (forwardItem != null) { - arrayList.add(new ThemeDescription(forwardItem.getIconView(), ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); + arrayList.add(new ThemeDescription(forwardItem.getIconView(), ThemeDescription.FLAG_IMAGECOLOR, null, null, null, null, Theme.key_actionBarActionModeDefaultIcon)); arrayList.add(new ThemeDescription(forwardItem, ThemeDescription.FLAG_BACKGROUNDFILTER, null, null, null, null, Theme.key_actionBarActionModeDefaultSelector)); } arrayList.add(new ThemeDescription(closeButton, ThemeDescription.FLAG_IMAGECOLOR, null, null, new Drawable[]{backDrawable}, null, Theme.key_actionBarActionModeDefaultIcon)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlotsDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlotsDrawable.java index c125f2293..3b5769182 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlotsDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlotsDrawable.java @@ -115,7 +115,7 @@ public class SlotsDrawable extends RLottieDrawable { if (secondFrameNums[0] == secondFrameCounts[0] - 100) { playWinAnimation = true; if (left == ReelValue.sevenWin) { - Runnable runnable = onFinishCallback.get(); + Runnable runnable = onFinishCallback == null ? null : onFinishCallback.get(); if (runnable != null) { AndroidUtilities.runOnUIThread(runnable); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java index 8139dc3f0..67ba5a56e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java @@ -27,12 +27,9 @@ import android.os.Build; import android.os.Parcelable; import android.text.Editable; import android.text.InputType; -import android.text.Selection; -import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.TextWatcher; -import android.text.method.LinkMovementMethod; import android.transition.Transition; import android.transition.TransitionManager; import android.transition.TransitionValues; @@ -118,28 +115,12 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not boolean onCustomButtonPressed(); } - private static class LinkMovementMethodMy extends LinkMovementMethod { - @Override - public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { - try { - boolean result = super.onTouchEvent(widget, buffer, event); - if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { - Selection.removeSelection(buffer); - } - return result; - } catch (Exception e) { - FileLog.e(e); - } - return false; - } - } - private boolean wasLightStatusBar; private Pattern urlPattern; private RecyclerListView gridView; private GridAdapter adapter; - private TextView titleTextView; + private LinkSpanDrawable.LinksTextView titleTextView; private TextView descriptionTextView; private ActionBarMenuItem optionsButton; private TextView pickerBottomLayout; @@ -814,14 +795,14 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not gridView.setEmptyView(emptyView); emptyView.setOnTouchListener((v, event) -> true); - titleTextView = new TextView(context); + titleTextView = new LinkSpanDrawable.LinksTextView(context); titleTextView.setLines(1); titleTextView.setSingleLine(true); titleTextView.setTextColor(getThemedColor(Theme.key_dialogTextBlack)); titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); titleTextView.setLinkTextColor(getThemedColor(Theme.key_dialogTextLink)); titleTextView.setEllipsize(TextUtils.TruncateAt.END); - titleTextView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); + titleTextView.setPadding(AndroidUtilities.dp(18), AndroidUtilities.dp(6), AndroidUtilities.dp(18), AndroidUtilities.dp(6)); titleTextView.setGravity(Gravity.CENTER_VERTICAL); titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); containerView.addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.LEFT | Gravity.TOP, 0, 0, 40, 0)); @@ -1054,22 +1035,23 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } if (stickerSet != null) { SpannableStringBuilder stringBuilder = null; + CharSequence title = stickerSet.set.title; + title = Emoji.replaceEmoji(title, titleTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(18), false); try { if (urlPattern == null) { urlPattern = Pattern.compile("@[a-zA-Z\\d_]{1,32}"); } - Matcher matcher = urlPattern.matcher(stickerSet.set.title); + Matcher matcher = urlPattern.matcher(title); while (matcher.find()) { if (stringBuilder == null) { - stringBuilder = new SpannableStringBuilder(stickerSet.set.title); - titleTextView.setMovementMethod(new LinkMovementMethodMy()); + stringBuilder = new SpannableStringBuilder(title); } int start = matcher.start(); int end = matcher.end(); if (stickerSet.set.title.charAt(start) != '@') { start++; } - URLSpanNoUnderline url = new URLSpanNoUnderline(stickerSet.set.title.subSequence(start + 1, end).toString()) { + URLSpanNoUnderline url = new URLSpanNoUnderline(title.subSequence(start + 1, end).toString()) { @Override public void onClick(View widget) { MessagesController.getInstance(currentAccount).openByUserName(getURL(), parentFragment, 1); @@ -1078,10 +1060,13 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not }; stringBuilder.setSpan(url, start, end, 0); } + if (stringBuilder != null) { + title = stringBuilder; + } } catch (Exception e) { FileLog.e(e); } - titleTextView.setText(stringBuilder != null ? stringBuilder : stickerSet.set.title); + titleTextView.setText(title); if (isEmoji()) { int width = gridView.getMeasuredWidth(); @@ -1148,11 +1133,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } else if (notInstalled) { String text; if (stickerSet != null && stickerSet.set != null && stickerSet.set.masks) { - text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())); + text = LocaleController.formatPluralString("AddManyMasksCount", stickerSet.documents == null ? 0 : stickerSet.documents.size()); } else if (stickerSet != null && stickerSet.set != null && stickerSet.set.emojis) { - text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("EmojiCountButton", stickerSet.documents.size())); + text = LocaleController.formatPluralString("AddManyEmojiCount", stickerSet.documents == null ? 0 : stickerSet.documents.size()); } else { - text = LocaleController.formatString("AddStickersCount", R.string.AddStickersCount, LocaleController.formatPluralString("Stickers", stickerSet.documents == null ? 0 : stickerSet.documents.size())); + text = LocaleController.formatPluralString("AddManyStickersCount", stickerSet == null || stickerSet.documents == null ? 0 : stickerSet.documents.size()); } setButton(v -> { dismiss(); @@ -1191,11 +1176,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } else { String text; if (stickerSet.set.masks) { - text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("MasksCount", stickerSet.documents.size())); + text = LocaleController.formatPluralString("RemoveManyMasksCount", stickerSet.documents.size()); } else if (stickerSet.set.emojis) { - text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("EmojiCountButton", stickerSet.documents.size())); + text = LocaleController.formatPluralString("RemoveManyEmojiCount", stickerSet.documents.size()); } else { - text = LocaleController.formatString("RemoveStickersCount", R.string.RemoveStickersCount, LocaleController.formatPluralString("Stickers", stickerSet.documents.size())); + text = LocaleController.formatPluralString("RemoveManyStickersCount", stickerSet.documents.size()); } if (stickerSet.set.official) { setButton(v -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StorageDiagramView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StorageDiagramView.java index a637011e0..07a55dc1d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StorageDiagramView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StorageDiagramView.java @@ -11,14 +11,29 @@ import android.os.Build; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.MotionEvent; import android.view.View; +import android.view.animation.OvershootInterpolator; import androidx.interpolator.view.animation.FastOutSlowInInterpolator; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DialogObject; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLObject; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.CacheControlActivity; -public class StorageDiagramView extends View { +public class StorageDiagramView extends View implements NotificationCenter.NotificationCenterDelegate { private RectF rectF = new RectF(); private ClearViewData[] data; @@ -27,11 +42,17 @@ public class StorageDiagramView extends View { private float[] startFromPercentage; private float singleProgress = 0; - TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); - TextPaint textPaint2 = new TextPaint(Paint.ANTI_ALIAS_FLAG); - StaticLayout layout1; - StaticLayout layout2; + private AvatarDrawable avatarDrawable; + private ImageReceiver avatarImageReceiver; + private Long dialogId; + + AnimatedTextView.AnimatedTextDrawable text1 = new AnimatedTextView.AnimatedTextDrawable(false, true, true); + AnimatedTextView.AnimatedTextDrawable text2 = new AnimatedTextView.AnimatedTextDrawable(false, true, false); + + CharSequence dialogText; + TextPaint dialogTextPaint; + StaticLayout dialogTextLayout; int enabledCount; @@ -39,20 +60,84 @@ public class StorageDiagramView extends View { public StorageDiagramView(Context context) { super(context); + text1.setCallback(this); + text2.setCallback(this); + } + + public StorageDiagramView(Context context, long dialogId) { + this(context); + this.dialogId = dialogId; + + avatarDrawable = new AvatarDrawable(); + avatarDrawable.setScaleSize(1.5f); + avatarImageReceiver = new ImageReceiver(); + avatarImageReceiver.setParentView(this); + + if (dialogId == CacheControlActivity.UNKNOWN_CHATS_DIALOG_ID) { + dialogText = LocaleController.getString("CacheOtherChats", R.string.CacheOtherChats); + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_OTHER_CHATS); + avatarImageReceiver.setForUserOrChat(null, avatarDrawable); + } else { + TLObject dialog = MessagesController.getInstance(UserConfig.selectedAccount).getUserOrChat(dialogId); + dialogText = DialogObject.setDialogPhotoTitle(avatarImageReceiver, avatarDrawable, dialog); + dialogText = Emoji.replaceEmoji(dialogText, null, AndroidUtilities.dp(6), false); + } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure( - MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(110), MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(110), MeasureSpec.EXACTLY) - ); - rectF.set(AndroidUtilities.dp(3), AndroidUtilities.dp(3), getMeasuredWidth() - AndroidUtilities.dp(3), getMeasuredHeight() - AndroidUtilities.dp(3)); - updateDescription(); - textPaint.setTextSize(AndroidUtilities.dp(24)); - textPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + int left; + if (dialogId != null) { + super.onMeasure( + widthMeasureSpec, + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(166), MeasureSpec.EXACTLY) + ); + int w = MeasureSpec.getSize(widthMeasureSpec); + left = (w - AndroidUtilities.dp(110)) / 2; + rectF.set(left + AndroidUtilities.dp(3), AndroidUtilities.dp(3), left + AndroidUtilities.dp(110 - 3), AndroidUtilities.dp(110 - 3)); + } else { + super.onMeasure( + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(110), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(110), MeasureSpec.EXACTLY) + ); + left = 0; + rectF.set(AndroidUtilities.dp(3), AndroidUtilities.dp(3), AndroidUtilities.dp(110 - 3), AndroidUtilities.dp(110 - 3)); + } - textPaint2.setTextSize(AndroidUtilities.dp(13)); + text1.setAnimationProperties(.18f, 0, 300, CubicBezierInterpolator.EASE_OUT_QUINT); + text1.setTextSize(AndroidUtilities.dp(24)); + text1.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + + text2.setAnimationProperties(.18f, 0, 300, CubicBezierInterpolator.EASE_OUT_QUINT); + + if (dialogId != null) { + text2.setTextSize(AndroidUtilities.dp(16)); + text1.setGravity(Gravity.RIGHT); + text2.setGravity(Gravity.LEFT); + } else { + text2.setTextSize(AndroidUtilities.dp(13)); + int t1h = (int) text1.getTextSize(), t2h = (int) text2.getTextSize(); + int top = (int) (AndroidUtilities.dp(110) - t1h - t2h) / 2; + text1.setBounds(0, top, getMeasuredWidth(), top + t1h); + text2.setBounds(0, top + t1h + AndroidUtilities.dp(2), getMeasuredWidth(), top + t1h + t2h + AndroidUtilities.dp(2)); + text1.setGravity(Gravity.CENTER); + text2.setGravity(Gravity.CENTER); + } + + if (dialogText != null) { + if (dialogTextPaint == null) { + dialogTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + } + dialogTextPaint.setTextSize(AndroidUtilities.dp(13)); + int width = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(60); + dialogTextLayout = StaticLayoutEx.createStaticLayout2(dialogText, dialogTextPaint, width, Layout.Alignment.ALIGN_CENTER, 1, 0, false, TextUtils.TruncateAt.END, width, 1); + } + if (avatarImageReceiver != null) { + avatarImageReceiver.setImageCoords(left + AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(90), AndroidUtilities.dp(90)); + avatarImageReceiver.setRoundRadius(AndroidUtilities.dp(45)); + } + + updateDescription(); } public void setData(ClearViewData[] data) { @@ -69,16 +154,27 @@ public class StorageDiagramView extends View { } else { singleProgress = 1f; } - - } + private long lastDrawTime; + @Override protected void onDraw(Canvas canvas) { if (data == null) { return; } + if (avatarImageReceiver != null) { + canvas.save(); + if (isPressed() && pressedProgress != 1f) { + pressedProgress += (float) Math.min(40, 1000f / AndroidUtilities.screenRefreshRate) / 100f; + pressedProgress = Utilities.clamp(pressedProgress, 1f, 0); + invalidate(); + } + float s = 0.85f + 0.15f * (1f - pressedProgress); + canvas.scale(s, s, avatarImageReceiver.getCenterX(), avatarImageReceiver.getCenterY()); + } + if (enabledCount > 1) { if (singleProgress > 0) { singleProgress -= 0.04; @@ -159,20 +255,31 @@ public class StorageDiagramView extends View { startFrom += percent; } - if (layout1 != null) { - canvas.save(); - canvas.translate( - (getMeasuredWidth() - layout1.getWidth()) >> 1, - ((getMeasuredHeight() - layout1.getHeight() - layout2.getHeight()) >> 1) + AndroidUtilities.dp(2) - ); - textPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - textPaint2.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - layout1.draw(canvas); - canvas.translate(0,layout1.getHeight()); - layout2.draw(canvas); + if (avatarImageReceiver != null) { + avatarImageReceiver.draw(canvas); canvas.restore(); } + if (text1 != null) { + text1.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + text2.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + if (dialogId != null) { + int textWidth = text1.getCurrentWidth() + AndroidUtilities.dp(4) + text2.getCurrentWidth(); + int leftpad = (getWidth() - textWidth) / 2; + text1.setBounds(0, AndroidUtilities.dp(115), leftpad + text1.getCurrentWidth(), AndroidUtilities.dp(115 + 30)); + text2.setBounds(leftpad + textWidth - text2.getCurrentWidth(), AndroidUtilities.dp(115 + 3), getWidth(), AndroidUtilities.dp(115 + 3 + 30)); + } + text1.draw(canvas); + text2.draw(canvas); + } + + if (dialogTextLayout != null) { + canvas.save(); + canvas.translate(AndroidUtilities.dp(30), AndroidUtilities.dp(148) - (dialogTextLayout.getHeight() - AndroidUtilities.dp(13)) / 2f); + dialogTextPaint.setColor(Theme.getColor(Theme.key_dialogTextBlack)); + dialogTextLayout.draw(canvas); + canvas.restore(); + } } public static class ClearViewData { @@ -286,6 +393,66 @@ public class StorageDiagramView extends View { } } + protected void onAvatarClick() { + + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean hitAvatar = ( + avatarImageReceiver != null && dialogId != null && dialogId != CacheControlActivity.UNKNOWN_CHATS_DIALOG_ID && + event.getX() > avatarImageReceiver.getImageX() && event.getX() <= avatarImageReceiver.getImageX2() && + event.getY() > avatarImageReceiver.getImageY() && event.getY() <= avatarImageReceiver.getImageY2() + ); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (hitAvatar) { + setPressed(true); + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (hitAvatar && event.getAction() != MotionEvent.ACTION_CANCEL) { + AndroidUtilities.runOnUIThread(this::onAvatarClick, 80); + } + setPressed(false); + return true; + } + return super.onTouchEvent(event); + } + + float pressedProgress; + ValueAnimator backAnimator; + + @Override + public void setPressed(boolean pressed) { + if (isPressed() != pressed) { + super.setPressed(pressed); + invalidate(); + if (pressed) { + if (backAnimator != null) { + backAnimator.removeAllListeners(); + backAnimator.cancel(); + } + } + if (!pressed && pressedProgress != 0) { + backAnimator = ValueAnimator.ofFloat(pressedProgress, 0); + backAnimator.addUpdateListener(animation -> { + pressedProgress = (float) animation.getAnimatedValue(); + invalidate(); + }); + backAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + backAnimator = null; + } + }); + backAnimator.setInterpolator(new OvershootInterpolator(2f)); + backAnimator.setDuration(350); + backAnimator.start(); + } + } + } + private void updateDescription() { if (data == null) { return; @@ -299,8 +466,33 @@ public class StorageDiagramView extends View { } String[] str = AndroidUtilities.formatFileSize(total).split(" "); if (str.length > 1) { - layout1 = new StaticLayout(total == 0 ? " " : str[0], textPaint, getMeasuredWidth(), Layout.Alignment.ALIGN_CENTER, 1f, 0, false); - layout2 = new StaticLayout(total == 0 ? " " : str[1], textPaint2, getMeasuredWidth(), Layout.Alignment.ALIGN_CENTER, 1f, 0, false); + text1.setText(total == 0 ? " " : str[0], true, false); + text2.setText(total == 0 ? " " : str[1], true, false); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (avatarImageReceiver != null) { + avatarImageReceiver.onAttachedToWindow(); + } + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiLoaded); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (avatarImageReceiver != null) { + avatarImageReceiver.onDetachedFromWindow(); + } + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.emojiLoaded) { + invalidate(); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StroageUsageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StorageUsageView.java similarity index 98% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/StroageUsageView.java rename to TMessagesProj/src/main/java/org/telegram/ui/Components/StorageUsageView.java index 1316ff288..6931f6047 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StroageUsageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StorageUsageView.java @@ -20,7 +20,7 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Components.voip.CellFlickerDrawable; -public class StroageUsageView extends FrameLayout { +public class StorageUsageView extends FrameLayout { private Paint paintFill = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint paintCalculcating = new Paint(Paint.ANTI_ALIAS_FLAG); @@ -57,7 +57,7 @@ public class StroageUsageView extends FrameLayout { CellFlickerDrawable cellFlickerDrawable = new CellFlickerDrawable(220, 255); - public StroageUsageView(Context context) { + public StorageUsageView(Context context) { super(context); setWillNotDraw(false); @@ -217,9 +217,8 @@ public class StroageUsageView extends FrameLayout { textSettingsCell.setVisibility(VISIBLE); telegramCacheTextView.setVisibility(View.VISIBLE); telegramDatabaseTextView.setVisibility(GONE); - textSettingsCell.setText(LocaleController.getString("ClearTelegramCache", R.string.ClearTelegramCache), false); + textSettingsCell.setTextAndValue(LocaleController.getString("ClearTelegramCache", R.string.ClearTelegramCache), AndroidUtilities.formatFileSize(totalSize), true); telegramCacheTextView.setText(LocaleController.formatString("TelegramCacheSize", R.string.TelegramCacheSize, AndroidUtilities.formatFileSize(totalSize + database))); - } else { telegramCacheTextView.setVisibility(View.GONE); telegramDatabaseTextView.setVisibility(VISIBLE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java index 2b9f7ebce..af8e96860 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SuggestEmojiView.java @@ -299,7 +299,7 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter. searchRunnable = () -> { ArrayList standard = new ArrayList<>(1); standard.add(new MediaDataController.KeywordResult(emoji, null)); - MediaDataController.getInstance(currentAccount).fillWithAnimatedEmoji(standard, 15, () -> { + MediaDataController.getInstance(currentAccount).fillWithAnimatedEmoji(standard, 15, false, () -> { if (id == lastQueryId) { lastQuery = emoji; lastQueryType = 2; @@ -541,16 +541,16 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter. float leftAlpha = leftGradientAlpha.set(listView.canScrollHorizontally(-1) ? 1f : 0f); if (leftAlpha > 0) { - Theme.chat_gradientLeftDrawable.setBounds((int) left, (int) top, (int) left + AndroidUtilities.dp(32), (int) bottom); - Theme.chat_gradientLeftDrawable.setAlpha((int) (255 * leftAlpha)); - Theme.chat_gradientLeftDrawable.draw(canvas); + Theme.chat_gradientRightDrawable.setBounds((int) left, (int) top, (int) left + AndroidUtilities.dp(32), (int) bottom); + Theme.chat_gradientRightDrawable.setAlpha((int) (255 * leftAlpha)); + Theme.chat_gradientRightDrawable.draw(canvas); } float rightAlpha = rightGradientAlpha.set(listView.canScrollHorizontally(1) ? 1f : 0f); if (rightAlpha > 0) { - Theme.chat_gradientRightDrawable.setBounds((int) right - AndroidUtilities.dp(32), (int) top, (int) right, (int) bottom); - Theme.chat_gradientRightDrawable.setAlpha((int) (255 * rightAlpha)); - Theme.chat_gradientRightDrawable.draw(canvas); + Theme.chat_gradientLeftDrawable.setBounds((int) right - AndroidUtilities.dp(32), (int) top, (int) right, (int) bottom); + Theme.chat_gradientLeftDrawable.setAlpha((int) (255 * rightAlpha)); + Theme.chat_gradientLeftDrawable.draw(canvas); } canvas.restore(); @@ -669,12 +669,20 @@ public class SuggestEmojiView extends FrameLayout implements NotificationCenter. } } + @Override + public void setPressed(boolean pressed) { + super.setPressed(pressed); + invalidate(); + } + @Override protected void dispatchDraw(Canvas canvas) { float scale = 0.8f + 0.2f * (1f - pressed.set(isPressed() ? 1f : 0f)); if (drawable != null) { - int cx = getWidth() / 2, cy = (getHeight() - getPaddingBottom() + getPaddingTop()) / 2, w = getWidth() - getPaddingLeft() - getPaddingRight(), h = getHeight() - getPaddingTop() - getPaddingBottom(); - drawable.setBounds((int) (cx - w / 2 * scale), (int) (cy - h / 2 * scale), (int) (cx + w / 2 * scale), (int) (cy + h / 2 * scale)); + int cx = getWidth() / 2; + int cy = (getHeight() - getPaddingBottom() + getPaddingTop()) / 2; + drawable.setBounds(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); + canvas.scale(scale, scale, cx, cy); if (drawable instanceof AnimatedEmojiDrawable) { ((AnimatedEmojiDrawable) drawable).setTime(System.currentTimeMillis()); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SwipeGestureSettingsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SwipeGestureSettingsView.java index 64d3e36b9..c2ca67891 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SwipeGestureSettingsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SwipeGestureSettingsView.java @@ -7,7 +7,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.RectF; import android.os.Build; -import android.os.Bundle; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.View; @@ -96,6 +95,7 @@ public class SwipeGestureSettingsView extends FrameLayout { canvas.drawLine(AndroidUtilities.dp(2), y, getMeasuredWidth() - AndroidUtilities.dp(2), y, pickerDividersPaint); } }; + picker.setWrapSelectorWheel(true); picker.setMinValue(0); picker.setDrawDividers(false); hasTabs = !MessagesController.getInstance(currentAccount).dialogFilters.isEmpty(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java index 2c749e5d6..ce69f1b20 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java @@ -287,15 +287,7 @@ public class Switch extends View { onCheckedChangeListener.onCheckedChanged(this, checked); } } - if (drawIconType != iconType) { - drawIconType = iconType; - if (attachedToWindow && animated) { - animateIcon(iconType == 0); - } else { - cancelIconAnimator(); - setIconProgress(iconType == 0 ? 1.0f : 0.0f); - } - } + setDrawIconType(iconType, animated); } public void setIcon(int icon) { @@ -310,6 +302,18 @@ public class Switch extends View { invalidate(); } + public void setDrawIconType(int iconType, boolean animated) { + if (drawIconType != iconType) { + drawIconType = iconType; + if (attachedToWindow && animated) { + animateIcon(iconType == 0); + } else { + cancelIconAnimator(); + setIconProgress(iconType == 0 ? 1.0f : 0.0f); + } + } + } + public boolean hasIcon() { return iconDrawable != null; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java index 74b6d1531..ccc423a2f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java @@ -10,6 +10,7 @@ package org.telegram.ui.Components; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; @@ -45,6 +46,7 @@ public class TimerDrawable extends Drawable { Theme.ResourcesProvider resourcesProvider; private boolean overrideColor; private boolean isStaticIcon; + private boolean isDialog; public TimerDrawable(Context context, Theme.ResourcesProvider resourcesProvider) { this.context = context; @@ -59,8 +61,12 @@ public class TimerDrawable extends Drawable { if (time != value) { time = value; - currentTtlIcon = ContextCompat.getDrawable(context, time == 0 ? R.drawable.msg_mini_autodelete : R.drawable.msg_mini_autodelete_empty).mutate(); - currentTtlIcon.setColorFilter(currentColorFilter); + if (isDialog) { + currentTtlIcon = ContextCompat.getDrawable(context, R.drawable.msg_autodelete_badge2).mutate(); + } else { + currentTtlIcon = ContextCompat.getDrawable(context, time == 0 ? R.drawable.msg_mini_autodelete : R.drawable.msg_mini_autodelete_empty).mutate(); + currentTtlIcon.setColorFilter(currentColorFilter); + } invalidateSelf(); String timeString; @@ -132,12 +138,21 @@ public class TimerDrawable extends Drawable { return timerDrawable; } + + public static TimerDrawable getTtlIconForDialogs(int ttl) { + TimerDrawable timerDrawable = new TimerDrawable(ApplicationLoader.applicationContext, null); + timerDrawable.isDialog = true; + timerDrawable.setTime(ttl); + return timerDrawable; + } @Override public void draw(Canvas canvas) { int width = getIntrinsicWidth(); int height = getIntrinsicHeight(); - if (!isStaticIcon) { + if (isDialog) { + timePaint.setColor(Color.WHITE); + } else if (!isStaticIcon) { if (!overrideColor) { paint.setColor(Theme.getColor(Theme.key_actionBarDefault, resourcesProvider)); } @@ -147,7 +162,7 @@ public class TimerDrawable extends Drawable { } if (currentTtlIcon != null) { - if (!isStaticIcon) { + if (!isStaticIcon && !isDialog) { canvas.drawCircle(getBounds().centerX(), getBounds().centerY(), getBounds().width() / 2f, paint); int iconColor = Theme.getColor(Theme.key_actionBarDefaultTitle, resourcesProvider); if (this.iconColor != iconColor) { @@ -155,11 +170,16 @@ public class TimerDrawable extends Drawable { currentTtlIcon.setColorFilter(new PorterDuffColorFilter(iconColor, PorterDuff.Mode.MULTIPLY)); } } - AndroidUtilities.rectTmp2.set((int) (getBounds().centerX() - AndroidUtilities.dp(10.5f)), (int) (getBounds().centerY() - AndroidUtilities.dp(10.5f)), - (int) (getBounds().centerX() - AndroidUtilities.dp(10.5f)) + currentTtlIcon.getIntrinsicWidth(), - (int) (getBounds().centerY() - AndroidUtilities.dp(10.5f)) + currentTtlIcon.getIntrinsicHeight()); - currentTtlIcon.setBounds(AndroidUtilities.rectTmp2); - currentTtlIcon.draw(canvas); + if (isDialog) { + currentTtlIcon.setBounds(getBounds().left, getBounds().top, getBounds().left + currentTtlIcon.getIntrinsicWidth(), getBounds().top + currentTtlIcon.getIntrinsicHeight()); + currentTtlIcon.draw(canvas); + } else { + AndroidUtilities.rectTmp2.set((int) (getBounds().centerX() - AndroidUtilities.dp(10.5f)), (int) (getBounds().centerY() - AndroidUtilities.dp(10.5f)), + (int) (getBounds().centerX() - AndroidUtilities.dp(10.5f)) + currentTtlIcon.getIntrinsicWidth(), + (int) (getBounds().centerY() - AndroidUtilities.dp(10.5f)) + currentTtlIcon.getIntrinsicHeight()); + currentTtlIcon.setBounds(AndroidUtilities.rectTmp2); + currentTtlIcon.draw(canvas); + } } if (time != 0) { if (timeLayout != null) { @@ -167,8 +187,14 @@ public class TimerDrawable extends Drawable { if (AndroidUtilities.density == 3) { xOffxet = -1; } - canvas.translate((int) (width / 2 - Math.ceil(timeWidth / 2)) + xOffxet, (height - timeHeight) / 2); - timeLayout.draw(canvas); + if (isDialog) { + canvas.translate((float) ((getBounds().width() / 2 - Math.ceil(timeWidth / 2)) + xOffxet), (getBounds().height() - timeHeight) / 2f); + timeLayout.draw(canvas); + } else { + canvas.translate((int) (width / 2 - Math.ceil(timeWidth / 2)) + xOffxet, (height - timeHeight) / 2f); + timeLayout.draw(canvas); + } + } } } @@ -206,4 +232,8 @@ public class TimerDrawable extends Drawable { overrideColor = true; paint.setColor(currentActionBarColor); } + + public int getTime() { + return time; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert.java index 7666f6f1d..d31ca6d8a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert.java @@ -21,7 +21,6 @@ import android.graphics.Region; import android.graphics.Shader; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.SystemClock; @@ -35,7 +34,6 @@ import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.text.style.URLSpan; import android.text.util.Linkify; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; @@ -53,8 +51,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.widget.NestedScrollView; -import org.json.JSONArray; -import org.json.JSONTokener; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.DispatchQueue; @@ -63,19 +59,13 @@ import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; import org.telegram.messenger.XiaomiUtilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.HttpURLConnection; -import java.net.URI; -import java.nio.charset.Charset; import java.util.ArrayList; public class TranslateAlert extends Dialog { @@ -229,6 +219,9 @@ public class TranslateAlert extends Dialog { public boolean run(URLSpan urlSpan); } + private int currentAccount; + private TLRPC.InputPeer peer; + private int msgId; private boolean allowScroll = true; private String fromLanguage, toLanguage; private CharSequence text; @@ -242,19 +235,21 @@ public class TranslateAlert extends Dialog { public TranslateAlert(BaseFragment fragment, Context context, int currentAccount, TLRPC.InputPeer peer, int msgId, String fromLanguage, String toLanguage, CharSequence text, boolean noforwards, OnLinkPress onLinkPress, Runnable onDismiss) { super(context, R.style.TransparentDialog); - if (peer != null) { - translateText(currentAccount, peer, msgId, fromLanguage != null && fromLanguage.equals("und") ? null : fromLanguage, toLanguage); - } - this.onLinkPress = onLinkPress; this.noforwards = noforwards; this.fragment = fragment; this.fromLanguage = fromLanguage != null && fromLanguage.equals("und") ? "auto" : fromLanguage; this.toLanguage = toLanguage; this.text = text; - this.textBlocks = cutInBlocks(text, 1024); + this.textBlocks = new ArrayList<>(); + this.textBlocks.add(text); +// cutInBlocks(text, 1024); this.onDismiss = onDismiss; + this.currentAccount = currentAccount; + this.peer = peer; + this.msgId = msgId; + if (Build.VERSION.SDK_INT >= 30) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); } else if (Build.VERSION.SDK_INT >= 21) { @@ -1026,8 +1021,8 @@ public class TranslateAlert extends Dialog { if (sourceLanguage != null) { fromLanguage = sourceLanguage; - updateSourceLanguage(); } + updateSourceLanguage(); if (blockIndex == 0 && AndroidUtilities.isAccessibilityScreenReaderEnabled()) { if (allTextsView != null) { @@ -1068,102 +1063,160 @@ public class TranslateAlert extends Dialog { public void run(boolean rateLimit); } private void fetchTranslation(CharSequence text, long minDuration, OnTranslationSuccess onSuccess, OnTranslationFail onFail) { - if (!translateQueue.isAlive()) { - translateQueue.start(); +// if (!translateQueue.isAlive()) { +// translateQueue.start(); +// } +// translateQueue.postRunnable(() -> { +// String uri = ""; +// HttpURLConnection connection = null; +// long start = SystemClock.elapsedRealtime(); +// try { +// uri = "https://translate.googleapis.com/translate_a/single?client=gtx&sl="; +// uri += Uri.encode(fromLanguage); +// uri += "&tl="; +// uri += Uri.encode(toLanguage); +// uri += "&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&q="; +// uri += Uri.encode(text.toString()); +// connection = (HttpURLConnection) new URI(uri).toURL().openConnection(); +// connection.setRequestMethod("GET"); +// connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"); +// connection.setRequestProperty("Content-Type", "application/json"); +// +// StringBuilder textBuilder = new StringBuilder(); +// try (Reader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")))) { +// int c = 0; +// while ((c = reader.read()) != -1) { +// textBuilder.append((char) c); +// } +// } +// String jsonString = textBuilder.toString(); +// +// JSONTokener tokener = new JSONTokener(jsonString); +// JSONArray array = new JSONArray(tokener); +// JSONArray array1 = array.getJSONArray(0); +// String sourceLanguage = null; +// try { +// sourceLanguage = array.getString(2); +// } catch (Exception e2) {} +// if (sourceLanguage != null && sourceLanguage.contains("-")) { +// sourceLanguage = sourceLanguage.substring(0, sourceLanguage.indexOf("-")); +// } +// StringBuilder result = new StringBuilder(); +// for (int i = 0; i < array1.length(); ++i) { +// String blockText = array1.getJSONArray(i).getString(0); +// if (blockText != null && !blockText.equals("null")) { +// result.append(blockText); +// } +// } +// if (text.length() > 0 && text.charAt(0) == '\n') { +// result.insert(0, "\n"); +// } +// final String finalResult = result.toString(); +// final String finalSourceLanguage = sourceLanguage; +// +// long elapsed = SystemClock.elapsedRealtime() - start; +// AndroidUtilities.runOnUIThread(() -> { +// if (onSuccess != null) { +// onSuccess.run(finalResult, finalSourceLanguage); +// } +// }, Math.max(0, minDuration - elapsed)); +// } catch (Exception e) { +// try { +// Log.e("translate", "failed to translate a text " + (connection != null ? connection.getResponseCode() : null) + " " + (connection != null ? connection.getResponseMessage() : null)); +// } catch (IOException ioException) { +// ioException.printStackTrace(); +// } +// e.printStackTrace(); +// +// if (onFail != null && !dismissed) { +// try { +// final boolean rateLimit = connection != null && connection.getResponseCode() == 429; +// AndroidUtilities.runOnUIThread(() -> { +// onFail.run(rateLimit); +// }); +// } catch (Exception e2) { +// AndroidUtilities.runOnUIThread(() -> { +// onFail.run(false); +// }); +// } +// } +// } +// }); + final long start = System.currentTimeMillis(); + Utilities.Callback onDone = (string) -> { + AndroidUtilities.runOnUIThread(() -> { + if (string != null) { + onSuccess.run(string, null); + } else { + onFail.run(false); + } + }, Math.max((System.currentTimeMillis() - start) - minDuration, 1)); + }; + if (peer != null) { + translateText(currentAccount, peer, msgId, fromLanguage, toLanguage, onDone); + } else if (text != null) { + translateText(currentAccount, text.toString(), fromLanguage, toLanguage, onDone); + } else { + onFail.run(false); } - translateQueue.postRunnable(() -> { - String uri = ""; - HttpURLConnection connection = null; - long start = SystemClock.elapsedRealtime(); - try { - uri = "https://translate.googleapis.com/translate_a/single?client=gtx&sl="; - uri += Uri.encode(fromLanguage); - uri += "&tl="; - uri += Uri.encode(toLanguage); - uri += "&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&q="; - uri += Uri.encode(text.toString()); - connection = (HttpURLConnection) new URI(uri).toURL().openConnection(); - connection.setRequestMethod("GET"); - connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"); - connection.setRequestProperty("Content-Type", "application/json"); - - StringBuilder textBuilder = new StringBuilder(); - try (Reader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")))) { - int c = 0; - while ((c = reader.read()) != -1) { - textBuilder.append((char) c); - } - } - String jsonString = textBuilder.toString(); - - JSONTokener tokener = new JSONTokener(jsonString); - JSONArray array = new JSONArray(tokener); - JSONArray array1 = array.getJSONArray(0); - String sourceLanguage = null; - try { - sourceLanguage = array.getString(2); - } catch (Exception e2) {} - if (sourceLanguage != null && sourceLanguage.contains("-")) { - sourceLanguage = sourceLanguage.substring(0, sourceLanguage.indexOf("-")); - } - StringBuilder result = new StringBuilder(); - for (int i = 0; i < array1.length(); ++i) { - String blockText = array1.getJSONArray(i).getString(0); - if (blockText != null && !blockText.equals("null")) { - result.append(blockText); - } - } - if (text.length() > 0 && text.charAt(0) == '\n') { - result.insert(0, "\n"); - } - final String finalResult = result.toString(); - final String finalSourceLanguage = sourceLanguage; - - long elapsed = SystemClock.elapsedRealtime() - start; - AndroidUtilities.runOnUIThread(() -> { - if (onSuccess != null) { - onSuccess.run(finalResult, finalSourceLanguage); - } - }, Math.max(0, minDuration - elapsed)); - } catch (Exception e) { - try { - Log.e("translate", "failed to translate a text " + (connection != null ? connection.getResponseCode() : null) + " " + (connection != null ? connection.getResponseMessage() : null)); - } catch (IOException ioException) { - ioException.printStackTrace(); - } - e.printStackTrace(); - - if (onFail != null && !dismissed) { - try { - final boolean rateLimit = connection != null && connection.getResponseCode() == 429; - AndroidUtilities.runOnUIThread(() -> { - onFail.run(rateLimit); - }); - } catch (Exception e2) { - AndroidUtilities.runOnUIThread(() -> { - onFail.run(false); - }); - } - } - } - }); } - private static void translateText(int currentAccount, TLRPC.InputPeer peer, int msg_id, String from_lang, String to_lang) { - TLRPC.TL_messages_translateText req = new TLRPC.TL_messages_translateText(); + private static void translateText(int currentAccount, TLRPC.InputPeer peer, int msg_id, String from_lang, String to_lang, Utilities.Callback onDone) { + if (onDone == null) { + return; + } + if (from_lang == null || from_lang.equals("und")) { + from_lang = null; + } + + TLRPC.TL_messages_translateText req = new TLRPC.TL_messages_translateText(); req.peer = peer; req.msg_id = msg_id; req.flags |= 1; - if (from_lang != null) { req.from_lang = from_lang; req.flags |= 4; } - req.to_lang = to_lang; try { - ConnectionsManager.getInstance(currentAccount).sendRequest(req, (error, res) -> {}); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> { + if (res instanceof TLRPC.TL_messages_translateResultText) { + onDone.run(((TLRPC.TL_messages_translateResultText) res).text); + return; + } + onDone.run(null); + }); + } catch (Exception e) { + FileLog.e(e); + } + } + + private static void translateText(int currentAccount, String text, String from_lang, String to_lang, Utilities.Callback onDone) { + if (onDone == null) { + return; + } + if (from_lang == null || from_lang.equals("und")) { + from_lang = null; + } + + TLRPC.TL_messages_translateText req = new TLRPC.TL_messages_translateText(); + req.flags |= 2; + req.text = text; + if (from_lang != null) { + req.from_lang = from_lang; + req.flags |= 4; + } + req.to_lang = to_lang; + + try { + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> { + if (res instanceof TLRPC.TL_messages_translateResultText) { + onDone.run(((TLRPC.TL_messages_translateResultText) res).text); + return; + } + onDone.run(null); + }); } catch (Exception e) { FileLog.e(e); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java index 6eb4f069e..e7015180f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java @@ -1053,9 +1053,9 @@ public class UndoView extends FrameLayout { } else { int amount = (Integer) infoObject2; if (count == 1) { - infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessageToChats", R.string.FwdMessageToChats, LocaleController.formatPluralString("Chats", amount)))); + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatPluralString("FwdMessageToManyChats", amount))); } else { - infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessagesToChats", R.string.FwdMessagesToChats, LocaleController.formatPluralString("Chats", amount)))); + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatPluralString("FwdMessagesToManyChats", amount))); } leftImageView.setAnimation(R.raw.forward, 30, 30); hapticDelay = 300; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java index 11160a149..60ea5042a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java @@ -9,7 +9,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.RectF; @@ -131,7 +130,7 @@ public class UsersAlertBase extends BottomSheet { } @Override - protected boolean emptyViewIsVisible() { + public boolean emptyViewIsVisible() { if (getAdapter() == null) { return false; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java index ca7150624..bb9dafbda 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java @@ -318,7 +318,7 @@ public class VideoPlayerSeekBar { } for (int i = 0; i < links.length; ++i) { URLSpanNoUnderline link = links[i]; - if (link != null && link.getURL().startsWith("video?")) { + if (link != null && link.getURL() != null && link.label != null && link.getURL().startsWith("video?")) { Integer seconds = Utilities.parseInt(link.getURL().substring(6)); if (seconds != null && seconds >= 0) { float position = seconds * 1000L / (float) videoDuration; @@ -672,6 +672,9 @@ public class VideoPlayerSeekBar { timestampLabelPaint.setTextSize(AndroidUtilities.dp(12)); timestampLabelPaint.setColor(0xffffffff); } + if (text == null) { + text = ""; + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return StaticLayout.Builder.obtain(text, 0, text.length(), timestampLabelPaint, width) .setMaxLines(1) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java index c67a489f7..b92586b8e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java @@ -193,6 +193,9 @@ public class ViewPagerFixed extends FrameLayout { private void updateViewForIndex(int index) { int adapterPosition = index == 0 ? currentPosition : nextPosition; + if (adapterPosition < 0 || adapterPosition >= adapter.getItemCount()) { + return; + } if (viewPages[index] == null) { viewTypes[index] = adapter.getItemViewType(adapterPosition); View v = viewsByType.get(viewTypes[index]); @@ -232,7 +235,16 @@ public class ViewPagerFixed extends FrameLayout { } } - private void fillTabs() { + protected void onBack() { + + } + + private float backProgress; + protected boolean onBackProgress(float progress) { + return false; + } + + protected void fillTabs() { if (adapter != null && tabsView != null) { tabsView.removeTabs(); for (int i = 0; i < adapter.getItemCount(); i++) { @@ -242,7 +254,7 @@ public class ViewPagerFixed extends FrameLayout { } private boolean prepareForMoving(MotionEvent ev, boolean forward) { - if ((!forward && currentPosition == 0) || (forward && currentPosition == adapter.getItemCount() - 1)) { + if ((!forward && currentPosition == 0 && !onBackProgress(backProgress = 0)) || (forward && currentPosition == adapter.getItemCount() - 1)) { return false; } @@ -257,10 +269,12 @@ public class ViewPagerFixed extends FrameLayout { animatingForward = forward; nextPosition = currentPosition + (forward ? 1 : -1); updateViewForIndex(1); - if (forward) { - viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth()); - } else { - viewPages[1].setTranslationX(-viewPages[0].getMeasuredWidth()); + if (viewPages[1] != null) { + if (forward) { + viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth()); + } else { + viewPages[1].setTranslationX(-viewPages[0].getMeasuredWidth()); + } } return true; } @@ -307,7 +321,7 @@ public class ViewPagerFixed extends FrameLayout { animatingForward = false; additionalOffset = viewPages[0].getTranslationX(); } - } else { + } else if (viewPages[1] != null) { if (startedTrackingX < viewPages[1].getMeasuredWidth() + viewPages[1].getTranslationX()) { swapViews(); animatingForward = true; @@ -342,7 +356,9 @@ public class ViewPagerFixed extends FrameLayout { maybeStartTracking = true; startedTracking = false; viewPages[0].setTranslationX(0); - viewPages[1].setTranslationX(animatingForward ? viewPages[0].getMeasuredWidth() : -viewPages[0].getMeasuredWidth()); + if (viewPages[1] != null) { + viewPages[1].setTranslationX(animatingForward ? viewPages[0].getMeasuredWidth() : -viewPages[0].getMeasuredWidth()); + } if (tabsView != null) { tabsView.selectTab(currentPosition, 0, 0); } @@ -354,13 +370,19 @@ public class ViewPagerFixed extends FrameLayout { prepareForMoving(ev, dx < 0); } } else if (startedTracking) { - viewPages[0].setTranslationX(dx); - if (animatingForward) { - viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth() + dx); - } else { - viewPages[1].setTranslationX(dx - viewPages[0].getMeasuredWidth()); - } float scrollProgress = Math.abs(dx) / (float) viewPages[0].getMeasuredWidth(); + if (nextPosition == -1) { + onBackProgress(backProgress = scrollProgress); + } else { + viewPages[0].setTranslationX(dx); + if (viewPages[1] != null) { + if (animatingForward) { + viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth() + dx); + } else { + viewPages[1].setTranslationX(dx - viewPages[0].getMeasuredWidth()); + } + } + } if (tabsView != null) { tabsView.selectTab(nextPosition, currentPosition, 1f - scrollProgress); } @@ -389,7 +411,11 @@ public class ViewPagerFixed extends FrameLayout { backAnimation = animatingForward ? velX > 0 : velX < 0; } else { if (animatingForward) { - backAnimation = (viewPages[1].getX() > (viewPages[0].getMeasuredWidth() >> 1)); + if (viewPages[1] != null) { + backAnimation = (viewPages[1].getX() > (viewPages[0].getMeasuredWidth() >> 1)); + } else { + backAnimation = false; + } } else { backAnimation = (viewPages[0].getX() < (viewPages[0].getMeasuredWidth() >> 1)); } @@ -398,34 +424,41 @@ public class ViewPagerFixed extends FrameLayout { backAnimation = Math.abs(x) < viewPages[0].getMeasuredWidth() / 3.0f && (Math.abs(velX) < 3500 || Math.abs(velX) < Math.abs(velY)); } float distToMove; - float dx; + float dx = 0; if (backAnimation) { dx = Math.abs(x); if (animatingForward) { - tabsAnimation.playTogether( - ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, 0), - ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, viewPages[1].getMeasuredWidth()) - ); + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, 0)); + if (viewPages[1] != null) { + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, viewPages[1].getMeasuredWidth())); + } } else { - tabsAnimation.playTogether( - ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, 0), - ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, -viewPages[1].getMeasuredWidth()) - ); + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, 0)); + if (viewPages[1] != null) { + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, -viewPages[1].getMeasuredWidth())); + } } - } else { + } else if (nextPosition >= 0) { dx = viewPages[0].getMeasuredWidth() - Math.abs(x); if (animatingForward) { - tabsAnimation.playTogether( - ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, -viewPages[0].getMeasuredWidth()), - ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, 0) - ); + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, -viewPages[0].getMeasuredWidth())); + if (viewPages[1] != null) { + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, 0)); + } } else { - tabsAnimation.playTogether( - ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, viewPages[0].getMeasuredWidth()), - ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, 0) - ); + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[0], View.TRANSLATION_X, viewPages[0].getMeasuredWidth())); + if (viewPages[1] != null) { + tabsAnimation.playTogether(ObjectAnimator.ofFloat(viewPages[1], View.TRANSLATION_X, 0)); + } } } + if (nextPosition < 0) { + ValueAnimator backAnimator = ValueAnimator.ofFloat(backProgress, backAnimation ? 0f : 1f); + backAnimator.addUpdateListener(anm -> { + onBackProgress(backProgress = (float) anm.getAnimatedValue()); + }); + tabsAnimation.playTogether(backAnimator); + } ValueAnimator animator = ValueAnimator.ofFloat(0,1f); animator.addUpdateListener(updateTabProgress); tabsAnimation.playTogether(animator); @@ -450,6 +483,9 @@ public class ViewPagerFixed extends FrameLayout { @Override public void onAnimationEnd(Animator animator) { tabsAnimation = null; + if (nextPosition < 0) { + onBack(); + } if (viewPages[1] != null) { if (!backAnimation) { swapViews(); @@ -505,12 +541,16 @@ public class ViewPagerFixed extends FrameLayout { if (backAnimation) { if (Math.abs(viewPages[0].getTranslationX()) < 1) { viewPages[0].setTranslationX(0); - viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth() * (animatingForward ? 1 : -1)); + if (viewPages[1] != null) { + viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth() * (animatingForward ? 1 : -1)); + } cancel = true; } } else if (Math.abs(viewPages[1].getTranslationX()) < 1) { viewPages[0].setTranslationX(viewPages[0].getMeasuredWidth() * (animatingForward ? -1 : 1)); - viewPages[1].setTranslationX(0); + if (viewPages[1] != null) { + viewPages[1].setTranslationX(0); + } cancel = true; } if (cancel) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java index fa00a282a..089966b69 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java @@ -24,6 +24,7 @@ import android.widget.TextView; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; @@ -279,7 +280,9 @@ public class ContactAddActivity extends BaseFragment implements NotificationCent if (needAddException) { checkBoxCell = new CheckBoxCell(getParentActivity(), 0); checkBoxCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - checkBoxCell.setText(LocaleController.formatString("SharePhoneNumberWith", R.string.SharePhoneNumberWith, UserObject.getFirstName(user)), "", true, false); + CharSequence firstName = UserObject.getFirstName(user); + firstName = Emoji.replaceEmoji(firstName, infoTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(12), false); + checkBoxCell.setText(AndroidUtilities.replaceCharSequence("%1$s", AndroidUtilities.replaceTags(LocaleController.getString("SharePhoneNumberWith", R.string.SharePhoneNumberWith)), firstName), "", true, false); checkBoxCell.setPadding(AndroidUtilities.dp(7), 0, AndroidUtilities.dp(7), 0); checkBoxCell.setOnClickListener(v -> checkBoxCell.setChecked(!checkBoxCell.isChecked(), true)); linearLayout.addView(checkBoxCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 10, 0, 0)); @@ -303,7 +306,9 @@ public class ContactAddActivity extends BaseFragment implements NotificationCent } if (TextUtils.isEmpty(getPhone())) { nameTextView.setText(LocaleController.getString("MobileHidden", R.string.MobileHidden)); - infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("MobileHiddenExceptionInfo", R.string.MobileHiddenExceptionInfo, UserObject.getFirstName(user)))); + CharSequence firstName = UserObject.getFirstName(user); + firstName = Emoji.replaceEmoji(firstName, infoTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(12), false); + infoTextView.setText(AndroidUtilities.replaceCharSequence("%1$s", AndroidUtilities.replaceTags(LocaleController.getString("MobileHiddenExceptionInfo", R.string.MobileHiddenExceptionInfo)), firstName)); } else { nameTextView.setText(PhoneFormat.getInstance().format("+" + getPhone())); if (needAddException) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java index b51028cda..f26e242e1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java @@ -21,6 +21,7 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.graphics.ColorUtils; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -98,8 +99,9 @@ public class CountrySelectActivity extends BaseFragment { } @Override - public boolean hasForceLightStatusBar() { - return true; + public boolean isLightStatusBar() { + int color = Theme.getColor(Theme.key_windowBackgroundWhite, null, true); + return ColorUtils.calculateLuminance(color) > 0.7f; } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java index 7f3ab706f..adb5ac512 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java @@ -495,8 +495,10 @@ public class DataSettingsActivity extends BaseFragment { textCell.setCanDisable(false); textCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); if (position == storageUsageRow) { + textCell.setIcon(R.drawable.msg_storage_usage); textCell.setText(LocaleController.getString("StorageUsage", R.string.StorageUsage), true); } else if (position == useLessDataForCallsRow) { + textCell.setIcon(0); SharedPreferences preferences = MessagesController.getGlobalMainSettings(); String value = null; switch (preferences.getInt("VoipDataSaving", VoIPHelper.getDataSavingDefault())) { @@ -516,8 +518,10 @@ public class DataSettingsActivity extends BaseFragment { textCell.setTextAndValue(LocaleController.getString("VoipUseLessData", R.string.VoipUseLessData), value, updateVoipUseLessData, true); updateVoipUseLessData = false; } else if (position == dataUsageRow) { + textCell.setIcon(R.drawable.msg_data_usage); textCell.setText(LocaleController.getString("NetworkUsage", R.string.NetworkUsage), storageNumRow != -1); } else if (position == storageNumRow) { + textCell.setIcon(0); String dir = storageDirs.get(0).getAbsolutePath(); if (!TextUtils.isEmpty(SharedConfig.storageCacheDir)) { for (int a = 0, N = storageDirs.size(); a < N; a++) { @@ -530,14 +534,18 @@ public class DataSettingsActivity extends BaseFragment { } textCell.setTextAndValue(LocaleController.getString("StoragePath", R.string.StoragePath), dir, false); } else if (position == proxyRow) { + textCell.setIcon(0); textCell.setText(LocaleController.getString("ProxySettings", R.string.ProxySettings), false); } else if (position == resetDownloadRow) { + textCell.setIcon(0); textCell.setCanDisable(true); textCell.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText)); textCell.setText(LocaleController.getString("ResetAutomaticMediaDownload", R.string.ResetAutomaticMediaDownload), false); } else if (position == quickRepliesRow){ + textCell.setIcon(0); textCell.setText(LocaleController.getString("VoipQuickReplies", R.string.VoipQuickReplies), false); } else if (position == clearDraftsRow) { + textCell.setIcon(0); textCell.setText(LocaleController.getString("PrivacyDeleteCloudDrafts", R.string.PrivacyDeleteCloudDrafts), false); } break; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 132bfbcc8..d84e64188 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -46,6 +46,7 @@ import android.os.Build; import android.os.Bundle; import android.text.TextPaint; import android.text.TextUtils; +import android.util.LongSparseArray; import android.util.Property; import android.util.StateSet; import android.util.TypedValue; @@ -208,8 +209,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private int initialSearchType = -1; private final String ACTION_MODE_SEARCH_DIALOGS_TAG = "search_dialogs_action_mode"; + private boolean isFirstTab = true; + private boolean rightFragmentTransitionInProgress; - private static class ViewPage extends FrameLayout { + public MessagesStorage.TopicKey getOpenedDialogId() { + return openedDialogId; + } + + public class ViewPage extends FrameLayout { private DialogsRecyclerView listView; private LinearLayoutManager layoutManager; private DialogsAdapter dialogsAdapter; @@ -226,6 +233,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private RecyclerItemsEnterAnimator recyclerItemsEnterAnimator; private boolean isLocked; + private RecyclerListView animationSupportListView; + private DialogsAdapter animationSupportDialogsAdapter; + public ViewPage(Context context) { super(context); } @@ -233,6 +243,39 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. public boolean isDefaultDialogType() { return dialogsType == 0 || dialogsType == 7 || dialogsType == 8; } + + boolean updating; + Runnable updateListRunnable = () -> { + dialogsAdapter.updateList(listView); + listView.updateDialogsOnNextDraw = true; + updating = false; + }; + + public void updateList(boolean animated) { + if (isPaused) { + return; + } + if (animated) { + AndroidUtilities.cancelRunOnUIThread(updateListRunnable); + listView.setItemAnimator(dialogsItemAnimator); + updateListRunnable.run(); + return; + } + if (updating) { + return; + } + updating = true; + if (!dialogsItemAnimator.isRunning()) { + listView.setItemAnimator(null); + } + AndroidUtilities.runOnUIThread(updateListRunnable, 36); + + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + } } private ViewPagerFixed.TabsView searchTabsView; @@ -342,9 +385,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private ArrayList frozenDialogsList; private boolean dialogsListFrozen; - private int dialogRemoveFinished; - private int dialogInsertFinished; - private int dialogChangeFinished; private AlertDialog permissionDialog; private boolean askAboutContacts = true; @@ -380,7 +420,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private boolean canSelectTopics; private String searchString; private String initialSearchString; - private long openedDialogId; + private MessagesStorage.TopicKey openedDialogId = new MessagesStorage.TopicKey(); private boolean cantSendToChannels; private boolean allowSwitchAccount; private boolean checkCanWrite; @@ -456,7 +496,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private int animationIndex = -1; private boolean searchIsShowed; private boolean searchWasFullyShowed; - private boolean whiteActionBar; + public boolean whiteActionBar; private boolean searchFiltersWasShowed; private float progressToActionMode; private ValueAnimator actionBarColorAnimator; @@ -472,6 +512,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable statusDrawable; private DrawerProfileCell.AnimatedStatusView animatedStatusView; + public RightSlidingDialogContainer rightSlidingDialogContainer; public final Property SCROLL_Y = new AnimationProperties.FloatProperty("animationValue") { @Override @@ -532,6 +573,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. public void setPadding(int left, int top, int right, int bottom) { topPadding = top; updateContextViewPosition(); + if (rightSlidingDialogContainer != null) { + rightSlidingDialogContainer.setFragmentViewPadding(topPadding); + } if (whiteActionBar && searchViewPager != null) { searchViewPager.setTranslationY(topPadding - lastMeasuredTopPadding); } else { @@ -589,7 +633,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. return true; } boolean result; - if (child == viewPages[0] || (viewPages.length > 1 && child == viewPages[1]) || child == fragmentContextView || child == fragmentLocationContextView || child == searchViewPager) { + if (child == viewPages[0] || (viewPages.length > 1 && child == viewPages[1]) || child == fragmentContextView || child == fragmentLocationContextView) { canvas.save(); canvas.clipRect(0, -getY() + actionBar.getY() + getActionBarFullHeight(), getMeasuredWidth(), getMeasuredHeight()); if (slideFragmentProgress != 1f) { @@ -610,20 +654,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else { result = super.drawChild(canvas, child, drawingTime); } - if (child == actionBar && parentLayout != null) { - int y = (int) (actionBar.getY() + getActionBarFullHeight()); - parentLayout.drawHeaderShadow(canvas, (int) (255 * (1f - searchAnimationProgress)), y); - if (searchAnimationProgress > 0) { - if (searchAnimationProgress < 1) { - int a = Theme.dividerPaint.getAlpha(); - Theme.dividerPaint.setAlpha((int) (a * searchAnimationProgress)); - canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); - Theme.dividerPaint.setAlpha(a); - } else { - canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); - } - } - } return result; } @@ -636,6 +666,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else { top = (int) (-getY() + actionBar.getY()); } + rightSlidingDialogContainer.setCurrentTop(top + actionBarHeight); if (whiteActionBar) { if (searchAnimationProgress == 1f) { actionBarSearchPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); @@ -699,7 +730,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } tabsYOffset = 0; - if (filtersTabAnimator != null && filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE) { + if ((filtersTabAnimator != null || rightSlidingDialogContainer.hasFragment()) && filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE) { tabsYOffset = -(1f - filterTabsProgress) * filterTabsView.getMeasuredHeight(); filterTabsView.setTranslationY(actionBar.getTranslationY() + tabsYOffset); filterTabsView.setAlpha(filterTabsProgress); @@ -715,6 +746,22 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. windowBackgroundPaint.setAlpha((int) (windowBackgroundPaint.getAlpha() * searchAnimationProgress)); canvas.drawRect(0, top + actionBarHeight, getMeasuredWidth(), top + actionBar.getMeasuredHeight() + searchTabsView.getMeasuredHeight(), windowBackgroundPaint); } + + if (parentLayout != null && actionBar != null && !actionBar.getCastShadows()) { + int y = (int) (actionBar.getY() + getActionBarFullHeight()); + parentLayout.drawHeaderShadow(canvas, (int) (255 * (1f - searchAnimationProgress)), y); + if (searchAnimationProgress > 0) { + if (searchAnimationProgress < 1) { + int a = Theme.dividerPaint.getAlpha(); + Theme.dividerPaint.setAlpha((int) (a * searchAnimationProgress)); + canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); + Theme.dividerPaint.setAlpha(a); + } else { + canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); + } + } + } + if (fragmentContextView != null && fragmentContextView.isCallStyle()) { canvas.save(); canvas.translate(fragmentContextView.getX(), fragmentContextView.getY()); @@ -834,10 +881,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. int h; if (filterTabsView != null && filterTabsView.getVisibility() == VISIBLE) { h = heightSize - inputFieldHeight + AndroidUtilities.dp(2) - AndroidUtilities.dp(44) - topPadding; + if (rightSlidingDialogContainer.hasFragment()) { + h += AndroidUtilities.dp(44); + } } else { h = heightSize - inputFieldHeight + AndroidUtilities.dp(2) - (onlySelect ? 0 : actionBar.getMeasuredHeight()) - topPadding; } - if (filtersTabAnimator != null && filterTabsView != null && filterTabsView.getVisibility() == VISIBLE) { h += filterTabsMoveFrom; } else { @@ -865,6 +914,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else { child.measure(View.MeasureSpec.makeMeasureSpec(widthSize, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(child.getLayoutParams().height, View.MeasureSpec.EXACTLY)); } + } else if (child == rightSlidingDialogContainer){ + int h = View.MeasureSpec.getSize(heightMeasureSpec); + int transitionPadding = ((isSlideBackTransition || isDrawerTransition) ? (int) (h * 0.05f) : 0); + h += transitionPadding; + rightSlidingDialogContainer.setTransitionPaddingBottom(transitionPadding); + child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(Math.max(AndroidUtilities.dp(10), h), View.MeasureSpec.EXACTLY)); } else { measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); } @@ -1001,7 +1056,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public boolean onTouchEvent(MotionEvent ev) { - if (parentLayout != null && filterTabsView != null && !filterTabsView.isEditing() && !searching && + if (parentLayout != null && filterTabsView != null && !filterTabsView.isEditing() && !searching && !rightSlidingDialogContainer.hasFragment() && !parentLayout.checkTransitionAnimation() && !parentLayout.isInPreviewMode() && !parentLayout.isPreviewOpenAnimationInProgress() && !parentLayout.getDrawerLayoutContainer().isDrawerOpened() && (ev == null || startedTracking || ev.getY() > actionBar.getMeasuredHeight() + actionBar.getTranslationY()) && SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS) { if (ev != null) { @@ -1189,9 +1244,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. viewPages[0].dialogsAdapter.resume(); viewPages[1].dialogsAdapter.pause(); } - if (parentLayout != null) { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(viewPages[0].selectedType == filterTabsView.getFirstTabId() || searchIsShowed || SharedConfig.getChatSwipeAction(currentAccount) != SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS); - } + isFirstTab = viewPages[0].selectedType == filterTabsView.getFirstTabId(); + updateDrawerSwipeEnabled(); viewPages[1].setVisibility(View.GONE); showScrollbars(true); tabsAnimationInProgress = false; @@ -1205,7 +1259,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. tabsAnimationInProgress = true; startedTracking = false; } else { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(viewPages[0].selectedType == filterTabsView.getFirstTabId() || searchIsShowed || SharedConfig.getChatSwipeAction(currentAccount) != SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS); + isFirstTab = viewPages[0].selectedType == filterTabsView.getFirstTabId(); + updateDrawerSwipeEnabled(); maybeStartTracking = false; actionBar.setEnabled(true); filterTabsView.setEnabled(true); @@ -1260,15 +1315,24 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. public class DialogsRecyclerView extends BlurredRecyclerView { + public boolean updateDialogsOnNextDraw; private boolean firstLayout = true; private boolean ignoreLayout; private final ViewPage parentPage; private int appliedPaddingTop; private int lastTop; private int lastListPadding; + private float rightFragmentOpenedProgress; Paint paint = new Paint(); RectF rectF = new RectF(); + private RecyclerListView animationSupportListView; + LongSparseArray animationSupportViewsByDialogId; + private Paint selectorPaint; + float lastDrawSelectorY; + float selectorPositionProgress = 1f; + float animateFromSelectorPosition; + boolean animateSwitchingSelector; public DialogsRecyclerView(Context context, ViewPage page) { super(context); @@ -1276,6 +1340,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. additionalClipBottom = AndroidUtilities.dp(200); } + public void prepareSelectorForAnimation() { + selectorPositionProgress = 0; + animateFromSelectorPosition = lastDrawSelectorY; + animateSwitchingSelector = rightFragmentOpenedProgress != 0; + } + @Override protected boolean updateEmptyViewAnimated() { return true; @@ -1334,9 +1404,184 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. super.onDraw(canvas); } + @Override protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); + canvas.save(); + if (rightFragmentOpenedProgress > 0) { + canvas.clipRect(0, 0, AndroidUtilities.lerp(getMeasuredWidth(), AndroidUtilities.dp(RightSlidingDialogContainer.getRightPaddingSize()), rightFragmentOpenedProgress), getMeasuredHeight()); + paint.setColor(Theme.getColor(Theme.key_chats_pinnedOverlay)); + paint.setAlpha((int) (paint.getAlpha() * rightFragmentOpenedProgress)); + canvas.drawRect(0, 0, AndroidUtilities.dp(RightSlidingDialogContainer.getRightPaddingSize()), getMeasuredHeight(), paint); + + + int alpha = Theme.dividerPaint.getAlpha(); + Theme.dividerPaint.setAlpha((int) (rightFragmentOpenedProgress * alpha)); + canvas.drawRect(AndroidUtilities.dp(RightSlidingDialogContainer.getRightPaddingSize()), 0, AndroidUtilities.dp(RightSlidingDialogContainer.getRightPaddingSize()) - 1, getMeasuredHeight(), Theme.dividerPaint); + Theme.dividerPaint.setAlpha(alpha); + } + + int maxSupportedViewsPosition = Integer.MIN_VALUE; + int minSupportedViewsPosition = Integer.MAX_VALUE; + + if (animationSupportListView != null) { + if (animationSupportViewsByDialogId == null) { + animationSupportViewsByDialogId = new LongSparseArray<>(); + } + + for (int i = 0; i < animationSupportListView.getChildCount(); i++) { + View child = animationSupportListView.getChildAt(i); + if (child instanceof DialogCell && child.getBottom() > 0) { + animationSupportViewsByDialogId.put(((DialogCell) child).getDialogId(), child); + } + } + } + + float maxTop = Integer.MAX_VALUE; + float maxBottom = Integer.MIN_VALUE; + DialogCell selectedCell = null; + for (int i = 0; i < getChildCount(); i++) { + View view = getChildAt(i); + DialogCell dialogCell = null; + if (view instanceof DialogCell) { + dialogCell = (DialogCell) view; + dialogCell.setRightFragmentOpenedProgress(rightFragmentOpenedProgress); + if (AndroidUtilities.isTablet()) { + dialogCell.setDialogSelected(dialogCell.getDialogId() == openedDialogId.dialogId); + } + if (animationSupportViewsByDialogId != null && animationSupportListView != null) { + View animateToView = animationSupportViewsByDialogId.get(dialogCell.getDialogId()); + + animationSupportViewsByDialogId.delete(dialogCell.getDialogId()); + if (animateToView != null) { + int supportViewPosition = animationSupportListView.getChildLayoutPosition(animateToView); + if (supportViewPosition > maxSupportedViewsPosition) { + maxSupportedViewsPosition = supportViewPosition; + } + if (supportViewPosition < minSupportedViewsPosition) { + minSupportedViewsPosition = supportViewPosition; + } + dialogCell.collapseOffset = (animateToView.getTop() - dialogCell.getTop()) * rightFragmentOpenedProgress; + + if (dialogCell.getTop() + dialogCell.collapseOffset < maxTop) { + maxTop = dialogCell.getTop() + dialogCell.collapseOffset; + } + float bottom = dialogCell.getTop() + AndroidUtilities.lerp(dialogCell.getMeasuredHeight(), animateToView.getMeasuredHeight(), rightFragmentOpenedProgress); + if (bottom + dialogCell.collapseOffset > maxBottom) { + maxBottom = bottom + dialogCell.collapseOffset; + } + } + } + if (updateDialogsOnNextDraw) { + if (dialogCell.update(0, true)) { + int p = getChildAdapterPosition(dialogCell); + if (p >= 0) { + getAdapter().notifyItemChanged(p); + } + } + } + if (dialogCell.getDialogId() == rightSlidingDialogContainer.getCurrentFragmetDialogId()) { + selectedCell = dialogCell; + } + } + if (animationSupportListView != null) { + int restoreCount = canvas.save(); + canvas.translate(view.getX(), view.getY()); + if (dialogCell == null) { + canvas.saveLayerAlpha(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight(), (int) (255 * (1f - rightFragmentOpenedProgress)), Canvas.ALL_SAVE_FLAG); + } + view.draw(canvas); + + if (dialogCell != null && dialogCell != selectedCell) { + dialogCell.collapseOffset = 0; + } + canvas.restoreToCount(restoreCount); + } + } + + + if (selectedCell != null) { + canvas.save(); + lastDrawSelectorY = selectedCell.getY() + selectedCell.collapseOffset + selectedCell.avatarImage.getImageY(); + selectedCell.collapseOffset = 0; + if (selectorPositionProgress != 1f) { + selectorPositionProgress += 16 / 200f; + selectorPositionProgress = Utilities.clamp(selectorPositionProgress, 1f, 0f); + invalidate(); + } + float selectorPositionProgress = CubicBezierInterpolator.DEFAULT.getInterpolation(this.selectorPositionProgress); + boolean animateInOut = false; + if (selectorPositionProgress != 1f && animateFromSelectorPosition != Integer.MIN_VALUE) { + if (Math.abs(animateFromSelectorPosition - lastDrawSelectorY) < getMeasuredHeight() * 0.4f) { + lastDrawSelectorY = AndroidUtilities.lerp(animateFromSelectorPosition, lastDrawSelectorY, selectorPositionProgress); + } else { + animateInOut = true; + } + } + + float hideProgrss = animateSwitchingSelector && (animateInOut || animateFromSelectorPosition == Integer.MIN_VALUE) ? (1f - selectorPositionProgress) : (1f - rightFragmentOpenedProgress); + if (hideProgrss == 1f) { + lastDrawSelectorY = Integer.MIN_VALUE; + } + float xOffset = -AndroidUtilities.dp(5) * hideProgrss; + AndroidUtilities.rectTmp.set(-AndroidUtilities.dp(4) + xOffset, lastDrawSelectorY - AndroidUtilities.dp(1), AndroidUtilities.dp(4) + xOffset, lastDrawSelectorY + selectedCell.avatarImage.getImageHeight() + AndroidUtilities.dp(1)); + if (selectorPaint == null) { + selectorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + } + selectorPaint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton)); + canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(4), AndroidUtilities.dp(4), selectorPaint); + canvas.restore(); + } else { + lastDrawSelectorY = Integer.MIN_VALUE; + } + + //undrawing views + if (animationSupportViewsByDialogId != null) { + float maxUndrawTop = Integer.MIN_VALUE; + float maxUndrawBottom = Integer.MAX_VALUE; + for (int i = 0; i < animationSupportViewsByDialogId.size(); i++) { + View view = animationSupportViewsByDialogId.valueAt(i); + int position = animationSupportListView.getChildLayoutPosition(view); + if ( position < minSupportedViewsPosition && view.getTop() > maxUndrawTop) { + maxUndrawTop = view.getTop(); + } + if (position > maxSupportedViewsPosition && view.getBottom() < maxUndrawBottom) { + maxUndrawBottom = view.getBottom(); + } + } + for (int i = 0; i < animationSupportViewsByDialogId.size(); i++) { + View view = animationSupportViewsByDialogId.valueAt(i); + if (view instanceof DialogCell) { + int position = animationSupportListView.getChildLayoutPosition(view); + DialogCell dialogCell = (DialogCell) view; + dialogCell.isTransitionSupport = false; + dialogCell.buildLayout(); + dialogCell.isTransitionSupport = true; + dialogCell.setRightFragmentOpenedProgress(rightFragmentOpenedProgress); + + int restoreCount = canvas.save(); + if (position > maxSupportedViewsPosition) { + canvas.translate(view.getX(), maxBottom + view.getBottom() - maxUndrawBottom); + } else { + canvas.translate(view.getX(), maxBottom + view.getTop() - maxUndrawTop); + } + view.draw(canvas); + + canvas.restoreToCount(restoreCount); + } + } + animationSupportViewsByDialogId.clear(); + } + + updateDialogsOnNextDraw = false; + if (animationSupportListView != null) { + invalidate(); + } + + if (animationSupportListView == null) { + super.dispatchDraw(canvas); + } + if (drawMovingViewsOverlayed()) { paint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); for (int i = 0; i < getChildCount(); i++) { @@ -1363,7 +1608,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private boolean drawMovingViewsOverlayed() { - return getItemAnimator() != null && getItemAnimator().isRunning() && (dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0); + return getItemAnimator() != null && getItemAnimator().isRunning(); } @Override @@ -1385,15 +1630,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. firstLayout = true; } - private void checkIfAdapterValid() { - RecyclerView.Adapter adapter = getAdapter(); - if (parentPage.lastItemsCount != adapter.getItemCount() && !dialogsListFrozen) { - ignoreLayout = true; - adapter.notifyDataSetChanged(); - ignoreLayout = false; - } - } - @Override protected void onMeasure(int widthSpec, int heightSpec) { int t = 0; @@ -1438,10 +1674,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } firstLayout = false; } - checkIfAdapterValid(); super.onMeasure(widthSpec, heightSpec); if (!onlySelect) { - if (appliedPaddingTop != t && viewPages != null && viewPages.length > 1) { + if (appliedPaddingTop != t && viewPages != null && viewPages.length > 1 && !startedTracking && (tabsAnimation == null || !tabsAnimation.isRunning()) && !tabsAnimationInProgress && (filterTabsView == null || !filterTabsView.isAnimatingIndicator())) { viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth()); } } @@ -1453,10 +1688,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. lastListPadding = getPaddingTop(); lastTop = t; scrollAdditionalOffset = 0; - - if ((dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0) && !parentPage.dialogsItemAnimator.isRunning()) { - onDialogAnimationFinished(); - } } @Override @@ -1500,7 +1731,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public boolean onTouchEvent(MotionEvent e) { - if (fastScrollAnimationRunning || waitingForScrollFinished || dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0) { + if (fastScrollAnimationRunning || waitingForScrollFinished || parentPage.dialogsItemAnimator.isRunning() || rightFragmentTransitionInProgress) { return false; } int action = e.getAction(); @@ -1519,36 +1750,37 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (DialogObject.isFolderDialogId(dialogId)) { toggleArchiveHidden(false, dialogCell); } else { - ArrayList dialogs = getDialogsArray(currentAccount, parentPage.dialogsType, folderId, false); - TLRPC.Dialog dialog = dialogs.get(dialogCell.getDialogIndex()); - if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_READ) { - ArrayList selectedDialogs = new ArrayList<>(); - selectedDialogs.add(dialogId); - canReadCount = dialog.unread_count > 0 || dialog.unread_mark ? 1 : 0; - performSelectedDialogsAction(selectedDialogs, read, true); - } else if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_MUTE) { - if (!getMessagesController().isDialogMuted(dialogId, 0)) { - NotificationsController.getInstance(UserConfig.selectedAccount).setDialogNotificationsSettings(dialogId, 0, NotificationsController.SETTING_MUTE_FOREVER); - if (BulletinFactory.canShowBulletin(DialogsActivity.this)) { - BulletinFactory.createMuteBulletin(DialogsActivity.this, NotificationsController.SETTING_MUTE_FOREVER).show(); - } - } else { + TLRPC.Dialog dialog = getMessagesController().dialogs_dict.get(dialogId); + if (dialog != null) { + if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_READ) { ArrayList selectedDialogs = new ArrayList<>(); selectedDialogs.add(dialogId); - canMuteCount = MessagesController.getInstance(currentAccount).isDialogMuted(dialogId, 0) ? 0 : 1; - canUnmuteCount = canMuteCount > 0 ? 0 : 1; - performSelectedDialogsAction(selectedDialogs, mute, true); + canReadCount = dialog.unread_count > 0 || dialog.unread_mark ? 1 : 0; + performSelectedDialogsAction(selectedDialogs, read, true); + } else if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_MUTE) { + if (!getMessagesController().isDialogMuted(dialogId, 0)) { + NotificationsController.getInstance(UserConfig.selectedAccount).setDialogNotificationsSettings(dialogId, 0, NotificationsController.SETTING_MUTE_FOREVER); + if (BulletinFactory.canShowBulletin(DialogsActivity.this)) { + BulletinFactory.createMuteBulletin(DialogsActivity.this, NotificationsController.SETTING_MUTE_FOREVER).show(); + } + } else { + ArrayList selectedDialogs = new ArrayList<>(); + selectedDialogs.add(dialogId); + canMuteCount = MessagesController.getInstance(currentAccount).isDialogMuted(dialogId, 0) ? 0 : 1; + canUnmuteCount = canMuteCount > 0 ? 0 : 1; + performSelectedDialogsAction(selectedDialogs, mute, true); + } + } else if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_PIN) { + ArrayList selectedDialogs = new ArrayList<>(); + selectedDialogs.add(dialogId); + boolean pinned = isDialogPinned(dialog); + canPinCount = pinned ? 0 : 1; + performSelectedDialogsAction(selectedDialogs, pin, true); + } else if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_DELETE) { + ArrayList selectedDialogs = new ArrayList<>(); + selectedDialogs.add(dialogId); + performSelectedDialogsAction(selectedDialogs, delete, true); } - } else if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_PIN) { - ArrayList selectedDialogs = new ArrayList<>(); - selectedDialogs.add(dialogId); - boolean pinned = isDialogPinned(dialog); - canPinCount = pinned ? 0 : 1; - performSelectedDialogsAction(selectedDialogs, pin, true); - } else if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_DELETE) { - ArrayList selectedDialogs = new ArrayList<>(); - selectedDialogs.add(dialogId); - performSelectedDialogsAction(selectedDialogs, delete, true); } } } @@ -1566,7 +1798,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. View view = layoutManager.findViewByPosition(currentPosition); int height = (int) (AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72) * PullForegroundDrawable.SNAP_HEIGHT); int diff = (view.getTop() - pTop) + view.getMeasuredHeight(); - if (view != null) { + if (view instanceof DialogCell) { long pullingTime = System.currentTimeMillis() - startArchivePullingTime; if (diff < height || pullingTime < PullForegroundDrawable.minPullingTime) { disableActionBarScrolling = true; @@ -1614,12 +1846,11 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public boolean onInterceptTouchEvent(MotionEvent e) { - if (fastScrollAnimationRunning || waitingForScrollFinished || dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0) { + if (fastScrollAnimationRunning || waitingForScrollFinished || parentPage.dialogsItemAnimator.isRunning()) { return false; } if (e.getAction() == MotionEvent.ACTION_DOWN) { allowSwipeDuringCurrentTouch = !actionBar.isActionModeShowed(); - checkIfAdapterValid(); } return super.onInterceptTouchEvent(e); } @@ -1631,6 +1862,62 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } return true; } + + public void setOpenRightFragmentProgress(float progress) { + rightFragmentOpenedProgress = progress; + invalidate(); + } + + public void setAnimationSupportView(RecyclerListView animationSupportListView, float scrollOffset, boolean opened) { + RecyclerListView anchorListView = animationSupportListView == null ? this.animationSupportListView : this; + DialogCell anchorView = null; + DialogCell selectedDialogView = null; + if (anchorListView == null) { + this.animationSupportListView = animationSupportListView; + return; + } + int maxTop = Integer.MAX_VALUE; + for (int i = 0; i < anchorListView.getChildCount(); i++) { + View child = anchorListView.getChildAt(i); + if (child instanceof DialogCell) { + DialogCell dialogCell = (DialogCell) child; + if (dialogCell.getDialogId() == rightSlidingDialogContainer.getCurrentFragmetDialogId()) { + selectedDialogView = dialogCell; + } + if (child.getTop() >= getPaddingTop() && dialogCell.getDialogId() != 0 && child.getTop() < maxTop){ + anchorView = (DialogCell) child; + maxTop = anchorView.getTop(); + } + } + } + if (selectedDialogView != null && getAdapter().getItemCount() * AndroidUtilities.dp(70) > getMeasuredHeight() && (anchorView.getTop() - getPaddingTop()) > (getMeasuredHeight() - getPaddingTop()) / 2f) { + anchorView = selectedDialogView; + } + this.animationSupportListView = animationSupportListView; + + if (anchorView != null) { + if (animationSupportListView != null) { + animationSupportListView.setPadding(getPaddingLeft(), topPadding, getPaddingLeft(), getPaddingBottom()); + if (anchorView != null) { + DialogsAdapter adapter = (DialogsAdapter) animationSupportListView.getAdapter(); + int p = adapter.findDialogPosition(anchorView.getDialogId()); + int offset = (int) (anchorView.getTop() - anchorListView.getPaddingTop() + scrollOffset); + if (p >= 0) { + ((LinearLayoutManager) animationSupportListView.getLayoutManager()).scrollToPositionWithOffset(p, adapter.fixScrollGap(this, p, offset, parentPage.dialogsType == 0 && parentPage.archivePullViewState == ARCHIVE_ITEM_STATE_HIDDEN && hasHiddenArchive(), opened)); + } + } + } + DialogsAdapter adapter = (DialogsAdapter) getAdapter(); + int p = adapter.findDialogPosition(anchorView.getDialogId()); + int offset = (int) (anchorView.getTop() - getPaddingTop()); +// if (!opened && offset > (getMeasuredHeight() - getPaddingTop()) / 2) { +// offset -= AndroidUtilities.dp(44); +// } + if (p >= 0) { + ((LinearLayoutManager) getLayoutManager()).scrollToPositionWithOffset(p, offset); + } + } + } } private class SwipeController extends ItemTouchHelper.Callback { @@ -1673,7 +1960,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if ((filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE && SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS) || !allowSwipeDuringCurrentTouch || ((dialogId == getUserConfig().clientUserId || dialogId == 777000) && SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_ARCHIVE) || getMessagesController().isPromoDialog(dialogId, false) && getMessagesController().promoDialogType != MessagesController.PROMO_TYPE_PSA) { return 0; } - boolean canSwipeBack = folderId == 0 && (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_MUTE || SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_READ || SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_PIN || SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_DELETE); + boolean canSwipeBack = folderId == 0 && (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_MUTE || SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_READ || SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_PIN || SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_DELETE) && !rightSlidingDialogContainer.hasFragment(); if (SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_READ) { MessagesController.DialogFilter filter = null; if (viewPages[0].dialogsType == 7 || viewPages[0].dialogsType == 8) { @@ -1708,8 +1995,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } int fromIndex = source.getAdapterPosition(); int toIndex = target.getAdapterPosition(); + parentPage.listView.setItemAnimator(parentPage.dialogsItemAnimator); parentPage.dialogsAdapter.notifyItemMoved(fromIndex, toIndex); - updateDialogIndices(); + if (viewPages[0].dialogsType == 7 || viewPages[0].dialogsType == 8) { MessagesController.DialogFilter filter = getMessagesController().selectedDialogFilter[viewPages[0].dialogsType == 8 ? 1 : 0]; if (!movingDialogFilters.contains(filter)) { @@ -1769,27 +2057,22 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (getMessagesController().isPromoDialog(dialog.id, false)) { getMessagesController().hidePromoDialog(); parentPage.dialogsItemAnimator.prepareForRemove(); - parentPage.lastItemsCount--; - parentPage.dialogsAdapter.notifyItemRemoved(position); - dialogRemoveFinished = 2; + parentPage.updateList(true); } else { int added = getMessagesController().addDialogToFolder(dialog.id, folderId == 0 ? 1 : 0, -1, 0); if (added != 2 || position != 0) { parentPage.dialogsItemAnimator.prepareForRemove(); - parentPage.lastItemsCount--; - parentPage.dialogsAdapter.notifyItemRemoved(position); - dialogRemoveFinished = 2; + parentPage.updateList(true); } if (folderId == 0) { if (added == 2) { parentPage.dialogsItemAnimator.prepareForRemove(); if (position == 0) { - dialogChangeFinished = 2; setDialogsListFrozen(true); - parentPage.dialogsAdapter.notifyItemChanged(0); + parentPage.updateList(true); + checkAnimationFinished(); } else { - parentPage.lastItemsCount++; - parentPage.dialogsAdapter.notifyItemInserted(0); + parentPage.updateList(true); if (!SharedConfig.archiveHidden && parentPage.layoutManager.findFirstVisibleItemPosition() == 0) { disableActionBarScrolling = true; parentPage.listView.smoothScrollBy(0, -AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72)); @@ -1819,27 +2102,25 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (index >= 0) { ArrayList archivedDialogs = getMessagesController().getDialogs(1); if (!archivedDialogs.isEmpty() || index != 1) { - dialogInsertFinished = 2; setDialogsListFrozen(true); parentPage.dialogsItemAnimator.prepareForRemove(); - parentPage.lastItemsCount++; - parentPage.dialogsAdapter.notifyItemInserted(index); + parentPage.updateList(true); + checkAnimationFinished(); } if (archivedDialogs.isEmpty()) { dialogs.remove(0); if (index == 1) { - dialogChangeFinished = 2; setDialogsListFrozen(true); - parentPage.dialogsAdapter.notifyItemChanged(0); + parentPage.updateList(true); + checkAnimationFinished(); } else { frozenDialogsList.remove(0); parentPage.dialogsItemAnimator.prepareForRemove(); - parentPage.lastItemsCount--; - parentPage.dialogsAdapter.notifyItemRemoved(0); + parentPage.updateList(true); } } } else { - parentPage.dialogsAdapter.notifyDataSetChanged(); + parentPage.updateList(false); } }); } @@ -2126,7 +2407,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } @Override - protected ActionBar createActionBar(Context context) { + public ActionBar createActionBar(Context context) { ActionBar actionBar = new ActionBar(context) { @Override @@ -2158,6 +2439,19 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. ((SelectAnimatedEmojiDialog) selectAnimatedEmojiDialog.getContentView()).setScrimDrawable(textView != null && textView.getRightDrawable() == statusDrawable ? statusDrawable : null, textView); } } + + @Override + protected boolean onSearchChangedIgnoreTitles() { + return rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment(); + } + + @Override + public void onSearchFieldVisibilityChanged(boolean visible) { + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { + getBackButton().animate().alpha(visible ? 1f : 0f).start(); + } + super.onSearchFieldVisibilityChanged(visible); + } }; actionBar.setItemsBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSelector), false); actionBar.setItemsBackgroundColor(Theme.getColor(Theme.key_actionBarActionModeDefaultSelector), true); @@ -2207,7 +2501,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updatePasscodeButton(); updateProxyButton(false, false); } - searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true, true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true, false).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { boolean isSpeedItemCreated = false; @Override @@ -2336,7 +2630,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public boolean canToggleSearch() { - return !actionBar.isActionModeShowed() && databaseMigrationHint == null; + return !actionBar.isActionModeShowed() && databaseMigrationHint == null;// && !rightSlidingDialogContainer.hasFragment(); } }); @@ -2502,9 +2796,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (!tab.isDefault && (tab.id < 0 || tab.id >= dialogFilters.size())) { return; } - if (parentLayout != null) { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(tab.id == filterTabsView.getFirstTabId() || SharedConfig.getChatSwipeAction(currentAccount) != SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS); - } + isFirstTab = tab.id == filterTabsView.getFirstTabId(); + updateDrawerSwipeEnabled(); + viewPages[1].selectedType = tab.id; viewPages[1].setVisibility(View.VISIBLE); viewPages[1].setTranslationX(viewPages[0].getMeasuredWidth()); @@ -2819,6 +3113,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. viewPage.addView(viewPage.progressView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); viewPage.listView = new DialogsRecyclerView(context, viewPage); + viewPage.listView.setAllowStopHeaveOperations(true); viewPage.listView.setAccessibilityEnabled(false); viewPage.listView.setAnimateEmptyView(true, RecyclerListView.EMPTY_VIEW_ANIMATION_TYPE_ALPHA); viewPage.listView.setClipToPadding(false); @@ -2840,36 +3135,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } } - - @Override - public void onRemoveFinished(RecyclerView.ViewHolder item) { - if (dialogRemoveFinished == 2) { - dialogRemoveFinished = 1; - } - } - - @Override - public void onAddFinished(RecyclerView.ViewHolder item) { - if (dialogInsertFinished == 2) { - dialogInsertFinished = 1; - } - } - - @Override - public void onChangeFinished(RecyclerView.ViewHolder item, boolean oldItem) { - if (dialogChangeFinished == 2) { - dialogChangeFinished = 1; - } - } - - @Override - protected void onAllAnimationsDone() { - if (dialogRemoveFinished == 1 || dialogInsertFinished == 1 || dialogChangeFinished == 1) { - onDialogAnimationFinished(); - } - } }; - viewPage.listView.setItemAnimator(viewPage.dialogsItemAnimator); viewPage.listView.setVerticalScrollBarEnabled(true); viewPage.listView.setInstantClick(true); viewPage.layoutManager = new LinearLayoutManager(context) { @@ -3119,6 +3385,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private boolean wasManualScroll; + private boolean stoppedAllHeavyOperations; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { @@ -3128,6 +3395,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. scrollingManually = false; } if (newState == RecyclerView.SCROLL_STATE_IDLE) { + wasManualScroll = false; disableActionBarScrolling = false; if (waitingForScrollFinished) { @@ -3184,7 +3452,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } } - if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE && recyclerView == viewPages[0].listView && !searching && !actionBar.isActionModeShowed() && !disableActionBarScrolling && filterTabsViewIsVisible) { + if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE && recyclerView == viewPages[0].listView && !searching && !actionBar.isActionModeShowed() && !disableActionBarScrolling && filterTabsViewIsVisible && !rightSlidingDialogContainer.hasFragment()) { if (dy > 0 && hasHiddenArchive() && viewPages[0].dialogsType == 0) { View child = recyclerView.getChildAt(0); if (child != null) { @@ -3216,6 +3484,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (fragmentView != null) { ((SizeNotifierFrameLayout) fragmentView).invalidateBlur(); } + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { + viewPage.listView.invalidate(); + } } }); @@ -3249,7 +3520,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public void onButtonClicked(DialogCell dialogCell) { if (dialogCell.getMessage() != null) { - TLRPC.TL_forumTopic topic = getMessagesController().getTopicsController().findTopic(-dialogCell.getDialogId(), MessageObject.getTopicId(dialogCell.getMessage().messageOwner)); + TLRPC.TL_forumTopic topic = getMessagesController().getTopicsController().findTopic(-dialogCell.getDialogId(), MessageObject.getTopicId(dialogCell.getMessage().messageOwner, true)); if (topic != null) { if (onlySelect) { didSelectResult(dialogCell.getDialogId(), topic.id, false, false); @@ -3265,9 +3536,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. onItemLongClick(viewPage.listView, dialogCell, viewPage.listView.getChildAdapterPosition(dialogCell), 0, 0, viewPage.dialogsType, viewPage.dialogsAdapter); } }; + viewPage.dialogsAdapter.setRecyclerListView(viewPage.listView); viewPage.dialogsAdapter.setForceShowEmptyCell(afterSignup); - if (AndroidUtilities.isTablet() && openedDialogId != 0) { - viewPage.dialogsAdapter.setOpenedDialogId(openedDialogId); + if (AndroidUtilities.isTablet() && openedDialogId.dialogId != 0) { + viewPage.dialogsAdapter.setOpenedDialogId(openedDialogId.dialogId); } viewPage.dialogsAdapter.setArchivedPullDrawable(viewPage.pullForegroundDrawable); viewPage.listView.setAdapter(viewPage.dialogsAdapter); @@ -3310,6 +3582,34 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. protected void onTabPageSelected(int position) { updateSpeedItem(position == 2); } + + @Override + protected long getDialogId(String query) { + if (query != null && query.length() > 0 && rightSlidingDialogContainer != null && rightSlidingDialogContainer.getFragment() instanceof TopicsFragment) { + return ((TopicsFragment) rightSlidingDialogContainer.getFragment()).getDialogId(); + } + return 0; + } + + @Override + protected boolean onBackProgress(float progress) { + return false; +// setSearchAnimationProgress(1f - progress, true); +// return true; + } + +// @Override +// protected void onBack() { +// actionBar.onSearchFieldVisibilityChanged(searchItem.toggleSearch(false)); +// } + + @Override + protected boolean includeDownloads() { + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { + return false; + } + return true; + } }; contentView.addView(searchViewPager); @@ -3355,7 +3655,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. closeSearch(); if (AndroidUtilities.isTablet() && viewPages != null) { for (int a = 0; a < viewPages.length; a++) { - viewPages[a].dialogsAdapter.setOpenedDialogId(openedDialogId = did); + viewPages[a].dialogsAdapter.setOpenedDialogId(openedDialogId.dialogId = did); } updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); } @@ -3434,6 +3734,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. public boolean isSelected(long dialogId) { return selectedDialogs.contains(dialogId); } + + @Override + public long getSearchForumDialogId() { + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.getFragment() instanceof TopicsFragment) { + return ((TopicsFragment) rightSlidingDialogContainer.getFragment()).getDialogId(); + } + return 0; + } }); searchViewPager.searchListView.setOnItemClickListener((view, position) -> { @@ -3969,14 +4277,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. AndroidUtilities.runOnUIThread(() -> { if (frozenDialogsList != null) { frozenDialogsList.add(finalSelectedIndex, dialog); - viewPages[0].dialogsAdapter.notifyItemInserted(finalSelectedIndex); - dialogInsertFinished = 2; + viewPages[0].updateList(true); } }); } else { setDialogsListFrozen(false); } } + checkAnimationFinished(); } } }; @@ -4037,7 +4345,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } searchIsShowed = false; - updateFilterTabs(false, false); + updateFilterTabs(true, false); if (searchString != null) { showSearch(true, false, false); @@ -4058,9 +4366,166 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } updateMenuButton(false); actionBar.setDrawBlurBackground(contentView); + + rightSlidingDialogContainer = new RightSlidingDialogContainer(context) { + + boolean anotherFragmentOpened; + DialogsActivity.ViewPage transitionPage; + + float fromScrollYProperty; + + @Override + boolean getOccupyStatusbar() { + return actionBar != null && actionBar.getOccupyStatusBar(); + } + + @Override + public void openAnimationStarted(boolean open) { + if (!isArchive()) { + actionBar.setBackButtonDrawable(menuDrawable = new MenuDrawable()); + menuDrawable.setRoundCap(); + } + + rightFragmentTransitionInProgress = true; + contentView.requestLayout(); + fromScrollYProperty = actionBar.getTranslationY(); + + if (canShowFilterTabsView && filterTabsView != null) { + filterTabsView.setVisibility(View.VISIBLE); + } + transitionPage = viewPages[0]; + if (transitionPage.animationSupportListView == null) { + transitionPage.animationSupportListView = new BlurredRecyclerView(context) { + + @Override + protected void dispatchDraw(Canvas canvas) { + + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + return false; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent e) { + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + return false; + } + }; + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + layoutManager.setNeedFixEndGap(false); + transitionPage.animationSupportListView.setLayoutManager(layoutManager); + transitionPage.animationSupportDialogsAdapter = new DialogsAdapter(DialogsActivity.this, context, transitionPage.dialogsType, folderId, onlySelect, selectedDialogs, currentAccount); + transitionPage.animationSupportDialogsAdapter.setIsTransitionSupport(); + transitionPage.animationSupportListView.setAdapter(transitionPage.animationSupportDialogsAdapter); + transitionPage.addView(transitionPage.animationSupportListView); + } + + transitionPage.animationSupportDialogsAdapter.setDialogsType(transitionPage.dialogsType); + transitionPage.dialogsAdapter.setCollapsedView(false, transitionPage.listView); + transitionPage.dialogsAdapter.setDialogsListFrozen(true); + transitionPage.animationSupportDialogsAdapter.setDialogsListFrozen(true); + transitionPage.layoutManager.setNeedFixEndGap(false); + setDialogsListFrozen(true); + hideFloatingButton(anotherFragmentOpened); + transitionPage.dialogsAdapter.notifyDataSetChanged(); + transitionPage.animationSupportDialogsAdapter.notifyDataSetChanged(); + transitionPage.listView.setAnimationSupportView(transitionPage.animationSupportListView, -actionBar.getTranslationY(), open); + transitionPage.listView.setClipChildren(false); + actionBar.setAllowOverlayTitle(false); + transitionPage.listView.stopScroll(); + } + + @Override + public void openAnimationFinished() { + if (!canShowFilterTabsView && filterTabsView != null) { + filterTabsView.setVisibility(View.GONE); + } + transitionPage.layoutManager.setNeedFixGap(true); + transitionPage.dialogsAdapter.setCollapsedView(hasFragment(), transitionPage.listView); + transitionPage.dialogsAdapter.setDialogsListFrozen(false); + transitionPage.animationSupportDialogsAdapter.setDialogsListFrozen(false); + setDialogsListFrozen(false); + transitionPage.listView.setClipChildren(true); + transitionPage.listView.invalidate(); + transitionPage.dialogsAdapter.notifyDataSetChanged(); + transitionPage.animationSupportDialogsAdapter.notifyDataSetChanged(); + transitionPage.listView.setAnimationSupportView(null, 0, hasFragment()); + rightFragmentTransitionInProgress = false; + actionBar.setAllowOverlayTitle(!hasFragment()); + contentView.requestLayout(); + transitionPage.layoutManager.setNeedFixEndGap(!hasFragment()); + DialogsActivity.this.setScrollY(0); + searchViewPager.updateTabs(); + } + + @Override + void setOpenProgress(float progress) { + boolean opened = progress > 0f; + if (anotherFragmentOpened != opened) { + anotherFragmentOpened = opened; + } + filterTabsMoveFrom = AndroidUtilities.dp(44); + filterTabsProgress = canShowFilterTabsView ? 1f - progress : 0; + if (fragmentView != null) { + fragmentView.invalidate(); + } + + DialogsActivity.this.setScrollY(AndroidUtilities.lerp(fromScrollYProperty, 0, progress)); + updateDrawerSwipeEnabled(); + if (menuDrawable != null && hasFragment()) { + menuDrawable.setRotation(progress, false); + } + actionBar.getTitleTextView().setAlpha(1f - progress); + if (actionBar.getTitleTextView().getAlpha() > 0) { + actionBar.getTitleTextView().setVisibility(View.VISIBLE); + } + if (proxyItem != null) { + proxyItem.setAlpha(1f - progress); + } + if (downloadsItem != null) { + downloadsItem.setAlpha(1f - progress); + } + if (passcodeItem != null) { + passcodeItem.setAlpha(1f - progress); + } + if (searchItem != null) { + searchItem.setAlpha(anotherFragmentOpened ? 0 : 1f); + } + if (actionBar.getBackButton() != null) { + actionBar.getBackButton().setAlpha(progress == 1f ? 0f : 1f); + } + + if (folderId != 0) { + actionBarDefaultPaint.setColor( + ColorUtils.blendARGB( + Theme.getColor(Theme.key_actionBarDefaultArchived), + Theme.getColor(Theme.key_actionBarDefault), + progress + ) + ); + } + + if (transitionPage != null) { + transitionPage.listView.setOpenRightFragmentProgress(progress); + } + } + }; + rightSlidingDialogContainer.setOpenProgress(0f); + contentView.addView(rightSlidingDialogContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); return fragmentView; } +// @Override +// public ActionBar getActionBar() { +// return rightSlidingDialogContainer != null && rightSlidingDialogContainer.currentActionBarView != null && rightSlidingDialogContainer.isOpenned ? rightSlidingDialogContainer.currentActionBarView : super.getActionBar(); +// } + public void showSelectStatusDialog() { if (selectAnimatedEmojiDialog != null || SharedConfig.appLocked) { return; @@ -4438,7 +4903,19 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. return; } if (id == -1) { - if (filterTabsView != null && filterTabsView.isEditing()) { + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { + if (actionBar.isActionModeShowed()) { + if (searchViewPager != null && searchViewPager.getVisibility() == View.VISIBLE && searchViewPager.actionModeShowing()) { + searchViewPager.hideActionMode(); + } else { + hideActionMode(true); + } + } else { + rightSlidingDialogContainer.finishPreview(); + searchViewPager.updateTabs(); + return; + } + } else if (filterTabsView != null && filterTabsView.isEditing()) { filterTabsView.setIsEditing(false); showDoneItem(false); } else if (actionBar.isActionModeShowed()) { @@ -4598,19 +5075,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } - private void scrollToFilterTab(int index) { - if (filterTabsView == null || viewPages[0].selectedType == index) { - return; - } - filterTabsView.selectTabWithId(index, 1.0f); - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(false); - viewPages[1].selectedType = viewPages[0].selectedType; - viewPages[0].selectedType = index; - switchToCurrentSelectedMode(false); - switchToCurrentSelectedMode(true); - updateCounters(false); - } - private void updateFilterTabs(boolean force, boolean animated) { if (filterTabsView == null || inPreviewMode || searchIsShowed) { return; @@ -4664,9 +5128,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (updateCurrentTab) { switchToCurrentSelectedMode(false); } - if (parentLayout != null) { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(id == filterTabsView.getFirstTabId() || SharedConfig.getChatSwipeAction(currentAccount) != SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS); - } + isFirstTab = id == filterTabsView.getFirstTabId(); + updateDrawerSwipeEnabled(); if (filterTabsView.isLocked(filterTabsView.getCurrentTabId())) { filterTabsView.selectFirstTab(); } @@ -4707,13 +5170,17 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. viewPages[a].requestLayout(); } } - if (parentLayout != null) { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(true); - } + updateDrawerSwipeEnabled(); } updateCounters(false); } + private void updateDrawerSwipeEnabled() { + if (parentLayout != null && parentLayout.getDrawerLayoutContainer() != null) { + parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(isFirstTab && !searchIsShowed && SharedConfig.getChatSwipeAction(currentAccount) == SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS && (rightSlidingDialogContainer == null || !rightSlidingDialogContainer.hasFragment())); + } + } + @Override protected void onPanTranslationUpdate(float y) { if (viewPages == null) { @@ -4756,13 +5223,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public void onResume() { super.onResume(); + if (rightSlidingDialogContainer != null) { + rightSlidingDialogContainer.onResume(); + } if (!parentLayout.isInPreviewMode() && blurredView != null && blurredView.getVisibility() == View.VISIBLE) { blurredView.setVisibility(View.GONE); blurredView.setBackground(null); } - if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE) { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(viewPages[0].selectedType == filterTabsView.getFirstTabId() || searchIsShowed || SharedConfig.getChatSwipeAction(currentAccount) != SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS); - } + updateDrawerSwipeEnabled(); if (viewPages != null) { for (int a = 0; a < viewPages.length; a++) { viewPages[a].dialogsAdapter.notifyDataSetChanged(); @@ -4905,11 +5373,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public void onPause() { super.onPause(); + if (rightSlidingDialogContainer != null) { + rightSlidingDialogContainer.onPause(); + } if (scrimPopupWindow != null) { scrimPopupWindow.dismiss(); } if (commentView != null) { - commentView.onResume(); + commentView.onPause(); } if (undoView[0] != null) { undoView[0].hide(true, 0); @@ -4925,7 +5396,13 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. @Override public boolean onBackPressed() { - if (scrimPopupWindow != null) { + if (rightSlidingDialogContainer.hasFragment()) { + if (rightSlidingDialogContainer.getFragment().onBackPressed()) { + rightSlidingDialogContainer.finishPreview(); + searchViewPager.updateTabs(); + } + return false; + } else if (scrimPopupWindow != null) { scrimPopupWindow.dismiss(); return false; } else if (filterTabsView != null && filterTabsView.isEditing()) { @@ -4978,6 +5455,31 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } + @Override + public void onBecomeFullyVisible() { + super.onBecomeFullyVisible(); + if (SharedConfig.useLNavigation) { + if (viewPages != null) { + for (int a = 0; a < viewPages.length; a++) { + if (viewPages[a].dialogsType == 0 && viewPages[a].archivePullViewState == ARCHIVE_ITEM_STATE_HIDDEN && viewPages[a].layoutManager.findFirstVisibleItemPosition() == 0 && hasHiddenArchive()) { + viewPages[a].layoutManager.scrollToPositionWithOffset(1, 0); + } + if (a == 0) { + viewPages[a].dialogsAdapter.resume(); + } else { + viewPages[a].dialogsAdapter.pause(); + } + } + } + if (searchIsShowed) { + AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); + } + updateVisibleRows(0, false); + updateProxyButton(false, true); + checkSuggestClearDatabase(); + } + } + @Override public void setInPreviewMode(boolean value) { super.setInPreviewMode(value); @@ -5091,17 +5593,15 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. editText.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSearch)); } searchViewPager.setKeyboardHeight(((ContentView) fragmentView).getKeyboardHeight()); - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(true); + updateDrawerSwipeEnabled(); searchViewPager.clear(); - if (folderId != 0) { + if (folderId != 0 && (rightSlidingDialogContainer == null || !rightSlidingDialogContainer.hasFragment())) { FiltersView.MediaFilterData filterData = new FiltersView.MediaFilterData(R.drawable.chats_archive, LocaleController.getString("ArchiveSearchFilter", R.string.ArchiveSearchFilter), null, FiltersView.FILTER_TYPE_ARCHIVE); addSearchFilter(filterData); } } else { - if (filterTabsView != null && parentLayout != null) { - parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(viewPages[0].selectedType == filterTabsView.getFirstTabId() || SharedConfig.getChatSwipeAction(currentAccount) != SwipeGestureSettingsView.SWIPE_GESTURE_FOLDERS); - } + updateDrawerSwipeEnabled(); } if (animated && searchViewPager.dialogsSearchAdapter.hasRecentSearch()) { @@ -5134,6 +5634,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. animators.add(ObjectAnimator.ofFloat(viewPages[0], View.ALPHA, show ? 0.0f : 1.0f)); animators.add(ObjectAnimator.ofFloat(viewPages[0], View.SCALE_X, show ? 0.9f : 1.0f)); animators.add(ObjectAnimator.ofFloat(viewPages[0], View.SCALE_Y, show ? 0.9f : 1.0f)); + if (rightSlidingDialogContainer != null) { + rightSlidingDialogContainer.setVisibility(View.VISIBLE); + animators.add(ObjectAnimator.ofFloat(rightSlidingDialogContainer, View.ALPHA, show ? 0.0f : 1.0f)); + } animators.add(ObjectAnimator.ofFloat(searchViewPager, View.ALPHA, show ? 1.0f : 0.0f)); animators.add(ObjectAnimator.ofFloat(searchViewPager, View.SCALE_X, show ? 1.0f : 1.05f)); animators.add(ObjectAnimator.ofFloat(searchViewPager, View.SCALE_Y, show ? 1.0f : 1.05f)); @@ -5161,7 +5665,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } ValueAnimator valueAnimator = ValueAnimator.ofFloat(searchAnimationProgress, show ? 1f : 0); - valueAnimator.addUpdateListener(valueAnimator1 -> setSearchAnimationProgress((float) valueAnimator1.getAnimatedValue())); + valueAnimator.addUpdateListener(valueAnimator1 -> setSearchAnimationProgress((float) valueAnimator1.getAnimatedValue(), false)); animators.add(valueAnimator); searchAnimator.playTogether(animators); @@ -5204,6 +5708,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. searchWasFullyShowed = true; AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); searchItem.setVisibility(View.GONE); + if (rightSlidingDialogContainer != null) { + rightSlidingDialogContainer.setVisibility(View.GONE); + } } else { searchItem.collapseSearchFilters(); whiteActionBar = false; @@ -5219,13 +5726,16 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. hideFloatingButton(false); } searchWasFullyShowed = false; + if (rightSlidingDialogContainer != null) { + rightSlidingDialogContainer.setVisibility(View.VISIBLE); + } } if (fragmentView != null) { fragmentView.requestLayout(); } - setSearchAnimationProgress(show ? 1f : 0); + setSearchAnimationProgress(show ? 1f : 0, false); viewPages[0].listView.setVerticalScrollBarEnabled(true); searchViewPager.setBackground(null); @@ -5280,7 +5790,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } searchViewPager.setVisibility(show ? View.VISIBLE : View.GONE); - setSearchAnimationProgress(show ? 1f : 0); + setSearchAnimationProgress(show ? 1f : 0, false); fragmentView.invalidate(); if (downloadsItem != null) { @@ -5372,7 +5882,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } - private void setSearchAnimationProgress(float progress) { + public void setSearchAnimationProgress(float progress, boolean full) { searchAnimationProgress = progress; if (whiteActionBar) { int color1 = folderId != 0 ? Theme.getColor(Theme.key_actionBarDefaultArchivedIcon) : Theme.getColor(Theme.key_actionBarDefaultIcon); @@ -5386,6 +5896,153 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (fragmentView != null) { fragmentView.invalidate(); } + if (full) { +// +// if (show) { +// searchViewPager.setVisibility(View.VISIBLE); +// searchViewPager.reset(); +// updateFiltersView(true, null, null, false, false); +// if (searchTabsView != null) { +// searchTabsView.hide(false, false); +// searchTabsView.setVisibility(View.VISIBLE); +// } +// } else { +// viewPages[0].listView.setVisibility(View.VISIBLE); +// viewPages[0].setVisibility(View.VISIBLE); +// } + +// setDialogsListFrozen(true); +// viewPages[0].listView.setVerticalScrollBarEnabled(false); +// searchViewPager.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); +// searchAnimator = new AnimatorSet(); +// ArrayList animators = new ArrayList<>(); + if (viewPages[0] != null) { + if (progress < 1f) { + viewPages[0].setVisibility(View.VISIBLE); + } + viewPages[0].setAlpha(1f - progress); + viewPages[0].setScaleX(.9f + .1f * progress); + viewPages[0].setScaleY(.9f + .1f * progress); + } + if (rightSlidingDialogContainer != null) { + if (progress >= 1f) { + rightSlidingDialogContainer.setVisibility(View.GONE); + } else { + rightSlidingDialogContainer.setVisibility(View.VISIBLE); + rightSlidingDialogContainer.setAlpha(1f - progress); + } + } + if (searchViewPager != null) { + searchViewPager.setAlpha(progress); + searchViewPager.setScaleX(1f + .05f * (1f - progress)); + searchViewPager.setScaleY(1f + .05f * (1f - progress)); + } + if (passcodeItem != null) { + passcodeItem.getIconView().setAlpha(1f - progress); + } + + if (downloadsItem != null) { + downloadsItem.setAlpha(1f - progress); +// updateProxyButton(false, false); + } + + if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE) { + filterTabsView.getTabsContainer().setAlpha(1f - progress); + } + +// if (filterTabsViewIsVisible) { +// int backgroundColor1 = Theme.getColor(folderId == 0 ? Theme.key_actionBarDefault : Theme.key_actionBarDefaultArchived); +// int backgroundColor2 = Theme.getColor(Theme.key_windowBackgroundWhite); +// int sum = Math.abs(Color.red(backgroundColor1) - Color.red(backgroundColor2)) + Math.abs(Color.green(backgroundColor1) - Color.green(backgroundColor2)) + Math.abs(Color.blue(backgroundColor1) - Color.blue(backgroundColor2)); +// searchAnimationTabsDelayedCrossfade = sum / 255f > 0.3f; +// } else { +// searchAnimationTabsDelayedCrossfade = true; +// } +// if (!show) { +// searchAnimator.setStartDelay(20); +// if (tabsAlphaAnimator != null) { +// if (searchAnimationTabsDelayedCrossfade) { +// tabsAlphaAnimator.setStartDelay(80); +// tabsAlphaAnimator.setDuration(100); +// } else { +// tabsAlphaAnimator.setDuration(show ? 200 : 180); +// +// } +// } +// } +// searchAnimator.addListener(new AnimatorListenerAdapter() { +// @Override +// public void onAnimationEnd(Animator animation) { +// getNotificationCenter().onAnimationFinish(animationIndex); +// if (searchAnimator != animation) { +// return; +// } +// setDialogsListFrozen(false); +// if (show) { +// viewPages[0].listView.hide(); +// if (filterTabsView != null) { +// filterTabsView.setVisibility(View.GONE); +// } +// searchWasFullyShowed = true; +// AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); +// searchItem.setVisibility(View.GONE); +// if (rightSlidingDialogContainer != null) { +// rightSlidingDialogContainer.setVisibility(View.GONE); +// } +// } else { +// searchItem.collapseSearchFilters(); +// whiteActionBar = false; +// searchViewPager.setVisibility(View.GONE); +// if (searchTabsView != null) { +// searchTabsView.setVisibility(View.GONE); +// } +// searchItem.clearSearchFilters(); +// searchViewPager.clear(); +// filtersView.setVisibility(View.GONE); +// viewPages[0].listView.show(); +// if (!onlySelect) { +// hideFloatingButton(false); +// } +// searchWasFullyShowed = false; +// if (rightSlidingDialogContainer != null) { +// rightSlidingDialogContainer.setVisibility(View.VISIBLE); +// } +// } +// +// if (fragmentView != null) { +// fragmentView.requestLayout(); +// } +// +// setSearchAnimationProgress(show ? 1f : 0, false); +// +// viewPages[0].listView.setVerticalScrollBarEnabled(true); +// searchViewPager.setBackground(null); +// searchAnimator = null; +// +// if (downloadsItem != null) { +// downloadsItem.setAlpha(show ? 0 : 1f); +// } +// } +// +// @Override +// public void onAnimationCancel(Animator animation) { +// getNotificationCenter().onAnimationFinish(animationIndex); +// if (searchAnimator == animation) { +// if (show) { +// viewPages[0].listView.hide(); +// } else { +// viewPages[0].listView.show(); +// } +// searchAnimator = null; +// } +// } +// }); +// animationIndex = getNotificationCenter().setAnimationInProgress(animationIndex, null); +// searchAnimator.start(); +// if (tabsAlphaAnimator != null) { +// tabsAlphaAnimator.start(); +// } + } updateContextViewPosition(); } @@ -5564,7 +6221,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. message_id = messageObject.getId(); TLRPC.Chat chat = getMessagesController().getChat(-dialogId); if (ChatObject.isForum(chat)) { - topicId = MessageObject.getTopicId(messageObject.messageOwner); + topicId = MessageObject.getTopicId(messageObject.messageOwner, true); } searchViewPager.dialogsSearchAdapter.addHashtagsFromMessage(searchViewPager.dialogsSearchAdapter.getLastSearchString()); } else if (obj instanceof String) { @@ -5644,10 +6301,11 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. searchObject = null; } } + boolean canOpenInRightSlidingView = !(LocaleController.isRTL || searching || (AndroidUtilities.isTablet() && folderId != 0)); args.putInt("dialog_folder_id", folderId); args.putInt("dialog_filter_id", filterId); - if (AndroidUtilities.isTablet()) { - if (openedDialogId == dialogId && adapter != searchViewPager.dialogsSearchAdapter) { + if (AndroidUtilities.isTablet() && (!getMessagesController().isForum(dialogId) || !canOpenInRightSlidingView)) { + if (openedDialogId.dialogId == dialogId && adapter != searchViewPager.dialogsSearchAdapter) { if (getParentActivity() instanceof LaunchActivity) { LaunchActivity launchActivity = (LaunchActivity) getParentActivity(); List rightFragments = launchActivity.getRightActionBarLayout().getFragmentStack(); @@ -5680,7 +6338,23 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (getMessagesController().checkCanOpenChat(args, DialogsActivity.this)) { TLRPC.Chat chat = getMessagesController().getChat(-dialogId); if (chat != null && chat.forum && topicId == 0) { - presentFragment(new TopicsFragment(args)); + if (SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW) { + presentFragment(new TopicsFragment(args)); + } else { + if (!canOpenInRightSlidingView) { + presentFragment(new TopicsFragment(args)); + } else if (!searching) { + if (rightSlidingDialogContainer.currentFragment != null && ((TopicsFragment) rightSlidingDialogContainer.currentFragment).getDialogId() == dialogId) { + rightSlidingDialogContainer.finishPreview(); + } else { + viewPages[0].listView.prepareSelectorForAnimation(); + TopicsFragment topicsFragment = new TopicsFragment(args); + topicsFragment.parentDialogsActivity = this; + rightSlidingDialogContainer.presentFragment(getParentLayout(), topicsFragment); + } + searchViewPager.updateTabs(); + } + } } else { ChatActivity chatActivity = new ChatActivity(args); if (topicId != 0) { @@ -5699,15 +6373,16 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } - public void setOpenedDialogId(long dialogId) { - openedDialogId = dialogId; + public void setOpenedDialogId(long dialogId, int topicId) { + openedDialogId.dialogId = dialogId; + openedDialogId.topicId = topicId; if (viewPages == null) { return; } for (ViewPage viewPage : viewPages) { if (viewPage.isDefaultDialogType() && AndroidUtilities.isTablet()) { - viewPage.dialogsAdapter.setOpenedDialogId(openedDialogId); + viewPage.dialogsAdapter.setOpenedDialogId(openedDialogId.dialogId); } } updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); @@ -5723,6 +6398,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. return showChatPreview(cell); } } + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment()) { + return false; + } if (adapter == searchViewPager.dialogsSearchAdapter) { Object item = searchViewPager.dialogsSearchAdapter.getItem(position); if (!searchViewPager.dialogsSearchAdapter.isSearchWas()) { @@ -6185,13 +6863,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private boolean waitingForDialogsAnimationEnd(ViewPage viewPage) { - return viewPage.dialogsItemAnimator.isRunning() || dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0; + return viewPage.dialogsItemAnimator.isRunning(); } - private void onDialogAnimationFinished() { - dialogRemoveFinished = 0; - dialogInsertFinished = 0; - dialogChangeFinished = 0; + private void checkAnimationFinished() { AndroidUtilities.runOnUIThread(() -> { if (viewPages != null && folderId != 0 && (frozenDialogsList == null || frozenDialogsList.isEmpty())) { for (int a = 0; a < viewPages.length; a++) { @@ -6202,10 +6877,13 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } setDialogsListFrozen(false); updateDialogIndices(); - }); + }, 300); } private void setScrollY(float value) { + if (fragmentView == null) { + return; + } if (scrimView != null) { scrimView.getLocationInWindow(scrimViewLocation); } @@ -6278,8 +6956,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(ObjectAnimator.ofFloat(this, SCROLL_Y, 0)); - animatorSet.setInterpolator(new DecelerateInterpolator()); - animatorSet.setDuration(180); + animatorSet.setInterpolator(CubicBezierInterpolator.DEFAULT); + animatorSet.setDuration(250); animatorSet.start(); } @@ -6641,6 +7319,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } } + checkAnimationFinished(); } getUndoView().showWithAction(selectedDialog, action == clear ? UndoView.ACTION_CLEAR : UndoView.ACTION_DELETE, () -> performDeleteOrClearDialogAction(action, selectedDialog, chat, isBot, param)); @@ -6658,8 +7337,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (selectedDialogIndex >= 0 && currentDialogIndex < 0 && frozenDialogsList != null) { frozenDialogsList.remove(selectedDialogIndex); viewPages[0].dialogsItemAnimator.prepareForRemove(); - viewPages[0].dialogsAdapter.notifyItemRemoved(selectedDialogIndex); - dialogRemoveFinished = 2; + viewPages[0].updateList(true); } else { setDialogsListFrozen(false); } @@ -6733,6 +7411,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. int selectedDialogIndex = -1; if (filter != null && (filter.flags & MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_READ) != 0 && !filter.alwaysShow(currentAccount, dialog)) { setDialogsListFrozen(true); + checkAnimationFinished(); if (frozenDialogsList != null) { for (int i = 0; i < frozenDialogsList.size(); i++) { if (frozenDialogsList.get(i).id == did) { @@ -6755,8 +7434,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (selectedDialogIndex >= 0) { frozenDialogsList.remove(selectedDialogIndex); viewPages[0].dialogsItemAnimator.prepareForRemove(); - viewPages[0].dialogsAdapter.notifyItemRemoved(selectedDialogIndex); - dialogRemoveFinished = 2; + viewPages[0].updateList(true); } } @@ -6810,6 +7488,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. needScroll = true; } else { setDialogsListFrozen(true); + checkAnimationFinished(); if (frozenDialogsList != null) { for (int i = 0; i < frozenDialogsList.size(); i++) { if (frozenDialogsList.get(i).id == selectedDialog) { @@ -6860,10 +7539,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (frozenDialogsList != null && currentDialogIndex >= 0 && selectedDialogIndex != currentDialogIndex) { frozenDialogsList.add(currentDialogIndex, frozenDialogsList.remove(selectedDialogIndex)); viewPages[0].dialogsItemAnimator.prepareForRemove(); - viewPages[0].dialogsAdapter.notifyItemRemoved(selectedDialogIndex); - viewPages[0].dialogsAdapter.notifyItemInserted(currentDialogIndex); - dialogRemoveFinished = 2; - dialogInsertFinished = 2; + viewPages[0].updateList(true); viewPages[0].layoutManager.scrollToPositionWithOffset(viewPages[0].dialogsType == 0 && hasHiddenArchive() ? 1 : 0, (int) actionBar.getTranslationY()); @@ -7585,10 +8261,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. int newItemCount = viewPage.dialogsAdapter.getItemCount(); if (newItemCount == 1 && oldItemCount == 1 && viewPage.dialogsAdapter.getItemViewType(0) == 5) { if (viewPage.dialogsAdapter.lastDialogsEmptyType != viewPage.dialogsAdapter.dialogsEmptyType()) { - viewPage.dialogsAdapter.notifyItemChanged(0); + viewPage.updateList(true); } } else { - viewPage.dialogsAdapter.notifyDataSetChanged(); + viewPage.updateList(false); if (newItemCount > oldItemCount && initialDialogsType != 11 && initialDialogsType != 12 && initialDialogsType != 13) { viewPage.recyclerItemsEnterAnimator.showItemsAnimated(oldItemCount); } @@ -7709,16 +8385,19 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } for (int a = 0; a < viewPages.length; a++) { if (viewPages[a].isDefaultDialogType() && AndroidUtilities.isTablet()) { - boolean close = (Boolean) args[1]; + boolean close = (Boolean) args[2]; long dialog_id = (Long) args[0]; + int topicId = (int) args[1]; if (close) { - if (dialog_id == openedDialogId) { - openedDialogId = 0; + if (dialog_id == openedDialogId.dialogId && topicId == openedDialogId.topicId) { + openedDialogId.dialogId = 0; + openedDialogId.topicId = 0; } } else { - openedDialogId = dialog_id; + openedDialogId.dialogId = dialog_id; + openedDialogId.topicId = topicId; } - viewPages[a].dialogsAdapter.setOpenedDialogId(openedDialogId); + viewPages[a].dialogsAdapter.setOpenedDialogId(openedDialogId.dialogId); } } updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); @@ -8149,6 +8828,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private void hideFloatingButton(boolean hide) { + if (rightSlidingDialogContainer.hasFragment()) { + hide = true; + } if (floatingHidden == hide || hide && floatingForceVisible) { return; } @@ -8188,7 +8870,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. RecyclerListView listView = p.listView; for (int i = 0; i < listView.getChildCount(); i++) { View v = listView.getChildAt(i); - if (listView.getChildAdapterPosition(v) >= p.dialogsAdapter.getDialogsCount() + 1) { + if (v != null && listView.getChildAdapterPosition(v) >= p.dialogsAdapter.getDialogsCount() + 1) { v.setAlpha(alpha); } } @@ -8207,26 +8889,27 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. return; } for (int b = 0; b < viewPages.length; b++) { - if (viewPages[b].getVisibility() != View.VISIBLE) { + if (viewPages[b].getVisibility() != View.VISIBLE || viewPages[b].dialogsAdapter.getDialogsListIsFrozen()) { continue; } - ArrayList dialogs = getDialogsArray(currentAccount, viewPages[b].dialogsType, folderId, false); - int count = viewPages[b].listView.getChildCount(); - for (int a = 0; a < count; a++) { - View child = viewPages[b].listView.getChildAt(a); - if (child instanceof DialogCell) { - DialogCell dialogCell = (DialogCell) child; - TLRPC.Dialog dialog = getMessagesController().dialogs_dict.get(dialogCell.getDialogId()); - if (dialog == null) { - continue; - } - int index = dialogs.indexOf(dialog); - if (index < 0) { - continue; - } - dialogCell.setDialogIndex(index); - } - } +// ArrayList dialogs = getDialogsArray(currentAccount, viewPages[b].dialogsType, folderId, false); +// int count = viewPages[b].listView.getChildCount(); +// for (int a = 0; a < count; a++) { +// View child = viewPages[b].listView.getChildAt(a); +// if (child instanceof DialogCell) { +// DialogCell dialogCell = (DialogCell) child; +// TLRPC.Dialog dialog = getMessagesController().dialogs_dict.get(dialogCell.getDialogId()); +// if (dialog == null) { +// continue; +// } +// int index = dialogs.indexOf(dialog); +// if (index < 0) { +// continue; +// } +// // dialogCell.setDialogIndex(index); +// } +// } + viewPages[b].updateList(false); } } @@ -8240,6 +8923,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } for (int c = 0; c < 3; c++) { RecyclerListView list; + ViewPage viewPage = null; if (c == 2) { list = searchViewPager != null ? searchViewPager.searchListView : null; } else if (viewPages != null) { @@ -8247,12 +8931,21 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (list != null && viewPages[c].getVisibility() != View.VISIBLE) { continue; } + if (list != null) { + viewPage = viewPages[c]; + } } else { continue; } if (list == null || list.getAdapter() == null) { continue; } + if ((mask & MessagesController.UPDATE_MASK_NEW_MESSAGE) != 0 || mask == 0) { + if (viewPage != null) { + viewPage.updateList(false); + continue; + } + } int count = list.getChildCount(); for (int a = 0; a < count; a++) { View child = list.getChildAt(a); @@ -8269,25 +8962,21 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. cell.setChecked(false, (mask & MessagesController.UPDATE_MASK_CHAT) != 0); } else { if ((mask & MessagesController.UPDATE_MASK_NEW_MESSAGE) != 0) { - if (cell.checkCurrentDialogIndex(dialogsListFrozen)) { - if (list.getAdapter() != null) { - list.getAdapter().notifyDataSetChanged(); - break; - } + if (list.getAdapter() != null) { + viewPage.updateList(false); + break; } if (viewPages[c].isDefaultDialogType() && AndroidUtilities.isTablet()) { - cell.setDialogSelected(cell.getDialogId() == openedDialogId); + cell.setDialogSelected(cell.getDialogId() == openedDialogId.dialogId); } } else if ((mask & MessagesController.UPDATE_MASK_SELECT_DIALOG) != 0) { if (viewPages[c].isDefaultDialogType() && AndroidUtilities.isTablet()) { - cell.setDialogSelected(cell.getDialogId() == openedDialogId); + cell.setDialogSelected(cell.getDialogId() == openedDialogId.dialogId); } } else { if (cell.update(mask, animated)) { - if (list.getAdapter() != null) { - list.getAdapter().notifyDataSetChanged(); - break; - } + viewPage.updateList(false); + break; } } if (selectedDialogs != null) { @@ -8703,7 +9392,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. searchItem.updateColor(); } updateFloatingButtonColor(); - setSearchAnimationProgress(searchAnimationProgress); + setSearchAnimationProgress(searchAnimationProgress, false); }; ArrayList arrayList = new ArrayList<>(); @@ -9249,9 +9938,9 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (fragmentView != null) { fragmentView.invalidate(); } + float s = 1f - 0.05f * (1f - slideFragmentProgress); if (filterTabsView != null) { - float s = 1f - 0.05f * (1f - slideFragmentProgress); filterTabsView.getListView().setScaleX(s); filterTabsView.getListView().setScaleY(s); filterTabsView.getListView().setTranslationX((isDrawerTransition ? AndroidUtilities.dp(4) : -AndroidUtilities.dp(4)) * (1f - slideFragmentProgress)); @@ -9259,11 +9948,20 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. filterTabsView.getListView().setPivotY(0); filterTabsView.invalidate(); } + if (rightSlidingDialogContainer != null && rightSlidingDialogContainer.getFragmentView() != null) { + if (!rightFragmentTransitionInProgress) { + rightSlidingDialogContainer.getFragmentView().setScaleX(s); + rightSlidingDialogContainer.getFragmentView().setScaleY(s); + rightSlidingDialogContainer.getFragmentView().setTranslationX((isDrawerTransition ? AndroidUtilities.dp(4) : -AndroidUtilities.dp(4)) * (1f - slideFragmentProgress)); + } + rightSlidingDialogContainer.getFragmentView().setPivotX(isDrawerTransition ? rightSlidingDialogContainer.getMeasuredWidth() : 0); + rightSlidingDialogContainer.getFragmentView().setPivotY(0); + } } @Override public INavigationLayout.BackButtonState getBackButtonState() { - return INavigationLayout.BackButtonState.MENU; + return isArchive() || rightSlidingDialogContainer.isOpenned ? INavigationLayout.BackButtonState.BACK : INavigationLayout.BackButtonState.MENU; } @Override @@ -9307,8 +10005,15 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } } + public ActionBarMenuItem getSearchItem() { + return searchItem; + } + @Override public boolean isLightStatusBar() { + if (!searching && rightSlidingDialogContainer != null && rightSlidingDialogContainer.getFragment() != null) { + return rightSlidingDialogContainer.getFragment().isLightStatusBar(); + } int color = (searching && whiteActionBar) ? Theme.getColor(Theme.key_windowBackgroundWhite) : Theme.getColor(folderId == 0 ? Theme.key_actionBarDefault : Theme.key_actionBarDefaultArchived); if (actionBar.isActionModeShowed()) { color = Theme.getColor(Theme.key_actionBarActionModeDefault); @@ -9327,4 +10032,19 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. new FloatingDebugController.DebugItem(LocaleController.getString(R.string.DebugClearSendMessageAsPeers), () -> getMessagesController().clearSendAsPeers()) ); } + + @Override + public boolean closeLastFragment() { + if (rightSlidingDialogContainer.hasFragment()) { + rightSlidingDialogContainer.finishPreview(); + searchViewPager.updateTabs(); + return true; + } + return super.closeLastFragment(); + } + + @Override + public boolean canBeginSlide() { + return !rightSlidingDialogContainer.hasFragment(); + } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java index fe2f81a9b..e0caf0560 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java @@ -322,7 +322,7 @@ public class FilterCreateActivity extends BaseFragment { updateRows(); } else if (position == includeAddRow || position == excludeAddRow) { ArrayList arrayList = position == excludeAddRow ? newNeverShow : newAlwaysShow; - FilterUsersActivity fragment = new FilterUsersActivity(position == includeAddRow, arrayList, newFilterFlags); + UsersSelectActivity fragment = new UsersSelectActivity(position == includeAddRow, arrayList, newFilterFlags); fragment.setDelegate((ids, flags) -> { newFilterFlags = flags; if (position == excludeAddRow) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java b/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java index 6aeb7b6b5..32174bb20 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java @@ -30,6 +30,7 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageReceiver; @@ -68,6 +69,7 @@ import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EmbedBottomSheet; import org.telegram.ui.Components.FlickerLoadingView; +import org.telegram.ui.Components.Forum.ForumUtilities; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.SearchViewPager; @@ -434,16 +436,32 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente chatTo = messageObject.messageOwner.peer_id.chat_id != 0 ? MessagesController.getInstance(UserConfig.selectedAccount).getChat(messageObject.messageOwner.peer_id.chat_id) : null; } if (user != null && chatTo != null) { + CharSequence chatTitle = chatTo.title; + if (ChatObject.isForum(chatTo)) { + TLRPC.TL_forumTopic topic = MessagesController.getInstance(UserConfig.selectedAccount).getTopicsController().findTopic(chatTo.id, MessageObject.getTopicId(messageObject.messageOwner, true)); + if (topic != null) { + chatTitle = ForumUtilities.getTopicSpannedName(topic, null); + } + } + chatTitle = Emoji.replaceEmoji(chatTitle, null, AndroidUtilities.dp(12), false); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); spannableStringBuilder .append(ContactsController.formatName(user.first_name, user.last_name)) .append(' ').append(arrowSpan).append(' ') - .append(chatTo.title); + .append(chatTitle); fromName = spannableStringBuilder; } else if (user != null) { fromName = ContactsController.formatName(user.first_name, user.last_name); } else if (chatFrom != null) { - fromName = chatFrom.title; + CharSequence chatTitle = chatFrom.title; + if (ChatObject.isForum(chatFrom)) { + TLRPC.TL_forumTopic topic = MessagesController.getInstance(UserConfig.selectedAccount).getTopicsController().findTopic(chatFrom.id, MessageObject.getTopicId(messageObject.messageOwner, true)); + if (topic != null) { + chatTitle = ForumUtilities.getTopicSpannedName(topic, null); + } + } + chatTitle = Emoji.replaceEmoji(chatTitle, null, AndroidUtilities.dp(12), false); + fromName = chatTitle; } return fromName == null ? "" : fromName; } @@ -696,7 +714,7 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente if (finalResultArray != null) { localTipChats.addAll(finalResultArray); } - if (query.length() >= 3 && (LocaleController.getString("SavedMessages", R.string.SavedMessages).toLowerCase().startsWith(query) || + if (query != null && query.length() >= 3 && (LocaleController.getString("SavedMessages", R.string.SavedMessages).toLowerCase().startsWith(query) || "saved messages".startsWith(query))) { boolean found = false; for (int i = 0; i < localTipChats.size(); i++) { @@ -713,7 +731,7 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente localTipDates.clear(); localTipDates.addAll(dateData); localTipArchive = false; - if (query.length() >= 3 && (LocaleController.getString("ArchiveSearchFilter", R.string.ArchiveSearchFilter).toLowerCase().startsWith(query) || + if (query != null && query.length() >= 3 && (LocaleController.getString("ArchiveSearchFilter", R.string.ArchiveSearchFilter).toLowerCase().startsWith(query) || "archive".startsWith(query))) { localTipArchive = true; } @@ -943,6 +961,7 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente cell.useSeparator = (position != getItemCount() - 1); MessageObject messageObject = messages.get(position); boolean animated = cell.getMessage() != null && cell.getMessage().getId() == messageObject.getId(); + cell.useFromUserAsAvatar = useFromUserAsAvatar; cell.setDialog(messageObject.getDialogId(), messageObject, messageObject.messageOwner.date, false, false); if (uiCallback.actionModeShowing()) { messageHashIdTmp.set(messageObject.getId(), messageObject.getDialogId()); @@ -967,6 +986,10 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente } } + private boolean useFromUserAsAvatar; + public void setUseFromUserAsAvatar(boolean value) { + useFromUserAsAvatar = value; + } private void onItemClick(int index, View view, MessageObject message, int a) { if (message == null) { @@ -1511,7 +1534,12 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente View view; switch (viewType) { case 0: - view = new DialogCell(null, parent.getContext(), true, false); + view = new DialogCell(null, parent.getContext(), true, true) { + @Override + public boolean isForumCell() { + return false; + } + }; break; case 3: FlickerLoadingView flickerLoadingView = new FlickerLoadingView(parent.getContext()); @@ -1535,7 +1563,7 @@ public class FilteredSearchView extends FrameLayout implements NotificationCente if (holder.getItemViewType() == 0) { DialogCell cell = ((DialogCell) holder.itemView); MessageObject messageObject = messages.get(position); - + cell.useFromUserAsAvatar = useFromUserAsAvatar; cell.setDialog(messageObject.getDialogId(), messageObject, messageObject.messageOwner.date, false, false); cell.useSeparator = position != getItemCount() - 1; boolean animated = cell.getMessage() != null && cell.getMessage().getId() == messageObject.getId(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java index f2c30c56b..30aad136b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java @@ -509,6 +509,7 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe FrameLayout frameLayout = (FrameLayout) fragmentView; frameLayout.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); + LinearLayoutManager layoutManager; listView = new RecyclerListView(context) { @Override public boolean onTouchEvent(MotionEvent e) { @@ -519,9 +520,15 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe } return super.onTouchEvent(e); } + + @Override + protected void dispatchDraw(Canvas canvas) { + drawSectionBackground(canvas, filtersStartRow, filtersEndRow, getThemedColor(Theme.key_windowBackgroundWhite)); + super.dispatchDraw(canvas); + } }; ((DefaultItemAnimator) listView.getItemAnimator()).setDelayAnimations(false); - listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); + listView.setLayoutManager(layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); listView.setVerticalScrollBarEnabled(false); itemTouchHelper = new ItemTouchHelper(new TouchHelperCallback()); itemTouchHelper.attachToRecyclerView(listView); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index 5c52d1ff8..f1b4b119e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -367,6 +367,8 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen getNotificationCenter().addObserver(this, NotificationCenter.contactsDidLoad); getNotificationCenter().addObserver(this, NotificationCenter.updateInterfaces); getNotificationCenter().addObserver(this, NotificationCenter.chatDidCreated); + + getUserConfig().loadGlobalTTl(); return super.onFragmentCreate(); } @@ -969,11 +971,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen return false; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - if (selectedContacts.size() == 1) { - builder.setTitle(LocaleController.getString("AddOneMemberAlertTitle", R.string.AddOneMemberAlertTitle)); - } else { - builder.setTitle(LocaleController.formatString("AddMembersAlertTitle", R.string.AddMembersAlertTitle, LocaleController.formatPluralString("Members", selectedContacts.size()))); - } + builder.setTitle(LocaleController.formatPluralString("AddManyMembersAlertTitle", selectedContacts.size())); StringBuilder stringBuilder = new StringBuilder(); for (int a = 0; a < selectedContacts.size(); a++) { long uid = selectedContacts.keyAt(a); @@ -988,7 +986,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } TLRPC.Chat chat = getMessagesController().getChat(chatId != 0 ? chatId : channelId); if (selectedContacts.size() > 5) { - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, LocaleController.formatPluralString("Members", selectedContacts.size()), chat == null ? "" : chat.title))); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatPluralString("AddManyMembersAlertNamesText", selectedContacts.size(), chat == null ? "" : chat.title))); String countString = String.format("%d", selectedContacts.size()); int index = TextUtils.indexOf(spannableStringBuilder, countString); if (index >= 0) { @@ -1034,6 +1032,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen getNotificationCenter().postNotificationName(NotificationCenter.closeChats); Bundle args2 = new Bundle(); args2.putLong("chat_id", chatId); + args2.putBoolean("just_created_chat", true); presentFragment(new ChatActivity(args2), true); } else { if (!doneButtonVisible || selectedContacts.size() == 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index f467d6917..93b67be44 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -37,46 +37,50 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; +import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; -import org.telegram.messenger.MessagesStorage; -import org.telegram.tgnet.ConnectionsManager; -import org.telegram.tgnet.TLRPC; -import org.telegram.messenger.FileLog; import org.telegram.messenger.MessagesController; +import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarPopupWindow; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Cells.GroupCreateUserCell; -import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; +import org.telegram.ui.Components.AutoDeletePopupWrapper; import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CombinedDrawable; +import org.telegram.ui.Components.ContextProgressView; import org.telegram.ui.Components.EditTextEmoji; +import org.telegram.ui.Components.ImageUpdater; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.ListView.AdapterWithDiffUtils; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RLottieImageView; -import org.telegram.ui.Components.VerticalPositionAutoAnimator; -import org.telegram.ui.Components.ImageUpdater; -import org.telegram.ui.Components.BackupImageView; -import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.Components.ContextProgressView; -import org.telegram.ui.Components.GroupCreateDividerItemDecoration; -import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.SizeNotifierFrameLayout; +import org.telegram.ui.Components.VerticalPositionAutoAnimator; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - public class GroupCreateFinalActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ImageUpdater.ImageUpdaterDelegate { private GroupCreateAdapter adapter; @@ -93,6 +97,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private FrameLayout editTextContainer; private ImageView floatingButtonIcon; private FrameLayout floatingButtonContainer; + ActionBarPopupWindow popupWindow; private Drawable shadowDrawable; @@ -117,6 +122,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private Location currentGroupCreateLocation; private int reqId; + private int ttlPeriod; private final static int done_button = 1; @@ -183,6 +189,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati return false; } } + ttlPeriod = getUserConfig().getGlobalTTl() * 60; return super.onFragmentCreate(); } @@ -533,9 +540,6 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati listView.setLayoutManager(linearLayoutManager); listView.setVerticalScrollBarEnabled(false); listView.setVerticalScrollbarPosition(LocaleController.isRTL ? View.SCROLLBAR_POSITION_LEFT : View.SCROLLBAR_POSITION_RIGHT); - GroupCreateDividerItemDecoration decoration = new GroupCreateDividerItemDecoration(); - decoration.setSkipRows(currentGroupCreateAddress != null ? 5 : 2); - listView.addItemDecoration(decoration); linearLayout.addView(listView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override @@ -545,7 +549,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } } }); - listView.setOnItemClickListener((view, position) -> { + listView.setOnItemClickListener((view, position, x, y) -> { if (view instanceof TextSettingsCell) { if (!AndroidUtilities.isMapsInstalled(GroupCreateFinalActivity.this)) { return; @@ -559,6 +563,39 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati }); presentFragment(fragment); } + if (view instanceof TextCell) { + if (popupWindow != null && popupWindow.isShowing()) { + return; + } + AutoDeletePopupWrapper autoDeletePopupWrapper = new AutoDeletePopupWrapper(getContext(), null, new AutoDeletePopupWrapper.Callback() { + @Override + public void dismiss() { + popupWindow.dismiss(); + } + + @Override + public void setAutoDeleteHistory(int time, int action) { + ttlPeriod = time; + AndroidUtilities.updateVisibleRows(listView); + + } + }, true, AutoDeletePopupWrapper.TYPE_GROUP_CREATE, null); + + autoDeletePopupWrapper.updateItems(ttlPeriod); + + popupWindow = new ActionBarPopupWindow(autoDeletePopupWrapper.windowLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT); + popupWindow.setPauseNotifications(true); + popupWindow.setDismissAnimationDuration(220); + popupWindow.setOutsideTouchable(true); + popupWindow.setClippingEnabled(true); + popupWindow.setAnimationStyle(R.style.PopupContextAnimation); + popupWindow.setFocusable(true); + autoDeletePopupWrapper.windowLayout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST)); + popupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED); + popupWindow.getContentView().setFocusableInTouchMode(true); + popupWindow.showAtLocation(getFragmentView(), 0, (int) (view.getX() + x), (int) (view.getY() + y + autoDeletePopupWrapper.windowLayout.getMeasuredHeight() / 2f)); + popupWindow.dimBehind(); + } }); floatingButtonContainer = new FrameLayout(context); @@ -606,7 +643,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati createAfterUpload = true; } else { showEditDoneProgress(true); - reqId = getMessagesController().createChat(editText.getText().toString(), selectedContacts, null, chatType, forImport, currentGroupCreateLocation, currentGroupCreateAddress, GroupCreateFinalActivity.this); + reqId = getMessagesController().createChat(editText.getText().toString(), selectedContacts, null, chatType, forImport, currentGroupCreateLocation, currentGroupCreateAddress, ttlPeriod, GroupCreateFinalActivity.this); } }); @@ -656,7 +693,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati if (delegate != null) { delegate.didStartChatCreation(); } - getMessagesController().createChat(editText.getText().toString(), selectedContacts, null, chatType, forImport, currentGroupCreateLocation, currentGroupCreateAddress, GroupCreateFinalActivity.this); + getMessagesController().createChat(editText.getText().toString(), selectedContacts, null, chatType, forImport, currentGroupCreateLocation, currentGroupCreateAddress, ttlPeriod, GroupCreateFinalActivity.this); } showAvatarProgress(false, true); avatarEditor.setImageDrawable(null); @@ -810,6 +847,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.closeChats); Bundle args2 = new Bundle(); args2.putLong("chat_id", chatId); + args2.putBoolean("just_created_chat", true); presentFragment(new ChatActivity(args2), true); } if (inputPhoto != null || inputVideo != null) { @@ -875,30 +913,54 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private Context context; private int usersStartRow; + private final static int VIEW_TYPE_SHADOW_SECTION_CELL = 0; + private final static int VIEW_TYPE_HEADER_CELL = 1; + private final static int VIEW_TYPE_USER_CELL = 2; + private final static int VIEW_TYPE_TEXT_SETTINGS = 3; + private final static int VIEW_TYPE_AUTO_DELETE = 4; + private final static int VIEW_TYPE_TEXT_INFO_CELL = 5; + + ArrayList items = new ArrayList<>(); public GroupCreateAdapter(Context ctx) { context = ctx; } @Override - public int getItemCount() { - int count = 2 + selectedContacts.size(); + public void notifyDataSetChanged() { + items.clear(); + items.add(new InnerItem(VIEW_TYPE_SHADOW_SECTION_CELL)); + items.add(new InnerItem(VIEW_TYPE_AUTO_DELETE)); + items.add(new InnerItem(VIEW_TYPE_TEXT_INFO_CELL, LocaleController.getString("GroupCreateAutodeleteDescription", R.string.GroupCreateAutodeleteDescription))); if (currentGroupCreateAddress != null) { - count += 3; + items.add(new InnerItem(VIEW_TYPE_HEADER_CELL)); + items.add(new InnerItem(VIEW_TYPE_TEXT_SETTINGS)); + items.add(new InnerItem(VIEW_TYPE_SHADOW_SECTION_CELL)); } - return count; + items.add(new InnerItem(VIEW_TYPE_HEADER_CELL)); + usersStartRow = items.size(); + for (int i = 0; i < selectedContacts.size(); i++) { + items.add(new InnerItem(VIEW_TYPE_USER_CELL)); + } + + super.notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return items.size(); } @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { - return holder.getItemViewType() == 3; + return holder.getItemViewType() == VIEW_TYPE_TEXT_SETTINGS || holder.getItemViewType() == VIEW_TYPE_AUTO_DELETE; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { - case 0: { + case VIEW_TYPE_SHADOW_SECTION_CELL: { view = new ShadowSectionCell(context); Drawable drawable = Theme.getThemedDrawable(context, R.drawable.greydivider_top, Theme.key_windowBackgroundGrayShadow); CombinedDrawable combinedDrawable = new CombinedDrawable(new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)), drawable); @@ -906,14 +968,24 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati view.setBackgroundDrawable(combinedDrawable); break; } - case 1: + case VIEW_TYPE_HEADER_CELL: HeaderCell headerCell = new HeaderCell(context); headerCell.setHeight(46); view = headerCell; break; - case 2: + case VIEW_TYPE_USER_CELL: view = new GroupCreateUserCell(context, 0, 3, false); break; + case VIEW_TYPE_AUTO_DELETE: + view = new TextCell(context); + break; + case VIEW_TYPE_TEXT_INFO_CELL: + view = new TextInfoPrivacyCell(context); + Drawable drawable = Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow); + CombinedDrawable combinedDrawable = new CombinedDrawable(new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)), drawable); + combinedDrawable.setFullsize(true); + view.setBackgroundDrawable(combinedDrawable); + break; case 3: default: view = new TextSettingsCell(context); @@ -925,7 +997,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { - case 1: { + case VIEW_TYPE_HEADER_CELL: { HeaderCell cell = (HeaderCell) holder.itemView; if (currentGroupCreateAddress != null && position == 1) { cell.setText(LocaleController.getString("AttachLocation", R.string.AttachLocation)); @@ -934,45 +1006,39 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } break; } - case 2: { + case VIEW_TYPE_USER_CELL: { GroupCreateUserCell cell = (GroupCreateUserCell) holder.itemView; TLRPC.User user = getMessagesController().getUser(selectedContacts.get(position - usersStartRow)); cell.setObject(user, null, null); + cell.setDrawDivider(position != items.size() - 1); break; } - case 3: { + case VIEW_TYPE_TEXT_SETTINGS: { TextSettingsCell cell = (TextSettingsCell) holder.itemView; cell.setText(currentGroupCreateAddress, false); break; } + case VIEW_TYPE_AUTO_DELETE: { + TextCell textCell = (TextCell) holder.itemView; + String value; + if (ttlPeriod == 0) { + value = LocaleController.getString("PasswordOff", R.string.PasswordOff); + } else { + value = LocaleController.formatTTLString(ttlPeriod); + } + textCell.setTextAndValueAndIcon(LocaleController.getString("AutoDeleteMessages", R.string.AutoDeleteMessages), value, fragmentBeginToShow, R.drawable.msg_autodelete, false); + break; + } + case VIEW_TYPE_TEXT_INFO_CELL: + TextInfoPrivacyCell textInfoPrivacyCell = (TextInfoPrivacyCell) holder.itemView; + textInfoPrivacyCell.setText(items.get(position).string); + break; } } @Override public int getItemViewType(int position) { - if (currentGroupCreateAddress != null) { - if (position == 0) { - return 0; - } else if (position == 1) { - return 1; - } else if (position == 2) { - return 3; - } else { - position -= 3; - } - usersStartRow = 5; - } else { - usersStartRow = 2; - } - switch (position) { - case 0: - return 0; - case 1: - return 1; - case 2: - default: - return 2; - } + return items.get(position).viewType; } @Override @@ -981,6 +1047,22 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati ((GroupCreateUserCell) holder.itemView).recycle(); } } + + private class InnerItem extends AdapterWithDiffUtils.Item { + + String string; + + public InnerItem(int viewType) { + super(viewType, true); + } + + public InnerItem(int viewType, String string) { + super(viewType, true); + this.string = string; + } + + + } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LNavigation/LNavigation.java b/TMessagesProj/src/main/java/org/telegram/ui/LNavigation/LNavigation.java index d32f9485d..3ebe6b2b7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LNavigation/LNavigation.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LNavigation/LNavigation.java @@ -767,10 +767,16 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float } fragment.onTransitionAnimationStart(true, false); + if (prevFragment != null) { + prevFragment.onTransitionAnimationStart(false, false); + } customAnimation = fragment.onCustomTransitionAnimation(true, ()-> { customAnimation = null; fragment.onTransitionAnimationEnd(true, false); + if (prevFragment != null) { + prevFragment.onTransitionAnimationEnd(false, false); + } swipeProgress = 0f; invalidateTranslation(); @@ -804,6 +810,9 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float currentSpringAnimation.addEndListener((animation, canceled, value, velocity) -> { if (animation == currentSpringAnimation) { fragment.onTransitionAnimationEnd(true, false); + if (prevFragment != null) { + prevFragment.onTransitionAnimationEnd(false, false); + } swipeProgress = 0f; invalidateTranslation(); @@ -893,10 +902,15 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float try { if (bgView != null && fgView != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getParentActivity().getWindow().setNavigationBarColor(ColorUtils.blendARGB(fgView.fragment.getNavigationBarColor(), bgView.fragment.getNavigationBarColor(), swipeProgress)); + int navColor = ColorUtils.blendARGB(fgView.fragment.getNavigationBarColor(), bgView.fragment.getNavigationBarColor(), swipeProgress); + getParentActivity().getWindow().setNavigationBarColor(navColor); + AndroidUtilities.setLightNavigationBar(getParentActivity().getWindow(), AndroidUtilities.computePerceivedBrightness(navColor) > 0.721f); } } catch (Exception ignore) {} + if (getLastFragment() != null) { + getLastFragment().onSlideProgressFront(false, swipeProgress); + } if (getBackgroundFragment() != null) { getBackgroundFragment().onSlideProgress(false, swipeProgress); } @@ -1219,6 +1233,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float @Override public void draw(Canvas canvas) { + boolean crossfade = isActionBarInCrossfade(); if (useAlphaAnimations) { canvas.save(); path.rewind(); @@ -1229,12 +1244,16 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float super.draw(canvas); if (!isInPreviewMode() && !(useAlphaAnimations && fragmentStack.size() <= 1) && (isSwipeInProgress() || isTransitionAnimationInProgress()) && swipeProgress != 0) { + int top = getPaddingTop(); + if (crossfade) { + top += AndroidUtilities.lerp(getBackgroundFragment().getActionBar().getHeight(), getLastFragment().getActionBar().getHeight(), 1f - swipeProgress); + } int widthNoPaddings = getWidth() - getPaddingLeft() - getPaddingRight(); dimmPaint.setAlpha((int) (0x7a * (1f - swipeProgress))); - canvas.drawRect(getPaddingLeft(), getPaddingTop(), widthNoPaddings * swipeProgress + getPaddingLeft(), getHeight() - getPaddingBottom(), dimmPaint); + canvas.drawRect(getPaddingLeft(), top, widthNoPaddings * swipeProgress + getPaddingLeft(), getHeight() - getPaddingBottom(), dimmPaint); layerShadowDrawable.setAlpha((int) (0xFF * (1f - swipeProgress))); - layerShadowDrawable.setBounds((int) (widthNoPaddings * swipeProgress - layerShadowDrawable.getIntrinsicWidth()) + getPaddingLeft(), getPaddingTop(), (int) (widthNoPaddings * swipeProgress) + getPaddingLeft(), getHeight() - getPaddingBottom()); + layerShadowDrawable.setBounds((int) (widthNoPaddings * swipeProgress - layerShadowDrawable.getIntrinsicWidth()) + getPaddingLeft(), top, (int) (widthNoPaddings * swipeProgress) + getPaddingLeft(), getHeight() - getPaddingBottom()); layerShadowDrawable.draw(canvas); } if (useAlphaAnimations) { @@ -1255,7 +1274,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float canvas.restore(); } - if (isActionBarInCrossfade()) { + if (crossfade) { BaseFragment foregroundFragment = getLastFragment(); BaseFragment backgroundFragment = getBackgroundFragment(); @@ -1280,7 +1299,7 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float backDrawableForcedProgress = 1f; } - AndroidUtilities.rectTmp.set(0, 0, getWidth(), bgActionBar.getHeight()); + AndroidUtilities.rectTmp.set(0, 0, getWidth(), bgActionBar.getY() + bgActionBar.getHeight()); canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (swipeProgress * 0xFF), Canvas.ALL_SAVE_FLAG); bgActionBar.onDrawCrossfadeBackground(canvas); canvas.restore(); @@ -1290,18 +1309,18 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float canvas.restore(); if (useBackDrawable) { - AndroidUtilities.rectTmp.set(0, 0, getWidth(), bgActionBar.getHeight()); + AndroidUtilities.rectTmp.set(0, 0, getWidth(), bgActionBar.getY() + bgActionBar.getHeight()); float progress = backDrawableForcedProgress != null ? backDrawableForcedProgress : swipeProgress; float bgAlpha = 1f - (bgActionBar.getY() / -(bgActionBar.getHeight() - AndroidUtilities.statusBarHeight)); float fgAlpha = 1f - (fgActionBar.getY() / -(fgActionBar.getHeight() - AndroidUtilities.statusBarHeight)); canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (AndroidUtilities.lerp(bgAlpha, fgAlpha, 1f - swipeProgress) * 0xFF), Canvas.ALL_SAVE_FLAG); - canvas.translate(AndroidUtilities.dp(16) - AndroidUtilities.dp(2) * (1f - progress), AndroidUtilities.dp(16) + (fgActionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0)); + canvas.translate(AndroidUtilities.dp(16) - AndroidUtilities.dp(1) * (1f - progress), AndroidUtilities.dp(16) + (fgActionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0)); menuDrawable.setRotation(backDrawableReverse ? progress : 1f - progress, false); menuDrawable.draw(canvas); canvas.restore(); } - AndroidUtilities.rectTmp.set(0, AndroidUtilities.statusBarHeight, getWidth(), bgActionBar.getHeight()); + AndroidUtilities.rectTmp.set(0, AndroidUtilities.statusBarHeight, getWidth(), bgActionBar.getY() + bgActionBar.getHeight()); canvas.saveLayerAlpha(AndroidUtilities.rectTmp, (int) (swipeProgress * 0xFF), Canvas.ALL_SAVE_FLAG); canvas.translate(0, bgActionBar.getY()); bgActionBar.onDrawCrossfadeContent(canvas, false, useBackDrawable, swipeProgress); @@ -1338,6 +1357,10 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float } public void closeLastFragment(boolean animated, boolean forceNoAnimation, float velocityX) { + BaseFragment fragment = getLastFragment(); + if (fragment != null && fragment.closeLastFragment()) { + return; + } if (fragmentStack.isEmpty() || checkTransitionAnimation() || delegate != null && !delegate.needCloseLastFragment(this)) { return; } @@ -1417,9 +1440,11 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float notifyFragmentStackChanged(); FragmentHolderView holderView = getForegroundView(); - holderView.setFragment(null); - removeView(holderView); - resetViewProperties(holderView); + if (holderView != null) { + holderView.setFragment(null); + removeView(holderView); + resetViewProperties(holderView); + } if (newLastFragment != null) { newLastFragment.prepareFragmentToSlide(false, false); @@ -1431,7 +1456,11 @@ public class LNavigation extends FrameLayout implements INavigationLayout, Float BaseFragment prevFragment = getBackgroundFragment(); prevFragment.setParentLayout(this); - holderView.setFragment(prevFragment); + if (holderView == null) { + holderView = onCreateHolderView(prevFragment); + } else { + holderView.setFragment(prevFragment); + } holderView.setVisibility(GONE); addView(holderView, getChildCount() - 2); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java index 1c2da39e0..4b8d27dc6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java @@ -428,7 +428,7 @@ public class LanguageSelectActivity extends BaseFragment implements Notification boolean value = getValue(); showButtonCheck = new TextCheckCell(context); - showButtonCheck.setBackground(Theme.AdaptiveRipple.filledRect(Theme.getColor(Theme.key_windowBackgroundWhite))); + showButtonCheck.setBackground(Theme.createSelectorWithBackgroundDrawable(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(Theme.key_listSelector))); showButtonCheck.setTextAndCheck( LocaleController.getString("ShowTranslateButton", R.string.ShowTranslateButton), value, @@ -441,7 +441,7 @@ public class LanguageSelectActivity extends BaseFragment implements Notification addView(showButtonCheck, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); doNotTranslateCell = new TextSettingsCell(context); - doNotTranslateCell.setBackground(Theme.AdaptiveRipple.filledRect(Theme.getColor(Theme.key_windowBackgroundWhite))); + doNotTranslateCell.setBackground(Theme.createSelectorWithBackgroundDrawable(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(Theme.key_listSelector))); doNotTranslateCell.setOnClickListener(e -> { presentFragment(new RestrictedLanguagesSelectActivity()); update(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 110f83eeb..d6d237134 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -1891,6 +1891,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati String lang = null; String theme = null; String code = null; + String contactToken = null; TLRPC.TL_wallPaper wallPaper = null; String inputInvoiceSlug = null; Integer messageId = null; @@ -2051,7 +2052,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati theme = path.substring(9); } else if (path.startsWith("c/")) { List segments = data.getPathSegments(); - if (segments.size() == 3) { + if (segments.size() >= 3) { channelId = Utilities.parseLong(segments.get(1)); messageId = Utilities.parseInt(segments.get(2)); if (messageId == 0 || channelId == 0) { @@ -2068,7 +2069,13 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati threadId = null; } } + if (threadId == null && messageId != null && segments.size() >= 4) { + threadId = messageId; + messageId = Utilities.parseInt(segments.get(3)); + } } + } else if (path.startsWith("contact/")) { + contactToken = path.substring(8); } else if (path.length() >= 1) { ArrayList segments = new ArrayList<>(data.getPathSegments()); if (segments.size() > 0 && segments.get(0).equals("s")) { @@ -2106,6 +2113,10 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati threadId = null; } } + if (threadId == null && messageId != null && segments.size() >= 3) { + threadId = messageId; + messageId = Utilities.parseInt(segments.get(2)); + } commentId = Utilities.parseInt(data.getQueryParameter("comment")); if (commentId == 0) { commentId = null; @@ -2178,11 +2189,14 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati commentId = null; } } - } - else if (url.startsWith("tg:invoice") || url.startsWith("tg://invoice")) { + } else if (url.startsWith("tg:invoice") || url.startsWith("tg://invoice")) { url = url.replace("tg:invoice", "tg://invoice"); data = Uri.parse(url); inputInvoiceSlug = data.getQueryParameter("slug"); + } else if (url.startsWith("tg:contact") || url.startsWith("tg://contact")) { + url = url.replace("tg:contact", "tg://contact"); + data = Uri.parse(url); + contactToken = data.getQueryParameter("token"); } else if (url.startsWith("tg:privatepost") || url.startsWith("tg://privatepost")) { url = url.replace("tg:privatepost", "tg://telegram.org").replace("tg://privatepost", "tg://telegram.org"); data = Uri.parse(url); @@ -2500,11 +2514,11 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati AlertsCreator.processError(currentAccount, error, getActionBarLayout().getLastFragment(), req); } }), ConnectionsManager.RequestFlagFailOnServerErrors); - } else if (username != null || group != null || sticker != null || emoji != null || message != null || game != null || voicechat != null || auth != null || unsupportedUrl != null || lang != null || code != null || wallPaper != null || inputInvoiceSlug != null || channelId != null || theme != null || login != null) { + } else if (username != null || group != null || sticker != null || emoji != null || contactToken != null || message != null || game != null || voicechat != null || auth != null || unsupportedUrl != null || lang != null || code != null || wallPaper != null || inputInvoiceSlug != null || channelId != null || theme != null || login != null) { if (message != null && message.startsWith("@")) { message = " " + message; } - runLinkRequest(intentAccount[0], username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 0, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); + runLinkRequest(intentAccount[0], username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 0, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); } else { try (Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null)) { if (cursor != null) { @@ -2945,6 +2959,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati private void openDialogsToSend(boolean animated) { Bundle args = new Bundle(); args.putBoolean("onlySelect", true); + args.putBoolean("canSelectTopics", true); args.putInt("dialogsType", 3); args.putBoolean("allowSwitchAccount", true); if (contactsToSend != null) { @@ -3247,6 +3262,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati final String botChannel, final String botChatAdminParams, final String message, + final String contactToken, final boolean hasUrl, final Integer messageId, final Long channelId, @@ -3273,7 +3289,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati if (account != intentAccount) { switchToAccount(account, true); } - runLinkRequest(account, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); + runLinkRequest(account, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose); }).show(); return; } else if (code != null) { @@ -3299,7 +3315,28 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati final int[] requestId = new int[]{0}; Runnable cancelRunnable = null; - if (inputInvoiceSlug != null) { + if (contactToken != null) { + TLRPC.TL_contacts_importContactToken req = new TLRPC.TL_contacts_importContactToken(); + req.token = contactToken; + requestId[0] = ConnectionsManager.getInstance(intentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) response; + MessagesController.getInstance(intentAccount).putUser(user, false); + Bundle args = new Bundle(); + args.putLong("user_id", user.id); + presentFragment(new ChatActivity(args)); + } else { + FileLog.e("cant import contact token. token=" + contactToken + " err=" + (error == null ? null : error.text)); + BulletinFactory.of(mainFragmentsStack.get(mainFragmentsStack.size() - 1)).createErrorBulletin(LocaleController.getString(R.string.NoUsernameFound)).show(); + } + + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e(e); + } + })); + } else if (inputInvoiceSlug != null) { TLRPC.TL_payments_getPaymentForm req = new TLRPC.TL_payments_getPaymentForm(); TLRPC.TL_inputInvoiceSlug invoiceSlug = new TLRPC.TL_inputInvoiceSlug(); invoiceSlug.slug = inputInvoiceSlug; @@ -3551,7 +3588,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-did); if (chat != null && (chat.creator || chat.admin_rights != null && chat.admin_rights.add_admins)) { - MessagesController.getInstance(intentAccount).checkIsInChat(chat, user, (isInChatAlready, currentRights, currentRank) -> AndroidUtilities.runOnUIThread(() -> { + MessagesController.getInstance(intentAccount).checkIsInChat(false, chat, user, (isInChatAlready, currentRights, currentRank) -> AndroidUtilities.runOnUIThread(() -> { TLRPC.TL_chatAdminRights requestingRights = null; if (botChatAdminParams != null) { String[] adminParams = botChatAdminParams.split("\\+| "); @@ -4379,7 +4416,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } if (message != null) { - runCommentRequest(currentAccount, null, message.id, null, MessageObject.getTopicId(message), MessagesController.getInstance(currentAccount).getChat(-dialogId), onOpened); + runCommentRequest(currentAccount, null, message.id, null, MessageObject.getTopicId(message, MessagesController.getInstance(currentAccount).isForum(message)), MessagesController.getInstance(currentAccount).getChat(-dialogId), onOpened); return; } @@ -5324,6 +5361,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati AndroidUtilities.resetWasTabletFlag(); if (wasTablet != AndroidUtilities.isTablet()) { long dialogId = 0; + int topicId = 0; if (wasTablet) { mainFragmentsStack.addAll(rightFragmentsStack); mainFragmentsStack.addAll(layerFragmentsStack); @@ -5341,6 +5379,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati rightFragmentsStack.add(fragment); if (dialogId == 0) { dialogId = ((ChatActivity) fragment).getDialogId(); + topicId = ((ChatActivity) fragment).getTopicId(); } } else { layerFragmentsStack.add(fragment); @@ -5356,7 +5395,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati for (BaseFragment fragment : mainFragmentsStack) { if (fragment instanceof DialogsActivity && ((DialogsActivity) fragment).isMainDialogList()) { - ((DialogsActivity) fragment).setOpenedDialogId(dialogId); + ((DialogsActivity) fragment).setOpenedDialogId(dialogId, topicId); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index e2a27cbf2..ee18f1e4b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -63,6 +63,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.DialogObject; import org.telegram.messenger.FileLog; @@ -212,6 +213,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private final static int open_in = 1; private final static int share_live_location = 5; + private final static int get_directions = 6; private final static int map_list_menu_map = 2; private final static int map_list_menu_satellite = 3; private final static int map_list_menu_hybrid = 4; @@ -539,6 +541,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } } else if (id == share_live_location) { openShareLiveLocation(0); + } else if (id == get_directions) { + openDirections(); } } }); @@ -549,6 +553,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } else if (messageObject != null) { if (messageObject.isLiveLocation()) { actionBar.setTitle(LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation)); + otherItem = menu.addItem(0, R.drawable.ic_ab_other); + otherItem.addSubItem(get_directions, R.drawable.navigate, LocaleController.getString("GetDirections", R.string.GetDirections)); } else { if (messageObject.messageOwner.media.title != null && messageObject.messageOwner.media.title.length() > 0) { actionBar.setTitle(LocaleController.getString("SharedPlace", R.string.SharedPlace)); @@ -945,28 +951,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter listView.setAdapter(adapter = new LocationActivityAdapter(context, locationType, dialogId, false, null) { @Override protected void onDirectionClick() { - if (Build.VERSION.SDK_INT >= 23) { - Activity activity = getParentActivity(); - if (activity != null) { - if (activity.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - showPermissionAlert(true); - return; - } - } - } - if (myLocation != null) { - try { - Intent intent; - if (messageObject != null) { - intent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format(Locale.US, "http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f", myLocation.getLatitude(), myLocation.getLongitude(), messageObject.messageOwner.media.geo.lat, messageObject.messageOwner.media.geo._long))); - } else { - intent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format(Locale.US, "http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f", myLocation.getLatitude(), myLocation.getLongitude(), chatLocation.geo_point.lat, chatLocation.geo_point._long))); - } - getParentActivity().startActivity(intent); - } catch (Exception e) { - FileLog.e(e); - } - } + openDirections(); } }); adapter.setMyLocationDenied(locationDenied); @@ -1304,6 +1289,38 @@ public class LocationActivity extends BaseFragment implements NotificationCenter return AndroidUtilities.computePerceivedBrightness(color) < 0.721f; } + private void openDirections() { + double daddrLat, daddrLong; + if (messageObject != null) { + daddrLat = messageObject.messageOwner.media.geo.lat; + daddrLong = messageObject.messageOwner.media.geo._long; + } else { + daddrLat = chatLocation.geo_point.lat; + daddrLong = chatLocation.geo_point._long; + } + String domain; + if (BuildVars.isHuaweiStoreApp()) { + domain = "mapapp://navigation"; + } else { + domain = "http://maps.google.com/maps"; + } + if (myLocation != null) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format(Locale.US, domain + "?saddr=%f,%f&daddr=%f,%f", myLocation.getLatitude(), myLocation.getLongitude(), daddrLat, daddrLong))); + getParentActivity().startActivity(intent); + } catch (Exception e) { + FileLog.e(e); + } + } else { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(String.format(Locale.US, domain + "?saddr=&daddr=%f,%f", daddrLat, daddrLong))); + getParentActivity().startActivity(intent); + } catch (Exception e) { + FileLog.e(e); + } + } + } + private void updateEmptyView() { if (searching) { if (searchInProgress) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 9a02e634d..3dfdbba7e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -174,7 +174,8 @@ public class LoginActivity extends BaseFragment { AUTH_TYPE_SMS = 2, AUTH_TYPE_FLASH_CALL = 3, AUTH_TYPE_CALL = 4, - AUTH_TYPE_MISSED_CALL = 11; + AUTH_TYPE_MISSED_CALL = 11, + AUTH_TYPE_FRAGMENT_SMS = 15; private final static int MODE_LOGIN = 0, MODE_CANCEL_ACCOUNT_DELETION = 1, @@ -195,7 +196,8 @@ public class LoginActivity extends BaseFragment { VIEW_CODE_MISSED_CALL = 11, VIEW_ADD_EMAIL = 12, VIEW_CODE_EMAIL_SETUP = 13, - VIEW_CODE_EMAIL = 14; + VIEW_CODE_EMAIL = 14, + VIEW_CODE_FRAGMENT_SMS = 15; private final static int COUNTRY_STATE_NOT_SET_OR_VALID = 0, COUNTRY_STATE_EMPTY = 1, @@ -207,7 +209,8 @@ public class LoginActivity extends BaseFragment { AUTH_TYPE_SMS, AUTH_TYPE_FLASH_CALL, AUTH_TYPE_CALL, - AUTH_TYPE_MISSED_CALL + AUTH_TYPE_MISSED_CALL, + AUTH_TYPE_FRAGMENT_SMS }) public @interface AuthType {} @@ -236,7 +239,8 @@ public class LoginActivity extends BaseFragment { VIEW_CODE_MISSED_CALL, VIEW_ADD_EMAIL, VIEW_CODE_EMAIL_SETUP, - VIEW_CODE_EMAIL + VIEW_CODE_EMAIL, + VIEW_CODE_FRAGMENT_SMS }) private @interface ViewNumber {} @@ -249,7 +253,7 @@ public class LoginActivity extends BaseFragment { @ViewNumber private int currentViewNum; - private SlideView[] views = new SlideView[15]; + private SlideView[] views = new SlideView[16]; private CustomPhoneKeyboardView keyboardView; private ValueAnimator keyboardAnimator; @@ -566,6 +570,7 @@ public class LoginActivity extends BaseFragment { views[VIEW_ADD_EMAIL] = new LoginActivitySetupEmail(context); views[VIEW_CODE_EMAIL_SETUP] = new LoginActivityEmailCodeView(context, true); views[VIEW_CODE_EMAIL] = new LoginActivityEmailCodeView(context, false); + views[VIEW_CODE_FRAGMENT_SMS] = new LoginActivitySmsView(context, AUTH_TYPE_FRAGMENT_SMS); for (int a = 0; a < views.length; a++) { views[a].setVisibility(a == 0 ? View.VISIBLE : View.GONE); @@ -817,11 +822,6 @@ public class LoginActivity extends BaseFragment { } } - @Override - public boolean hasForceLightStatusBar() { - return true; - } - @Override public void onConfigurationChanged(Configuration newConfig) { setCustomKeyboardVisible(views[currentViewNum].hasCustomKeyboard(), false); @@ -962,7 +962,7 @@ public class LoginActivity extends BaseFragment { } else if (currentViewNum == VIEW_RECOVER || currentViewNum == VIEW_RESET_WAIT) { views[currentViewNum].onBackPressed(true); setPage(VIEW_PASSWORD, true, null, true); - } else if ((currentViewNum >= VIEW_CODE_MESSAGE && currentViewNum <= VIEW_CODE_CALL) || currentViewNum == AUTH_TYPE_MISSED_CALL) { + } else if ((currentViewNum >= VIEW_CODE_MESSAGE && currentViewNum <= VIEW_CODE_CALL) || currentViewNum == AUTH_TYPE_MISSED_CALL || currentViewNum == AUTH_TYPE_FRAGMENT_SMS) { if (views[currentViewNum].onBackPressed(false)) { setPage(VIEW_PHONE_INPUT, true, null, true); } @@ -1594,6 +1594,8 @@ public class LoginActivity extends BaseFragment { params.putInt("nextType", AUTH_TYPE_SMS); } else if (res.next_type instanceof TLRPC.TL_auth_codeTypeMissedCall) { params.putInt("nextType", AUTH_TYPE_MISSED_CALL); + } else if (res.next_type instanceof TLRPC.TL_auth_codeTypeFragmentSms) { + params.putInt("nextType", AUTH_TYPE_FRAGMENT_SMS); } if (res.type instanceof TLRPC.TL_auth_sentCodeTypeApp) { params.putInt("type", AUTH_TYPE_MESSAGE); @@ -1616,6 +1618,11 @@ public class LoginActivity extends BaseFragment { params.putInt("type", AUTH_TYPE_SMS); params.putInt("length", res.type.length); setPage(VIEW_CODE_SMS, animate, params, false); + } else if (res.type instanceof TLRPC.TL_auth_sentCodeTypeFragmentSms) { + params.putInt("type", AUTH_TYPE_FRAGMENT_SMS); + params.putString("url", res.type.url); + params.putInt("length", res.type.length); + setPage(VIEW_CODE_FRAGMENT_SMS, animate, params, false); } else if (res.type instanceof TLRPC.TL_auth_sentCodeTypeMissedCall) { params.putInt("type", AUTH_TYPE_MISSED_CALL); params.putInt("length", res.type.length); @@ -2033,7 +2040,7 @@ public class LoginActivity extends BaseFragment { if (BuildVars.DEBUG_PRIVATE_VERSION && activityMode == MODE_LOGIN) { testBackendCheckBox = new CheckBoxCell(context, 2); - testBackendCheckBox.setText("Test Backend", "", testBackend, false); + testBackendCheckBox.setText(LocaleController.getString(R.string.DebugTestBackend), "", testBackend, false); addView(testBackendCheckBox, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 16, 0, 16 + (LocaleController.isRTL && AndroidUtilities.isSmallScreen() ? Build.VERSION.SDK_INT >= 21 ? 56 : 60 : 0), 0)); bottomMargin -= 24; testBackendCheckBox.setOnClickListener(v -> { @@ -2043,6 +2050,12 @@ public class LoginActivity extends BaseFragment { CheckBoxCell cell = (CheckBoxCell) v; testBackend = !testBackend; cell.setChecked(testBackend, true); + + boolean testBackend = BuildVars.DEBUG_PRIVATE_VERSION && getConnectionsManager().isTestBackend(); + if (testBackend != LoginActivity.this.testBackend) { + getConnectionsManager().switchBackend(false); + } + loadCountries(); }); } if (bottomMargin > 0 && !AndroidUtilities.isSmallScreen()) { @@ -2114,6 +2127,10 @@ public class LoginActivity extends BaseFragment { codeField.requestFocus(); } + loadCountries(); + } + + private void loadCountries() { TLRPC.TL_help_getCountriesList req = new TLRPC.TL_help_getCountriesList(); req.lang_code = ""; getConnectionsManager().sendRequest(req, (response, error) -> { @@ -2122,6 +2139,7 @@ public class LoginActivity extends BaseFragment { countriesArray.clear(); codesMap.clear(); phoneFormatMap.clear(); + TLRPC.TL_help_countriesList help_countriesList = (TLRPC.TL_help_countriesList) response; for (int i = 0; i < help_countriesList.countries.size(); i++) { TLRPC.TL_help_country c = help_countriesList.countries.get(i); @@ -2493,12 +2511,6 @@ public class LoginActivity extends BaseFragment { } String phone = PhoneFormat.stripExceptNumbers("" + codeField.getText() + phoneField.getText()); if (activityMode == MODE_LOGIN) { - boolean testBackend = BuildVars.DEBUG_PRIVATE_VERSION && getConnectionsManager().isTestBackend(); - if (testBackend != LoginActivity.this.testBackend) { - getConnectionsManager().switchBackend(false); - testBackend = LoginActivity.this.testBackend; - } - if (getParentActivity() instanceof LaunchActivity) { for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { UserConfig userConfig = UserConfig.getInstance(a); @@ -2836,6 +2848,9 @@ public class LoginActivity extends BaseFragment { private TextView problemText; private FrameLayout problemFrame; private TextView wrongCode; + private LinearLayout openFragmentButton; + private RLottieImageView openFragmentImageView; + private TextView openFragmentButtonText; private Bundle currentParams; private ProgressView progressView; @@ -2871,6 +2886,7 @@ public class LoginActivity extends BaseFragment { private String prefix = ""; private String catchedPhone; private int length; + private String url; private boolean postedErrorColorTimeout; private Runnable errorColorTimeout = () -> { @@ -2879,7 +2895,8 @@ public class LoginActivity extends BaseFragment { codeFieldContainer.codeField[i].animateErrorProgress(0); } - if (errorViewSwitcher.getCurrentView() != problemFrame) { + View v = currentType == AUTH_TYPE_FRAGMENT_SMS ? openFragmentButton : problemFrame; + if (errorViewSwitcher.getCurrentView() != v) { errorViewSwitcher.showNext(); } }; @@ -3010,7 +3027,8 @@ public class LoginActivity extends BaseFragment { frameLayout.addView(blueImageView, LayoutHelper.createFrame(size, size, Gravity.LEFT | Gravity.TOP, 0, 0, 0, currentType == AUTH_TYPE_MESSAGE && !AndroidUtilities.isSmallScreen() ? -AndroidUtilities.dp(16) : 0)); titleTextView.setText(overrideTitle != null ? overrideTitle : LocaleController.getString(currentType == AUTH_TYPE_MESSAGE ? R.string.SentAppCodeTitle : R.string.SentSmsCodeTitle)); addView(titleTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 18, 0, 0)); - addView(confirmTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 17, 0, 0)); + int sideMargin = currentType == AUTH_TYPE_FRAGMENT_SMS ? 16 : 0; + addView(confirmTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, sideMargin, 17, sideMargin, 0)); } if (currentType != AUTH_TYPE_MISSED_CALL) { codeFieldContainer = new CodeFieldContainer(context) { @@ -3073,21 +3091,58 @@ public class LoginActivity extends BaseFragment { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(100), MeasureSpec.AT_MOST)); } }; - Animation anim = AnimationUtils.loadAnimation(context, R.anim.text_in); - anim.setInterpolator(Easings.easeInOutQuad); - errorViewSwitcher.setInAnimation(anim); - anim = AnimationUtils.loadAnimation(context, R.anim.text_out); - anim.setInterpolator(Easings.easeInOutQuad); - errorViewSwitcher.setOutAnimation(anim); + if (currentType != AUTH_TYPE_FRAGMENT_SMS) { + Animation anim = AnimationUtils.loadAnimation(context, R.anim.text_in); + anim.setInterpolator(Easings.easeInOutQuad); + errorViewSwitcher.setInAnimation(anim); - problemText = new TextView(context); - problemText.setLineSpacing(AndroidUtilities.dp(2), 1.0f); - problemText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - problemText.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); - problemText.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4)); - problemFrame.addView(problemText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - errorViewSwitcher.addView(problemFrame); + anim = AnimationUtils.loadAnimation(context, R.anim.text_out); + anim.setInterpolator(Easings.easeInOutQuad); + errorViewSwitcher.setOutAnimation(anim); + + problemText = new TextView(context); + problemText.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + problemText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + problemText.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); + problemText.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4)); + problemFrame.addView(problemText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + errorViewSwitcher.addView(problemFrame, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + } else { + Animation anim = AnimationUtils.loadAnimation(context, R.anim.scale_in); + anim.setInterpolator(CubicBezierInterpolator.DEFAULT); + errorViewSwitcher.setInAnimation(anim); + + anim = AnimationUtils.loadAnimation(context, R.anim.scale_out); + anim.setInterpolator(CubicBezierInterpolator.DEFAULT); + errorViewSwitcher.setOutAnimation(anim); + + openFragmentButton = new LinearLayout(context); + openFragmentButton.setOrientation(HORIZONTAL); + openFragmentButton.setGravity(Gravity.CENTER); + openFragmentButton.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); + openFragmentButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_changephoneinfo_image2), Theme.getColor(Theme.key_chats_actionPressedBackground))); + openFragmentButton.setOnClickListener(v -> { + try { + getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + } catch (Exception e) { + FileLog.e(e); + } + }); + errorViewSwitcher.addView(openFragmentButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 52)); + + openFragmentImageView = new RLottieImageView(context); + openFragmentImageView.setAnimation(R.raw.fragment, 36, 36); + openFragmentButton.addView(openFragmentImageView, LayoutHelper.createLinear(36, 36, Gravity.CENTER_VERTICAL, 0, 0, 2, 0)); + + openFragmentButtonText = new TextView(context); + openFragmentButtonText.setText(LocaleController.getString(R.string.OpenFragment)); + openFragmentButtonText.setTextColor(Color.WHITE); + openFragmentButtonText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + openFragmentButtonText.setGravity(Gravity.CENTER); + openFragmentButtonText.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + openFragmentButton.addView(openFragmentButtonText); + } wrongCode = new TextView(context); wrongCode.setText(LocaleController.getString("WrongCode", R.string.WrongCode)); @@ -3095,60 +3150,64 @@ public class LoginActivity extends BaseFragment { wrongCode.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); wrongCode.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); wrongCode.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4)); - errorViewSwitcher.addView(wrongCode); + errorViewSwitcher.addView(wrongCode, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - if (currentType == AUTH_TYPE_MESSAGE) { - if (nextType == AUTH_TYPE_FLASH_CALL || nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_MISSED_CALL) { - problemText.setText(LocaleController.getString("DidNotGetTheCodePhone", R.string.DidNotGetTheCodePhone)); + if (currentType != AUTH_TYPE_FRAGMENT_SMS) { + if (currentType == AUTH_TYPE_MESSAGE) { + if (nextType == AUTH_TYPE_FLASH_CALL || nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_MISSED_CALL) { + problemText.setText(LocaleController.getString("DidNotGetTheCodePhone", R.string.DidNotGetTheCodePhone)); + } else { + problemText.setText(LocaleController.getString("DidNotGetTheCodeSms", R.string.DidNotGetTheCodeSms)); + } } else { - problemText.setText(LocaleController.getString("DidNotGetTheCodeSms", R.string.DidNotGetTheCodeSms)); + problemText.setText(LocaleController.getString("DidNotGetTheCode", R.string.DidNotGetTheCode)); } - } else { - problemText.setText(LocaleController.getString("DidNotGetTheCode", R.string.DidNotGetTheCode)); } if (centerContainer == null) { bottomContainer = new FrameLayout(context); - bottomContainer.addView(errorViewSwitcher, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 0, 0, 32)); + bottomContainer.addView(errorViewSwitcher, LayoutHelper.createFrame(currentType == VIEW_CODE_FRAGMENT_SMS ? LayoutHelper.MATCH_PARENT : LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 0, 0, 32)); addView(bottomContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 0, 1f)); } else { centerContainer.addView(errorViewSwitcher, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 0, 0, 32)); } VerticalPositionAutoAnimator.attach(errorViewSwitcher); - problemText.setOnClickListener(v -> { - if (nextPressed) { - return; - } - boolean email = nextType == 0; - if (!email) { - if (radialProgressView.getTag() != null) { + if (currentType != AUTH_TYPE_FRAGMENT_SMS) { + problemText.setOnClickListener(v -> { + if (nextPressed) { return; } - resendCode(); - } else { - new AlertDialog.Builder(context) - .setTitle(LocaleController.getString(R.string.RestorePasswordNoEmailTitle)) - .setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("DidNotGetTheCodeInfo", R.string.DidNotGetTheCodeInfo, phone))) - .setNeutralButton(LocaleController.getString(R.string.DidNotGetTheCodeHelpButton), (dialog, which)->{ - try { - PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0); - String version = String.format(Locale.US, "%s (%d)", pInfo.versionName, pInfo.versionCode); + boolean email = nextType == 0; + if (!email) { + if (radialProgressView.getTag() != null) { + return; + } + resendCode(); + } else { + new AlertDialog.Builder(context) + .setTitle(LocaleController.getString(R.string.RestorePasswordNoEmailTitle)) + .setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("DidNotGetTheCodeInfo", R.string.DidNotGetTheCodeInfo, phone))) + .setNeutralButton(LocaleController.getString(R.string.DidNotGetTheCodeHelpButton), (dialog, which) -> { + try { + PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0); + String version = String.format(Locale.US, "%s (%d)", pInfo.versionName, pInfo.versionCode); - Intent mailer = new Intent(Intent.ACTION_SENDTO); - mailer.setData(Uri.parse("mailto:")); - mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"sms@telegram.org"}); - mailer.putExtra(Intent.EXTRA_SUBJECT, "Android registration/login issue " + version + " " + emailPhone); - mailer.putExtra(Intent.EXTRA_TEXT, "Phone: " + requestPhone + "\nApp version: " + version + "\nOS version: SDK " + Build.VERSION.SDK_INT + "\nDevice Name: " + Build.MANUFACTURER + Build.MODEL + "\nLocale: " + Locale.getDefault() + "\nError: " + lastError); - getContext().startActivity(Intent.createChooser(mailer, "Send email...")); - } catch (Exception e) { - needShowAlert(LocaleController.getString(R.string.AppName), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); - } - }) - .setPositiveButton(LocaleController.getString(R.string.Close), null) - .setNegativeButton(LocaleController.getString(R.string.DidNotGetTheCodeEditNumberButton), (dialog, which)-> setPage(VIEW_PHONE_INPUT, true, null, true)) - .show(); - } - }); + Intent mailer = new Intent(Intent.ACTION_SENDTO); + mailer.setData(Uri.parse("mailto:")); + mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"sms@telegram.org"}); + mailer.putExtra(Intent.EXTRA_SUBJECT, "Android registration/login issue " + version + " " + emailPhone); + mailer.putExtra(Intent.EXTRA_TEXT, "Phone: " + requestPhone + "\nApp version: " + version + "\nOS version: SDK " + Build.VERSION.SDK_INT + "\nDevice Name: " + Build.MANUFACTURER + Build.MODEL + "\nLocale: " + Locale.getDefault() + "\nError: " + lastError); + getContext().startActivity(Intent.createChooser(mailer, "Send email...")); + } catch (Exception e) { + needShowAlert(LocaleController.getString(R.string.AppName), LocaleController.getString("NoMailInstalled", R.string.NoMailInstalled)); + } + }) + .setPositiveButton(LocaleController.getString(R.string.Close), null) + .setNegativeButton(LocaleController.getString(R.string.DidNotGetTheCodeEditNumberButton), (dialog, which) -> setPage(VIEW_PHONE_INPUT, true, null, true)) + .show(); + } + }); + } } @Override @@ -3177,7 +3236,9 @@ public class LoginActivity extends BaseFragment { if (timeTextColorTag == null) timeTextColorTag = Theme.key_windowBackgroundWhiteGrayText6; timeText.setTextColor(Theme.getColor(timeTextColorTag)); - problemText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4)); + if (currentType != AUTH_TYPE_FRAGMENT_SMS) { + problemText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4)); + } wrongCode.setTextColor(Theme.getColor(Theme.key_dialogTextRed)); } @@ -3328,7 +3389,9 @@ public class LoginActivity extends BaseFragment { return; } waitingForEvent = true; - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(true); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -3350,6 +3413,7 @@ public class LoginActivity extends BaseFragment { if (length == 0) { length = 5; } + url = params.getString("url"); codeFieldContainer.setNumbersCount(length, currentType); for (CodeNumberField f : codeFieldContainer.codeField) { @@ -3411,6 +3475,8 @@ public class LoginActivity extends BaseFragment { str = AndroidUtilities.replaceTags(LocaleController.formatString("SentCallCode", R.string.SentCallCode, LocaleController.addNbsp(number))); } else if (currentType == AUTH_TYPE_CALL) { str = AndroidUtilities.replaceTags(LocaleController.formatString("SentCallOnly", R.string.SentCallOnly, LocaleController.addNbsp(number))); + } else if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + str = AndroidUtilities.replaceTags(LocaleController.formatString("SentFragmentCode", R.string.SentFragmentCode, LocaleController.addNbsp(number))); } } confirmTextView.setText(str); @@ -3455,7 +3521,7 @@ public class LoginActivity extends BaseFragment { String savedCode = null; if (!TextUtils.isEmpty(hash)) { savedCode = preferences.getString("sms_hash_code", null); - if (savedCode != null && savedCode.contains(hash + "|")) { + if (savedCode != null && savedCode.contains(hash + "|") && !newAccount) { savedCode = savedCode.substring(savedCode.indexOf('|') + 1); } else { savedCode = null; @@ -3497,6 +3563,9 @@ public class LoginActivity extends BaseFragment { } private void setProblemTextVisible(boolean visible) { + if (problemText == null) { + return; + } float newAlpha = visible ? 1f : 0f; if (problemText.getAlpha() != newAlpha) { problemText.animate().cancel(); @@ -3616,7 +3685,7 @@ public class LoginActivity extends BaseFragment { return; } } else { - if (nextPressed || currentViewNum < VIEW_CODE_MESSAGE || currentViewNum > VIEW_CODE_CALL) { + if (nextPressed || (currentViewNum < VIEW_CODE_MESSAGE || currentViewNum > VIEW_CODE_CALL) && currentViewNum != VIEW_CODE_FRAGMENT_SMS) { return; } } @@ -3634,7 +3703,9 @@ public class LoginActivity extends BaseFragment { } nextPressed = true; - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(false); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -3682,7 +3753,7 @@ public class LoginActivity extends BaseFragment { } catch (Exception ignored) {} new AlertDialog.Builder(getContext()) .setTitle(LocaleController.getString(R.string.YourPasswordSuccess)) - .setMessage(LocaleController.getString(R.string.ChangePhoneNumberSuccess)) + .setMessage(LocaleController.formatString(R.string.ChangePhoneNumberSuccessWithPhone, PhoneFormat.getInstance().format("+" + requestPhone))) .setPositiveButton(LocaleController.getString(R.string.OK), null) .setOnDismissListener(dialog -> finishFragment()) .show(); @@ -3694,7 +3765,9 @@ public class LoginActivity extends BaseFragment { if (currentType == AUTH_TYPE_FLASH_CALL && (nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_SMS) || currentType == AUTH_TYPE_SMS && (nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_FLASH_CALL) || currentType == AUTH_TYPE_CALL && nextType == AUTH_TYPE_SMS) { createTimer(); } - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().addObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(true); NotificationCenter.getGlobalInstance().addObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -3762,7 +3835,9 @@ public class LoginActivity extends BaseFragment { (nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_FLASH_CALL) || currentType == AUTH_TYPE_CALL && nextType == AUTH_TYPE_SMS) { createTimer(); } - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().addObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(true); NotificationCenter.getGlobalInstance().addObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -3857,7 +3932,9 @@ public class LoginActivity extends BaseFragment { if (currentType == AUTH_TYPE_FLASH_CALL && (nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_SMS) || currentType == AUTH_TYPE_SMS && (nextType == AUTH_TYPE_CALL || nextType == AUTH_TYPE_FLASH_CALL) || currentType == AUTH_TYPE_CALL && nextType == AUTH_TYPE_SMS) { createTimer(); } - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().addObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(true); NotificationCenter.getGlobalInstance().addObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -3929,7 +4006,7 @@ public class LoginActivity extends BaseFragment { codeFieldContainer.codeField[a].setText(""); codeFieldContainer.codeField[a].animateErrorProgress(1f); } - if (errorViewSwitcher.getCurrentView() == problemFrame) { + if (errorViewSwitcher.getCurrentView() != wrongCode) { errorViewSwitcher.showNext(); } codeFieldContainer.codeField[0].requestFocus(); @@ -3985,7 +4062,9 @@ public class LoginActivity extends BaseFragment { destroyTimer(); destroyCodeTimer(); currentParams = null; - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().removeObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(false); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -3999,7 +4078,9 @@ public class LoginActivity extends BaseFragment { @Override public void onDestroyActivity() { super.onDestroyActivity(); - if (currentType == AUTH_TYPE_SMS) { + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + NotificationCenter.getGlobalInstance().removeObserver(LoginActivitySmsView.this, NotificationCenter.didReceiveSmsCode); + } else if (currentType == AUTH_TYPE_SMS) { AndroidUtilities.setWaitingForSms(false); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didReceiveSmsCode); } else if (currentType == AUTH_TYPE_FLASH_CALL) { @@ -4031,6 +4112,10 @@ public class LoginActivity extends BaseFragment { if (hintDrawable != null) { hintDrawable.start(); } + if (currentType == AUTH_TYPE_FRAGMENT_SMS) { + openFragmentImageView.getAnimatedDrawable().setCurrentFrame(0, false); + openFragmentImageView.getAnimatedDrawable().start(); + } }, SHOW_DELAY); } @@ -6983,6 +7068,8 @@ public class LoginActivity extends BaseFragment { } private void updateColors() { + fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + Context context = getParentActivity(); Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_chats_actionBackground), Theme.getColor(Theme.key_chats_actionPressedBackground)); if (Build.VERSION.SDK_INT < 21) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSoundActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSoundActivity.java index 8ff055c99..733d46783 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSoundActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSoundActivity.java @@ -298,7 +298,7 @@ public class NotificationsSoundActivity extends BaseFragment implements ChatAtta if (dialogId < 0) { if (topicId != 0) { TLRPC.TL_forumTopic forumTopic = getMessagesController().getTopicsController().findTopic(-dialogId, topicId); - ForumUtilities.setTopicIcon(avatarContainer.getAvatarImageView(), forumTopic, true); + ForumUtilities.setTopicIcon(avatarContainer.getAvatarImageView(), forumTopic, true, resourcesProvider); avatarContainer.setTitle(forumTopic.title); } else { TLRPC.Chat chatLocal = getMessagesController().getChat(-dialogId); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java index b4141ab73..8c696aa2b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PassportActivity.java @@ -62,6 +62,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.core.content.FileProvider; +import androidx.core.graphics.ColorUtils; import org.json.JSONArray; import org.json.JSONObject; @@ -115,6 +116,7 @@ import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.EmptyTextProgressView; import org.telegram.ui.Components.HintEditText; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkSpanDrawable; import org.telegram.ui.Components.RadialProgress; import org.telegram.ui.Components.SlideView; import org.telegram.ui.Components.URLSpanNoUnderline; @@ -1110,7 +1112,7 @@ public class PassportActivity extends BaseFragment implements NotificationCenter if (getParentActivity() == null) { return; } - final TextView message = new TextView(getParentActivity()); + final LinkSpanDrawable.LinksTextView message = new LinkSpanDrawable.LinksTextView(getParentActivity()); String str2 = LocaleController.getString("PassportInfo2", R.string.PassportInfo2); SpannableStringBuilder spanned = new SpannableStringBuilder(str2); int index1 = str2.indexOf('*'); @@ -2514,12 +2516,14 @@ public class PassportActivity extends BaseFragment implements NotificationCenter emptyTextView3 = new TextView(context); emptyTextView3.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4)); + emptyTextView3.setPadding(AndroidUtilities.dp(12), AndroidUtilities.dp(4), AndroidUtilities.dp(12), AndroidUtilities.dp(4)); + emptyTextView3.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4), 0x20), Theme.RIPPLE_MASK_ROUNDRECT_6DP)); emptyTextView3.setGravity(Gravity.CENTER); emptyTextView3.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); emptyTextView3.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); emptyTextView3.setGravity(Gravity.CENTER); emptyTextView3.setText(LocaleController.getString("PassportNoDocumentsAdd", R.string.PassportNoDocumentsAdd).toUpperCase()); - emptyLayout.addView(emptyTextView3, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 30, Gravity.CENTER, 0, 16, 0, 0)); + emptyLayout.addView(emptyTextView3, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 30, Gravity.CENTER, 0, 12, 0, 0)); emptyTextView3.setOnClickListener(v -> openAddDocumentAlert()); for (int a = 0, size = currentForm.values.size(); a < size; a++) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 6f85a76f9..4cee1b704 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -5099,6 +5099,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat requestVideoPreview(2); }); qualityPicker.doneButton.setOnClickListener(view -> { + Object object = imagesArrLocals.get(currentIndex); + if (object instanceof MediaController.MediaEditState) { + ((MediaController.MediaEditState) object).editedInfo = getCurrentVideoEditedInfo(); + } showQualityView(false); requestVideoPreview(2); }); @@ -7492,6 +7496,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat videoEditedInfo.endTime *= 2; } videoEditedInfo.end = videoEditedInfo.endTime; + videoEditedInfo.compressQuality = selectedCompression; videoEditedInfo.rotationValue = 0; videoEditedInfo.originalPath = currentImagePath; videoEditedInfo.estimatedSize = (int) (videoEditedInfo.endTime / 1000.0f * 115200); @@ -7548,6 +7553,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat videoEditedInfo.endTime = endTime; videoEditedInfo.start = videoCutStart; videoEditedInfo.end = videoCutEnd; + videoEditedInfo.compressQuality = selectedCompression; videoEditedInfo.rotationValue = rotationValue; videoEditedInfo.originalWidth = originalWidth; videoEditedInfo.originalHeight = originalHeight; @@ -10619,7 +10625,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } } else if (MessageObject.getMedia(message.messageOwner) instanceof TLRPC.TL_messageMediaInvoice) { - return ImageLocation.getForWebFile(WebFile.createWithWebDocument(((TLRPC.TL_messageMediaInvoice) MessageObject.getMedia(message.messageOwner)).photo)); + return ImageLocation.getForWebFile(WebFile.createWithWebDocument(((TLRPC.TL_messageMediaInvoice) MessageObject.getMedia(message.messageOwner)).webPhoto)); } else if (message.getDocument() != null) { TLRPC.Document document = message.getDocument(); if (sharedMediaType == MediaDataController.MEDIA_GIF) { @@ -11554,15 +11560,17 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat boolean isMuted = false; float start = 0.0f; float end = 1.0f; + int compressQuality = -1; if (object instanceof MediaController.PhotoEntry) { MediaController.PhotoEntry photoEntry = ((MediaController.PhotoEntry) object); if (photoEntry.editedInfo != null) { isMuted = photoEntry.editedInfo.muted; start = photoEntry.editedInfo.start; end = photoEntry.editedInfo.end; + compressQuality = photoEntry.editedInfo.compressQuality; } } - processOpenVideo(currentPathObject, isMuted, start, end); + processOpenVideo(currentPathObject, isMuted, start, end, compressQuality); if (isDocumentsPicker || Build.VERSION.SDK_INT < 18) { showVideoTimeline(false, animated); videoAvatarTooltip.setVisibility(View.GONE); @@ -11882,8 +11890,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } if (isVideo || isEmbedVideo) { speedItem.setVisibility(View.VISIBLE); - speedGap.setVisibility(View.VISIBLE); menuItem.showSubItem(gallery_menu_speed); + speedGap.setVisibility(menuItem.getVisibleSubItemsCount() > 1 ? View.VISIBLE : View.GONE); } else { speedItem.setVisibility(View.GONE); speedGap.setVisibility(View.GONE); @@ -16799,7 +16807,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return new ByteArrayInputStream(output, 0, outPos); } - private void processOpenVideo(final String videoPath, boolean muted, float start, float end) { + private void processOpenVideo(final String videoPath, boolean muted, float start, float end, int compressQality) { if (currentLoadingVideoRunnable != null) { Utilities.globalQueue.cancelRunnable(currentLoadingVideoRunnable); currentLoadingVideoRunnable = null; @@ -16852,7 +16860,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat resultHeight = originalHeight = params[AnimatedFileDrawable.PARAM_NUM_HEIGHT]; updateCompressionsCount(originalWidth, originalHeight); - selectedCompression = selectCompression(); + if (compressQality == -1) { + selectedCompression = selectCompression(); + } else { + selectedCompression = compressQality; + } updateWidthHeightBitrateForCompression(); if (selectedCompression > compressionsCount - 1) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PinchToZoomHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/PinchToZoomHelper.java index 6cb9b9199..a0b827192 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PinchToZoomHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PinchToZoomHelper.java @@ -594,7 +594,7 @@ public class PinchToZoomHelper { } } } else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaInvoice) { - return ImageLocation.getForWebFile(WebFile.createWithWebDocument(((TLRPC.TL_messageMediaInvoice) message.messageOwner.media).photo)); + return ImageLocation.getForWebFile(WebFile.createWithWebDocument(((TLRPC.TL_messageMediaInvoice) message.messageOwner.media).webPhoto)); } else if (message.getDocument() != null) { TLRPC.Document document = message.getDocument(); if (MessageObject.isDocumentHasThumb(message.getDocument())) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java index a64f7103c..2ff521b72 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java @@ -560,6 +560,11 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification return fragmentView; } + @Override + public boolean isActionBarCrossfadeEnabled() { + return false; + } + public static void buyPremium(BaseFragment fragment) { buyPremium(fragment, "settings"); } @@ -1326,8 +1331,10 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification premiumButtonView.setFlickerDisabled(true); return; } - premiumButtonView.setButton(getPremiumButtonText(currentAccount, subscriptionTiers.get(selectedTierIndex)), v -> buyPremium(this, subscriptionTiers.get(selectedTierIndex), "settings"), animated); - premiumButtonView.setFlickerDisabled(false); + if (!subscriptionTiers.isEmpty()) { + premiumButtonView.setButton(getPremiumButtonText(currentAccount, subscriptionTiers.get(selectedTierIndex)), v -> buyPremium(this, subscriptionTiers.get(selectedTierIndex), "settings"), animated); + premiumButtonView.setFlickerDisabled(false); + } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java index edbb18b47..79a4ce74d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java @@ -46,6 +46,7 @@ import org.telegram.ui.Cells.CheckBoxCell; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.RadioColorCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; @@ -84,7 +85,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int passwordRow; private int sessionsRow; private int passcodeRow; - private int sessionsDetailRow; + private int autoDeleteMesages; + private int autoDeleteDetailRow; private int newChatsHeaderRow; private int newChatsRow; private int newChatsSectionRow; @@ -136,7 +138,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio getNotificationCenter().addObserver(this, NotificationCenter.privacyRulesUpdated); getNotificationCenter().addObserver(this, NotificationCenter.blockedUsersDidLoad); getNotificationCenter().addObserver(this, NotificationCenter.didSetOrRemoveTwoStepPassword); + getNotificationCenter().addObserver(this, NotificationCenter.didUpdateGlobalAutoDeleteTimer); + getUserConfig().loadGlobalTTl(); return true; } @@ -146,6 +150,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio getNotificationCenter().removeObserver(this, NotificationCenter.privacyRulesUpdated); getNotificationCenter().removeObserver(this, NotificationCenter.blockedUsersDidLoad); getNotificationCenter().removeObserver(this, NotificationCenter.didSetOrRemoveTwoStepPassword); + getNotificationCenter().removeObserver(this, NotificationCenter.didUpdateGlobalAutoDeleteTimer); boolean save = false; if (currentSync != newSync) { getUserConfig().syncContacts = newSync; @@ -222,7 +227,11 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio if (!view.isEnabled()) { return; } - if (position == blockedRow) { + if (position == autoDeleteMesages) { + if (getUserConfig().getGlobalTTl() >= 0) { + presentFragment(new AutoDeleteMessagesActivity()); + } + } if (position == blockedRow) { presentFragment(new PrivacyUsersActivity()); } else if (position == sessionsRow) { presentFragment(new SessionsActivity(0)); @@ -567,6 +576,10 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio loadPasswordSettings(); updateRows(); } + } if (id == NotificationCenter.didUpdateGlobalAutoDeleteTimer) { + if (listAdapter != null) { + listAdapter.notifyItemChanged(autoDeleteMesages); + } } } @@ -592,6 +605,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } privacyShadowRow = rowCount++; securitySectionRow = rowCount++; + sessionsRow = rowCount++; passcodeRow = rowCount++; passwordRow = rowCount++; @@ -607,8 +621,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio SharedConfig.saveConfig(); } } - sessionsRow = rowCount++; - sessionsDetailRow = rowCount++; + autoDeleteMesages = rowCount++; + autoDeleteDetailRow = rowCount++; if (getMessagesController().autoarchiveAvailable || getUserConfig().isPremium()) { newChatsHeaderRow = rowCount++; newChatsRow = rowCount++; @@ -832,7 +846,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio position == deleteAccountRow && !getContactsController().getLoadingDeleteInfo() || position == newChatsRow && !getContactsController().getLoadingGlobalSettings() || position == emailLoginRow || position == paymentsClearRow || position == secretMapRow || - position == contactsSyncRow || position == passportRow || position == contactsDeleteRow || position == contactsSuggestRow; + position == contactsSyncRow || position == passportRow || position == contactsDeleteRow || position == contactsSuggestRow || position == autoDeleteMesages; } @Override @@ -858,6 +872,10 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio case 4: view = new ShadowSectionCell(mContext); break; + case 5: + view = new TextCell(mContext); + view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + break; case 3: default: view = new TextCheckCell(mContext); @@ -887,23 +905,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio showLoading = true; textCell.setText(LocaleController.getString("BlockedUsers", R.string.BlockedUsers), true); } - } else if (position == sessionsRow) { - textCell.setText(LocaleController.getString("SessionsTitle", R.string.SessionsTitle), false); } else if (position == webSessionsRow) { textCell.setText(LocaleController.getString("WebSessionsTitle", R.string.WebSessionsTitle), false); - } else if (position == passwordRow) { - if (currentPassword == null) { - showLoading = true; - } else if (currentPassword.has_password) { - value = LocaleController.getString("PasswordOn", R.string.PasswordOn); - } else { - value = LocaleController.getString("PasswordOff", R.string.PasswordOff); - } - textCell.setTextAndValue(LocaleController.getString("TwoStepVerification", R.string.TwoStepVerification), value, true); - } else if (position == passcodeRow) { - textCell.setText(LocaleController.getString("Passcode", R.string.Passcode), true); - } else if (position == emailLoginRow) { - textCell.setText(LocaleController.getString(R.string.EmailLogin), true); } else if (position == phoneNumberRow) { if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_PHONE)) { showLoading = true; @@ -1021,8 +1024,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } else if (position == groupsDetailRow) { privacyCell.setText(LocaleController.getString("GroupsAndChannelsHelp", R.string.GroupsAndChannelsHelp)); privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); - } else if (position == sessionsDetailRow) { - privacyCell.setText(LocaleController.getString("SessionsInfo", R.string.SessionsInfo)); + } else if (position == autoDeleteDetailRow) { + privacyCell.setText(LocaleController.getString("AutoDeleteSettingsInfo", R.string.AutoDeleteSettingsInfo)); privacyCell.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); } else if (position == secretDetailRow) { privacyCell.setText(LocaleController.getString("SecretWebPageInfo", R.string.SecretWebPageInfo)); @@ -1073,14 +1076,57 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio textCheckCell.setTextAndCheck(LocaleController.getString("ArchiveAndMute", R.string.ArchiveAndMute), archiveChats, false); } break; + case 5: + TextCell textCell2 = (TextCell) holder.itemView; + animated = holder.itemView.getTag() != null && ((Integer) holder.itemView.getTag()) == position; + holder.itemView.setTag(position); + showLoading = false; + loadingLen = 16; + value = null; + if (position == autoDeleteMesages) { + int ttl = getUserConfig().getGlobalTTl(); + if (ttl == -1) { + showLoading = true; + } else if (ttl > 0) { + value = LocaleController.formatTTLString(ttl * 60); + } else { + value = LocaleController.getString("PasswordOff", R.string.PasswordOff); + } + textCell2.setTextAndValueAndIcon(LocaleController.getString("AutoDeleteMessages", R.string.AutoDeleteMessages), value, R.drawable.msg_autodelete, false); + } else if (position == sessionsRow) { + textCell2.setTextAndValueAndIcon(LocaleController.getString("SessionsTitle", R.string.SessionsTitle), "", R.drawable.msg_devices, true); + } else if (position == emailLoginRow) { + textCell2.setTextAndValueAndIcon(LocaleController.getString(R.string.EmailLogin), "", R.drawable.msg_email, true); + } else if (position == passwordRow) { + value = ""; + if (currentPassword == null) { + showLoading = true; + } else if (currentPassword.has_password) { + value = LocaleController.getString("PasswordOn", R.string.PasswordOn); + } else { + value = LocaleController.getString("PasswordOff", R.string.PasswordOff); + } + textCell2.setTextAndValueAndIcon(LocaleController.getString("TwoStepVerification", R.string.TwoStepVerification), value, R.drawable.msg_secret, true); + } else if (position == passcodeRow) { + if (SharedConfig.passcodeHash.length() != 0) { + value = LocaleController.getString("PasswordOn", R.string.PasswordOn); + } else { + value = LocaleController.getString("PasswordOff", R.string.PasswordOff); + } + textCell2.setTextAndValueAndIcon(LocaleController.getString("Passcode", R.string.Passcode), value, R.drawable.msg_permissions, true); + } + textCell2.setDrawLoading(showLoading, loadingLen, animated); + break; } } @Override public int getItemViewType(int position) { - if (position == passportRow || position == lastSeenRow || position == phoneNumberRow || position == blockedRow || position == deleteAccountRow || position == sessionsRow || position == webSessionsRow || position == passwordRow || position == passcodeRow || position == groupsRow || position == paymentsClearRow || position == secretMapRow || position == contactsDeleteRow || position == emailLoginRow) { + if (position == passportRow || position == lastSeenRow || position == phoneNumberRow || position == blockedRow || + position == deleteAccountRow || position == webSessionsRow || position == groupsRow || position == paymentsClearRow || + position == secretMapRow || position == contactsDeleteRow) { return 0; - } else if (position == deleteAccountDetailRow || position == groupsDetailRow || position == sessionsDetailRow || position == secretDetailRow || position == botsDetailRow || position == contactsDetailRow || position == newChatsSectionRow) { + } else if (position == deleteAccountDetailRow || position == groupsDetailRow || position == autoDeleteDetailRow || position == secretDetailRow || position == botsDetailRow || position == contactsDetailRow || position == newChatsSectionRow) { return 1; } else if (position == securitySectionRow || position == advancedSectionRow || position == privacySectionRow || position == secretSectionRow || position == botsSectionRow || position == contactsSectionRow || position == newChatsHeaderRow) { return 2; @@ -1088,6 +1134,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio return 3; } else if (position == privacyShadowRow) { return 4; + } else if (position == autoDeleteMesages || position == sessionsRow || position == emailLoginRow || position == passwordRow || position == passcodeRow ) { + return 5; } return 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 07875af54..010b8a41d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -18,6 +18,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; import android.app.Dialog; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -168,6 +169,7 @@ import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.ChatActivityInterface; import org.telegram.ui.Components.ChatAvatarContainer; import org.telegram.ui.Components.ChatNotificationsPopupWrapper; +import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CrossfadeDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -179,6 +181,7 @@ import org.telegram.ui.Components.HintView; import org.telegram.ui.Components.IdenticonDrawable; import org.telegram.ui.Components.ImageUpdater; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkSpanDrawable; import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet; import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.Components.Premium.PremiumGradient; @@ -197,6 +200,7 @@ import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.StickerEmptyView; import org.telegram.ui.Components.TimerDrawable; import org.telegram.ui.Components.TranslateAlert; +import org.telegram.ui.Components.TypefaceSpan; import org.telegram.ui.Components.UndoView; import org.telegram.ui.Components.voip.VoIPHelper; @@ -520,6 +524,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private int reportReactionMessageId = 0; private long reportReactionFromDialogId = 0; + private boolean isFragmentPhoneNumber; + private boolean showAddToContacts; private String vcardPhone; private String vcardFirstName; @@ -752,7 +758,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (y1 != 0) { if (previousTransitionFragment != null && previousTransitionFragment.getContentView() != null) { AndroidUtilities.rectTmp2.set(0, 0, getMeasuredWidth(), y1); - previousTransitionFragment.getContentView().drawBlurRect(canvas, getY(), AndroidUtilities.rectTmp2, previousTransitionFragment.getActionBar().blurScrimPaint, true); + if (previousTransitionFragment.getActionBar() != null && previousTransitionFragment.getActionBar().getBackground() == null) { + paint.setColor(Theme.getColor(Theme.key_actionBarDefault, previousTransitionFragment.getResourceProvider())); + canvas.drawRect(AndroidUtilities.rectTmp2, paint); + } else { + previousTransitionFragment.getContentView().drawBlurRect(canvas, getY(), AndroidUtilities.rectTmp2, previousTransitionFragment.getActionBar().blurScrimPaint, true); + } } paint.setColor(currentColor); canvas.drawRect(0, 0, getMeasuredWidth(), y1, paint); @@ -1572,7 +1583,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } private void updateExceptions() { - if (!isTopic && currentChat != null && currentChat.forum) { + if (!isTopic && ChatObject.isForum(currentChat)) { getNotificationsController().loadTopicsNotificationsExceptions(-chatId, (topics) -> { ArrayList arrayList = new ArrayList<>(topics); for (int i = 0; i < arrayList.size(); i++) { @@ -1593,7 +1604,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. @Override public boolean isActionBarCrossfadeEnabled() { - return false; + return !isPulledDown; } @Override @@ -1652,7 +1663,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } @Override - protected ActionBar createActionBar(Context context) { + public ActionBar createActionBar(Context context) { BaseFragment lastFragment = parentLayout.getLastFragment(); if (lastFragment instanceof ChatActivity && ((ChatActivity) lastFragment).themeDelegate != null && ((ChatActivity) lastFragment).themeDelegate.getCurrentTheme() != null) { resourcesProvider = lastFragment.getResourceProvider(); @@ -1675,6 +1686,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } }; + actionBar.setColorFilterMode(PorterDuff.Mode.SRC_IN); actionBar.setForceSkipTouches(true); actionBar.setBackgroundColor(Color.TRANSPARENT); actionBar.setItemsBackgroundColor(getThemedColor(Theme.key_avatar_actionBarSelectorBlue), false); @@ -1882,7 +1894,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-did); if (chat != null && (chat.creator || chat.admin_rights != null && chat.admin_rights.add_admins)) { - getMessagesController().checkIsInChat(chat, user, (isInChatAlready, rightsAdmin, currentRank) -> AndroidUtilities.runOnUIThread(() -> { + getMessagesController().checkIsInChat(false, chat, user, (isInChatAlready, rightsAdmin, currentRank) -> AndroidUtilities.runOnUIThread(() -> { ChatRightsEditActivity editRightsActivity = new ChatRightsEditActivity(userId, -did, rightsAdmin, null, null, currentRank, ChatRightsEditActivity.TYPE_ADD_BOT, true, !isInChatAlready, null); editRightsActivity.setDelegate(new ChatRightsEditActivity.ChatRightsEditActivityDelegate() { @Override @@ -2269,6 +2281,22 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. searchItem.setVisibility(GONE); } nameTextView[1].setTextColor(Color.WHITE); + nameTextView[1].setPivotY(nameTextView[1].getMeasuredHeight()); + nameTextView[1].setScaleX(1.67f); + nameTextView[1].setScaleY(1.67f); + if (scamDrawable != null) { + scamDrawable.setColor(Color.argb(179, 255, 255, 255)); + } + if (lockIconDrawable != null) { + lockIconDrawable.setColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY); + } + if (verifiedCrossfadeDrawable != null) { + verifiedCrossfadeDrawable.setProgress(1f); + } + if (premiumCrossfadeDrawable != null) { + premiumCrossfadeDrawable.setProgress(1f); + } + updateEmojiStatusDrawableColor(1f); onlineTextView[1].setTextColor(Color.argb(179, 255, 255, 255)); actionBar.setItemsBackgroundColor(Theme.ACTION_BAR_WHITE_SELECTOR_COLOR, false); actionBar.setItemsColor(Color.WHITE, false); @@ -2882,7 +2910,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. getNotificationsController().muteDialog(did, topicId, !muted); BulletinFactory.createMuteBulletin(ProfileActivity.this, !muted, null).show(); updateExceptions(); - if (notificationsSimpleRow >= 0) { + if (notificationsSimpleRow >= 0 && listAdapter != null) { listAdapter.notifyItemChanged(notificationsSimpleRow); } } else if (position == addToContactsRow) { @@ -3038,7 +3066,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. BulletinFactory.createMuteBulletin(ProfileActivity.this, NotificationsController.SETTING_MUTE_CUSTOM, timeInSeconds, getResourceProvider()).show(); } updateExceptions(); - if (notificationsRow >= 0) { + if (notificationsRow >= 0 && listAdapter != null) { listAdapter.notifyItemChanged(notificationsRow); } } @@ -3060,7 +3088,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. getNotificationsController().muteDialog(did, topicId, !muted); BulletinFactory.createMuteBulletin(ProfileActivity.this, !muted, null).show(); updateExceptions(); - if (notificationsRow >= 0) { + if (notificationsRow >= 0 && listAdapter != null) { listAdapter.notifyItemChanged(notificationsRow); } } @@ -3561,7 +3589,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (avatarBig != null) { return; } - if (isTopic) { + if (isTopic && !getMessagesController().premiumLocked) { ArrayList topics = getMessagesController().getTopicsController().getTopics(chatId); if (topics != null) { TLRPC.TL_forumTopic currentTopic = null; @@ -3577,20 +3605,15 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (document == null) { return; } - TLRPC.InputStickerSet inputStickerSet = MessageObject.getInputStickerSet(document); - if (inputStickerSet == null) { - return; - } - TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSet, false); - if (set == null || set.set == null) { - return; - } - BulletinFactory.of(ProfileActivity.this).createEmojiBulletin(document, AndroidUtilities.replaceTags(LocaleController.formatString("TopicContainsEmojiPackSingle", R.string.TopicContainsEmojiPackSingle, set.set.title)), LocaleController.getString("ViewAction", R.string.ViewAction), () -> { + Bulletin bulletin = BulletinFactory.of(ProfileActivity.this).createContainsEmojiBulletin(document, true, set -> { ArrayList inputSets = new ArrayList<>(1); - inputSets.add(inputStickerSet); + inputSets.add(set); EmojiPacksAlert alert = new EmojiPacksAlert(ProfileActivity.this, getParentActivity(), resourcesProvider, inputSets); showDialog(alert); - }).show(); + }); + if (bulletin != null) { + bulletin.show(); + } } } return; @@ -3726,17 +3749,20 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. avatarContainer2.addView(nameTextView[a], LayoutHelper.createFrame(a == 0 ? initialTitleWidth : LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 118, -6, (a == 0 ? rightMargin - (hasTitleExpanded ? 10 : 0) : 0), 0)); } for (int a = 0; a < onlineTextView.length; a++) { - onlineTextView[a] = new SimpleTextView(context); + onlineTextView[a] = new LinkSpanDrawable.ClickableSmallTextView(context); onlineTextView[a].setEllipsizeByGradient(true); onlineTextView[a].setTextColor(getThemedColor(Theme.key_avatar_subtitleInProfileBlue)); onlineTextView[a].setTextSize(14); onlineTextView[a].setGravity(Gravity.LEFT); onlineTextView[a].setAlpha(a == 0 || a == 2 ? 0.0f : 1.0f); + if (a == 1) { + onlineTextView[a].setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(2), AndroidUtilities.dp(4), AndroidUtilities.dp(2)); + } if (a > 0) { onlineTextView[a].setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); } onlineTextView[a].setFocusable(a == 0); - avatarContainer2.addView(onlineTextView[a], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 118, 0, a == 0 ? rightMargin - (hasTitleExpanded ? 10 : 0) : 8, 0)); + avatarContainer2.addView(onlineTextView[a], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 118 - (a == 1 ? 4 : 0), (a == 1 ? -2 : 0), (a == 0 ? rightMargin - (hasTitleExpanded ? 10 : 0) : 8) - (a == 1 ? 4 : 0), 0)); } avatarContainer2.addView(animatedStatusView); @@ -3883,7 +3909,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. final float k = AndroidUtilities.dpf2(8f); - final float nameTextViewXEnd = AndroidUtilities.dpf2(16f) - nameTextView[1].getLeft(); + final float nameTextViewXEnd = AndroidUtilities.dpf2(18f) - nameTextView[1].getLeft(); final float nameTextViewYEnd = newTop + extraHeight - AndroidUtilities.dpf2(38f) - nameTextView[1].getBottom(); final float nameTextViewCx = k + nameX + (nameTextViewXEnd - nameX) / 2f; final float nameTextViewCy = k + nameY + (nameTextViewYEnd - nameY) / 2f; @@ -4039,7 +4065,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private int getSmallAvatarRoundRadius() { if (chatId != 0) { TLRPC.Chat chatLocal = getMessagesController().getChat(chatId); - if (chatLocal != null && chatLocal.forum) { + if (ChatObject.isForum(chatLocal)) { return AndroidUtilities.dp(16); } } @@ -4085,6 +4111,43 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. // animatedState.translate(rect.centerX(), rect.centerY()); } + public void goToForum() { + if (getParentLayout() != null && getParentLayout().getFragmentStack() != null) { + for (int i = 0; i < getParentLayout().getFragmentStack().size(); ++i) { + BaseFragment fragment = getParentLayout().getFragmentStack().get(i); + if (fragment instanceof DialogsActivity) { + if (((DialogsActivity) fragment).rightSlidingDialogContainer != null) { + BaseFragment previewFragment = ((DialogsActivity) fragment).rightSlidingDialogContainer.getFragment(); + if (previewFragment instanceof TopicsFragment && ((TopicsFragment) previewFragment).getDialogId() == getDialogId()) { + ((DialogsActivity) fragment).rightSlidingDialogContainer.finishPreview(); + } + } + } else if (fragment instanceof ChatActivity) { + if (((ChatActivity) fragment).getDialogId() == getDialogId()) { + getParentLayout().removeFragmentFromStack(fragment); + i--; + } + } else if (fragment instanceof TopicsFragment) { + if (((TopicsFragment) fragment).getDialogId() == getDialogId()) { + getParentLayout().removeFragmentFromStack(fragment); + i--; + } + } else if (fragment instanceof ProfileActivity) { + if (fragment != this && ((ProfileActivity) fragment).getDialogId() == getDialogId() && ((ProfileActivity) fragment).isTopic) { + getParentLayout().removeFragmentFromStack(fragment); + i--; + } + } + } + } + + playProfileAnimation = 0; + + Bundle args = new Bundle(); + args.putLong("chat_id", chatId); + presentFragment(new TopicsFragment(args)); + } + private SelectAnimatedEmojiDialog.SelectAnimatedEmojiDialogWindow selectAnimatedEmojiDialog; public void showStatusSelect() { if (selectAnimatedEmojiDialog != null) { @@ -4571,9 +4634,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. actions.add(PHONE_OPTION_TELEGRAM_VIDEO_CALL); } } - icons.add(R.drawable.msg_calls_regular); - items.add(LocaleController.getString("Call", R.string.Call)); - actions.add(PHONE_OPTION_CALL); + if (!isFragmentPhoneNumber) { + icons.add(R.drawable.msg_calls_regular); + items.add(LocaleController.getString("Call", R.string.Call)); + actions.add(PHONE_OPTION_CALL); + } } icons.add(R.drawable.msg_copy); items.add(LocaleController.getString("Copy", R.string.Copy)); @@ -4630,6 +4695,41 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } }); } + if (isFragmentPhoneNumber) { + FrameLayout gap = new FrameLayout(getContext()); + gap.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuSeparator, resourcesProvider)); + popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + + TextView fragmentInfoView = new TextView(getContext()); + fragmentInfoView.setPadding(AndroidUtilities.dp(13), AndroidUtilities.dp(8), AndroidUtilities.dp(13), AndroidUtilities.dp(8)); + fragmentInfoView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + fragmentInfoView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem, resourcesProvider)); + fragmentInfoView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteValueText, resourcesProvider)); + fragmentInfoView.setBackground(Theme.createRadSelectorDrawable(Theme.getColor(Theme.key_dialogButtonSelector, resourcesProvider), 0,6)); + + SpannableStringBuilder spanned = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.getString(R.string.AnonymousNumberNotice))); + + int startIndex = TextUtils.indexOf(spanned, '*'); + int lastIndex = TextUtils.lastIndexOf(spanned, '*'); + if (startIndex != -1 && lastIndex != -1 && startIndex != lastIndex) { + spanned.replace(lastIndex, lastIndex + 1, ""); + spanned.replace(startIndex, startIndex + 1, ""); + spanned.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), startIndex, lastIndex - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spanned.setSpan(new ForegroundColorSpan(fragmentInfoView.getLinkTextColors().getDefaultColor()), startIndex, lastIndex - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + fragmentInfoView.setText(spanned); + fragmentInfoView.setOnClickListener(v -> { + try { + v.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://fragment.com"))); + } catch (ActivityNotFoundException e) { + FileLog.e(e); + } + }); + + gap.setTag(R.id.fit_width_tag, 1); + fragmentInfoView.setTag(R.id.fit_width_tag, 1); + popupLayout.addView(fragmentInfoView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + } ActionBarPopupWindow popupWindow = new ActionBarPopupWindow(popupLayout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT); popupWindow.setPauseNotifications(true); @@ -4769,8 +4869,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. LanguageDetector.detectLanguage(finalText, (fromLang) -> { fromLanguage[0] = fromLang; withTranslate[0] = fromLang != null && (!fromLang.equals(toLang) || fromLang.equals("und")) && ( - translateButtonEnabled && !RestrictedLanguagesSelectActivity.getRestrictedLanguages().contains(fromLang) || - (currentChat != null && (currentChat.has_link || ChatObject.isPublic(currentChat))) && ("uk".equals(fromLang) || "ru".equals(fromLang))); + translateButtonEnabled && !RestrictedLanguagesSelectActivity.getRestrictedLanguages().contains(fromLang) || + (currentChat != null && (currentChat.has_link || ChatObject.isPublic(currentChat))) && ("uk".equals(fromLang) || "ru".equals(fromLang))); showMenu.run(); }, (error) -> { FileLog.e("mlkit: failed to detect language in selection", error); @@ -5315,7 +5415,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (openAnimationInProgress && playProfileAnimation == 2) { additionalTranslationY = -(1.0f - animationProgress) * AndroidUtilities.dp(50); } - nameTextView[1].setTranslationX(AndroidUtilities.dpf2(16f) - nameTextView[1].getLeft()); + nameTextView[1].setTranslationX(AndroidUtilities.dpf2(18f) - nameTextView[1].getLeft()); nameTextView[1].setTranslationY(newTop + h - AndroidUtilities.dpf2(38f) - nameTextView[1].getBottom() + additionalTranslationY); onlineTextView[1].setTranslationX(AndroidUtilities.dpf2(16f) - onlineTextView[1].getLeft()); onlineTextView[1].setTranslationY(newTop + h - AndroidUtilities.dpf2(18f) - onlineTextView[1].getBottom() + additionalTranslationY); @@ -6173,7 +6273,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. BaseFragment fragment = parentLayout.getFragmentStack().get(parentLayout.getFragmentStack().size() - 2); if (fragment instanceof ChatActivityInterface) { previousTransitionFragment = (ChatActivityInterface) fragment; - previousTransitionFragment.getAvatarContainer().getTitleTextView(); + } + if (fragment instanceof DialogsActivity) { + DialogsActivity dialogsActivity = (DialogsActivity) fragment; + if (dialogsActivity.rightSlidingDialogContainer != null && dialogsActivity.rightSlidingDialogContainer.currentFragment instanceof ChatActivityInterface) { + previousTransitionFragment = (ChatActivityInterface) dialogsActivity.rightSlidingDialogContainer.currentFragment; + } } } if (previousTransitionFragment != null) { @@ -7154,8 +7259,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. topic = getMessagesController().getTopicsController().findTopic(chatId, topicId); } - String statusString; - String profileStatusString; + CharSequence statusString; + CharSequence profileStatusString; + boolean profileStatusIsButton = false; if (ChatObject.isChannel(chat)) { if (!isTopic && (chatInfo == null || !currentChat.megagroup && (chatInfo.participants_count == 0 || ChatObject.hasAdminRights(currentChat) || chatInfo.can_view_participants))) { if (currentChat.megagroup) { @@ -7169,7 +7275,19 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } else { if (isTopic) { - statusString = profileStatusString = LocaleController.formatString("TopicProfileStatus", R.string.TopicProfileStatus, chat.title); + int count = 0; + if (topic != null) { + count = topic.totalMessagesCount - 1; + } + if (count > 0) { + statusString = LocaleController.formatPluralString("messages", count, count); + } else { + statusString = LocaleController.formatString("TopicProfileStatus", R.string.TopicProfileStatus, chat.title); + } + SpannableString arrowString = new SpannableString(">"); + arrowString.setSpan(new ColoredImageSpan(R.drawable.arrow_newchat), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + profileStatusString = new SpannableStringBuilder(chat.title).append(' ').append(arrowString); + profileStatusIsButton = true; } else if (currentChat.megagroup) { if (onlineCount > 1 && chatInfo.participants_count != 0) { statusString = String.format("%s, %s", LocaleController.formatPluralString("Members", chatInfo.participants_count), LocaleController.formatPluralString("OnlineCount", Math.min(onlineCount, chatInfo.participants_count))); @@ -7293,6 +7411,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. onlineTextView[a].setText(a == 0 ? statusString : profileStatusString); } } + if (a == 1 && isTopic) { + if (profileStatusIsButton) { + onlineTextView[a].setOnClickListener(e -> goToForum()); + } else { + onlineTextView[a].setOnClickListener(null); + onlineTextView[a].setClickable(false); + } + } } if (changed) { needLayout(true); @@ -7310,7 +7436,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. imageLocation = null; thumbLocation = null; videoLocation = null; - ForumUtilities.setTopicIcon(avatarImage, topic, true); + ForumUtilities.setTopicIcon(avatarImage, topic, true, resourcesProvider); } else { avatarDrawable.setInfo(chat); imageLocation = ImageLocation.getForUserOrChat(chat, ImageLocation.TYPE_BIG); @@ -7589,7 +7715,16 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. public void setAutoDeleteHistory(int time, int action) { ProfileActivity.this.setAutoDeleteHistory(time, action); } - }, false, resourcesProvider); + + @Override + public void showGlobalAutoDeleteScreen() { + presentFragment(new AutoDeleteMessagesActivity()); + dismiss(); + } + }, false, 0, resourcesProvider); + if (dialogId > 0 || userId > 0) { + autoDeletePopupWrapper.allowExtenededHint(); + } int ttl = 0; if (userInfo != null || chatInfo != null) { ttl = userInfo != null ? userInfo.ttl_period : chatInfo.ttl_period; @@ -8078,7 +8213,16 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. zipFile.delete(); } - File[] files = dir.listFiles(); + ArrayList files = new ArrayList<>(); + + File[] logFiles = dir.listFiles(); + for (File f : logFiles) { + files.add(f); + } + + if (FileLog.databaseIsMalformed) { + files.addAll(getMessagesStorage().getDatabaseFiles()); + } boolean[] finished = new boolean[1]; long currentDate = System.currentTimeMillis(); @@ -8090,14 +8234,18 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. out = new ZipOutputStream(new BufferedOutputStream(dest)); byte[] data = new byte[1024 * 64]; - for (int i = 0; i < files.length; i++) { - if ((last || files[i].getName().contains("_mtproto")) && (currentDate - files[i].lastModified()) > 24 * 60 * 60 * 1000) { + for (int i = 0; i < files.size(); i++) { + File file = files.get(i); + if (!file.getName().contains("cache4") && (last || file.getName().contains("_mtproto")) && (currentDate - file.lastModified()) > 24 * 60 * 60 * 1000) { continue; } - FileInputStream fi = new FileInputStream(files[i]); + if (!file.exists()) { + continue; + } + FileInputStream fi = new FileInputStream(file); origin = new BufferedInputStream(fi, data.length); - ZipEntry entry = new ZipEntry(files[i].getName()); + ZipEntry entry = new ZipEntry(file.getName()); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, data.length)) != -1) { @@ -8196,7 +8344,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. case VIEW_TYPE_TEXT_DETAIL: final TextDetailCell textDetailCell = new TextDetailCell(mContext, resourcesProvider, viewType == VIEW_TYPE_TEXT_DETAIL_MULTILINE); textDetailCell.setContentDescriptionValueFirst(true); - textDetailCell.setImageClickListener(ProfileActivity.this::onTextDetailCellImageClicked); view = textDetailCell; break; case VIEW_TYPE_ABOUT_LINK: { @@ -8410,20 +8557,27 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. Drawable drawable = ContextCompat.getDrawable(detailCell.getContext(), R.drawable.msg_qr_mini); drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_switch2TrackChecked), PorterDuff.Mode.MULTIPLY)); detailCell.setImage(drawable, LocaleController.getString("GetQRCode", R.string.GetQRCode)); + detailCell.setImageClickListener(ProfileActivity.this::onTextDetailCellImageClicked); } else { detailCell.setImage(null); + detailCell.setImageClickListener(null); } if (position == phoneRow) { String text; - final TLRPC.User user = getMessagesController().getUser(userId); + TLRPC.User user = getMessagesController().getUser(userId); + String phoneNumber; if (user != null && !TextUtils.isEmpty(vcardPhone)) { text = PhoneFormat.getInstance().format("+" + vcardPhone); + phoneNumber = vcardPhone; } else if (!TextUtils.isEmpty(user.phone)) { text = PhoneFormat.getInstance().format("+" + user.phone); + phoneNumber = user.phone; } else { text = LocaleController.getString("PhoneHidden", R.string.PhoneHidden); + phoneNumber = null; } - detailCell.setTextAndValue(text, LocaleController.getString("PhoneMobile", R.string.PhoneMobile), false); + isFragmentPhoneNumber = phoneNumber != null && phoneNumber.matches("888\\d{8}"); + detailCell.setTextAndValue(text, LocaleController.getString(isFragmentPhoneNumber ? R.string.AnonymousNumber : R.string.PhoneMobile), false); } else if (position == usernameRow) { String text, username = null; CharSequence value; @@ -9930,33 +10084,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. 0, 0); combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); writeButton.setBackground(combinedDrawable); - } catch (Exception e) { - } + } catch (Exception e) {} } private boolean isQrNeedVisible() { - if (!TextUtils.isEmpty(getUserConfig().getCurrentUser().username)) { - return true; - } - final ArrayList privacyRules = ContactsController.getInstance(currentAccount).getPrivacyRules(ContactsController.PRIVACY_RULES_TYPE_PHONE); - if (privacyRules == null) { - return false; - } - int type = 2; - for (int i = 0; i < privacyRules.size(); ++i) { - TLRPC.PrivacyRule rule = privacyRules.get(i); - if (rule instanceof TLRPC.TL_privacyValueAllowAll) { - type = 0; - break; - } else if (rule instanceof TLRPC.TL_privacyValueDisallowAll) { - type = 2; - break; - } else if (rule instanceof TLRPC.TL_privacyValueAllowContacts) { - type = 1; - break; - } - } - return type == 0 || type == 1; + return true; } private class DiffCallback extends DiffUtil.Callback { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java index 0f8d7f0cb..52634b69e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java @@ -321,7 +321,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi if (dialogId < 0) { if (topicId != 0) { TLRPC.TL_forumTopic forumTopic = getMessagesController().getTopicsController().findTopic(-dialogId, topicId); - ForumUtilities.setTopicIcon(avatarContainer.getAvatarImageView(), forumTopic, true); + ForumUtilities.setTopicIcon(avatarContainer.getAvatarImageView(), forumTopic, true, resourcesProvider); avatarContainer.setTitle(forumTopic.title); } else { TLRPC.Chat chatLocal = getMessagesController().getChat(-dialogId); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java index 82543f59f..80cba4698 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/QrActivity.java @@ -12,6 +12,7 @@ import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; @@ -24,6 +25,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; +import android.os.Vibrator; import android.text.Layout; import android.text.SpannableStringBuilder; import android.text.Spanned; @@ -32,6 +34,7 @@ import android.text.TextPaint; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -59,13 +62,17 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ChatThemeController; +import org.telegram.messenger.ContactsController; +import org.telegram.messenger.Emoji; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SvgHelper; +import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.ResultCallback; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBarLayout; @@ -74,9 +81,12 @@ import org.telegram.ui.ActionBar.EmojiThemes; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Cells.SettingsSearchCell; +import org.telegram.ui.Components.AnimatedFloat; +import org.telegram.ui.Components.AnimatedTextView; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.ChatThemeBottomSheet; +import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.Easings; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.HideViewAfterAnimation; @@ -122,7 +132,7 @@ public class QrActivity extends BaseFragment { private final EmojiThemes homeTheme = EmojiThemes.createHomeQrTheme(); private final Rect logoRect = new Rect(); private final ArrayMap emojiThemeDarkIcons = new ArrayMap<>(); - private final int[] prevQrColors = new int[4]; + private int[] prevQrColors = null; private ThemeListViewController themesViewController; private MotionBackgroundDrawable currMotionDrawable = new MotionBackgroundDrawable(); @@ -146,6 +156,8 @@ public class QrActivity extends BaseFragment { private int prevSystemUiVisibility; private int selectedPosition = -1; + private static boolean firstOpen = true; + public QrActivity(Bundle args) { super(args); } @@ -159,7 +171,6 @@ public class QrActivity extends BaseFragment { @Override public View createView(Context context) { - homeTheme.loadPreviewColors(currentAccount); isCurrentThemeDark = Theme.getActiveTheme().isDark(); actionBar.setAddToContainer(false); actionBar.setBackground(null); @@ -241,6 +252,7 @@ public class QrActivity extends BaseFragment { backgroundView = new View(context) { @Override protected void onDraw(Canvas canvas) { + canvas.drawColor(isCurrentThemeDark ? 0xFF121A2A : 0xFF9BC38F); if (prevMotionDrawable != null) { prevMotionDrawable.setBounds(0, 0, getWidth(), getHeight()); } @@ -260,17 +272,26 @@ public class QrActivity extends BaseFragment { AvatarDrawable avatarDrawable = null; String username = null; boolean isPhone = false; + boolean isTimer = false; String userfullname = null; ImageLocation imageLocationSmall = null; ImageLocation imageLocation = null; + String link = null; if (userId != 0) { TLRPC.User user = getMessagesController().getUser(userId); if (user != null) { - username = user.username; + username = UserObject.getPublicUsername(user); if (username == null) { userfullname = UserObject.getUserName(user); - username = user.phone; - isPhone = true; + if (phoneIsPublic()) { + username = user.phone; + if (username != null && !username.startsWith("+")) { + username = "+" + username; + } + isPhone = true; + } else { + isTimer = true; + } } avatarDrawable = new AvatarDrawable(user); imageLocationSmall = ImageLocation.getForUser(user, ImageLocation.TYPE_SMALL); @@ -286,10 +307,12 @@ public class QrActivity extends BaseFragment { } } - String link = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/" + username; qrView = new QrView(context); qrView.setColors(0xFF71B654, 0xFF2C9077, 0xFF9ABB3E, 0xFF68B55E); - qrView.setData(link, userfullname != null ? userfullname : username, isPhone); + if (link == null && username != null) { + link = "https://" + MessagesController.getInstance(currentAccount).linkPrefix + "/" + username; + } + qrView.setData(link, userfullname != null ? userfullname : username, isPhone, isTimer); qrView.setCenterChangedListener((left, top, right, bottom) -> { logoRect.set(left, top, right, bottom); qrView.requestLayout(); @@ -349,29 +372,60 @@ public class QrActivity extends BaseFragment { currMotionDrawable.setIndeterminateAnimation(true); fragmentView = rootLayout; - onItemSelected(currentTheme, 0, false); + Utilities.themeQueue.postRunnable(() -> { + homeTheme.loadPreviewColors(currentAccount); - if (cachedThemes == null || cachedThemes.isEmpty()) { - ChatThemeController.requestAllChatThemes(new ResultCallback>() { - @Override - public void onComplete(List result) { - onDataLoaded(result); - cachedThemes = result; - } - @Override - public void onError(TLRPC.TL_error error) { - Toast.makeText(getParentActivity(), error.text, Toast.LENGTH_SHORT).show(); - } - }, true); - } else { - onDataLoaded(cachedThemes); - } + fragmentView.postDelayed(() -> { + onItemSelected(currentTheme, 0, true); + }, 17); + }, 25); + + fragmentView.postDelayed(() -> { + firstOpen = false; + if (cachedThemes == null || cachedThemes.isEmpty()) { + ChatThemeController.requestAllChatThemes(new ResultCallback>() { + @Override + public void onComplete(List result) { + onDataLoaded(result); + cachedThemes = result; + } + @Override + public void onError(TLRPC.TL_error error) { + Toast.makeText(getParentActivity(), error.text, Toast.LENGTH_SHORT).show(); + } + }, true); + } else { + onDataLoaded(cachedThemes); + } + }, firstOpen ? 250 : 0); prevSystemUiVisibility = getParentActivity().getWindow().getDecorView().getSystemUiVisibility(); applyScreenSettings(); return fragmentView; } + private boolean phoneIsPublic() { + final ArrayList privacyRules = ContactsController.getInstance(currentAccount).getPrivacyRules(ContactsController.PRIVACY_RULES_TYPE_PHONE); + if (privacyRules == null) { + return false; + } + int type = 2; + for (int i = 0; i < privacyRules.size(); ++i) { + TLRPC.PrivacyRule rule = privacyRules.get(i); + if (rule instanceof TLRPC.TL_privacyValueAllowAll) { + type = 0; + break; + } else if (rule instanceof TLRPC.TL_privacyValueDisallowAll) { + type = 2; + break; + } else if (rule instanceof TLRPC.TL_privacyValueAllowContacts) { + type = 1; + break; + } + } + return type == 0 || type == 1; + } + @SuppressLint("SourceLockedOrientationActivity") @Override public void onResume() { @@ -540,17 +594,21 @@ public class QrActivity extends BaseFragment { } }); } else { - ChatThemeController.chatThemeQueue.postRunnable(() -> { + Utilities.themeQueue.postRunnable(() -> { final Bitmap bitmap = SvgHelper.getBitmap(R.raw.default_pattern, backgroundView.getWidth(), backgroundView.getHeight(), Color.BLACK); AndroidUtilities.runOnUIThread(() -> { onPatternLoaded(bitmap, 34, true); }); - }); + }, 35); } currMotionDrawable.setPatternColorFilter(currMotionDrawable.getPatternColor()); int[] newQrColors = qrColorsMap.get(newTheme.emoji + (isDarkTheme ? "n" : "d")); if (withAnimation) { + if (prevQrColors == null) { + prevQrColors = new int[4]; + System.arraycopy(newQrColors, 0, prevQrColors, 0, 4); + } currMotionDrawable.setAlpha(255); currMotionDrawable.setBackgroundAlpha(0f); patternAlphaAnimator = ValueAnimator.ofFloat(0f, 1f); @@ -616,15 +674,18 @@ public class QrActivity extends BaseFragment { animationSettings.onlyTopFragment = true; animationSettings.resourcesProvider = getResourceProvider(); animationSettings.duration = (int) (250 * duration); - if (withAnimation) { - resourcesProvider.initColors(prevTheme, isCurrentThemeDark); - } else { - resourcesProvider.initColors(currentTheme, isCurrentThemeDark); - } - animationSettings.afterStartDescriptionsAddedRunnable = () -> { - resourcesProvider.initColors(currentTheme, isCurrentThemeDark); - }; - parentLayout.animateThemedValues(animationSettings, null); + AndroidUtilities.runOnUIThread(() -> { + if (withAnimation) { + resourcesProvider.initColors(prevTheme, isCurrentThemeDark); + } else { + resourcesProvider.initColors(currentTheme, isCurrentThemeDark); + } + animationSettings.afterStartDescriptionsAddedRunnable = () -> { + resourcesProvider.initColors(currentTheme, isCurrentThemeDark); + }; + + parentLayout.animateThemedValues(animationSettings, null); + }); } private void performShare() { @@ -643,6 +704,10 @@ public class QrActivity extends BaseFragment { int currentFrame = drawable.getCurrentFrame(); drawable.setCurrentFrame(33, false); + if (qrView != null) { + qrView.setForShare(true); + } + fragmentView.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)); fragmentView.layout(0, 0, width, height); fragmentView.draw(canvas); @@ -656,6 +721,10 @@ public class QrActivity extends BaseFragment { ViewGroup parent = (ViewGroup) fragmentView.getParent(); fragmentView.layout(0, 0, parent.getWidth(), parent.getHeight()); + if (qrView != null) { + qrView.setForShare(false); + } + Uri uri = AndroidUtilities.getBitmapShareUri(bitmap, "qr_tmp.jpg", Bitmap.CompressFormat.JPEG); if (uri != null) { Intent intent = new Intent(Intent.ACTION_SEND) @@ -713,19 +782,71 @@ public class QrActivity extends BaseFragment { private final MotionBackgroundDrawable gradientDrawable = new MotionBackgroundDrawable(); private final Paint bitmapGradientPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final BitmapShader gradientShader; + private final BitmapShader gradientTextShader; private QrCenterChangedListener centerChangedListener; private Bitmap backgroundBitmap; - private Bitmap contentBitmap; + private Bitmap contentBitmap, oldContentBitmap; + private boolean hasTimer; + private AnimatedTextView.AnimatedTextDrawable timerTextDrawable; + private TextPaint shareUsernameLayoutPaint; + private StaticLayout shareUsernameLayout; + private AnimatedFloat contentBitmapAlpha = new AnimatedFloat(1f, this,0, 2000, CubicBezierInterpolator.EASE_OUT_QUINT); + private Paint crossfadeFromPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint crossfadeToPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private RLottieDrawable loadingMatrix; + private final int crossfadeWidthDp = 120; private String username; private boolean isPhone; private String link; + private int linkExpires; + + private boolean setData; + private float[] radii = new float[8]; + private boolean logoCenterSet; QrView(Context context) { super(context); gradientDrawable.setIndeterminateAnimation(true); gradientDrawable.setParentView(this); gradientShader = new BitmapShader(gradientDrawable.getBitmap(), Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); + gradientTextShader = new BitmapShader(gradientDrawable.getBitmap(), Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); bitmapGradientPaint.setShader(gradientShader); + timerTextDrawable = new AnimatedTextView.AnimatedTextDrawable(false, true, false) { + @Override + public void invalidateSelf() { + QrView.this.invalidate(); + } + }; + timerTextDrawable.setAnimationProperties(.35f, 0, 300, CubicBezierInterpolator.EASE_OUT_QUINT); + timerTextDrawable.setCallback(this); + timerTextDrawable.setTypeface(AndroidUtilities.getTypeface("fonts/rcondensedbold.ttf")); + timerTextDrawable.getPaint().setShader(gradientTextShader); + timerTextDrawable.setGravity(Gravity.CENTER); + timerTextDrawable.setTextSize(AndroidUtilities.dp(35)); + timerTextDrawable.setText(""); + crossfadeFromPaint.setShader(new LinearGradient(0, 0, 0, AndroidUtilities.dp(crossfadeWidthDp), new int[]{0xffffffff, 0}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + crossfadeFromPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + crossfadeToPaint.setShader(new LinearGradient(0, 0, 0, AndroidUtilities.dp(crossfadeWidthDp), new int[]{0, 0xffffffff}, new float[]{0f, 1f}, Shader.TileMode.CLAMP)); + crossfadeToPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + } + + public void setForShare(boolean enable) { + if (!hasTimer) { + return; + } + if (enable) { + if (shareUsernameLayoutPaint == null) { + shareUsernameLayoutPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + } + shareUsernameLayoutPaint.setShader(gradientTextShader); + shareUsernameLayoutPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rcondensedbold.ttf")); + shareUsernameLayoutPaint.setTextSize(AndroidUtilities.dp(25)); + CharSequence text = this.username == null ? "" : this.username; + text = Emoji.replaceEmoji(text, shareUsernameLayoutPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + shareUsernameLayout = StaticLayoutEx.createStaticLayout(text, shareUsernameLayoutPaint, getWidth(), Layout.Alignment.ALIGN_CENTER, 1f, 0, false, TextUtils.TruncateAt.END, getWidth() - AndroidUtilities.dp(60), 1); + } else { + shareUsernameLayout = null; + } } @Override @@ -743,7 +864,9 @@ public class QrActivity extends BaseFragment { Canvas canvas = new Canvas(backgroundBitmap); RectF rect = new RectF(SHADOW_SIZE, SHADOW_SIZE, w - SHADOW_SIZE, getHeight() - SHADOW_SIZE); canvas.drawRoundRect(rect, RADIUS, RADIUS, backgroundPaint); - prepareContent(w, h); + if (setData) { + Utilities.themeQueue.postRunnable(() -> prepareContent(w, h)); + } float xScale = getWidth() * 1f / gradientDrawable.getBitmap().getWidth(); float yScale = getHeight() * 1f / gradientDrawable.getBitmap().getHeight(); @@ -751,6 +874,39 @@ public class QrActivity extends BaseFragment { Matrix matrix = new Matrix(); matrix.setScale(maxScale, maxScale); gradientShader.setLocalMatrix(matrix); + + Matrix textMatrix = new Matrix(); + textMatrix.setScale(maxScale, maxScale); + textMatrix.postTranslate(w / 2f, getWidth() + AndroidUtilities.dp(6)); + gradientTextShader.setLocalMatrix(textMatrix); + } + } + + private void drawLoading(Canvas canvas) { + if (loadingMatrix != null) { + int qrSize = 33; + int multiple = (getWidth() - AndroidUtilities.dp(60)) / qrSize; + int size = multiple * qrSize + 32; + int padding = (getWidth() - size) / 2, top = (int) (getHeight() * 0.15f); + if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) { + top = (int) (getHeight() * 0.09f); + } + AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); + canvas.saveLayerAlpha(AndroidUtilities.rectTmp, 255, Canvas.ALL_SAVE_FLAG); + canvas.drawRect(padding + 16, top + 16, getWidth() - padding - 16, top + getWidth() - padding - padding - 16, bitmapGradientPaint); + canvas.save(); + loadingMatrix.setBounds(padding + 16, top + 16, getWidth() - padding - 16, top + getWidth() - padding - padding - 16); + loadingMatrix.draw(canvas); + canvas.restore(); + canvas.restore(); + float xCenter = getWidth() / 2f, yCenter = top + (getWidth()) / 2f - padding; + int imageSize = Math.round((size - 32) / 4.65f / multiple) * multiple / 2; + canvas.drawCircle(xCenter, yCenter, imageSize * .75f, bitmapGradientPaint); + QRCodeWriter.drawSideQuads(canvas, padding, top, bitmapGradientPaint, 7, multiple, 16, size, .75f, radii, true); + if (!logoCenterSet && centerChangedListener != null) { + centerChangedListener.onCenterChanged((int) (xCenter - imageSize * 0.75f), (int) (yCenter - imageSize * 0.75f), (int) (xCenter + imageSize * 0.75f), (int) (yCenter + imageSize * 0.75f)); + logoCenterSet = true; + } } } @@ -760,9 +916,64 @@ public class QrActivity extends BaseFragment { if (backgroundBitmap != null) { canvas.drawBitmap(backgroundBitmap, 0f, 0f, null); } - if (contentBitmap != null) { - canvas.drawBitmap(contentBitmap, 0f, 0f, bitmapGradientPaint); - gradientDrawable.updateAnimation(true); + + float crossfadeAlpha = contentBitmapAlpha.set(1f); + boolean crossfading = crossfadeAlpha > 0 && crossfadeAlpha < 1; + + if (crossfadeAlpha < 1f) { + if (crossfading) { + AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); + canvas.saveLayerAlpha(AndroidUtilities.rectTmp, 255, Canvas.ALL_SAVE_FLAG); + } + if (oldContentBitmap != null) { + canvas.drawBitmap(oldContentBitmap, 0, 0, bitmapGradientPaint); + } else { + drawLoading(canvas); + } + if (crossfading) { + float h = AndroidUtilities.dp(crossfadeWidthDp); + canvas.save(); + canvas.translate(0, -h + (getHeight() + h) * (1f - crossfadeAlpha)); + canvas.drawRect(0, 0, getWidth(), getHeight() + h, crossfadeToPaint); + canvas.restore(); + canvas.restore(); + } + } + if (crossfadeAlpha > 0f) { + if (crossfading) { + AndroidUtilities.rectTmp.set(0, 0, getWidth(), getHeight()); + canvas.saveLayerAlpha(AndroidUtilities.rectTmp, 255, Canvas.ALL_SAVE_FLAG); + } + if (contentBitmap != null) { + canvas.drawBitmap(contentBitmap, 0f, 0f, bitmapGradientPaint); + gradientDrawable.updateAnimation(true); + } else { + drawLoading(canvas); + } + if (crossfading) { + float h = AndroidUtilities.dp(crossfadeWidthDp); + canvas.save(); + canvas.translate(0, -h + (getHeight() + h) * (1f - crossfadeAlpha)); + canvas.drawRect(0, - h - getHeight(), getWidth(), getHeight() + h, crossfadeFromPaint); + canvas.restore(); + canvas.restore(); + } + } + + if (hasTimer) { + float transY = getWidth() + AndroidUtilities.dp(6); + if (shareUsernameLayout != null) { + canvas.save(); + canvas.translate(0, transY); + if (shareUsernameLayout.getWidth() != getWidth()) { + setForShare(true); + } + shareUsernameLayout.draw(canvas); + canvas.restore(); + } else { + timerTextDrawable.setBounds(0, (int) transY, getWidth(), (int) transY + AndroidUtilities.dp(40)); + timerTextDrawable.draw(canvas); + } } } @@ -770,12 +981,82 @@ public class QrActivity extends BaseFragment { this.centerChangedListener = centerChangedListener; } - void setData(String link, String username, boolean isPhone) { + void setData(String link, String username, boolean isPhone, boolean isTimer) { + this.setData = true; this.username = username; this.isPhone = isPhone; - this.link = link; - prepareContent(getWidth(), getHeight()); + if (isTimer) { + TLRPC.TL_exportedContactToken token = MessagesController.getInstance(UserConfig.selectedAccount).getCachedContactToken(); + if (token != null) { + this.link = token.url; + this.linkExpires = token.expires; + } else { + this.link = null; + } + } else { + this.link = link; + } + this.hasTimer = isTimer; + final int w = getWidth(), h = getHeight(); + Utilities.themeQueue.postRunnable(() -> prepareContent(w, h)); invalidate(); + + checkTimerToken(); + } + + private void checkTimerToken() { + AndroidUtilities.cancelRunOnUIThread(this::checkTimerToken); + if (!this.hasTimer) { + return; + } + if (hasTimer && loadingMatrix == null) { + loadingMatrix = new RLottieDrawable(R.raw.qr_matrix, "qr_matrix", AndroidUtilities.dp(200), AndroidUtilities.dp(200)); + loadingMatrix.setMasterParent(this); + loadingMatrix.getPaint().setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); + loadingMatrix.setAutoRepeat(1); + loadingMatrix.start(); + } + if (linkExpires == 0 || System.currentTimeMillis() / 1000 >= linkExpires) { + if (linkExpires != 0) { + this.link = null; + final int w = getWidth(), h = getHeight(); + Utilities.themeQueue.postRunnable(() -> prepareContent(w, h)); + timerTextDrawable.setText(""); + } + MessagesController.getInstance(UserConfig.selectedAccount).requestContactToken(linkExpires == 0 ? 750 : 1750, token -> { + AndroidUtilities.runOnUIThread(() -> { + if (token == null) { + return; + } + if (linkExpires != 0 && linkExpires < token.expires) { + try { + Vibrator vibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator != null) { + vibrator.vibrate(100); + } + } catch (Exception ignore) { + try { + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignore2) {} + } + } + linkExpires = token.expires; + setData(token.url, null, false, true); + }); + }); + } + if (linkExpires > 0 && link != null) { + long secondsLeft = Math.max(0, linkExpires - System.currentTimeMillis() / 1000 - 1); + int sec = (int) (secondsLeft % 60), min = Math.min(99, (int) (secondsLeft / 60)); + timerTextDrawable.setText( + (min < 10 ? "0" : "") + min + ":" + (sec < 10 ? "0" : "") + sec, + true, + false + ); + } + if (isAttachedToWindow()) { + AndroidUtilities.runOnUIThread(this::checkTimerToken, 1000); + } } void setColors(int c1, int c2, int c3, int c4) { @@ -787,15 +1068,37 @@ public class QrActivity extends BaseFragment { gradientDrawable.posAnimationProgress = progress; } + private Integer hadWidth, hadHeight; + private String hadUserText, hadLink; + private boolean firstPrepare = true; + private void prepareContent(int w, int h) { - if (TextUtils.isEmpty(username) || TextUtils.isEmpty(link) || w == 0 || h == 0) { + if (w == 0 || h == 0) { + return; + } + if (TextUtils.isEmpty(username) && !hasTimer || TextUtils.isEmpty(link)) { + AndroidUtilities.runOnUIThread(() -> { + firstPrepare = false; + if (contentBitmap != null) { + Bitmap oldBitmap = contentBitmap; + contentBitmap = null; + contentBitmapAlpha.set(0, true); + if (oldContentBitmap != null) { + oldContentBitmap.recycle(); + } + oldContentBitmap = oldBitmap; + this.invalidate(); + } + }); return; } - if (contentBitmap != null) { - contentBitmap.recycle(); + String userText = hasTimer ? null : (isPhone ? username : username.toUpperCase()); + if (TextUtils.equals(userText, hadUserText) && TextUtils.equals(link, hadLink) && hadWidth != null && hadHeight != null && hadWidth == w && hadHeight == h) { + return; } - contentBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + + Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); int qrColor = 0xff000000; int backgroundColor = 0x00ffffff; @@ -805,46 +1108,48 @@ public class QrActivity extends BaseFragment { StaticLayout staticLayout = null; Drawable drawable; int attemptsCount = 2; - final int textMaxWidth = contentBitmap.getWidth() - AndroidUtilities.dp(20) * 2; - for (int i = 0; i <= attemptsCount; ++i) { - if (i == 0) { - drawable = ContextCompat.getDrawable(getContext(), R.drawable.qr_at_large); - textPaint.setTextSize(AndroidUtilities.dp(30)); - } else if (i == 1) { - drawable = ContextCompat.getDrawable(getContext(), R.drawable.qr_at_medium); - textPaint.setTextSize(AndroidUtilities.dp(25)); - } else { - drawable = ContextCompat.getDrawable(getContext(), R.drawable.qr_at_small); - textPaint.setTextSize(AndroidUtilities.dp(19)); - } - if (drawable != null) { - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - drawable.setColorFilter(new PorterDuffColorFilter(qrColor, PorterDuff.Mode.SRC_IN)); - } + final int textMaxWidth = bitmap.getWidth() - AndroidUtilities.dp(20) * 2; + if (!hasTimer) { + for (int i = 0; i <= attemptsCount; ++i) { + if (i == 0) { + drawable = ContextCompat.getDrawable(getContext(), R.drawable.qr_at_large); + textPaint.setTextSize(AndroidUtilities.dp(30)); + } else if (i == 1) { + drawable = ContextCompat.getDrawable(getContext(), R.drawable.qr_at_medium); + textPaint.setTextSize(AndroidUtilities.dp(25)); + } else { + drawable = ContextCompat.getDrawable(getContext(), R.drawable.qr_at_small); + textPaint.setTextSize(AndroidUtilities.dp(19)); + } + if (drawable != null) { + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + drawable.setColorFilter(new PorterDuffColorFilter(qrColor, PorterDuff.Mode.SRC_IN)); + } - SpannableStringBuilder string = new SpannableStringBuilder(" " + (isPhone ? username : username.toUpperCase())); - if (!isPhone) { - string.setSpan(new SettingsSearchCell.VerticalImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - float textWidth = textPaint.measureText(string, 1, string.length()) + drawable.getBounds().width(); - if (i <= 1 && textWidth > textMaxWidth) { - continue; - } - int linesCount = textWidth > textMaxWidth ? 2 : 1; - int layoutWidth = textMaxWidth; - if (linesCount > 1) { - layoutWidth = (int)(textWidth + drawable.getBounds().width()) / 2 + AndroidUtilities.dp(2); - } - if (layoutWidth > textMaxWidth) { - linesCount = 3; - layoutWidth = (int)(textWidth + drawable.getBounds().width()) / 3 + AndroidUtilities.dp(4); - } - staticLayout = StaticLayoutEx.createStaticLayout(string, textPaint, layoutWidth, Layout.Alignment.ALIGN_CENTER, 1f, 0f, false, null, Math.min(layoutWidth + AndroidUtilities.dp(10), contentBitmap.getWidth()), linesCount); + SpannableStringBuilder string = new SpannableStringBuilder(" " + userText); + if (!isPhone) { + string.setSpan(new SettingsSearchCell.VerticalImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + float textWidth = textPaint.measureText(string, 1, string.length()) + drawable.getBounds().width(); + if (i <= 1 && textWidth > textMaxWidth) { + continue; + } + int linesCount = textWidth > textMaxWidth ? 2 : 1; + int layoutWidth = textMaxWidth; + if (linesCount > 1) { + layoutWidth = (int)(textWidth + drawable.getBounds().width()) / 2 + AndroidUtilities.dp(2); + } + if (layoutWidth > textMaxWidth) { + linesCount = 3; + layoutWidth = (int)(textWidth + drawable.getBounds().width()) / 3 + AndroidUtilities.dp(4); + } + staticLayout = StaticLayoutEx.createStaticLayout(string, textPaint, layoutWidth, Layout.Alignment.ALIGN_CENTER, 1f, 0f, false, null, Math.min(layoutWidth + AndroidUtilities.dp(10), bitmap.getWidth()), linesCount); - break; + break; + } } float lineHeight = textPaint.descent() - textPaint.ascent(); - float textHeight = lineHeight * staticLayout.getLineCount(); + float textHeight = lineHeight * (staticLayout == null ? 0 : staticLayout.getLineCount()); Bitmap qrBitmap = null; int imageSize = 0; @@ -870,12 +1175,12 @@ public class QrActivity extends BaseFragment { return; } - Canvas canvas = new Canvas(contentBitmap); + Canvas canvas = new Canvas(bitmap); canvas.drawColor(backgroundColor); float left = (w - qrBitmap.getWidth()) / 2f; float qrTop = h * 0.15f; - if (staticLayout.getLineCount() == 3) { + if (staticLayout != null && staticLayout.getLineCount() == 3) { qrTop = h * 0.13f; } boolean isPortrait = ((ViewGroup) getParent()).getMeasuredWidth() < ((ViewGroup) getParent()).getMeasuredHeight(); @@ -889,27 +1194,62 @@ public class QrActivity extends BaseFragment { float xCenter = left + qrBitmap.getWidth() * 0.5f; float yCenter = qrTop + qrBitmap.getWidth() * 0.5f; canvas.drawCircle(xCenter, yCenter, imageSize * 0.5f, circlePaint); - if (centerChangedListener != null) { - centerChangedListener.onCenterChanged((int) (xCenter - imageSize * 0.5f), (int) (yCenter - imageSize * 0.5f), (int) (xCenter + imageSize * 0.5f), (int) (yCenter + imageSize * 0.5f)); + final int imageSizeFinal = imageSize; + + if (staticLayout != null) { + float xTranslate = (canvas.getWidth() - staticLayout.getWidth()) * 0.5f; + float yTranslate = qrTop + qrBitmap.getHeight() + (canvas.getHeight() - (qrTop + qrBitmap.getHeight()) - textHeight) * 0.5f - AndroidUtilities.dp(4); + canvas.save(); + canvas.translate(xTranslate, yTranslate); + staticLayout.draw(canvas); + canvas.restore(); + qrBitmap.recycle(); } - float xTranslate = (canvas.getWidth() - staticLayout.getWidth()) * 0.5f; - float yTranslate = qrTop + qrBitmap.getHeight() + (canvas.getHeight() - (qrTop + qrBitmap.getHeight()) - textHeight) * 0.5f - AndroidUtilities.dp(4); - canvas.save(); - canvas.translate(xTranslate, yTranslate); - staticLayout.draw(canvas); - canvas.restore(); - qrBitmap.recycle(); + hadWidth = w; + hadHeight = h; + hadUserText = userText; + hadLink = link; - Bitmap oldBitmap = contentBitmap; - contentBitmap = contentBitmap.extractAlpha(); - oldBitmap.recycle(); + AndroidUtilities.runOnUIThread(() -> { + Bitmap oldBitmap = contentBitmap; + contentBitmap = bitmap.extractAlpha(); + if (!firstPrepare) { + contentBitmapAlpha.set(0, true); + } + firstPrepare = false; + if (oldContentBitmap != null) { + oldContentBitmap.recycle(); + } + oldContentBitmap = oldBitmap; + + if (centerChangedListener != null) { + centerChangedListener.onCenterChanged((int) (xCenter - imageSizeFinal * 0.5f), (int) (yCenter - imageSizeFinal * 0.5f), (int) (xCenter + imageSizeFinal * 0.5f), (int) (yCenter + imageSizeFinal * 0.5f)); + logoCenterSet = true; + } + this.invalidate(); + }); } public interface QrCenterChangedListener { - void onCenterChanged(int left, int top, int right, int bottom); } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + checkTimerToken(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (loadingMatrix != null) { + loadingMatrix.stop(); + loadingMatrix.recycle(); + loadingMatrix = null; + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RightSlidingDialogContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/RightSlidingDialogContainer.java new file mode 100644 index 000000000..31b8942be --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/RightSlidingDialogContainer.java @@ -0,0 +1,579 @@ +package org.telegram.ui; + +import static org.telegram.ui.ActionBar.ActionBarLayout.findScrollingChild; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.view.MotionEvent; +import android.view.VelocityTracker; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.dynamicanimation.animation.FloatValueHolder; +import androidx.dynamicanimation.animation.SpringAnimation; +import androidx.dynamicanimation.animation.SpringForce; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.INavigationLayout; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.CubicBezierInterpolator; + +public abstract class RightSlidingDialogContainer extends FrameLayout { + + BaseFragment currentFragment; + View currentFragmentView; + View currentFragmentFullscreenView; + ActionBar currentActionBarView; + + float openedProgress = 0; + boolean isOpenned; + ValueAnimator openAnimator; + private int animationIndex = -1; + private int currentAccount = UserConfig.selectedAccount; + public static long fragmentDialogId; + boolean isPaused; + public int fragmentViewPadding; + private boolean replaceAnimationInProgress; + INavigationLayout navigationLayout; + + public RightSlidingDialogContainer(@NonNull Context context) { + super(context); + } + + public void presentFragment(INavigationLayout navigationLayout, BaseFragment fragment) { + if (isPaused) { + return; + } + this.navigationLayout = navigationLayout; + if (fragment.onFragmentCreate()) { + fragment.setInPreviewMode(true); + fragment.setParentLayout(navigationLayout); + View view = fragment.createView(getContext()); + + fragment.onResume(); + addView(currentFragmentView = view); + BaseFragment oldFragment = currentFragment; + if (fragment instanceof BaseFragmentWithFullscreen) { + currentFragmentFullscreenView = ((BaseFragmentWithFullscreen) fragment).getFullscreenView(); + addView(currentFragmentFullscreenView); + } + currentFragment = fragment; + + fragmentDialogId = 0; + if (currentFragment instanceof TopicsFragment) { + fragmentDialogId = -((TopicsFragment) currentFragment).chatId; + } + if (fragment.getActionBar() != null) { + addView(currentActionBarView = fragment.getActionBar()); + currentActionBarView.listenToBackgroundUpdate(this::invalidate); + } + + + if (oldFragment != null) { + animateReplace(oldFragment); + } else if (!isOpenned) { + isOpenned = true; + if (!SharedConfig.animationsEnabled()) { + openAnimationStarted(true); + fragment.onTransitionAnimationStart(true, false); + fragment.onTransitionAnimationEnd(true, false); + openedProgress = 1f; + updateOpenAnimationProgress(); + openAnimationFinished(); + return; + } + animationIndex = NotificationCenter.getInstance(currentAccount).setAnimationInProgress(animationIndex, null); + openAnimator = ValueAnimator.ofFloat(0, 1f); + openedProgress = 0; + openAnimationStarted(true); + updateOpenAnimationProgress(); + fragment.onTransitionAnimationStart(true, false); + openAnimator.addUpdateListener(animation -> { + openedProgress = (float) animation.getAnimatedValue(); + updateOpenAnimationProgress(); + }); + openAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (openAnimator == null) { + return; + } + openAnimator = null; + NotificationCenter.getInstance(currentAccount).onAnimationFinish(animationIndex); + fragment.onTransitionAnimationEnd(true, false); + openedProgress = 1f; + updateOpenAnimationProgress(); + openAnimationFinished(); + } + }); + openAnimator.setDuration(250); + openAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + openAnimator.setStartDelay(50); + openAnimator.start(); + } + + fragment.setPreviewDelegate(new BaseFragment.PreviewDelegate() { + @Override + public void finishFragment() { + finishPreview(); + } + }); + } + } + + SpringAnimation replaceAnimation; + float replaceProgress; + BaseFragment replacingFragment; + + private void animateReplace(BaseFragment oldFragment) { + BaseFragment currentFragment = this.currentFragment; + + if (!SharedConfig.animationsEnabled()) { + currentFragment.onTransitionAnimationStart(true, false); + currentFragment.onTransitionAnimationEnd(true, false); + setReplaceProgress(oldFragment, currentFragment, 1f); + replaceAnimationInProgress = false; + replacingFragment = null; + oldFragment.onPause(); + oldFragment.onFragmentDestroy(); + removeView(oldFragment.getFragmentView()); + removeView(oldFragment.getActionBar()); + NotificationCenter.getInstance(currentAccount).onAnimationFinish(animationIndex); + return; + } + if (replaceAnimation != null) { + replaceAnimation.cancel(); + } + currentFragment.onTransitionAnimationStart(true, false); + replacingFragment = oldFragment; + replaceAnimationInProgress = true; + animationIndex = NotificationCenter.getInstance(currentAccount).setAnimationInProgress(animationIndex, null); + replaceAnimation = new SpringAnimation(new FloatValueHolder(0f)); + replaceAnimation.setSpring(new SpringForce(1000f) + .setStiffness(400f) + .setDampingRatio(1f)); + + setReplaceProgress(oldFragment, currentFragment, 0f); + replaceAnimation.addUpdateListener((animation, value, velocity) -> { + replaceProgress = value / 1000f; + invalidate(); + }); + replaceAnimation.addEndListener((animation, canceled, value, velocity) -> { + if (replaceAnimation == null) { + return; + } + replaceAnimation = null; + currentFragment.onTransitionAnimationEnd(true, false); + setReplaceProgress(oldFragment, currentFragment, 1f); + replaceAnimationInProgress = false; + replacingFragment = null; + oldFragment.onPause(); + oldFragment.onFragmentDestroy(); + removeView(oldFragment.getFragmentView()); + removeView(oldFragment.getActionBar()); + NotificationCenter.getInstance(currentAccount).onAnimationFinish(animationIndex); + }); + replaceAnimation.start(); + } + + private void setReplaceProgress(BaseFragment oldFragment, BaseFragment currentFragment, float p) { + if (oldFragment == null && currentFragment == null) { + return; + } + int width; + if (oldFragment != null) { + width = oldFragment.getFragmentView().getMeasuredWidth(); + } else { + width = currentFragment.getFragmentView().getMeasuredWidth(); + } + if (oldFragment != null) { + if (oldFragment.getFragmentView() != null) { + oldFragment.getFragmentView().setAlpha(1f - p); + oldFragment.getFragmentView().setTranslationX(width * 0.6f * p); + } + oldFragment.setPreviewOpenedProgress(1f - p); + } + + if (currentFragment != null) { + if (currentFragment.getFragmentView() != null) { + currentFragment.getFragmentView().setAlpha(1f); + currentFragment.getFragmentView().setTranslationX(width * (1f - p)); + } + currentFragment.setPreviewReplaceProgress(p); + } + } + + protected void updateOpenAnimationProgress() { + if (replaceAnimationInProgress || !hasFragment()) { + return; + } + setOpenProgress(openedProgress); + if (currentFragmentView != null) { + currentFragmentView.setTranslationX((getMeasuredWidth() - AndroidUtilities.dp(getRightPaddingSize())) * (1f - openedProgress)); + } + if (currentActionBarView != null) { + currentActionBarView.setTranslationX(AndroidUtilities.dp(48) * (1f - openedProgress)); + } + if (currentFragment != null) { + currentFragment.setPreviewOpenedProgress(openedProgress); + } + invalidate(); + } + + int lastSize; + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int stausBarHeight = getOccupyStatusbar() ? AndroidUtilities.statusBarHeight : 0; + if (currentFragmentView != null) { + LayoutParams layoutParams = (LayoutParams) currentFragmentView.getLayoutParams(); + layoutParams.leftMargin = AndroidUtilities.dp(getRightPaddingSize()); + layoutParams.topMargin = ActionBar.getCurrentActionBarHeight() + stausBarHeight + fragmentViewPadding; + } + if (currentActionBarView != null) { + LayoutParams layoutParams = (LayoutParams) currentActionBarView.getLayoutParams(); + layoutParams.topMargin = stausBarHeight; + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int size = getMeasuredHeight() + getMeasuredWidth() << 16; + if (lastSize != size) { + lastSize = size; + updateOpenAnimationProgress(); + } + } + + void setOpenProgress(float progress) { + + } + + public boolean hasFragment() { + return currentFragment != null; + } + + public void finishPreview() { + if (!isOpenned) { + return; + } + openAnimationStarted(false); + finishPreviewInernal(); + } + + public void finishPreviewInernal() { + isOpenned = false; + if (!SharedConfig.animationsEnabled()) { + openedProgress = 0; + updateOpenAnimationProgress(); + if (currentFragment != null) { + currentFragment.onPause(); + currentFragment.onFragmentDestroy(); + removeAllViews(); + currentFragment = null; + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needCheckSystemBarColors); + } + + openAnimationFinished(); + + return; + } + animationIndex = NotificationCenter.getInstance(currentAccount).setAnimationInProgress(animationIndex, null); + openAnimator = ValueAnimator.ofFloat(openedProgress, 0); + openAnimator.addUpdateListener(animation -> { + openedProgress = (float) animation.getAnimatedValue(); + updateOpenAnimationProgress(); + }); + openAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (openAnimator == null) { + return; + } + openAnimator = null; + openedProgress = 0; + updateOpenAnimationProgress(); + NotificationCenter.getInstance(currentAccount).onAnimationFinish(animationIndex); + if (currentFragment != null) { + currentFragment.onPause(); + currentFragment.onFragmentDestroy(); + removeAllViews(); + currentFragment = null; + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needCheckSystemBarColors); + } + + openAnimationFinished(); + + } + }); + openAnimator.setDuration(250); + openAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + openAnimator.start(); + } + + public interface BaseFragmentWithFullscreen { + View getFullscreenView(); + } + + private int startedTrackingPointerId; + private boolean maybeStartTracking; + protected boolean startedTracking; + private int startedTrackingX; + private int startedTrackingY; + private VelocityTracker velocityTracker; + public boolean enabled = true; + float swipeBackX; + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return onTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (navigationLayout != null && navigationLayout.isInPreviewMode()) { + return false; + } + if (hasFragment() && enabled) { + if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN) { + startedTrackingPointerId = ev.getPointerId(0); + maybeStartTracking = true; + startedTrackingX = (int) ev.getX(); + startedTrackingY = (int) ev.getY(); + if (velocityTracker != null) { + velocityTracker.clear(); + } + } else if (ev != null && ev.getAction() == MotionEvent.ACTION_MOVE && ev.getPointerId(0) == startedTrackingPointerId) { + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain(); + } + int dx = Math.max(0, (int) (ev.getX() - startedTrackingX)); + int dy = Math.abs((int) ev.getY() - startedTrackingY); + velocityTracker.addMovement(ev); + if (maybeStartTracking && !startedTracking && dx >= AndroidUtilities.getPixelsInCM(0.4f, true) && Math.abs(dx) / 3 > dy) { +// BaseFragment currentFragment = fragmentsStack.get(fragmentsStack.size() - 1); + if (findScrollingChild(this, ev.getX(), ev.getY()) == null) { + prepareForMoving(ev); + } else { + maybeStartTracking = false; + } + } else if (startedTracking) { +// if (!beginTrackingSent) { +// if (parentActivity.getCurrentFocus() != null) { +// AndroidUtilities.hideKeyboard(parentActivity.getCurrentFocus()); +// } +// BaseFragment currentFragment = fragmentsStack.get(fragmentsStack.size() - 1); +// currentFragment.onBeginSlide(); +// beginTrackingSent = true; +// } +// containerView.setTranslationX(dx); + swipeBackX = dx; + openedProgress = Utilities.clamp(1f - swipeBackX / getMeasuredWidth(), 1f, 0); + updateOpenAnimationProgress(); +// setInnerTranslationX(dx); + } + } else if (ev != null && ev.getPointerId(0) == startedTrackingPointerId && (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_POINTER_UP)) { + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain(); + } + velocityTracker.computeCurrentVelocity(1000); + + if (startedTracking) { + float x = swipeBackX; + float velX = velocityTracker.getXVelocity(); + float velY = velocityTracker.getYVelocity(); + final boolean backAnimation = x < getMeasuredWidth() / 3.0f && (velX < 3500 || velX < velY); + + if (!backAnimation) { + finishPreviewInernal(); + } else { + openAnimator = ValueAnimator.ofFloat(openedProgress, 1f); + openAnimator.addUpdateListener(animation -> { + openedProgress = (float) animation.getAnimatedValue(); + updateOpenAnimationProgress(); + }); + openAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (openAnimator == null) { + return; + } + openAnimator = null; + openAnimationFinished(); + } + }); + openAnimator.setDuration(250); + openAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + openAnimator.start(); + } + } + maybeStartTracking = false; + startedTracking = false; + + if (velocityTracker != null) { + velocityTracker.recycle(); + velocityTracker = null; + } + } else if (ev == null) { + maybeStartTracking = false; + startedTracking = false; + if (velocityTracker != null) { + velocityTracker.recycle(); + velocityTracker = null; + } + } + return startedTracking; + } + return false; + } + + private void prepareForMoving(MotionEvent ev) { + maybeStartTracking = false; + startedTracking = true; + startedTrackingX = (int) ev.getX(); + openAnimationStarted(false); + } + + float currentTop; + public void setCurrentTop(int top) { + currentTop = top; + if (currentFragmentView != null) { + currentFragmentView.setTranslationY(top - currentFragmentView.getTop() + fragmentViewPadding); + } + if (currentFragmentFullscreenView != null) { + currentFragmentFullscreenView.setTranslationY(top - currentFragmentFullscreenView.getTop()); + } + } + + public void openAnimationFinished() { + + } + + abstract boolean getOccupyStatusbar(); + + public void openAnimationStarted(boolean open) { + + } + + public long getCurrentFragmetDialogId() { + return fragmentDialogId; + } + + public static int getRightPaddingSize() { + return SharedConfig.useThreeLinesLayout ? 74 : 76; + } + + public View getFragmentView() { + return currentFragmentView; + } + + public void onPause() { + isPaused = true; + if (currentFragment != null) { + currentFragment.onPause(); + } + } + + public void onResume() { + isPaused = false; + if (currentFragment != null) { + currentFragment.onResume(); + } + } + + public BaseFragment getFragment() { + return currentFragment; + } + + private Paint actionModePaint; + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child == currentActionBarView && currentActionBarView.getActionMode() != null && currentActionBarView.getActionMode().getAlpha() == 1f) { + return true; + } + return super.drawChild(canvas, child, drawingTime); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (replaceAnimationInProgress) { + setReplaceProgress(replacingFragment, currentFragment, replaceProgress); + invalidate(); + } + super.dispatchDraw(canvas); + float alpha = openedProgress * Math.max(currentActionBarView == null || currentActionBarView.getActionMode() == null ? 0 : currentActionBarView.getActionMode().getAlpha(), currentActionBarView == null ? 0 : currentActionBarView.searchFieldVisibleAlpha); + if (currentFragment != null && currentActionBarView != null && alpha > 0) { + if (actionModePaint == null) { + actionModePaint = new Paint(); + } + actionModePaint.setColor(Theme.getColor(Theme.key_actionBarActionModeDefault)); + if (alpha == 1) { + canvas.save(); + } else { + canvas.saveLayerAlpha(0, 0, getMeasuredWidth(), currentTop, (int) (255 * alpha), Canvas.ALL_SAVE_FLAG); + } + canvas.drawRect(0, 0, getMeasuredWidth(), currentTop, actionModePaint); + + canvas.translate(currentActionBarView.getX(), currentActionBarView.getY()); + + canvas.save(); + canvas.translate(currentActionBarView.getBackButton().getX(), currentActionBarView.getBackButton().getY()); + currentActionBarView.getBackButton().draw(canvas); + canvas.restore(); + + if (currentActionBarView.getActionMode() != null) { + if (alpha != openedProgress * currentActionBarView.getActionMode().getAlpha()) { + currentActionBarView.draw(canvas); + canvas.saveLayerAlpha(0, 0, getMeasuredWidth(), currentTop, (int) (255 * currentActionBarView.getActionMode().getAlpha()), Canvas.ALL_SAVE_FLAG); + currentActionBarView.getActionMode().draw(canvas); + canvas.restore(); + } else { + currentActionBarView.getActionMode().draw(canvas); + } + } else { + currentActionBarView.draw(canvas); + } + canvas.restore(); + invalidate(); + } + } + + public boolean isActionModeShowed() { + return currentFragment != null && currentActionBarView != null && currentActionBarView.isActionModeShowed(); + } + + public void setFragmentViewPadding(int fragmentViewPadding) { + this.fragmentViewPadding = fragmentViewPadding; + } + + public void setTransitionPaddingBottom(int transitionPadding) { + if (currentFragment instanceof TopicsFragment) { + ((TopicsFragment)currentFragment).setTransitionPadding(transitionPadding); + } + } + + @Override + public void removeViewInLayout(View view) { + super.removeViewInLayout(view); + if (view == currentFragmentView) { + finishPreview(); + } + } + + @Override + public void removeView(View view) { + super.removeView(view); + if (view == currentFragmentView) { + finishPreview(); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java b/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java index 56457176c..fcaca2dc6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java @@ -898,7 +898,9 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati if (animated) { dimAnimator = ValueAnimator.ofFloat(contentViewForeground.getAlpha(), dim * maxDim); dimAnimator.addUpdateListener(anm -> { - contentViewForeground.setAlpha((float) anm.getAnimatedValue()); + if (contentViewForeground != null) { + contentViewForeground.setAlpha((float) anm.getAnimatedValue()); + } final int bubbleColor = Theme.blendOver(Theme.getColor(Theme.key_actionBarDefaultSubmenuBackground, resourcesProvider), ColorUtils.setAlphaComponent(0xff000000, (int) (255 * (float) anm.getAnimatedValue()))); if (bubble1View != null) { bubble1View.getBackground().setColorFilter(new PorterDuffColorFilter(bubbleColor, PorterDuff.Mode.MULTIPLY)); @@ -1480,6 +1482,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati }, null, true, + type == TYPE_TOPIC_ICON, 30 ); } @@ -2160,7 +2163,9 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati installFadeAway = ValueAnimator.ofFloat(addButtonView.getAlpha(), installed ? .6f : 1f); addButtonView.setAlpha(addButtonView.getAlpha()); installFadeAway.addUpdateListener(anm -> { - addButtonView.setAlpha((float) anm.getAnimatedValue()); + if (addButtonView != null) { + addButtonView.setAlpha((float) anm.getAnimatedValue()); + } }); installFadeAway.setDuration(450); installFadeAway.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); @@ -2190,8 +2195,12 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati lockAnimator = ValueAnimator.ofFloat(lockT, show ? 1f : 0f); lockAnimator.addUpdateListener(anm -> { lockT = (float) anm.getAnimatedValue(); - addButtonView.setAlpha(1f - lockT); - premiumButtonView.setAlpha(lockT); + if (addButtonView != null) { + addButtonView.setAlpha(1f - lockT); + } + if (premiumButtonView != null) { + premiumButtonView.setAlpha(lockT); + } }); lockAnimator.addListener(new AnimatorListenerAdapter() { @Override @@ -2843,7 +2852,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati fromCount = recentExpanded ? recent.size() : Math.min(maxlen - (includeEmpty ? 1 : 0) - 2, recent.size()); toCount = recent.size(); recentExpanded = true; - animateExpandFromButtonTranslate = AndroidUtilities.dp(8); +// animateExpandFromButtonTranslate = AndroidUtilities.dp(8); } else { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SessionBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/SessionBottomSheet.java index a628e04d5..d813cc932 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SessionBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SessionBottomSheet.java @@ -30,6 +30,7 @@ import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.SessionCell; import org.telegram.ui.Cells.TextCheckCell2; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.LayoutHelper; @@ -309,19 +310,22 @@ public class SessionBottomSheet extends BottomSheet { } String deviceModel = session.device_model.toLowerCase(); int iconId; - String colorKey; + String colorKey, colorKey2; boolean animation = true; if (deviceModel.contains("safari")) { iconId = R.raw.safari_30; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("edge")) { iconId = R.raw.edge_30; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("chrome")) { iconId = R.raw.chrome_30; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (deviceModel.contains("opera") || deviceModel.contains("firefox") || deviceModel.contains("vivaldi")) { animation = false; if (deviceModel.contains("opera")) { @@ -332,32 +336,41 @@ public class SessionBottomSheet extends BottomSheet { iconId = R.drawable.device_web_other; } colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } else if (platform.contains("ubuntu")) { iconId = R.raw.ubuntu_30; colorKey = Theme.key_avatar_backgroundBlue; + colorKey2 = Theme.key_avatar_background2Blue; } else if (platform.contains("ios")) { iconId = deviceModel.contains("ipad") ? R.raw.ipad_30 : R.raw.iphone_30; colorKey = Theme.key_avatar_backgroundBlue; + colorKey2 = Theme.key_avatar_background2Blue; } else if (platform.contains("windows")) { iconId = R.raw.windows_30; colorKey = Theme.key_avatar_backgroundCyan; + colorKey2 = Theme.key_avatar_background2Cyan; } else if (platform.contains("macos")) { iconId = R.raw.mac_30; colorKey = Theme.key_avatar_backgroundCyan; + colorKey2 = Theme.key_avatar_background2Cyan; } else if (platform.contains("android")) { iconId = R.raw.android_30; colorKey = Theme.key_avatar_backgroundGreen; + colorKey2 = Theme.key_avatar_background2Green; } else { if (session.app_name.toLowerCase().contains("desktop")) { iconId = R.raw.windows_30; colorKey = Theme.key_avatar_backgroundCyan; + colorKey2 = Theme.key_avatar_background2Cyan; } else { iconId = R.raw.chrome_30; colorKey = Theme.key_avatar_backgroundPink; + colorKey2 = Theme.key_avatar_background2Pink; } } imageView.setBackground(Theme.createCircleDrawable(AndroidUtilities.dp(42), Theme.getColor(colorKey))); +// imageView.setBackground(new SessionCell.CircleGradientDrawable(AndroidUtilities.dp(42), Theme.getColor(colorKey), Theme.getColor(colorKey2))); if (animation) { int[] colors = new int[]{0x000000, Theme.getColor(colorKey)}; imageView.setAnimation(iconId, 50, 50, colors); @@ -377,7 +390,8 @@ public class SessionBottomSheet extends BottomSheet { public ItemView(Context context, boolean needSwitch) { super(context); iconView = new ImageView(context); - addView(iconView, LayoutHelper.createFrame(28, 28, 0, 16, 8, 0, 0)); + iconView.setScaleType(ImageView.ScaleType.CENTER); + addView(iconView, LayoutHelper.createFrame(32, 32, 0, 12, 4, 0, 0)); LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java index 9684a50a9..5751979d7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java @@ -242,6 +242,7 @@ public class SessionsActivity extends BaseFragment implements NotificationCenter cell.setCheckColor(Theme.getColor(Theme.key_radioBackground), Theme.getColor(Theme.key_dialogRadioBackgroundChecked)); cell.setTextAndValue(items[a], selected == a); linearLayout.addView(cell); + cell.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), Theme.RIPPLE_MASK_ALL)); cell.setOnClickListener(v -> { builder.getDismissRunnable().run(); Integer which = (Integer) v.getTag(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TopicCreateFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/TopicCreateFragment.java index ba8470d3d..6fdfaaf9f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TopicCreateFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TopicCreateFragment.java @@ -6,6 +6,8 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Canvas; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -18,6 +20,7 @@ import android.view.View; import android.view.animation.OvershootInterpolator; import android.view.inputmethod.EditorInfo; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import org.telegram.messenger.AndroidUtilities; @@ -31,10 +34,13 @@ import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Cells.TextCheckCell2; +import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.BulletinFactory; @@ -58,6 +64,7 @@ public class TopicCreateFragment extends BaseFragment { long selectedEmojiDocumentId; int topicId; + TextCheckCell2 checkBoxCell; EditTextBoldCursor editTextBoldCursor; SelectAnimatedEmojiDialog selectAnimatedEmojiDialog; BackupImageView[] backupImageView = new BackupImageView[2]; @@ -101,7 +108,7 @@ public class TopicCreateFragment extends BaseFragment { @Override public View createView(Context context) { if (topicForEdit != null) { - actionBar.setTitle(LocaleController.getString("NewTopic", R.string.EditTopic)); + actionBar.setTitle(LocaleController.getString("EditTopic", R.string.EditTopic)); } else { actionBar.setTitle(LocaleController.getString("NewTopic", R.string.NewTopic)); } @@ -217,12 +224,15 @@ public class TopicCreateFragment extends BaseFragment { editForumRequest.icon_emoji_id = selectedEmojiDocumentId; editForumRequest.flags |= 2; } + if (checkBoxCell != null) { + editForumRequest.hidden = !checkBoxCell.isChecked(); + editForumRequest.flags |= 8; + } ConnectionsManager.getInstance(currentAccount).sendRequest(editForumRequest, (response, error) -> { }); } - topicForEdit.icon_emoji_id = selectedEmojiDocumentId; if (selectedEmojiDocumentId != 0) { topicForEdit.flags |= 1; @@ -230,6 +240,9 @@ public class TopicCreateFragment extends BaseFragment { topicForEdit.flags &= ~1; } topicForEdit.title = topicName; + if (checkBoxCell != null) { + topicForEdit.hidden = !checkBoxCell.isChecked(); + } getMessagesController().getTopicsController().onTopicEdited(-chatId, topicForEdit); finishFragment(); } @@ -264,7 +277,11 @@ public class TopicCreateFragment extends BaseFragment { contentView.addView(linearLayout); HeaderCell headerCell = new HeaderCell(context); - headerCell.setText(LocaleController.getString("CreateTopicTitle", R.string.CreateTopicTitle)); + if (topicForEdit != null && topicForEdit.id == 1) { + headerCell.setText(LocaleController.getString("CreateGeneralTopicTitle", R.string.CreateGeneralTopicTitle)); + } else { + headerCell.setText(LocaleController.getString("CreateTopicTitle", R.string.CreateTopicTitle)); + } FrameLayout editTextContainer = new FrameLayout(context); @@ -301,8 +318,9 @@ public class TopicCreateFragment extends BaseFragment { if (!oldFirstSymbol.equals(firstSymbol)) { LetterDrawable letterDrawable = new LetterDrawable(null, LetterDrawable.STYLE_TOPIC_DRAWABLE); letterDrawable.setTitle(firstSymbol); - replaceableIconDrawable.setIcon(letterDrawable, true); - + if (replaceableIconDrawable != null) { + replaceableIconDrawable.setIcon(letterDrawable, true); + } } } }); @@ -383,59 +401,85 @@ public class TopicCreateFragment extends BaseFragment { emojiContainer.setBackgroundDrawable(combinedDrawable); emojiContainer.setClipChildren(false); + if (topicForEdit == null || topicForEdit.id != 1) { + selectAnimatedEmojiDialog = new SelectAnimatedEmojiDialog(this, getContext(), false, null, SelectAnimatedEmojiDialog.TYPE_TOPIC_ICON, null) { - selectAnimatedEmojiDialog = new SelectAnimatedEmojiDialog(this, getContext(), false, null, SelectAnimatedEmojiDialog.TYPE_TOPIC_ICON, null) { + private boolean firstLayout = true; - private boolean firstLayout = true; - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - if (firstLayout) { - firstLayout = false; - selectAnimatedEmojiDialog.onShow(null); - } - } - - protected void onEmojiSelected(View view, Long documentId, TLRPC.Document document, Integer until) { - boolean setIsFree = false; - if (!TextUtils.isEmpty(UserConfig.getInstance(currentAccount).defaultTopicIcons)) { - TLRPC.TL_messages_stickerSet stickerSet = getMediaDataController().getStickerSetByEmojiOrName(UserConfig.getInstance(currentAccount).defaultTopicIcons); - long stickerSetId = stickerSet == null ? 0 : stickerSet.set.id; - long documentSetId = MediaDataController.getStickerSetId(document); - setIsFree = stickerSetId == documentSetId; + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (firstLayout) { + firstLayout = false; + selectAnimatedEmojiDialog.onShow(null); + } } - selectEmoji(documentId, setIsFree); - } - }; + protected void onEmojiSelected(View view, Long documentId, TLRPC.Document document, Integer until) { + boolean setIsFree = false; + if (!TextUtils.isEmpty(UserConfig.getInstance(currentAccount).defaultTopicIcons)) { + TLRPC.TL_messages_stickerSet stickerSet = getMediaDataController().getStickerSetByEmojiOrName(UserConfig.getInstance(currentAccount).defaultTopicIcons); + long stickerSetId = stickerSet == null ? 0 : stickerSet.set.id; + long documentSetId = MediaDataController.getStickerSetId(document); + setIsFree = stickerSetId == documentSetId; + } - selectAnimatedEmojiDialog.setAnimationsEnabled(fragmentBeginToShow); - selectAnimatedEmojiDialog.setClipChildren(false); - emojiContainer.addView(selectAnimatedEmojiDialog, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 12, 12, 12, 12)); + selectEmoji(documentId, setIsFree); + } + }; + selectAnimatedEmojiDialog.setAnimationsEnabled(fragmentBeginToShow); + selectAnimatedEmojiDialog.setClipChildren(false); + emojiContainer.addView(selectAnimatedEmojiDialog, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 12, 12, 12, 12)); + + Drawable drawable = ForumUtilities.createTopicDrawable("", iconColor); + CombinedDrawable topicCombinedDrawable = (CombinedDrawable) drawable; + forumBubbleDrawable = (ForumBubbleDrawable) topicCombinedDrawable.getBackgroundDrawable(); + + replaceableIconDrawable = new ReplaceableIconDrawable(context); + CombinedDrawable combinedDrawable2 = new CombinedDrawable(drawable, replaceableIconDrawable, 0, 0); + combinedDrawable2.setFullsize(true); + + selectAnimatedEmojiDialog.setForumIconDrawable(combinedDrawable2); + + defaultIconDrawable = combinedDrawable2; + + replaceableIconDrawable.addView(backupImageView[0]); + replaceableIconDrawable.addView(backupImageView[1]); + + backupImageView[0].setImageDrawable(defaultIconDrawable); + AndroidUtilities.updateViewVisibilityAnimated(backupImageView[0], true, 1, false); + AndroidUtilities.updateViewVisibilityAnimated(backupImageView[1], false, 1, false); + + forumBubbleDrawable.addParent(backupImageView[0]); + forumBubbleDrawable.addParent(backupImageView[1]); + } else { + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.msg_filled_general); + imageView.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_inMenu), PorterDuff.Mode.MULTIPLY)); + iconContainer.addView(imageView, LayoutHelper.createFrame(22, 22, Gravity.CENTER)); + + emojiContainer.addView( + new ActionBarPopupWindow.GapView(context, getResourceProvider()), + LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 8) + ); + + checkBoxCell = new TextCheckCell2(context); + checkBoxCell.getCheckBox().setDrawIconType(0); + checkBoxCell.setTextAndCheck(LocaleController.getString("EditTopicHide", R.string.EditTopicHide), !topicForEdit.hidden, false); + checkBoxCell.setBackground(Theme.createSelectorWithBackgroundDrawable(getThemedColor(Theme.key_windowBackgroundWhite), getThemedColor(Theme.key_listSelector))); + checkBoxCell.setOnClickListener(e -> { + checkBoxCell.setChecked(!checkBoxCell.isChecked()); + }); + emojiContainer.addView(checkBoxCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.TOP, 0, 8, 0, 0)); + + TextInfoPrivacyCell infoCell = new TextInfoPrivacyCell(context); + infoCell.setText(LocaleController.getString("EditTopicHideInfo", R.string.EditTopicHideInfo)); + infoCell.setBackground(Theme.getThemedDrawable(getContext(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow, getResourceProvider())); + emojiContainer.addView(infoCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP, 0, 8 + 50, 0, 0)); + } linearLayout.addView(emojiContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - Drawable drawable = ForumUtilities.createTopicDrawable("", iconColor); - CombinedDrawable topicCombinedDrawable = (CombinedDrawable) drawable; - forumBubbleDrawable = (ForumBubbleDrawable) topicCombinedDrawable.getBackgroundDrawable(); - - - replaceableIconDrawable = new ReplaceableIconDrawable(context); - CombinedDrawable combinedDrawable2 = new CombinedDrawable(drawable, replaceableIconDrawable, 0, 0); - combinedDrawable2.setFullsize(true); - - selectAnimatedEmojiDialog.setForumIconDrawable(combinedDrawable2); - - defaultIconDrawable = combinedDrawable2; - - replaceableIconDrawable.addView(backupImageView[0]); - replaceableIconDrawable.addView(backupImageView[1]); - backupImageView[0].setImageDrawable(defaultIconDrawable); - AndroidUtilities.updateViewVisibilityAnimated(backupImageView[0], true, 1, false); - AndroidUtilities.updateViewVisibilityAnimated(backupImageView[1], false, 1, false); - - forumBubbleDrawable.addParent(backupImageView[0]); - forumBubbleDrawable.addParent(backupImageView[1]); if (topicForEdit != null) { editTextBoldCursor.setText(topicForEdit.title); selectEmoji(topicForEdit.icon_emoji_id, true); @@ -447,6 +491,9 @@ public class TopicCreateFragment extends BaseFragment { } private void selectEmoji(Long documentId, boolean free) { + if (selectAnimatedEmojiDialog == null || replaceableIconDrawable == null) { + return; + } long docId = documentId == null ? 0L : documentId; selectAnimatedEmojiDialog.setSelected(docId); if (selectedEmojiDocumentId == docId) { @@ -509,7 +556,9 @@ public class TopicCreateFragment extends BaseFragment { } getNotificationCenter().onAnimationFinish(animationIndex); - selectAnimatedEmojiDialog.setAnimationsEnabled(fragmentBeginToShow); + if (selectAnimatedEmojiDialog != null) { + selectAnimatedEmojiDialog.setAnimationsEnabled(fragmentBeginToShow); + } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java index befff3683..a506732e8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java @@ -12,19 +12,27 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Outline; +import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.text.SpannableString; import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.TextUtils; +import android.text.style.DynamicDrawableSpan; +import android.text.style.ImageSpan; import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; @@ -40,10 +48,16 @@ import androidx.core.graphics.ColorUtils; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScrollerCustom; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.exoplayer2.util.Log; + +import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; +import org.telegram.messenger.DialogObject; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; @@ -68,14 +82,19 @@ import org.telegram.ui.ActionBar.BackDrawable; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.Adapters.DialogsAdapter; import org.telegram.ui.Adapters.FiltersView; import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.Cells.GraySectionCell; +import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.ProfileSearchCell; import org.telegram.ui.Cells.TopicSearchCell; import org.telegram.ui.Cells.UserCell; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.BlurredRecyclerView; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.ChatActivityInterface; @@ -84,6 +103,7 @@ import org.telegram.ui.Components.ChatNotificationsPopupWrapper; import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.Forum.ForumUtilities; import org.telegram.ui.Components.FragmentContextView; @@ -92,33 +112,52 @@ import org.telegram.ui.Components.JoinGroupAlert; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.ListView.AdapterWithDiffUtils; import org.telegram.ui.Components.NumberTextView; +import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.RadialProgressView; +import org.telegram.ui.Components.RecyclerAnimationScrollHelper; import org.telegram.ui.Components.RecyclerItemsEnterAnimator; import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Components.SearchDownloadsContainer; +import org.telegram.ui.Components.SearchViewPager; import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.StickerEmptyView; import org.telegram.ui.Components.UnreadCounterTextView; +import org.telegram.ui.Components.ViewPagerFixed; import org.telegram.ui.Delegates.ChatActivityMemberRequestsDelegate; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -public class TopicsFragment extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ChatActivityInterface { +public class TopicsFragment extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, ChatActivityInterface, RightSlidingDialogContainer.BaseFragmentWithFullscreen { private final static int BOTTOM_BUTTON_TYPE_JOIN = 0; private final static int BOTTOM_BUTTON_TYPE_REPORT = 1; final long chatId; ArrayList forumTopics = new ArrayList<>(); + private int lastItemsCount; + private ArrayList frozenForumTopicsList = new ArrayList<>(); + private boolean forumTopicsListFrozen; + SizeNotifierFrameLayout contentView; + FrameLayout fullscreenView; ChatAvatarContainer avatarContainer; ChatActivity.ThemeDelegate themeDelegate; FrameLayout floatingButtonContainer; Adapter adapter = new Adapter(); private final TopicsController topicsController; OnTopicSelectedListener onTopicSelectedListener; + private PullForegroundDrawable pullForegroundDrawable; + private int hiddenCount = 0; + private int pullViewState; + private boolean hiddenShown = true; + + private final static int ARCHIVE_ITEM_STATE_PINNED = 0; + private final static int ARCHIVE_ITEM_STATE_SHOWED = 1; + private final static int ARCHIVE_ITEM_STATE_HIDDEN = 2; private float floatingButtonTranslation; private float floatingButtonHideProgress; @@ -129,8 +168,13 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N LinearLayoutManager layoutManager; boolean animatedUpdateEnabled = true; + private int prevPosition; + private int prevTop; + private boolean scrollUpdated; + private final static int VIEW_TYPE_TOPIC = 0; private final static int VIEW_TYPE_LOADING_CELL = 1; + private final static int VIEW_TYPE_EMPTY = 2; private static final int toggle_id = 1; private static final int add_member_id = 2; @@ -143,20 +187,28 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private static final int close_topic_id = 9; private static final int restart_topic_id = 10; private static final int delete_chat_id = 11; + private static final int hide_id = 12; + private static final int show_id = 13; private boolean removeFragmentOnTransitionEnd; TLRPC.ChatFull chatFull; boolean canShowCreateTopic; private UnreadCounterTextView bottomOverlayChatText; private int bottomButtonType; - private RecyclerListView recyclerListView; + private TopicsRecyclerView recyclerListView; + private RecyclerAnimationScrollHelper scrollHelper; private ItemTouchHelper itemTouchHelper; + private TouchHelperCallback itemTouchHelperCallback; private ActionBarMenuSubItem createTopicSubmenu; private ActionBarMenuSubItem addMemberSubMenu; private ActionBarMenuSubItem deleteChatSubmenu; private boolean bottomPannelVisible = true; private float searchAnimationProgress = 0f; - private float searchAnimation2Progress = 0f; + + private long startArchivePullingTime; + private boolean scrollingManually; + private boolean canShowHiddenArchive; + private boolean disableActionBarScrolling; HashSet selectedTopics = new HashSet<>(); private boolean reordering; @@ -166,6 +218,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private ActionBarMenuItem unpinItem; private ActionBarMenuItem muteItem; private ActionBarMenuItem deleteItem; + private ActionBarMenuItem hideItem; + private ActionBarMenuItem showItem; private ActionBarMenuSubItem readItem; private ActionBarMenuSubItem closeTopic; private ActionBarMenuSubItem restartTopic; @@ -174,8 +228,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private FrameLayout bottomOverlayContainer; private ActionBarMenuItem searchItem; private ActionBarMenuItem other; - private SearchContainer searchContainer; - private boolean searching, searchingNotEmpty; + private MessagesSearchContainer searchContainer; + public boolean searching; private boolean opnendForSelect; private boolean openedForForward; HashSet excludeTopics; @@ -184,6 +238,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private boolean scrollToTop; private boolean endReached; StickerEmptyView topicsEmptyView; + private View emptyView; FragmentContextView fragmentContextView; private ChatObject.Call groupCall; @@ -191,12 +246,14 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private boolean loadingTopics; RecyclerItemsEnterAnimator itemsEnterAnimator; DialogsActivity dialogsActivity; + public DialogsActivity parentDialogsActivity; private boolean updateAnimated; private int transitionAnimationIndex; private int transitionAnimationGlobalIndex; private View blurredView; + private int selectedTopicForTablet; private boolean joinRequested; private ChatActivityMemberRequestsDelegate pendingRequestsDelegate; @@ -210,6 +267,11 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private RLottieImageView floatingButton; private boolean canShowProgress; + @Override + public View getFullscreenView() { + return fullscreenView; + } + public TopicsFragment(Bundle bundle) { super(bundle); chatId = arguments.getLong("chat_id", 0); @@ -251,11 +313,33 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N setWillNotDraw(false); } - @Override - public void draw(Canvas canvas) { - super.draw(canvas); + public int getActionBarFullHeight() { + float h = actionBar.getHeight(); + float searchTabsHeight = 0; + if (searchTabsView != null && searchTabsView.getVisibility() != View.GONE) { + searchTabsHeight = searchTabsView.getMeasuredHeight(); + } + h += searchTabsHeight * searchAnimationProgress; + return (int) h; + } - getParentLayout().drawHeaderShadow(canvas, (int) (actionBar.getY() + actionBar.getHeight() * actionBar.getScaleY())); + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child == actionBar && !isInPreviewMode()) { + int y = (int) (actionBar.getY() + getActionBarFullHeight()); + getParentLayout().drawHeaderShadow(canvas, (int) (255 * (1f - searchAnimationProgress)), y); + if (searchAnimationProgress > 0) { + if (searchAnimationProgress < 1) { + int a = Theme.dividerPaint.getAlpha(); + Theme.dividerPaint.setAlpha((int) (a * searchAnimationProgress)); + canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); + Theme.dividerPaint.setAlpha(a); + } else { + canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); + } + } + } + return super.drawChild(canvas, child, drawingTime); } @Override @@ -347,8 +431,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N default: childTop = parentTop + lp.topMargin; if (child == topView) { - topView.setPadding(0, actionBar.getTop() + actionBar.getMeasuredHeight(), 0, 0); - } else if (!(child instanceof ActionBar)) { + topView.setPadding(0, isInPreviewMode() ? 0 : actionBar.getTop() + actionBar.getMeasuredHeight(), 0, 0); + } else if (!(child instanceof ActionBar) && !isInPreviewMode()) { childTop += actionBar.getTop() + actionBar.getMeasuredHeight(); } } @@ -370,14 +454,33 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } } } + + private Paint actionBarPaint = new Paint(); + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (isInPreviewMode()) { + actionBarPaint.setColor(getThemedColor(Theme.key_windowBackgroundWhite)); + actionBarPaint.setAlpha((int) (255 * searchAnimationProgress)); + canvas.drawRect(0, 0, getWidth(), AndroidUtilities.statusBarHeight, actionBarPaint); + } + } + }; contentView.needBlur = true; actionBar.setAddToContainer(false); actionBar.setCastShadows(false); actionBar.setClipContent(true); + actionBar.setOccupyStatusBar(!AndroidUtilities.isTablet() && !inPreviewMode); + if (inPreviewMode) { + actionBar.setBackgroundColor(Color.TRANSPARENT); + actionBar.setInterceptTouches(false); + } actionBar.setBackButtonDrawable(new BackDrawable(false)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { @@ -389,6 +492,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N finishFragment(); return; } + TLRPC.TL_forumTopic topic; switch (id) { case toggle_id: switchToChat(false); @@ -443,6 +547,43 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N clearSelectedTopics(); }); break; + case hide_id: + case show_id: + topic = null; + TopicDialogCell dialogCell = null; + for (int i = 0; i < recyclerListView.getChildCount(); ++i) { + View child = recyclerListView.getChildAt(i); + if (child instanceof TopicDialogCell && ((TopicDialogCell) child).forumTopic != null && ((TopicDialogCell) child).forumTopic.id == 1) { + dialogCell = (TopicDialogCell) child; + topic = dialogCell.forumTopic; + break; + } + } + if (topic == null) { + for (int i = 0; i < forumTopics.size(); ++i) { + if (forumTopics.get(i) != null && forumTopics.get(i).topic != null && forumTopics.get(i).topic.id == 1) { + topic = forumTopics.get(i).topic; + break; + } + } + } + if (topic != null) { + if (hiddenCount <= 0) { + hiddenShown = true; + pullViewState = ARCHIVE_ITEM_STATE_HIDDEN; + } + getMessagesController().getTopicsController().toggleShowTopic(chatId, 1, topic.hidden); + if (dialogCell != null) { + generalTopicViewMoving = dialogCell; + } + recyclerListView.setArchiveHidden(!topic.hidden, dialogCell); + updateTopicsList(true, true); + if (dialogCell != null) { + dialogCell.setTopicIcon(dialogCell.currentTopic); + } + } + clearSelectedTopics(); + break; case pin_id: case unpin_id: if (selectedTopics.size() > 0) { @@ -472,7 +613,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N case read_id: list = new ArrayList<>(selectedTopics); for (int i = 0; i < list.size(); ++i) { - TLRPC.TL_forumTopic topic = topicsController.findTopic(chatId, list.get(i)); + topic = topicsController.findTopic(chatId, list.get(i)); if (topic != null) { getMessagesController().markMentionsAsRead(-chatId, topic.id); getMessagesController().markDialogAsRead(-chatId, topic.top_message, 0, topic.topMessage != null ? topic.topMessage.date : 0, false, topic.id, 0, true, 0); @@ -488,39 +629,50 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N actionBar.setOnClickListener(v -> { - openProfile(false); + if (!searching) { + openProfile(false); + } }); - ActionBarMenu menu = actionBar.createMenu(); - searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - animateToSearchView(true); - searchContainer.setSearchString(""); - searchContainer.setAlpha(0); - searchContainer.emptyView.showProgress(true, false); - } + if (parentDialogsActivity != null) { + searchItem = menu.addItem(0, R.drawable.ic_ab_search); + searchItem.setOnClickListener(e -> { + openParentSearch(); + }); + } else { + searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() { + animateToSearchView(true); + searchContainer.setSearchString(""); + searchContainer.setAlpha(0); + searchContainer.emptyView.showProgress(true, false); + } + @Override + public void onSearchCollapse() { + animateToSearchView(false); + } - @Override - public void onSearchCollapse() { - animateToSearchView(false); - } + @Override + public void onTextChanged(EditText editText) { + String text = editText.getText().toString(); + searchContainer.setSearchString(text); + } - @Override - public void onTextChanged(EditText editText) { - String text = editText.getText().toString(); - searchContainer.setSearchString(text); - } + @Override + public void onSearchFilterCleared(FiltersView.MediaFilterData filterData) { - @Override - public void onSearchFilterCleared(FiltersView.MediaFilterData filterData) { - - } - }); - searchItem.setSearchPaddingStart(56); - searchItem.setSearchFieldHint(LocaleController.getString("Search", R.string.Search)); + } + }); + searchItem.setSearchPaddingStart(56); + searchItem.setSearchFieldHint(LocaleController.getString("Search", R.string.Search)); + EditTextBoldCursor editText = searchItem.getSearchField(); + editText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + editText.setHintTextColor(Theme.getColor(Theme.key_player_time)); + editText.setCursorColor(Theme.getColor(Theme.key_chat_messagePanelCursor)); + } other = menu.addItem(0, R.drawable.ic_ab_other, themeDelegate); other.addSubItem(toggle_id, R.drawable.msg_discussion, LocaleController.getString("TopicViewAsMessages", R.string.TopicViewAsMessages)); addMemberSubMenu = other.addSubItem(add_member_id, R.drawable.msg_addcontact, LocaleController.getString("AddMember", R.string.AddMember)); @@ -529,8 +681,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N avatarContainer = new ChatAvatarContainer(context, this, false); avatarContainer.getAvatarImageView().setRoundRadius(AndroidUtilities.dp(16)); - avatarContainer.setOccupyStatusBar(!AndroidUtilities.isTablet()); - actionBar.addView(avatarContainer, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, !inPreviewMode ? 56 : 0, 0, 86, 0)); + avatarContainer.setOccupyStatusBar(!AndroidUtilities.isTablet() && !inPreviewMode); + actionBar.addView(avatarContainer, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 56, 0, 86, 0)); avatarContainer.getAvatarImageView().setOnClickListener(new View.OnClickListener() { @Override @@ -538,7 +690,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N openProfile(true); } }); - recyclerListView = new RecyclerListView(context) { + recyclerListView = new TopicsRecyclerView(context) { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); @@ -546,10 +698,36 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } @Override - protected boolean emptyViewIsVisible() { - return super.emptyViewIsVisible(); + public boolean emptyViewIsVisible() { + if (getAdapter() == null || isFastScrollAnimationRunning()) { + return false; + } + if (forumTopics != null && forumTopics.size() == 1 && forumTopics.get(0) != null && forumTopics.get(0).topic != null && forumTopics.get(0).topic.id == 1) { + return getAdapter().getItemCount() <= 2; + } + return getAdapter().getItemCount() <= 1; } }; + SpannableString generalIcon = new SpannableString("#"); + Drawable generalIconDrawable = ForumUtilities.createGeneralTopicDrawable(getContext(), .85f, Color.WHITE); + generalIconDrawable.setBounds(0, AndroidUtilities.dp(2), AndroidUtilities.dp(16), AndroidUtilities.dp(18)); + generalIcon.setSpan(new ImageSpan(generalIconDrawable, DynamicDrawableSpan.ALIGN_CENTER), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + pullForegroundDrawable = new PullForegroundDrawable( + AndroidUtilities.replaceCharSequence("#", LocaleController.getString("AccSwipeForGeneral", R.string.AccSwipeForGeneral), generalIcon), + AndroidUtilities.replaceCharSequence("#", LocaleController.getString("AccReleaseForGeneral", R.string.AccReleaseForGeneral), generalIcon) + ) { + @Override + protected float getViewOffset() { + return recyclerListView.getViewOffset(); + } + }; + if (false) { + pullForegroundDrawable.showHidden(); + } else { + pullForegroundDrawable.doNotShow(); + } + pullViewState = hiddenShown ? ARCHIVE_ITEM_STATE_HIDDEN : ARCHIVE_ITEM_STATE_PINNED; + pullForegroundDrawable.setWillDraw(pullViewState != ARCHIVE_ITEM_STATE_PINNED); DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator() { Runnable finishRunnable; int scrollAnimationIndex; @@ -596,7 +774,22 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } }); } + + @Override + protected void afterAnimateMoveImpl(RecyclerView.ViewHolder holder) { + if (generalTopicViewMoving == holder.itemView) { + generalTopicViewMoving.setTranslationX(0); + if (itemTouchHelper != null) { + itemTouchHelper.clearRecoverAnimations(); + } + if (generalTopicViewMoving instanceof TopicDialogCell) { + ((TopicDialogCell) generalTopicViewMoving).setTopicIcon(((TopicDialogCell) generalTopicViewMoving).currentTopic); + } + generalTopicViewMoving = null; + } + } }; + recyclerListView.setHideIfEmpty(false); defaultItemAnimator.setSupportsChangeAnimations(false); defaultItemAnimator.setDelayAnimations(false); recyclerListView.setItemAnimator(itemAnimator = defaultItemAnimator); @@ -611,6 +804,9 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N itemsEnterAnimator = new RecyclerItemsEnterAnimator(recyclerListView, true); recyclerListView.setItemsEnterAnimator(itemsEnterAnimator); recyclerListView.setOnItemClickListener((view, position) -> { + if (getParentLayout() == null || getParentLayout().isInPreviewMode()) { + return; + } TLRPC.TL_forumTopic topic = null; if (view instanceof TopicDialogCell) { topic = ((TopicDialogCell) view).forumTopic; @@ -632,16 +828,31 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N toggleSelection(view); return; } + if (inPreviewMode && AndroidUtilities.isTablet()) { + for (BaseFragment fragment : getParentLayout().getFragmentStack()) { + if (fragment instanceof DialogsActivity && ((DialogsActivity) fragment).isMainDialogList()) { + MessagesStorage.TopicKey topicKey = ((DialogsActivity) fragment).getOpenedDialogId(); + if (topicKey.dialogId == -chatId && topicKey.topicId == topic.id) { + return; + } + } + } + selectedTopicForTablet = topic.id; + updateTopicsList(false, false); + } ForumUtilities.openTopic(TopicsFragment.this, chatId, topic, 0); }); recyclerListView.setOnItemLongClickListener((view, position, x, y) -> { - if (opnendForSelect) { + if (opnendForSelect || getParentLayout() == null || getParentLayout().isInPreviewMode()) { return false; } if (!actionBar.isActionModeShowed() && !AndroidUtilities.isTablet() && view instanceof TopicDialogCell) { TopicDialogCell cell = (TopicDialogCell) view; if (cell.isPointInsideAvatar(x, y)) { - return showChatPreview(cell); + showChatPreview(cell); + recyclerListView.cancelClickRunnables(true); + recyclerListView.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0)); + return false; } } toggleSelection(view); @@ -655,7 +866,177 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N contentView.invalidateBlur(); } }); - recyclerListView.setLayoutManager(layoutManager = new LinearLayoutManager(context)); + recyclerListView.setLayoutManager(layoutManager = new LinearLayoutManager(context) { + + private boolean fixOffset; + @Override + public void scrollToPositionWithOffset(int position, int offset) { + if (fixOffset) { + offset -= recyclerListView.getPaddingTop(); + } + super.scrollToPositionWithOffset(position, offset); + } + + @Override + public void prepareForDrop(@NonNull View view, @NonNull View target, int x, int y) { + fixOffset = true; + super.prepareForDrop(view, target, x, y); + fixOffset = false; + } + + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + if (hiddenCount > 0 && position == 1) { + super.smoothScrollToPosition(recyclerView, state, position); + } else { + LinearSmoothScrollerCustom linearSmoothScroller = new LinearSmoothScrollerCustom(recyclerView.getContext(), LinearSmoothScrollerCustom.POSITION_MIDDLE); + linearSmoothScroller.setTargetPosition(position); + startSmoothScroll(linearSmoothScroller); + } + } + + @Override + public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { + if (recyclerListView.fastScrollAnimationRunning) { + return 0; + } + boolean isDragging = recyclerListView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING; + + int measuredDy = dy; + int pTop = recyclerListView.getPaddingTop(); + if (dy < 0 && hiddenCount > 0 && pullViewState == ARCHIVE_ITEM_STATE_HIDDEN) { + recyclerListView.setOverScrollMode(View.OVER_SCROLL_ALWAYS); + int currentPosition = layoutManager.findFirstVisibleItemPosition(); + if (currentPosition == 0) { + View view = layoutManager.findViewByPosition(currentPosition); + if (view != null) { + view.setTranslationX(0); + } + if (view != null && (view.getBottom() - pTop) <= AndroidUtilities.dp(1)) { + currentPosition = 1; + } + } + if (!isDragging) { + View view = layoutManager.findViewByPosition(currentPosition); + if (view != null) { + int dialogHeight = AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72) + 1; + int canScrollDy = -(view.getTop() - pTop) + (currentPosition - 1) * dialogHeight; + int positiveDy = Math.abs(dy); + if (canScrollDy < positiveDy) { + measuredDy = -canScrollDy; + } + } + } else if (currentPosition == 0) { + View v = layoutManager.findViewByPosition(currentPosition); + float k = 1f + ((v.getTop() - pTop) / (float) v.getMeasuredHeight()); + if (k > 1f) { + k = 1f; + } + recyclerListView.setOverScrollMode(View.OVER_SCROLL_NEVER); + measuredDy *= PullForegroundDrawable.startPullParallax - PullForegroundDrawable.endPullParallax * k; + if (measuredDy > -1) { + measuredDy = -1; + } + } + } + + if (recyclerListView.getViewOffset() != 0 && dy > 0 && isDragging) { + float ty = (int) recyclerListView.getViewOffset(); + ty -= dy; + if (ty < 0) { + measuredDy = (int) ty; + ty = 0; + } else { + measuredDy = 0; + } + recyclerListView.setViewsOffset(ty); + } + + if (pullViewState != ARCHIVE_ITEM_STATE_PINNED && hiddenCount > 0) { + int usedDy = super.scrollVerticallyBy(measuredDy, recycler, state); + if (pullForegroundDrawable != null) { + pullForegroundDrawable.scrollDy = usedDy; + } + int currentPosition = layoutManager.findFirstVisibleItemPosition(); + View firstView = null; + if (currentPosition == 0) { + firstView = layoutManager.findViewByPosition(currentPosition); + } + if (firstView != null) { + firstView.setTranslationX(0); + } + if (currentPosition == 0 && firstView != null && (firstView.getBottom() - pTop) >= AndroidUtilities.dp(4)) { + if (startArchivePullingTime == 0) { + startArchivePullingTime = System.currentTimeMillis(); + } + if (pullViewState == ARCHIVE_ITEM_STATE_HIDDEN) { + if (pullForegroundDrawable != null) { + pullForegroundDrawable.showHidden(); + } + } + float k = 1f + ((firstView.getTop() - pTop) / (float) firstView.getMeasuredHeight()); + if (k > 1f) { + k = 1f; + } + long pullingTime = System.currentTimeMillis() - startArchivePullingTime; + boolean canShowInternal = k > PullForegroundDrawable.SNAP_HEIGHT && pullingTime > PullForegroundDrawable.minPullingTime + 20; + if (canShowHiddenArchive != canShowInternal) { + canShowHiddenArchive = canShowInternal; + if (pullViewState == ARCHIVE_ITEM_STATE_HIDDEN) { + recyclerListView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + if (pullForegroundDrawable != null) { + pullForegroundDrawable.colorize(canShowInternal); + } + } + } + if (pullViewState == ARCHIVE_ITEM_STATE_HIDDEN && measuredDy - usedDy != 0 && dy < 0 && isDragging) { + float ty; + float tk = (recyclerListView.getViewOffset() / PullForegroundDrawable.getMaxOverscroll()); + tk = 1f - tk; + ty = (recyclerListView.getViewOffset() - dy * PullForegroundDrawable.startPullOverScroll * tk); + recyclerListView.setViewsOffset(ty); + } + if (pullForegroundDrawable != null) { + pullForegroundDrawable.pullProgress = k; + pullForegroundDrawable.setListView(recyclerListView); + } + } else { + startArchivePullingTime = 0; + canShowHiddenArchive = false; + pullViewState = ARCHIVE_ITEM_STATE_HIDDEN; + if (pullForegroundDrawable != null) { + pullForegroundDrawable.resetText(); + pullForegroundDrawable.pullProgress = 0f; + pullForegroundDrawable.setListView(recyclerListView); + } + } + if (firstView != null) { + firstView.invalidate(); + } + return usedDy; + } + return super.scrollVerticallyBy(measuredDy, recycler, state); + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + if (BuildVars.DEBUG_PRIVATE_VERSION) { + try { + super.onLayoutChildren(recycler, state); + } catch (IndexOutOfBoundsException e) { + throw new RuntimeException("Inconsistency detected. "); + } + } else { + try { + super.onLayoutChildren(recycler, state); + } catch (IndexOutOfBoundsException e) { + FileLog.e(e); + AndroidUtilities.runOnUIThread(() -> adapter.notifyDataSetChanged()); + } + } + } + }); + scrollHelper = new RecyclerAnimationScrollHelper(recyclerListView, layoutManager); recyclerListView.setAdapter(adapter); recyclerListView.setClipToPadding(false); recyclerListView.addOnScrollListener(new RecyclerView.OnScrollListener() { @@ -687,7 +1068,12 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } } }); - itemTouchHelper = new ItemTouchHelper(new TouchHelperCallback()); + itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback = new TouchHelperCallback()) { + @Override + protected boolean shouldSwipeBack() { + return hiddenCount > 0; + } + }; itemTouchHelper.attachToRecyclerView(recyclerListView); contentView.addView(recyclerListView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); @@ -756,14 +1142,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } topicsEmptyView.showProgress(loadingTopics, fragmentBeginToShow); topicsEmptyView.title.setText(LocaleController.getString("NoTopics", R.string.NoTopics)); - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("d"); - ColoredImageSpan coloredImageSpan = new ColoredImageSpan(R.drawable.ic_ab_other); - coloredImageSpan.setSize(AndroidUtilities.dp(16)); - spannableStringBuilder.setSpan(coloredImageSpan, 0, 1, 0); - topicsEmptyView.subtitle.setText( - AndroidUtilities.replaceCharSequence("%s", LocaleController.getString("NoTopicsDescription", R.string.NoTopicsDescription), spannableStringBuilder) - ); - + updateTopicsEmptyViewText(); emptyViewContainer.addView(flickerLoadingView); emptyViewContainer.addView(topicsEmptyView); @@ -807,10 +1186,34 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N updateChatInfo(); - - searchContainer = new SearchContainer(context); + fullscreenView = new FrameLayout(context) { + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child == searchTabsView && isInPreviewMode()) { + int y = (int) (searchTabsView.getY() + searchTabsView.getMeasuredHeight()); + getParentLayout().drawHeaderShadow(canvas, (int) (255 * searchAnimationProgress), y); +// if (searchAnimationProgress > 0) { +// if (searchAnimationProgress < 1) { +// int a = Theme.dividerPaint.getAlpha(); +// Theme.dividerPaint.setAlpha((int) (a * searchAnimationProgress)); +// canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); +// Theme.dividerPaint.setAlpha(a); +// } else { +// canvas.drawLine(0, y, getMeasuredWidth(), y, Theme.dividerPaint); +// } +// } + } + return super.drawChild(canvas, child, drawingTime); + } + }; + if (parentDialogsActivity == null) { + contentView.addView(fullscreenView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + } + searchContainer = new MessagesSearchContainer(context); searchContainer.setVisibility(View.GONE); - contentView.addView(searchContainer); + fullscreenView.addView(searchContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL, 0, 44, 0, 0)); + + searchContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); actionBar.setDrawBlurBackground(contentView); @@ -826,20 +1229,23 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N topView.addView(pendingRequestsDelegate.getView(), ViewGroup.LayoutParams.MATCH_PARENT, pendingRequestsDelegate.getViewHeight()); } - fragmentContextView = new FragmentContextView(context, this, false, themeDelegate) { - @Override - public void setTopPadding(float value) { - super.topPadding = value; - updateTopView(); - } - }; - topView.addView(fragmentContextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT)); - + if (!inPreviewMode) { + fragmentContextView = new FragmentContextView(context, this, false, themeDelegate) { + @Override + public void setTopPadding(float value) { + super.topPadding = value; + updateTopView(); + } + }; + topView.addView(fragmentContextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT)); + } FrameLayout.LayoutParams layoutParams = LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT); if (inPreviewMode && Build.VERSION.SDK_INT >= 21) { layoutParams.topMargin = AndroidUtilities.statusBarHeight; } - contentView.addView(actionBar, layoutParams); + if (!isInPreviewMode()) { + contentView.addView(actionBar, layoutParams); + } checkForLoadMore(); @@ -864,12 +1270,48 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N bottomPannelVisible = true; + if (inPreviewMode && AndroidUtilities.isTablet()) { + for (BaseFragment fragment : getParentLayout().getFragmentStack()) { + if (fragment instanceof DialogsActivity && ((DialogsActivity) fragment).isMainDialogList()) { + MessagesStorage.TopicKey topicKey = ((DialogsActivity) fragment).getOpenedDialogId(); + if (topicKey.dialogId == -chatId ) { + selectedTopicForTablet = topicKey.topicId; + break; + } + } + } + updateTopicsList(false, false); + } updateChatInfo(); updateColors(); return fragmentView; } + private void updateTopicsEmptyViewText() { + if (topicsEmptyView == null || topicsEmptyView.subtitle == null) { + return; + } + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("d"); + ColoredImageSpan coloredImageSpan = new ColoredImageSpan(R.drawable.ic_ab_other); + coloredImageSpan.setSize(AndroidUtilities.dp(16)); + spannableStringBuilder.setSpan(coloredImageSpan, 0, 1, 0); + if (ChatObject.canUserDoAdminAction(getCurrentChat(), ChatObject.ACTION_MANAGE_TOPICS)) { + topicsEmptyView.subtitle.setText( + AndroidUtilities.replaceCharSequence("%s", AndroidUtilities.replaceTags(LocaleController.getString("NoTopicsDescription", R.string.NoTopicsDescription)), spannableStringBuilder) + ); + } else { + String general = LocaleController.getString("General", R.string.General); + TLRPC.TL_forumTopic topic = getMessagesController().getTopicsController().findTopic(chatId, 1); + if (topic != null) { + general = topic.title; + } + topicsEmptyView.subtitle.setText( + AndroidUtilities.replaceTags(LocaleController.formatString("NoTopicsDescriptionUser", R.string.NoTopicsDescriptionUser, general)) + ); + } + } + private void updateColors() { if (bottomOverlayProgress == null) { return; @@ -878,16 +1320,24 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY)); bottomOverlayContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); actionBar.setActionModeColor(Theme.getColor(Theme.key_windowBackgroundWhite)); - actionBar.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefault)); + if (!inPreviewMode) { + actionBar.setBackgroundColor(Theme.getColor(Theme.key_actionBarDefault)); + } searchContainer.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); } private void openProfile(boolean byAvatar) { + if (byAvatar) { + TLRPC.Chat chat = getCurrentChat(); + if (chat != null && (chat.photo == null || chat.photo instanceof TLRPC.TL_chatPhotoEmpty)) { + byAvatar = false; + } + } Bundle args = new Bundle(); args.putLong("chat_id", chatId); ProfileActivity fragment = new ProfileActivity(args, avatarContainer.getSharedMediaPreloader()); fragment.setChatInfo(chatFull); - fragment.setPlayProfileAnimation(fragmentView.getMeasuredHeight() > fragmentView.getMeasuredWidth() && byAvatar ? 2 : 1); + fragment.setPlayProfileAnimation(fragmentView.getMeasuredHeight() > fragmentView.getMeasuredWidth() && avatarContainer.getAvatarImageView().getImageReceiver().hasImageLoaded() && byAvatar ? 2 : 1); presentFragment(fragment); } @@ -901,6 +1351,25 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N presentFragment(chatActivity); } + private AvatarDrawable parentAvatarDrawable; + private BackupImageView parentAvatarImageView; + private void openParentSearch() { + if (parentDialogsActivity != null && parentDialogsActivity.getSearchItem() != null) { + if (parentAvatarImageView == null) { + parentAvatarImageView = new BackupImageView(getContext()); + parentAvatarDrawable = new AvatarDrawable(); + parentAvatarImageView.setRoundRadius(AndroidUtilities.dp(16)); + parentAvatarDrawable.setInfo(getCurrentChat()); + parentAvatarImageView.setForUserOrChat(getCurrentChat(), parentAvatarDrawable); + } + parentDialogsActivity.getSearchItem().setSearchPaddingStart(52); + parentDialogsActivity.getActionBar().setSearchAvatarImageView(parentAvatarImageView); + parentDialogsActivity.getActionBar().onSearchFieldVisibilityChanged( + parentDialogsActivity.getSearchItem().toggleSearch(true) + ); + } + } + private void updateTopView() { float translation = 0; if (fragmentContextView != null) { @@ -913,10 +1382,314 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N translation += pendingRequestsDelegate.getViewEnterOffset() + pendingRequestsDelegate.getViewHeight(); } recyclerListView.setTranslationY(Math.max(0, translation)); - - recyclerListView.setPadding(0, AndroidUtilities.dp(100), 0, AndroidUtilities.dp(bottomPannelVisible ? 51 : 0) + (int) translation); + recyclerListView.setPadding(0, 0, 0, AndroidUtilities.dp(bottomPannelVisible ? 51 : 0) + (int) translation); } + float transitionPadding; + public void setTransitionPadding(int transitionPadding) { + this.transitionPadding = transitionPadding; + updateFloatingButtonOffset(); + } + + private class TopicsRecyclerView extends BlurredRecyclerView { + + private boolean firstLayout = true; + private boolean ignoreLayout; + private int listTopPadding; + + Paint paint = new Paint(); + RectF rectF = new RectF(); + + public TopicsRecyclerView(Context context) { + super(context); + useLayoutPositionOnClick = true; + additionalClipBottom = AndroidUtilities.dp(200); + } + + private float viewOffset; + + public void setViewsOffset(float viewOffset) { + this.viewOffset = viewOffset; + int n = getChildCount(); + for (int i = 0; i < n; i++) { + getChildAt(i).setTranslationY(viewOffset); + } + + if (selectorPosition != NO_POSITION) { + View v = getLayoutManager().findViewByPosition(selectorPosition); + if (v != null) { + selectorRect.set(v.getLeft(), (int) (v.getTop() + viewOffset), v.getRight(), (int) (v.getBottom() + viewOffset)); + selectorDrawable.setBounds(selectorRect); + } + } + invalidate(); + } + + public float getViewOffset() { + return viewOffset; + } + + @Override + public void addView(View child, int index, ViewGroup.LayoutParams params) { + super.addView(child, index, params); + child.setTranslationY(viewOffset); + child.setTranslationX(0); + child.setAlpha(1f); + } + + @Override + public void removeView(View view) { + super.removeView(view); + view.setTranslationY(0); + view.setTranslationX(0); + view.setAlpha(1f); + } + + @Override + public void onDraw(Canvas canvas) { + if (pullForegroundDrawable != null && viewOffset != 0) { + int pTop = getPaddingTop(); + if (pTop != 0) { + canvas.save(); + canvas.translate(0, pTop); + } + pullForegroundDrawable.drawOverScroll(canvas); + if (pTop != 0) { + canvas.restore(); + } + } + super.onDraw(canvas); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (generalTopicViewMoving != null) { + canvas.save(); + canvas.translate(generalTopicViewMoving.getLeft(), generalTopicViewMoving.getY()); + generalTopicViewMoving.draw(canvas); + canvas.restore(); + } + super.dispatchDraw(canvas); + if (drawMovingViewsOverlayed()) { + paint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + for (int i = 0; i < getChildCount(); i++) { + View view = getChildAt(i); + + if ((view instanceof DialogCell && ((DialogCell) view).isMoving()) || (view instanceof DialogsAdapter.LastEmptyView && ((DialogsAdapter.LastEmptyView) view).moving)) { + if (view.getAlpha() != 1f) { + rectF.set(view.getX(), view.getY(), view.getX() + view.getMeasuredWidth(), view.getY() + view.getMeasuredHeight()); + canvas.saveLayerAlpha(rectF, (int) (255 * view.getAlpha()), Canvas.ALL_SAVE_FLAG); + } else { + canvas.save(); + } + canvas.translate(view.getX(), view.getY()); + canvas.drawRect(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight(), paint); + view.draw(canvas); + canvas.restore(); + } + } + invalidate(); + } + } + + private boolean drawMovingViewsOverlayed() { + return getItemAnimator() != null && getItemAnimator().isRunning() && (dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0); + } + + @Override + public boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (drawMovingViewsOverlayed() && child instanceof DialogCell && ((DialogCell) child).isMoving() || generalTopicViewMoving == child) { + return true; + } + return super.drawChild(canvas, child, drawingTime); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + @Override + public void setAdapter(RecyclerView.Adapter adapter) { + super.setAdapter(adapter); + firstLayout = true; + } + + private void checkIfAdapterValid() { + RecyclerView.Adapter adapter = getAdapter(); + if (lastItemsCount != adapter.getItemCount() && !forumTopicsListFrozen) { + ignoreLayout = true; + adapter.notifyDataSetChanged(); + ignoreLayout = false; + } + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + if (firstLayout && getMessagesController().dialogsLoaded) { + if (hiddenCount > 0) { + ignoreLayout = true; + LinearLayoutManager layoutManager = (LinearLayoutManager) getLayoutManager(); + layoutManager.scrollToPositionWithOffset(1, (int) actionBar.getTranslationY()); + ignoreLayout = false; + } + firstLayout = false; + } + super.onMeasure(widthSpec, heightSpec); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + if ((dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0) && !itemAnimator.isRunning()) { + onDialogAnimationFinished(); + } + } + + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + + private void setArchiveHidden(boolean shown, DialogCell dialogCell) { + hiddenShown = shown; + if (!hiddenShown) { + if (dialogCell != null) { + disableActionBarScrolling = true; + layoutManager.scrollToPositionWithOffset(1, 0); + updatePullState(); + } + } else { + layoutManager.scrollToPositionWithOffset(0, 0); + updatePullState(); + if (dialogCell != null) { + dialogCell.resetPinnedArchiveState(); + dialogCell.invalidate(); + } + } + if (emptyView != null) { + emptyView.forceLayout(); + } + } + + private void updatePullState() { + pullViewState = !hiddenShown ? ARCHIVE_ITEM_STATE_HIDDEN : ARCHIVE_ITEM_STATE_PINNED; + if (pullForegroundDrawable != null) { + pullForegroundDrawable.setWillDraw(pullViewState != ARCHIVE_ITEM_STATE_PINNED); + } + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + if (fastScrollAnimationRunning || waitingForScrollFinished || dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0 || (getParentLayout() != null && getParentLayout().isInPreviewMode())) { + return false; + } + int action = e.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + setOverScrollMode(View.OVER_SCROLL_ALWAYS); + } + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + if (!itemTouchHelper.isIdle() && itemTouchHelperCallback.swipingFolder) { + itemTouchHelperCallback.swipeFolderBack = true; + if (itemTouchHelper.checkHorizontalSwipe(null, ItemTouchHelper.LEFT) != 0) { + if (itemTouchHelperCallback.currentItemViewHolder != null) { + ViewHolder viewHolder = itemTouchHelperCallback.currentItemViewHolder; + if (viewHolder.itemView instanceof DialogCell) { + setArchiveHidden(!hiddenShown, (DialogCell) viewHolder.itemView); + } + } + } + } + } + boolean result = super.onTouchEvent(e); + if ((action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) && pullViewState == ARCHIVE_ITEM_STATE_HIDDEN && hiddenCount > 0) { + LinearLayoutManager layoutManager = (LinearLayoutManager) getLayoutManager(); + int currentPosition = layoutManager.findFirstVisibleItemPosition(); + if (currentPosition == 0) { + int pTop = getPaddingTop(); + View view = layoutManager.findViewByPosition(currentPosition); + int height = (int) (AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72) * PullForegroundDrawable.SNAP_HEIGHT); + int diff = (view.getTop() - pTop) + view.getMeasuredHeight(); + if (view != null) { + long pullingTime = System.currentTimeMillis() - startArchivePullingTime; + if (diff < height || pullingTime < PullForegroundDrawable.minPullingTime) { + disableActionBarScrolling = true; + smoothScrollBy(0, diff, CubicBezierInterpolator.EASE_OUT_QUINT); + pullViewState = ARCHIVE_ITEM_STATE_HIDDEN; + } else { + if (pullViewState != ARCHIVE_ITEM_STATE_SHOWED) { + if (getViewOffset() == 0) { + disableActionBarScrolling = true; + smoothScrollBy(0, (view.getTop() - pTop), CubicBezierInterpolator.EASE_OUT_QUINT); + } + if (!canShowHiddenArchive) { + canShowHiddenArchive = true; + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + if (pullForegroundDrawable != null) { + pullForegroundDrawable.colorize(true); + } + } + ((DialogCell) view).startOutAnimation(); + pullViewState = ARCHIVE_ITEM_STATE_SHOWED; + } + } + + if (getViewOffset() != 0) { + ValueAnimator valueAnimator = ValueAnimator.ofFloat(getViewOffset(), 0f); + valueAnimator.addUpdateListener(animation -> setViewsOffset((float) animation.getAnimatedValue())); + + valueAnimator.setDuration(Math.max(100, (long) (350f - 120f * (getViewOffset() / PullForegroundDrawable.getMaxOverscroll())))); + valueAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + setScrollEnabled(false); + valueAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + setScrollEnabled(true); + } + }); + valueAnimator.start(); + } + } + } + } + return result; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent e) { + if (fastScrollAnimationRunning || waitingForScrollFinished || dialogRemoveFinished != 0 || dialogInsertFinished != 0 || dialogChangeFinished != 0 || (getParentLayout() != null && getParentLayout().isInPreviewMode())) { + return false; + } + if (e.getAction() == MotionEvent.ACTION_DOWN) { + allowSwipeDuringCurrentTouch = !actionBar.isActionModeShowed(); + checkIfAdapterValid(); + } + return super.onInterceptTouchEvent(e); + } + + @Override + protected boolean allowSelectChildAtPosition(View child) { + if (child instanceof HeaderCell && !child.isClickable()) { + return false; + } + return true; + } + } + + private void onDialogAnimationFinished() { + dialogRemoveFinished = 0; + dialogInsertFinished = 0; + dialogChangeFinished = 0; + AndroidUtilities.runOnUIThread(() -> { +// setDialogsListFrozen(false); +// updateDialogIndices(); + }); + } private void deleteTopics(HashSet selectedTopics, Runnable runnable) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); @@ -959,7 +1732,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } } - private boolean showChatPreview(TopicDialogCell cell) { + private boolean showChatPreview(DialogCell cell) { cell.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); final ActionBarPopupWindow.ActionBarPopupWindowLayout[] previewMenu = new ActionBarPopupWindow.ActionBarPopupWindowLayout[1]; int flags = ActionBarPopupWindow.ActionBarPopupWindowLayout.FLAG_USE_SWIPEBACK; @@ -1110,7 +1883,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private void checkLoading() { loadingTopics = topicsController.isLoading(chatId); - if (topicsEmptyView != null && forumTopics.size() == 0) { + if (topicsEmptyView != null/* && forumTopics.size() == 0*/) { topicsEmptyView.showProgress(loadingTopics, fragmentBeginToShow); } if (recyclerListView != null) { @@ -1122,6 +1895,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N ValueAnimator searchAnimator; ValueAnimator searchAnimator2; boolean animateSearchWithScale; + private ViewPagerFixed.TabsView searchTabsView; private void animateToSearchView(boolean showSearch) { searching = showSearch; @@ -1129,14 +1903,24 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N searchAnimator.removeAllListeners(); searchAnimator.cancel(); } + if (searchTabsView == null) { + searchTabsView = searchContainer.createTabsView(); + if (parentDialogsActivity != null) { + searchTabsView.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + } + fullscreenView.addView(searchTabsView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 44)); + } searchAnimator = ValueAnimator.ofFloat(searchAnimationProgress, showSearch ? 1f : 0); AndroidUtilities.updateViewVisibilityAnimated(searchContainer, false, 1f, true); + if (parentDialogsActivity != null && parentDialogsActivity.rightSlidingDialogContainer != null) { + parentDialogsActivity.rightSlidingDialogContainer.enabled = !showSearch; + } animateSearchWithScale = !showSearch && searchContainer.getVisibility() == View.VISIBLE && searchContainer.getAlpha() == 1f; searchAnimator.addUpdateListener(animation -> updateSearchProgress((Float) animation.getAnimatedValue())); + searchContainer.setVisibility(View.VISIBLE); if (!showSearch) { other.setVisibility(View.VISIBLE); } else { - searchContainer.setVisibility(View.VISIBLE); AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); updateCreateTopicButton(false); } @@ -1174,10 +1958,36 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private void updateSearchProgress(float value) { searchAnimationProgress = value; + int color1 = Theme.getColor(Theme.key_actionBarDefaultIcon); + actionBar.setItemsColor(ColorUtils.blendARGB(color1, Theme.getColor(Theme.key_actionBarActionModeDefaultIcon), searchAnimationProgress), false); + actionBar.setItemsColor(ColorUtils.blendARGB(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon), Theme.getColor(Theme.key_actionBarActionModeDefaultIcon), searchAnimationProgress), true); + color1 = Theme.getColor(Theme.key_actionBarDefaultSelector); + int color2 = Theme.getColor(Theme.key_actionBarActionModeDefaultSelector); + actionBar.setItemsBackgroundColor(ColorUtils.blendARGB(color1, color2, searchAnimationProgress), false); + + if (!inPreviewMode) { + actionBar.setBackgroundColor(ColorUtils.blendARGB(Theme.getColor(Theme.key_actionBarDefault), Theme.getColor(Theme.key_windowBackgroundWhite), searchAnimationProgress)); + } avatarContainer.getTitleTextView().setAlpha(1f - value); avatarContainer.getSubtitleTextView().setAlpha(1f - value); + if (searchTabsView != null) { + searchTabsView.setTranslationY(-AndroidUtilities.dp(16) * (1f - value)); + searchTabsView.setAlpha(value); + } + searchContainer.setTranslationY(-AndroidUtilities.dp(16) * (1f - value)); + searchContainer.setAlpha(value); + if (isInPreviewMode()) { + fullscreenView.invalidate(); + + if (parentDialogsActivity != null) { + + } + } + contentView.invalidate(); + + recyclerListView.setAlpha(1f - value); if (animateSearchWithScale) { float scale = 0.98f + 0.02f * (1f - searchAnimationProgress); recyclerListView.setScaleX(scale); @@ -1236,7 +2046,11 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N if (selectedTopics.size() > 0) { chekActionMode(); + if (inPreviewMode) { + ((View) fragmentView.getParent()).invalidate(); + } actionBar.showActionMode(true); + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needCheckSystemBarColors); Iterator iterator = selectedTopics.iterator(); int unreadCount = 0, readCount = 0; int canPinCount = 0, canUnpinCount = 0; @@ -1250,7 +2064,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } else { readCount++; } - if (ChatObject.canManageTopics(currentChat)) { + if (ChatObject.canManageTopics(currentChat) && !topic.hidden) { if (topic.pinned) { canUnpinCount++; } else { @@ -1293,6 +2107,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N int canDeleteCount = 0; int closedTopicsCount = 0; int openTopicsCount = 0; + int canHideCount = 0; + int canShowCount = 0; Iterator iterator = selectedTopics.iterator(); while (iterator.hasNext()) { int topicId = iterator.next(); @@ -1302,10 +2118,19 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N canDeleteCount++; } if (ChatObject.canManageTopic(currentAccount, currentChat, topic)) { - if (topic.closed) { - closedTopicsCount++; - } else { - openTopicsCount++; + if (topic.id == 1) { + if (topic.hidden) { + canShowCount++; + } else { + canHideCount++; + } + } + if (!topic.hidden) { + if (topic.closed) { + closedTopicsCount++; + } else { + openTopicsCount++; + } } } } @@ -1315,6 +2140,8 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N restartTopic.setVisibility(openTopicsCount == 0 && closedTopicsCount > 0 ? View.VISIBLE : View.GONE); restartTopic.setText(closedTopicsCount > 1 ? LocaleController.getString("RestartTopics", R.string.RestartTopics) : LocaleController.getString("RestartTopic", R.string.RestartTopic)); deleteItem.setVisibility(canDeleteCount == selectedTopics.size() ? View.VISIBLE : View.GONE); + hideItem.setVisibility(canHideCount == 1 && selectedTopics.size() == 1 ? View.VISIBLE : View.GONE); + showItem.setVisibility(canShowCount == 1 && selectedTopics.size() == 1 ? View.VISIBLE : View.GONE); otherItem.checkHideMenuItem(); @@ -1349,6 +2176,10 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } final ActionBarMenu actionMode = actionBar.createActionMode(false, null); + if (inPreviewMode) { + actionMode.setBackgroundColor(Color.TRANSPARENT); + actionMode.drawBlur = false; + } selectedDialogsCountTextView = new NumberTextView(actionMode.getContext()); selectedDialogsCountTextView.setTextSize(18); selectedDialogsCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); @@ -1360,6 +2191,10 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N unpinItem = actionMode.addItemWithWidth(unpin_id, R.drawable.msg_unpin, AndroidUtilities.dp(54)); muteItem = actionMode.addItemWithWidth(mute_id, R.drawable.msg_mute, AndroidUtilities.dp(54)); deleteItem = actionMode.addItemWithWidth(delete_id, R.drawable.msg_delete, AndroidUtilities.dp(54), LocaleController.getString("Delete", R.string.Delete)); + hideItem = actionMode.addItemWithWidth(hide_id, R.drawable.msg_archive_hide, AndroidUtilities.dp(54), LocaleController.getString("Hide", R.string.Hide)); + hideItem.setVisibility(View.GONE); + showItem = actionMode.addItemWithWidth(show_id, R.drawable.msg_archive_show, AndroidUtilities.dp(54), LocaleController.getString("Show", R.string.Show)); + showItem.setVisibility(View.GONE); otherItem = actionMode.addItemWithWidth(0, R.drawable.ic_ab_other, AndroidUtilities.dp(54), LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); readItem = otherItem.addSubItem(read_id, R.drawable.msg_markread, LocaleController.getString("MarkAsRead", R.string.MarkAsRead)); @@ -1367,8 +2202,25 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N restartTopic = otherItem.addSubItem(restart_topic_id, R.drawable.msg_topic_restart, LocaleController.getString("RestartTopic", R.string.RestartTopic)); } + private DialogCell slidingView; + private DialogCell movingView; + private boolean allowMoving; + private boolean movingWas; + private ArrayList movingDialogFilters = new ArrayList<>(); + private boolean waitingForScrollFinished; + private boolean allowSwipeDuringCurrentTouch; + private boolean updatePullAfterScroll; + private int dialogRemoveFinished; + private int dialogInsertFinished; + private int dialogChangeFinished; + private View generalTopicViewMoving; + public class TouchHelperCallback extends ItemTouchHelper.Callback { + private RecyclerView.ViewHolder currentItemViewHolder; + private boolean swipingFolder; + private boolean swipeFolderBack; + @Override public boolean isLongPressDragEnabled() { return !selectedTopics.isEmpty(); @@ -1377,7 +2229,18 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int position = viewHolder.getAdapterPosition(); - if (position < 0 || position >= forumTopics.size() || forumTopics.get(position).topic == null || !forumTopics.get(position).topic.pinned) { + if (position < 0 || position >= forumTopics.size() || forumTopics.get(position).topic == null || !ChatObject.canManageTopics(getCurrentChat())) { + return makeMovementFlags(0, 0); + } + TLRPC.TL_forumTopic topic = forumTopics.get(position).topic; + if (selectedTopics.isEmpty() && viewHolder.itemView instanceof TopicDialogCell && topic.id == 1) { + TopicDialogCell dialogCell = (TopicDialogCell) viewHolder.itemView; + swipeFolderBack = false; + swipingFolder = true; + dialogCell.setSliding(true); + return makeMovementFlags(0, ItemTouchHelper.LEFT); + } + if (!topic.pinned) { return makeMovementFlags(0, 0); } return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0); @@ -1414,6 +2277,18 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + if (viewHolder != null) { + TopicDialogCell dialogCell = (TopicDialogCell) viewHolder.itemView; + if (dialogCell.forumTopic != null) { + getMessagesController().getTopicsController().toggleShowTopic(chatId, dialogCell.forumTopic.id, dialogCell.forumTopic.hidden); + } + generalTopicViewMoving = dialogCell; + recyclerListView.setArchiveHidden(!dialogCell.forumTopic.hidden, dialogCell); + updateTopicsList(true, true); + if (dialogCell.currentTopic != null) { + dialogCell.setTopicIcon(dialogCell.currentTopic); + } + } } @Override @@ -1428,7 +2303,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } private void updateChatInfo(boolean forceAnimate) { - if (fragmentView == null) { + if (fragmentView == null || avatarContainer == null) { return; } TLRPC.Chat chatLocal = getMessagesController().getChat(chatId); @@ -1556,11 +2431,6 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N avatarContainer.setSubtitle(newSubtitle); } - @Override - protected ActionBar createActionBar(Context context) { - return super.createActionBar(context); - } - private static HashSet settingsPreloaded = new HashSet<>(); @Override @@ -1574,6 +2444,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.notificationsSettingsUpdated); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.chatSwithcedToForum); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.closeChats); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.openedChatChanged); updateTopicsList(false, false); SelectAnimatedEmojiDialog.preload(currentAccount); @@ -1612,14 +2483,20 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.notificationsSettingsUpdated); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.chatSwithcedToForum); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.closeChats); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.openedChatChanged); TLRPC.Chat chatLocal = getMessagesController().getChat(chatId); if (ChatObject.isChannel(chatLocal)) { getMessagesController().startShortPoll(chatLocal, classGuid, true); } super.onFragmentDestroy(); - } + if (parentDialogsActivity != null && parentDialogsActivity.rightSlidingDialogContainer != null) { + parentDialogsActivity.getActionBar().setSearchAvatarImageView(null); + parentDialogsActivity.getSearchItem().setSearchPaddingStart(0); + parentDialogsActivity.rightSlidingDialogContainer.enabled = true; + } + } private void updateTopicsList(boolean animated, boolean enalbeEnterAnimation) { if (!animated && updateAnimated) { @@ -1638,9 +2515,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } forumTopics.add(new Item(VIEW_TYPE_TOPIC, topics.get(i))); } - if (forumTopics.size() == 1 && forumTopics.get(0).topic.id == 1) { - forumTopics.clear(); - } else if (!forumTopics.isEmpty() && !topicsController.endIsReached(chatId) && canShowProgress) { + if (!forumTopics.isEmpty() && !topicsController.endIsReached(chatId) && canShowProgress) { forumTopics.add(new Item(VIEW_TYPE_LOADING_CELL, null)); } @@ -1650,6 +2525,14 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N animated = false; } + hiddenCount = 0; + for (int i = 0; i < forumTopics.size(); ++i) { + Item item = forumTopics.get(i); + if (item != null && item.topic != null && item.topic.hidden) { + hiddenCount++; + } + } + if (recyclerListView != null && recyclerListView.getItemAnimator() != (animated ? itemAnimator : null)) { recyclerListView.setItemAnimator(animated ? itemAnimator : null); } @@ -1665,6 +2548,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } checkLoading(); + updateTopicsEmptyViewText(); } @Override @@ -1719,6 +2603,24 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } else if (id == NotificationCenter.closeChats) { removeSelfFromStack(); + } if (id == NotificationCenter.openedChatChanged) { + if (getParentActivity() == null || !(inPreviewMode && AndroidUtilities.isTablet())) { + return; + } + boolean close = (Boolean) args[2]; + long dialog_id = (Long) args[0]; + int topicId = (int) args[1]; + if (dialog_id == -chatId && !close) { + if (selectedTopicForTablet != topicId) { + selectedTopicForTablet = topicId; + updateTopicsList(false, false); + } + } else { + if (selectedTopicForTablet != 0) { + selectedTopicForTablet = 0; + updateTopicsList(false, false); + } + } } } @@ -1760,15 +2662,60 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N @Override public int getItemViewType(int position) { + if (position == getItemCount() - 1) { + return VIEW_TYPE_EMPTY; + } return forumTopics.get(position).viewType; } + public ArrayList getArray() { + return (forumTopicsListFrozen ? frozenForumTopicsList : forumTopics); + } + @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_TOPIC) { TopicDialogCell dialogCell = new TopicDialogCell(null, parent.getContext(), true, false); + dialogCell.inPreviewMode = inPreviewMode; + dialogCell.setArchivedPullAnimation(pullForegroundDrawable); return new RecyclerListView.Holder(dialogCell); + } else if (viewType == VIEW_TYPE_EMPTY) { + return new RecyclerListView.Holder(emptyView = new View(getContext()) { + HashMap precalcEllipsized = new HashMap<>(); + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int hiddenCount = 0; + int childrenHeight = 0, generalHeight = AndroidUtilities.dp(64); + for (int i = 0; i < getArray().size(); ++i) { + if (getArray().get(i) == null || getArray().get(i).topic == null) { + continue; + } + String title = getArray().get(i).topic.title; + Boolean oneline = precalcEllipsized.get(title); + if (oneline == null) { + int nameLeft = AndroidUtilities.dp(!LocaleController.isRTL ? (isInPreviewMode() ? 11 : 50) + 4 : 18); + int nameWidth = !LocaleController.isRTL ? + width - nameLeft - AndroidUtilities.dp(14 + 8) : + width - nameLeft - AndroidUtilities.dp((isInPreviewMode() ? 11 : 50) + 5 + 8); + nameWidth -= (int) Math.ceil(Theme.dialogs_timePaint.measureText("00:00")); + oneline = Theme.dialogs_namePaint[0].measureText(title) <= nameWidth; + precalcEllipsized.put(title, oneline); + } + int childHeight = AndroidUtilities.dp(64 + (!oneline ? 20 : 0)); + if (getArray().get(i).topic.id == 1) { + generalHeight = childHeight; + } + if (getArray().get(i).topic.hidden) { + hiddenCount++; + } + childrenHeight += childHeight; + } + int height = Math.max(0, hiddenCount > 0 ? recyclerListView.getMeasuredHeight() - recyclerListView.getPaddingTop() - recyclerListView.getPaddingBottom() - childrenHeight + generalHeight : 0); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + } + }); } else { FlickerLoadingView flickerLoadingView = new FlickerLoadingView(parent.getContext()); flickerLoadingView.setViewType(FlickerLoadingView.TOPIC_CELL_TYPE); @@ -1781,10 +2728,10 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder.getItemViewType() == VIEW_TYPE_TOPIC) { - TLRPC.TL_forumTopic topic = forumTopics.get(position).topic; + TLRPC.TL_forumTopic topic = getArray().get(position).topic; TLRPC.TL_forumTopic nextTopic = null; - if (position + 1 < forumTopics.size()) { - nextTopic = forumTopics.get(position + 1).topic; + if (position + 1 < getArray().size()) { + nextTopic = getArray().get(position + 1).topic; } TopicDialogCell dialogCell = (TopicDialogCell) holder.itemView; @@ -1794,24 +2741,24 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N boolean animated = oldId == newId && dialogCell.position == position && animatedUpdateEnabled; if (tlMessage != null) { MessageObject messageObject = new MessageObject(currentAccount, tlMessage, false, false); - - dialogCell.setForumTopic(topic, -chatId, messageObject, animated); - dialogCell.drawDivider = position != forumTopics.size() - 1; + dialogCell.setForumTopic(topic, -chatId, messageObject, isInPreviewMode(), animated); + dialogCell.drawDivider = position != forumTopics.size() - 1 || recyclerListView.emptyViewIsVisible(); dialogCell.fullSeparator = topic.pinned && (nextTopic == null || !nextTopic.pinned); - dialogCell.setPinForced(topic.pinned); + dialogCell.setPinForced(topic.pinned && !topic.hidden); dialogCell.position = position; } dialogCell.setTopicIcon(topic); dialogCell.setChecked(selectedTopics.contains(newId), animated); + dialogCell.setDialogSelected(selectedTopicForTablet == newId); dialogCell.onReorderStateChanged(reordering, true); } } @Override public int getItemCount() { - return forumTopics.size(); + return getArray().size() + 1; } @Override @@ -1820,15 +2767,25 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } public void swapElements(int from, int to) { + if (forumTopicsListFrozen) { + return; + } + forumTopics.add(to, forumTopics.remove(from)); if (recyclerListView.getItemAnimator() != itemAnimator) { recyclerListView.setItemAnimator(itemAnimator); } notifyItemMoved(from, to); } + + @Override + public void notifyDataSetChanged() { + lastItemsCount = getItemCount(); + super.notifyDataSetChanged(); + } } - private class TopicDialogCell extends DialogCell { + public class TopicDialogCell extends DialogCell { public boolean drawDivider; public int position = -1; @@ -1836,7 +2793,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N public TopicDialogCell(DialogsActivity fragment, Context context, boolean needCheck, boolean forceThreeLines) { super(fragment, context, needCheck, forceThreeLines); drawAvatar = false; - messagePaddingStart = 50; + messagePaddingStart = isInPreviewMode() ? 11 : 50; chekBoxPaddingTop = 24; heightDefault = 64; heightThreeLines = 76; @@ -1847,24 +2804,28 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N private AnimatedEmojiDrawable animatedEmojiDrawable; private Drawable forumIcon; boolean attached; + private boolean isGeneral; private boolean closed; @Override protected void onDraw(Canvas canvas) { + xOffset = inPreviewMode && checkBox != null ? checkBox.getProgress() * AndroidUtilities.dp(30) : 0; canvas.save(); + canvas.translate(xOffset, translateY = -AndroidUtilities.dp(4)); canvas.drawColor(getThemedColor(Theme.key_windowBackgroundWhite)); - canvas.translate(0, translateY = -AndroidUtilities.dp(4)); super.onDraw(canvas); canvas.restore(); + canvas.save(); + canvas.translate(super.translationX, 0); if (drawDivider) { int left = fullSeparator ? 0 : AndroidUtilities.dp(messagePaddingStart); if (LocaleController.isRTL) { - canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - left, getMeasuredHeight() - 1, Theme.dividerPaint); + canvas.drawLine(0 - super.translationX, getMeasuredHeight() - 1, getMeasuredWidth() - left, getMeasuredHeight() - 1, Theme.dividerPaint); } else { - canvas.drawLine(left, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint); + canvas.drawLine(left - super.translationX, getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, Theme.dividerPaint); } } - if (animatedEmojiDrawable != null || forumIcon != null) { + if ((!isGeneral || archivedChatsDrawable == null || archivedChatsDrawable.outProgress != 0.0f) && (animatedEmojiDrawable != null || forumIcon != null)) { int padding = AndroidUtilities.dp(10); int paddingTop = AndroidUtilities.dp(10); int size = AndroidUtilities.dp(28); @@ -1884,6 +2845,13 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N forumIcon.draw(canvas); } } + canvas.restore(); + } + + @Override + public void buildLayout() { + super.buildLayout(); + setHiddenT(); } @Override @@ -1893,7 +2861,6 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N if (animatedEmojiDrawable != null) { animatedEmojiDrawable.addView(this); } - } @Override @@ -1903,7 +2870,6 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N if (animatedEmojiDrawable != null) { animatedEmojiDrawable.removeView(this); } - } public void setAnimatedEmojiDrawable(AnimatedEmojiDrawable animatedEmojiDrawable) { @@ -1926,7 +2892,36 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N public void setTopicIcon(TLRPC.TL_forumTopic topic) { currentTopic = topic; closed = topic != null && topic.closed; - if (topic != null && topic.icon_emoji_id != 0) { + if (inPreviewMode) { + updateHidden(topic != null && topic.hidden, true); + } + isGeneral = topic != null && topic.id == 1; + if (topic != null && this != generalTopicViewMoving) { + if (topic.hidden) { + overrideSwipeAction = true; + overrideSwipeActionBackgroundColorKey = Theme.key_chats_archivePinBackground; + overrideSwipeActionRevealBackgroundColorKey = Theme.key_chats_archiveBackground; + overrideSwipeActionStringKey = "Unhide"; + overrideSwipeActionStringId = R.string.Unhide; + overrideSwipeActionDrawable = Theme.dialogs_unpinArchiveDrawable; + } else { + overrideSwipeAction = true; + overrideSwipeActionBackgroundColorKey = Theme.key_chats_archiveBackground; + overrideSwipeActionRevealBackgroundColorKey = Theme.key_chats_archivePinBackground; + overrideSwipeActionStringKey = "Hide"; + overrideSwipeActionStringId = R.string.Hide; + overrideSwipeActionDrawable = Theme.dialogs_pinArchiveDrawable; + } + invalidate(); + } + + if (inPreviewMode) { + return; + } + if (topic != null && topic.id == 1) { + setAnimatedEmojiDrawable(null); + setForumIcon(ForumUtilities.createGeneralTopicDrawable(getContext(), 1f, getThemedColor(Theme.key_chat_inMenu))); + } else if (topic != null && topic.icon_emoji_id != 0) { setForumIcon(null); if (animatedEmojiDrawable == null || animatedEmojiDrawable.getDocumentId() != topic.icon_emoji_id) { setAnimatedEmojiDrawable(new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_FORUM_TOPIC, currentAccount, topic.icon_emoji_id)); @@ -1935,9 +2930,52 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N setAnimatedEmojiDrawable(null); setForumIcon(ForumUtilities.createTopicDrawable(topic)); } + updateHidden(topic != null && topic.hidden, true); + buildLayout(); } + private Boolean hidden; + private float hiddenT; + private ValueAnimator hiddenAnimator; + private void updateHidden(boolean hidden, boolean animated) { + if (this.hidden == null) { + animated = false; + } + + if (hiddenAnimator != null) { + hiddenAnimator.cancel(); + hiddenAnimator = null; + } + + this.hidden = hidden; + if (animated) { + hiddenAnimator = ValueAnimator.ofFloat(hiddenT, hidden ? 1f : 0f); + hiddenAnimator.addUpdateListener(anm -> { + hiddenT = (float) anm.getAnimatedValue(); + setHiddenT(); + }); + hiddenAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT); + hiddenAnimator.start(); + } else { + hiddenT = hidden ? 1f : 0f; + setHiddenT(); + } + } + private void setHiddenT() { + if (forumIcon instanceof ForumUtilities.GeneralTopicDrawable) { + ((ForumUtilities.GeneralTopicDrawable) forumIcon).setColor( + ColorUtils.blendARGB(getThemedColor(Theme.key_chats_archivePullDownBackground), getThemedColor(Theme.key_avatar_background2Saved), hiddenT) + ); + } + if (topicIconInName != null && topicIconInName[0] instanceof ForumUtilities.GeneralTopicDrawable) { + ((ForumUtilities.GeneralTopicDrawable) topicIconInName[0]).setColor( + ColorUtils.blendARGB(getThemedColor(Theme.key_chats_archivePullDownBackground), getThemedColor(Theme.key_avatar_background2Saved), hiddenT) + ); + } + invalidate(); + } + @Override protected boolean drawLock2() { return closed; @@ -1955,7 +2993,6 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N ValueAnimator valueAnimator = ValueAnimator.ofFloat(floatingButtonHideProgress, floatingHidden ? 1f : 0f); valueAnimator.addUpdateListener(animation -> { floatingButtonHideProgress = (float) animation.getAnimatedValue(); - floatingButtonTranslation = AndroidUtilities.dp(100) * floatingButtonHideProgress; updateFloatingButtonOffset(); }); animatorSet.playTogether(valueAnimator); @@ -1964,13 +3001,14 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N animatorSet.start(); } else { floatingButtonHideProgress = floatingHidden ? 1f : 0f; - floatingButtonTranslation = AndroidUtilities.dp(100) * floatingButtonHideProgress; + updateFloatingButtonOffset(); } floatingButtonContainer.setClickable(!hide); } private void updateFloatingButtonOffset() { + floatingButtonTranslation = AndroidUtilities.dp(100) * floatingButtonHideProgress - transitionPadding; floatingButtonContainer.setTranslationY(floatingButtonTranslation); } @@ -1996,13 +3034,13 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N } else { spannableStringBuilder = new SpannableStringBuilder(LocaleController.getString("TapToCreateTopicHint", R.string.TapToCreateTopicHint)); spannableStringBuilder.append(" "); - spannableStringBuilder.setSpan(new ColoredImageSpan(R.drawable.attach_arrow_right), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), 0); + spannableStringBuilder.setSpan(new ColoredImageSpan(R.drawable.arrow_newchat), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), 0); } textView.setText(spannableStringBuilder); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView.setLayerType(LAYER_TYPE_HARDWARE, null); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, getResourceProvider())); - addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 86, 0, 86, 32)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, LocaleController.isRTL ? 72 : 32, 0, LocaleController.isRTL ? 32 : 72, 32)); } float progress; @@ -2031,15 +3069,16 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N @Override public boolean isLightStatusBar() { - if (searchingNotEmpty) { - int color = Theme.getColor(Theme.key_windowBackgroundWhite); - return ColorUtils.calculateLuminance(color) > 0.7f; - } else { - return super.isLightStatusBar(); + int color = searching ? Theme.getColor(Theme.key_windowBackgroundWhite) : Theme.getColor(Theme.key_actionBarDefault); + if (actionBar.isActionModeShowed()) { + color = Theme.getColor(Theme.key_actionBarActionModeDefault); } + return ColorUtils.calculateLuminance(color) > 0.7f; } - private class SearchContainer extends FrameLayout { + private class MessagesSearchContainer extends ViewPagerFixed implements FilteredSearchView.UiCallback { + + FrameLayout searchContainer; RecyclerListView recyclerView; LinearLayoutManager layoutManager; @@ -2067,9 +3106,35 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N StickerEmptyView emptyView; RecyclerItemsEnterAnimator itemsEnterAnimator; boolean messagesIsLoading; + private int keyboardSize; + private ViewPagerAdapter viewPagerAdapter; + SearchViewPager.ChatPreviewDelegate chatPreviewDelegate; - public SearchContainer(@NonNull Context context) { + public MessagesSearchContainer(@NonNull Context context) { super(context); + + searchContainer = new FrameLayout(context); + chatPreviewDelegate = new SearchViewPager.ChatPreviewDelegate() { + @Override + public void startChatPreview(RecyclerListView listView, DialogCell cell) { + showChatPreview(cell); + } + + @Override + public void move(float dy) { + if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) { + movePreviewFragment(dy); + } + } + + @Override + public void finish() { + if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) { + finishPreviewFragment(); + } + } + }; + recyclerView = new RecyclerListView(context); recyclerView.setAdapter(searchAdapter = new SearchAdapter()); recyclerView.setLayoutManager(layoutManager = new LinearLayoutManager(context)); @@ -2113,25 +3178,203 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N recyclerView.setEmptyView(emptyView); recyclerView.setAnimateEmptyView(true, RecyclerListView.EMPTY_VIEW_ANIMATION_TYPE_ALPHA); - addView(emptyView); - addView(recyclerView); + searchContainer.addView(emptyView); + searchContainer.addView(recyclerView); updateRows(); itemsEnterAnimator = new RecyclerItemsEnterAnimator(recyclerView, true); recyclerView.setItemsEnterAnimator(itemsEnterAnimator); + + setAdapter(viewPagerAdapter = new ViewPagerAdapter()); } - public void setSearchString(String searchString) { - if (this.searchString.equals(searchString)) { - return; + class Item { + private final int type; + int filterIndex; + + private Item(int type) { + this.type = type; } - this.searchString = searchString; + } + + private class ViewPagerAdapter extends ViewPagerFixed.Adapter { + + ArrayList items = new ArrayList<>(); + + public ViewPagerAdapter() { + items.add(new Item(DIALOGS_TYPE)); + Item item = new Item(FILTER_TYPE); + item.filterIndex = 0; + items.add(item); +// items.add(new Item(DOWNLOADS_TYPE)); + item = new Item(FILTER_TYPE); + item.filterIndex = 1; + items.add(item); + item = new Item(FILTER_TYPE); + item.filterIndex = 2; + items.add(item); + item = new Item(FILTER_TYPE); + item.filterIndex = 3; + items.add(item); + item = new Item(FILTER_TYPE); + item.filterIndex = 4; + items.add(item); + } + + private final static int DIALOGS_TYPE = 0; + private final static int DOWNLOADS_TYPE = 1; + private final static int FILTER_TYPE = 2; + + @Override + public int getItemCount() { + return items.size(); + } + + @Override + public View createView(int viewType) { + if (viewType == 1) { + return searchContainer; + } else if (viewType == 2) { + SearchDownloadsContainer downloadsContainer = new SearchDownloadsContainer(TopicsFragment.this, currentAccount); + downloadsContainer.recyclerListView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); +// fragmentView.invalidateBlur(); + } + }); + downloadsContainer.setUiCallback(MessagesSearchContainer.this); + return downloadsContainer; + } else { + FilteredSearchView filteredSearchView = new FilteredSearchView(TopicsFragment.this); + filteredSearchView.setChatPreviewDelegate(chatPreviewDelegate); + filteredSearchView.setUiCallback(MessagesSearchContainer.this); + filteredSearchView.recyclerListView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); +// fragmentView.invalidateBlur(); + } + }); + return filteredSearchView; + } + } + + @Override + public String getItemTitle(int position) { + if (items.get(position).type == DIALOGS_TYPE) { + return LocaleController.getString("SearchMessages", R.string.SearchMessages); + } else if (items.get(position).type == DOWNLOADS_TYPE) { + return LocaleController.getString("DownloadsTabs", R.string.DownloadsTabs); + } else { + return FiltersView.filters[items.get(position).filterIndex].title; + } + } + + @Override + public int getItemViewType(int position) { + if (items.get(position).type == DIALOGS_TYPE) { + return 1; + } + if (items.get(position).type == DOWNLOADS_TYPE) { + return 2; + } + return items.get(position).type + position; + } + + @Override + public void bindView(View view, int position, int viewType) { + search(view, position, searchString, true); + } + } + + @Override + public void goToMessage(MessageObject messageObject) { + Bundle args = new Bundle(); + long dialogId = messageObject.getDialogId(); + if (DialogObject.isEncryptedDialog(dialogId)) { + args.putInt("enc_id", DialogObject.getEncryptedChatId(dialogId)); + } else if (DialogObject.isUserDialog(dialogId)) { + args.putLong("user_id", dialogId); + } else { + TLRPC.Chat chat = AccountInstance.getInstance(currentAccount).getMessagesController().getChat(-dialogId); + if (chat != null && chat.migrated_to != null) { + args.putLong("migrated_to", dialogId); + dialogId = -chat.migrated_to.channel_id; + } + args.putLong("chat_id", -dialogId); + } + args.putInt("message_id", messageObject.getId()); + TopicsFragment.this.presentFragment(new ChatActivity(args)); +// showActionMode(false); + } + + private ArrayList selectedItems = new ArrayList<>(); + + @Override + public boolean actionModeShowing() { + return actionBar.isActionModeShowed(); + } + + @Override + public void toggleItemSelection(MessageObject item, View view, int a) { + if (!selectedItems.remove(item)) { + selectedItems.add(item); + } + if (selectedItems.isEmpty()) { + actionBar.hideActionMode(); + } + } + + @Override + public boolean isSelected(FilteredSearchView.MessageHashId messageHashId) { + if (messageHashId == null) { + return false; + } + for (int i = 0; i < selectedItems.size(); ++i) { + MessageObject msg = selectedItems.get(i); + if (msg != null && msg.getId() == messageHashId.messageId && msg.getDialogId() == messageHashId.dialogId) { + return true; + } + } + return false; + } + + @Override + public void showActionMode() { + actionBar.showActionMode(); + } + + @Override + public int getFolderId() { + return 0; + } + + private void search(View view, int position, String query, boolean reset) { + long minDate = 0; + long maxDate = 0; + boolean includeFolder = false; + + this.searchString = query; + if (view == searchContainer) { + searchMessages(query); + } else if (view instanceof FilteredSearchView) { + ((FilteredSearchView) view).setKeyboardHeight(keyboardSize, false); + Item item = viewPagerAdapter.items.get(position); + ((FilteredSearchView) view).search(-chatId, minDate, maxDate, FiltersView.filters[item.filterIndex], includeFolder, query, reset); + } else if (view instanceof SearchDownloadsContainer) { + ((SearchDownloadsContainer) view).setKeyboardHeight(keyboardSize, false); + ((SearchDownloadsContainer) view).search(query); + } + } + + private void searchMessages(String searchString) { if (searchRunnable != null) { AndroidUtilities.cancelRunOnUIThread(searchRunnable); searchRunnable = null; } - AndroidUtilities.updateViewVisibilityAnimated(searchContainer, !TextUtils.isEmpty(searchString), 1f, true); +// AndroidUtilities.updateViewVisibilityAnimated(TopicsFragment.this.searchContainer, !TextUtils.isEmpty(searchString), 1f, true); messagesIsLoading = false; canLoadMore = false; @@ -2140,6 +3383,14 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N updateRows(); if (TextUtils.isEmpty(searchString)) { isLoading = false; + searchResultTopics.clear(); + for (int i = 0; i < forumTopics.size(); i++) { + if (forumTopics.get(i).topic != null) { + searchResultTopics.add(forumTopics.get(i).topic); + forumTopics.get(i).topic.searchQuery = null; + } + } + updateRows(); // emptyView.showProgress(true, true); return; } else { @@ -2149,7 +3400,6 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N isLoading = true; emptyView.showProgress(isLoading, true); - searchRunnable = () -> { String searchTrimmed = searchString.trim().toLowerCase(); ArrayList topics = new ArrayList<>(); @@ -2175,6 +3425,13 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N AndroidUtilities.runOnUIThread(searchRunnable, 200); } + public void setSearchString(String searchString) { + if (this.searchString.equals(searchString)) { + return; + } + search(viewPages[0], getCurrentPosition(), searchString, false); + } + private void loadMessages(String searchString) { if (messagesIsLoading) { return; @@ -2273,6 +3530,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N break; case VIEW_TYPE_MESSAGE: view = new TopicDialogCell(null, parent.getContext(), false, true); + ((TopicDialogCell) view).inPreviewMode = inPreviewMode; break; default: throw new RuntimeException("unsupported view type"); @@ -2304,7 +3562,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N MessageObject message = searchResultMessages.get(position - messagesStartRow); TopicDialogCell dialogCell = (TopicDialogCell) holder.itemView; dialogCell.drawDivider = position != messagesEndRow - 1; - int topicId = MessageObject.getTopicId(message.messageOwner); + int topicId = MessageObject.getTopicId(message.messageOwner, true); if (topicId == 0) { topicId = 1; } @@ -2312,8 +3570,7 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N if (topic == null) { FileLog.d("cant find topic " + topicId); } else { - dialogCell.setForumTopic(topic, message.getDialogId(), message, false); - dialogCell.setPinForced(topic.pinned); + dialogCell.setForumTopic(topic, message.getDialogId(), message, false, false); dialogCell.setTopicIcon(topic); } } @@ -2369,6 +3626,9 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N return bottomOverlayContainer != null && bottomOverlayContainer.getVisibility() == View.VISIBLE ? bottomOverlayContainer.getMeasuredHeight() : 0; } }); + if (inPreviewMode && !getMessagesController().isForum(-chatId)) { + finishFragment(); + } } @Override @@ -2527,6 +3787,10 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N clearSelectedTopics(); return false; } + if (searching) { + actionBar.onSearchFieldVisibilityChanged(searchItem.toggleSearch(false)); + return false; + } return super.onBackPressed(); } @@ -2573,6 +3837,23 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N return contentView; } + @Override + public void setPreviewOpenedProgress(float progress) { + if (avatarContainer != null) { + avatarContainer.setAlpha(progress); + other.setAlpha(progress); + actionBar.getBackButton().setAlpha(progress == 1f ? 1f : 0); + } + } + + @Override + public void setPreviewReplaceProgress(float progress) { + if (avatarContainer != null) { + avatarContainer.setAlpha(progress); + avatarContainer.setTranslationX((1f - progress) * AndroidUtilities.dp(40)); + } + } + @Override public ArrayList getThemeDescriptions() { ThemeDescription.ThemeDescriptionDelegate cellDelegate = () -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FilterUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java similarity index 89% rename from TMessagesProj/src/main/java/org/telegram/ui/FilterUsersActivity.java rename to TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java index d673d02e1..53621a6b9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FilterUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java @@ -67,6 +67,9 @@ import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Adapters.SearchAdapterHelper; import org.telegram.ui.Cells.GraySectionCell; import org.telegram.ui.Cells.GroupCreateUserCell; +import org.telegram.ui.Components.AnimatedAvatarContainer; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.EmptyTextProgressView; @@ -77,7 +80,10 @@ import org.telegram.ui.Components.RecyclerListView; import java.util.ArrayList; -public class FilterUsersActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, View.OnClickListener { +public class UsersSelectActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, View.OnClickListener { + + public final static int TYPE_FILTER = 0; + public final static int TYPE_AUTO_DELETE_EXISTING_CHATS = 1; private ScrollView scrollView; private SpansContainer spansContainer; @@ -91,9 +97,10 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen private boolean ignoreScrollEvent; private int selectedCount; + private int type; private int containerHeight; - //private boolean doneButtonVisible; + AnimatedAvatarContainer animatedAvatarContainer; private boolean isInclude; private int filterFlags; @@ -106,9 +113,14 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen private GroupCreateSpan currentDeletingSpan; private int fieldY; + private int ttlPeriod; private final static int done_button = 1; + public void setTtlPeriod(int selectedTime) { + ttlPeriod = selectedTime; + } + private static class ItemDecoration extends RecyclerView.ItemDecoration { private boolean single; @@ -229,7 +241,7 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen if (currentAnimation != null) { int resultHeight = y + AndroidUtilities.dp(32 + 10); if (containerHeight != resultHeight) { - animators.add(ObjectAnimator.ofInt(FilterUsersActivity.this, "containerHeight", resultHeight)); + animators.add(ObjectAnimator.ofInt(UsersSelectActivity.this, "containerHeight", resultHeight)); } if (editText.getTranslationX() != fieldX) { animators.add(ObjectAnimator.ofFloat(editText, View.TRANSLATION_X, fieldX)); @@ -337,11 +349,19 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen } } - public FilterUsersActivity(boolean include, ArrayList arrayList, int flags) { + + + public UsersSelectActivity(boolean include, ArrayList arrayList, int flags) { super(); isInclude = include; filterFlags = flags; initialIds = arrayList; + type = TYPE_FILTER; + } + + public UsersSelectActivity(int type) { + super(); + this.type = type; } @Override @@ -402,12 +422,21 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen selectedContacts.clear(); currentDeletingSpan = null; + if (type == TYPE_AUTO_DELETE_EXISTING_CHATS) { + animatedAvatarContainer = new AnimatedAvatarContainer(getContext()); + actionBar.addView(animatedAvatarContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, LocaleController.isRTL ? 0 : 64, 0, LocaleController.isRTL ? 64 : 0, 0)); + actionBar.setAllowOverlayTitle(false); + } actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); - if (isInclude) { - actionBar.setTitle(LocaleController.getString("FilterAlwaysShow", R.string.FilterAlwaysShow)); - } else { - actionBar.setTitle(LocaleController.getString("FilterNeverShow", R.string.FilterNeverShow)); + if (type == TYPE_FILTER) { + if (isInclude) { + actionBar.setTitle(LocaleController.getString("FilterAlwaysShow", R.string.FilterAlwaysShow)); + } else { + actionBar.setTitle(LocaleController.getString("FilterNeverShow", R.string.FilterNeverShow)); + } + } else if (type == TYPE_AUTO_DELETE_EXISTING_CHATS){ + updateHint(); } actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override @@ -676,6 +705,10 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen id = ((TLRPC.User) object).id; } else if (object instanceof TLRPC.Chat) { id = -((TLRPC.Chat) object).id; + if (type == TYPE_AUTO_DELETE_EXISTING_CHATS && !ChatObject.canUserDoAdminAction((TLRPC.Chat) object, ChatObject.ACTION_DELETE_MESSAGES)) { + BulletinFactory.of(this).createErrorBulletin(LocaleController.getString("NeedAdminRightForSetAutoDeleteTimer", R.string.NeedAdminRightForSetAutoDeleteTimer)).show(); + return; + } } else { return; } @@ -700,7 +733,7 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen } GroupCreateSpan span = new GroupCreateSpan(editText.getContext(), object); spansContainer.addSpan(span, true); - span.setOnClickListener(FilterUsersActivity.this); + span.setOnClickListener(UsersSelectActivity.this); } updateHint(); if (searching || searchWas) { @@ -793,7 +826,7 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen if ((filterFlags & flag) != 0) { GroupCreateSpan span = new GroupCreateSpan(editText.getContext(), object); spansContainer.addSpan(span, false); - span.setOnClickListener(FilterUsersActivity.this); + span.setOnClickListener(UsersSelectActivity.this); } } if (initialIds != null && !initialIds.isEmpty()) { @@ -810,7 +843,7 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen } GroupCreateSpan span = new GroupCreateSpan(editText.getContext(), object); spansContainer.addSpan(span, false); - span.setOnClickListener(FilterUsersActivity.this); + span.setOnClickListener(UsersSelectActivity.this); } } @@ -949,11 +982,32 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen } private void updateHint() { - int limit = getUserConfig().isPremium() ? getMessagesController().dialogFiltersChatsLimitPremium : getMessagesController().dialogFiltersChatsLimitDefault; - if (selectedCount == 0) { - actionBar.setSubtitle(LocaleController.formatString("MembersCountZero", R.string.MembersCountZero, LocaleController.formatPluralString("Chats", limit))); - } else { - actionBar.setSubtitle(String.format(LocaleController.getPluralString("MembersCountSelected", selectedCount), selectedCount, limit)); + if (type == TYPE_FILTER) { + int limit = getUserConfig().isPremium() ? getMessagesController().dialogFiltersChatsLimitPremium : getMessagesController().dialogFiltersChatsLimitDefault; + if (selectedCount == 0) { + actionBar.setSubtitle(LocaleController.formatString("MembersCountZero", R.string.MembersCountZero, LocaleController.formatPluralString("Chats", limit))); + } else { + actionBar.setSubtitle(String.format(LocaleController.getPluralString("MembersCountSelected", selectedCount), selectedCount, limit)); + } + } else if (type == TYPE_AUTO_DELETE_EXISTING_CHATS) { + actionBar.setTitle(""); + actionBar.setSubtitle(""); + + if (selectedCount == 0) { + animatedAvatarContainer.getTitle().setText(LocaleController.getString("SelectChats", R.string.SelectChats), true); + if (ttlPeriod > 0) { + animatedAvatarContainer.getSubtitleTextView().setText(LocaleController.getString("SelectChatsForAutoDelete", R.string.SelectChatsForAutoDelete), true); + } else { + animatedAvatarContainer.getSubtitleTextView().setText(LocaleController.getString("SelectChatsForDisableAutoDelete", R.string.SelectChatsForDisableAutoDelete), true); + } + } else { + animatedAvatarContainer.getTitle().setText(LocaleController.formatPluralString("Chats", selectedCount, selectedCount)); + if (ttlPeriod > 0) { + animatedAvatarContainer.getSubtitleTextView().setText(LocaleController.getPluralString("SelectChatsForAutoDelete2", selectedCount)); + } else { + animatedAvatarContainer.getSubtitleTextView().setText(LocaleController.getPluralString("SelectChatsForDisableAutoDelete2", selectedCount)); + } + } } } @@ -970,7 +1024,7 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen private Runnable searchRunnable; private boolean searching; private ArrayList contacts = new ArrayList<>(); - private final int usersStartRow = isInclude ? 7 : 5; + private final int usersStartRow = type == TYPE_FILTER ? isInclude ? 7 : 5 : 0; public GroupCreateAdapter(Context ctx) { context = ctx; @@ -985,6 +1039,9 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen if (DialogObject.isUserDialog(dialog.id)) { TLRPC.User user = getMessagesController().getUser(dialog.id); if (user != null) { + if (type == TYPE_AUTO_DELETE_EXISTING_CHATS && UserObject.isUserSelf(user)) { + continue; + } contacts.add(user); if (UserObject.isUserSelf(user)) { hasSelf = true; @@ -997,7 +1054,7 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen } } } - if (!hasSelf) { + if (!hasSelf && type != TYPE_AUTO_DELETE_EXISTING_CHATS) { TLRPC.User user = getMessagesController().getUser(getUserConfig().clientUserId); contacts.add(0, user); } @@ -1035,10 +1092,14 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen count += localServerCount + globalCount; return count; } else { - if (isInclude) { - count = 7; + if (type == TYPE_FILTER) { + if (isInclude) { + count = 7; + } else { + count = 5; + } } else { - count = 5; + count = 0; } count += contacts.size(); } @@ -1177,21 +1238,54 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen } else { id = 0; } - if (!searching) { - StringBuilder builder = new StringBuilder(); - ArrayList filters = getMessagesController().dialogFilters; - for (int a = 0, N = filters.size(); a < N; a++) { - MessagesController.DialogFilter filter = filters.get(a); - if (filter.includesDialog(getAccountInstance(), id)) { - if (builder.length() > 0) { - builder.append(", "); + boolean blueText = false; + boolean enabled = true; + if (type == TYPE_FILTER) { + if (!searching) { + StringBuilder builder = new StringBuilder(); + ArrayList filters = getMessagesController().dialogFilters; + for (int a = 0, N = filters.size(); a < N; a++) { + MessagesController.DialogFilter filter = filters.get(a); + if (filter.includesDialog(getAccountInstance(), id)) { + if (builder.length() > 0) { + builder.append(", "); + } + builder.append(filter.name); } - builder.append(filter.name); } + username = builder; } - username = builder; + } else { + int ttlPeriod = 0; + if (getMessagesController().dialogs_dict.get(id) != null) { + ttlPeriod = getMessagesController().dialogs_dict.get(id).ttl_period; + } + if (ttlPeriod > 0) { + blueText = true; + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append("d"); + spannableStringBuilder.setSpan(new ColoredImageSpan(R.drawable.msg_mini_fireon), 0, 1, 0); + spannableStringBuilder.append(LocaleController.formatString("AutoDeleteAfter", R.string.AutoDeleteAfter, LocaleController.formatTTLString(ttlPeriod)).toLowerCase()); + username = spannableStringBuilder; + } else { + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append("d"); + spannableStringBuilder.setSpan(new ColoredImageSpan(R.drawable.msg_mini_fireoff), 0, 1, 0); + spannableStringBuilder.append(LocaleController.formatString("AutoDeleteDisabled", R.string.AutoDeleteDisabled)); + username = spannableStringBuilder; + } + if (object instanceof TLRPC.Chat) { + enabled = ChatObject.canUserDoAdminAction((TLRPC.Chat) object, ChatObject.ACTION_DELETE_MESSAGES); + } + } + + if (enabled) { + cell.setAlpha(1f); + } else { + cell.setAlpha(0.5f); } cell.setObject(object, name, username); + cell.getStatusTextView().setTextColor(Theme.getColor(blueText ? Theme.key_windowBackgroundWhiteBlueText : Theme.key_windowBackgroundWhiteGrayText)); if (id != 0) { cell.setChecked(selectedContacts.indexOfKey(id) >= 0, false); cell.setCheckBoxEnabled(true); @@ -1215,13 +1309,15 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen if (searching) { return 1; } else { - if (isInclude) { - if (position == 0 || position == 6) { - return 2; - } - } else { - if (position == 0 || position == 4) { - return 2; + if (type == TYPE_FILTER) { + if (isInclude) { + if (position == 0 || position == 6) { + return 2; + } + } else { + if (position == 0 || position == 4) { + return 2; + } } } return 1; @@ -1251,15 +1347,19 @@ public class FilterUsersActivity extends BaseFragment implements NotificationCen Utilities.searchQueue.cancelRunnable(searchRunnable); searchRunnable = null; } + boolean allowSerachChats = true; + if (query == null) { searchResult.clear(); searchResultNames.clear(); searchAdapterHelper.mergeResults(null); - searchAdapterHelper.queryServerSearch(null, true, true, false, false, false, 0, false, 0, 0); + + searchAdapterHelper.queryServerSearch(null, true, allowSerachChats, false, false, false, 0, false, 0, 0); notifyDataSetChanged(); } else { + boolean finalAllowSerachChats = allowSerachChats; Utilities.searchQueue.postRunnable(searchRunnable = () -> AndroidUtilities.runOnUIThread(() -> { - searchAdapterHelper.queryServerSearch(query, true, true, true, true, false, 0, false, 0, 0); + searchAdapterHelper.queryServerSearch(query, true, finalAllowSerachChats, true, type != TYPE_AUTO_DELETE_EXISTING_CHATS, false, 0, false, 0, 0); Utilities.searchQueue.postRunnable(searchRunnable = () -> { String search1 = query.trim().toLowerCase(); if (search1.length() == 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java index ef34a2770..8bfcc3b59 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java @@ -847,7 +847,9 @@ public class VoIPFragment implements VoIPService.StateListener, NotificationCent callingUserTitle = new TextView(context); callingUserTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 24); - callingUserTitle.setText(ContactsController.formatName(callingUser.first_name, callingUser.last_name)); + CharSequence name = ContactsController.formatName(callingUser.first_name, callingUser.last_name); + name = Emoji.replaceEmoji(name, callingUserTitle.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); + callingUserTitle.setText(name); callingUserTitle.setShadowLayer(AndroidUtilities.dp(3), 0, AndroidUtilities.dp(.666666667f), 0x4C000000); callingUserTitle.setTextColor(Color.WHITE); callingUserTitle.setGravity(Gravity.CENTER_HORIZONTAL); diff --git a/TMessagesProj/src/main/res/anim/scale_in.xml b/TMessagesProj/src/main/res/anim/scale_in.xml new file mode 100644 index 000000000..534cd9880 --- /dev/null +++ b/TMessagesProj/src/main/res/anim/scale_in.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/anim/scale_out.xml b/TMessagesProj/src/main/res/anim/scale_out.xml new file mode 100644 index 000000000..f3e404a76 --- /dev/null +++ b/TMessagesProj/src/main/res/anim/scale_out.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/drawable-hdpi/chats_archive_hide.png b/TMessagesProj/src/main/res/drawable-hdpi/chats_archive_hide.png deleted file mode 100644 index 170d26991..000000000 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/chats_archive_hide.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/chats_archive_show.png b/TMessagesProj/src/main/res/drawable-hdpi/chats_archive_show.png deleted file mode 100644 index df2dde739..000000000 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/chats_archive_show.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_archive_hide.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_archive_hide.png new file mode 100644 index 000000000..a1737b5c6 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_archive_hide.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_archive_show.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_archive_show.png new file mode 100644 index 000000000..2dcaf2c4d Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_archive_show.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_autodelete_badge2.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_autodelete_badge2.png new file mode 100644 index 000000000..5ef950aac Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_autodelete_badge2.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_data_usage.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_data_usage.png new file mode 100644 index 000000000..ba1516804 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_data_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_email.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_email.png new file mode 100644 index 000000000..de348ac70 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_email.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_filled_fragment.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_filled_fragment.png new file mode 100644 index 000000000..a5660c22a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_filled_fragment.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_filled_general.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_filled_general.png new file mode 100644 index 000000000..d726602bc Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_filled_general.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_fireoff.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_fireoff.png new file mode 100644 index 000000000..cf539082f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_fireoff.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_fireon.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_fireon.png new file mode 100644 index 000000000..bf50c3359 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_mini_fireon.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_notspam.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_notspam.png new file mode 100644 index 000000000..b62bf7403 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_notspam.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_storage_usage.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_storage_usage.png new file mode 100644 index 000000000..ffa53d9af Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/msg_storage_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/chats_archive_hide.png b/TMessagesProj/src/main/res/drawable-mdpi/chats_archive_hide.png deleted file mode 100644 index 10e67900e..000000000 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/chats_archive_hide.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/chats_archive_show.png b/TMessagesProj/src/main/res/drawable-mdpi/chats_archive_show.png deleted file mode 100644 index 1f4b56f33..000000000 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/chats_archive_show.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_archive_hide.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_archive_hide.png new file mode 100644 index 000000000..d0dca8230 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_archive_hide.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_archive_show.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_archive_show.png new file mode 100644 index 000000000..4928d6c83 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_archive_show.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_autodelete_badge2.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_autodelete_badge2.png new file mode 100644 index 000000000..a1ea8118a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_autodelete_badge2.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_data_usage.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_data_usage.png new file mode 100644 index 000000000..be327d4b0 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_data_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_email.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_email.png new file mode 100644 index 000000000..376ea16df Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_email.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_filled_fragment.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_filled_fragment.png new file mode 100644 index 000000000..73b8662e3 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_filled_fragment.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_filled_general.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_filled_general.png new file mode 100644 index 000000000..4ad17a35e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_filled_general.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_fireoff.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_fireoff.png new file mode 100644 index 000000000..e55da1410 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_fireoff.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_fireon.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_fireon.png new file mode 100644 index 000000000..68ded11f2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_mini_fireon.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_notspam.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_notspam.png new file mode 100644 index 000000000..350553deb Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_notspam.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_storage_usage.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_storage_usage.png new file mode 100644 index 000000000..8845bcd8f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/msg_storage_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/chats_archive_hide.png b/TMessagesProj/src/main/res/drawable-xhdpi/chats_archive_hide.png deleted file mode 100644 index 4dc5179b0..000000000 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/chats_archive_hide.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/chats_archive_show.png b/TMessagesProj/src/main/res/drawable-xhdpi/chats_archive_show.png deleted file mode 100644 index 3bd0b727f..000000000 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/chats_archive_show.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_archive_hide.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_archive_hide.png new file mode 100644 index 000000000..5ea995f1e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_archive_hide.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_archive_show.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_archive_show.png new file mode 100644 index 000000000..26e00b1ea Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_archive_show.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_autodelete_badge2.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_autodelete_badge2.png new file mode 100644 index 000000000..7e204e3ea Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_autodelete_badge2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_data_usage.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_data_usage.png new file mode 100644 index 000000000..f7ce1b462 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_data_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_email.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_email.png new file mode 100644 index 000000000..f02980ea9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_email.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_filled_fragment.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_filled_fragment.png new file mode 100644 index 000000000..4a6ad49bc Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_filled_fragment.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_filled_general.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_filled_general.png new file mode 100644 index 000000000..ebc28a6b1 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_filled_general.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_fireoff.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_fireoff.png new file mode 100644 index 000000000..72b52fcec Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_fireoff.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_fireon.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_fireon.png new file mode 100644 index 000000000..1f0aa89d9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_mini_fireon.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_notspam.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_notspam.png new file mode 100644 index 000000000..345f250a4 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_notspam.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_storage_usage.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_storage_usage.png new file mode 100644 index 000000000..0ab43ef4d Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/msg_storage_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/chats_archive_hide.png b/TMessagesProj/src/main/res/drawable-xxhdpi/chats_archive_hide.png deleted file mode 100644 index 54b725074..000000000 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/chats_archive_hide.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/chats_archive_show.png b/TMessagesProj/src/main/res/drawable-xxhdpi/chats_archive_show.png deleted file mode 100644 index 772967cda..000000000 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/chats_archive_show.png and /dev/null differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_archive_hide.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_archive_hide.png new file mode 100644 index 000000000..624241d38 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_archive_hide.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_archive_show.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_archive_show.png new file mode 100644 index 000000000..5713a0071 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_archive_show.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_autodelete_badge2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_autodelete_badge2.png new file mode 100644 index 000000000..e53fcf97b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_autodelete_badge2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_data_usage.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_data_usage.png new file mode 100644 index 000000000..a8fa50bcd Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_data_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_email.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_email.png new file mode 100644 index 000000000..7d456218f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_email.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_filled_fragment.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_filled_fragment.png new file mode 100644 index 000000000..40d175630 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_filled_fragment.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_filled_general.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_filled_general.png new file mode 100644 index 000000000..7e74d364e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_filled_general.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_fireoff.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_fireoff.png new file mode 100644 index 000000000..e8cf58527 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_fireoff.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_fireon.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_fireon.png new file mode 100644 index 000000000..c6615ccda Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_mini_fireon.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_notspam.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_notspam.png new file mode 100644 index 000000000..a83693004 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_notspam.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_storage_usage.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_storage_usage.png new file mode 100644 index 000000000..8fac94c06 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_storage_usage.png differ diff --git a/TMessagesProj/src/main/res/drawable/other_chats.xml b/TMessagesProj/src/main/res/drawable/other_chats.xml new file mode 100644 index 000000000..150d54f0b --- /dev/null +++ b/TMessagesProj/src/main/res/drawable/other_chats.xml @@ -0,0 +1,12 @@ + + + diff --git a/TMessagesProj/src/main/res/raw/fragment.json b/TMessagesProj/src/main/res/raw/fragment.json new file mode 100644 index 000000000..d9a764851 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/fragment.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":59,"w":512,"h":512,"nm":"1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"1","sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.05,"y":0},"t":1,"s":[256,368.474,0],"to":[0,4,0],"ti":[0,3.5,0]},{"i":{"x":0.85,"y":1},"o":{"x":0.8,"y":0},"t":13,"s":[256,392.474,0],"to":[0,-3.5,0],"ti":[0,1.917,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.5,"y":0},"t":28,"s":[256,347.474,0],"to":[0,-1.917,0],"ti":[0,-2.167,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.29,"y":0},"t":39,"s":[256,380.974,0],"to":[0,2.167,0],"ti":[0,2.083,0]},{"i":{"x":0.71,"y":1},"o":{"x":0.29,"y":0},"t":49,"s":[256,360.474,0],"to":[0,-2.083,0],"ti":[0,-1.333,0]},{"t":58,"s":[256,368.474,0]}]},"a":{"a":0,"k":[256,368.474,0]},"s":{"a":1,"k":[{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.85,0.85,0.85],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":11,"s":[108,92,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":26,"s":[90,117,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":37,"s":[105,92,100]},{"i":{"x":[0.71,0.71,0.71],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":47,"s":[99,102,100]},{"t":57,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-9.813,-21.949],[-10.061,104.985],[-23.595,107.964],[-126.478,-51.435],[-128.685,-54.854],[-130.559,-57.758],[-130.614,-57.843],[-141.378,-74.519],[-131.648,-82.56],[-14.286,-29.675],[-13.656,-29.342],[-10.631,-26.481]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.014},"t":8,"s":[{"i":[[0.656,-2.458],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.216,-0.078],[-0.917,-0.848]],"o":[[0,0],[-1.939,6.784],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.125,0.405],[1.162,1.075]],"v":[[53.969,-13.324],[15.439,104.466],[-5.595,107.925],[-120.842,-24.689],[-123.512,-27.737],[-125.78,-30.326],[-125.846,-30.402],[-138.871,-45.269],[-129.141,-53.31],[47.527,-21.925],[48.469,-21.717],[52.057,-20.012]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-9.813,-21.949],[-10.061,104.985],[-23.595,107.964],[-126.478,-51.435],[-128.685,-54.854],[-130.559,-57.758],[-130.614,-57.843],[-141.378,-74.519],[-131.648,-82.56],[-14.286,-29.675],[-13.656,-29.342],[-10.631,-26.481]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[0,0],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.338,-27.899],[-13.561,104.877],[-24.095,107.857],[-109.118,-67.827],[-110.748,-71.594],[-112.134,-74.796],[-112.174,-74.889],[-120.128,-93.269],[-110.398,-101.31],[-70.686,-35.625],[-70.62,-35.475],[-68.969,-31.663]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[1.198,3.378],[0,0],[0,0],[0,0],[0,0],[-2.33,-0.621],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[-1.698,-5.003],[0,0],[0,0],[0,0],[0.006,-9.162],[0,0],[0,0],[0,0],[0,0]],"v":[[-85.763,-31.242],[-16.061,109.224],[-24.845,103.342],[-94.552,-28.372],[-90.984,-32.654],[-97.345,-52.21],[-101.503,-52.724],[-107.756,-96.338],[-99.545,-107.504],[-91.923,-55.657],[-97.366,-52.192],[-91.024,-32.662]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-98.638,-29.985],[-10.936,108.232],[-16.845,102.224],[-102.177,-28.24],[-102.909,-31.699],[-97.505,-60.262],[-98.235,-60.89],[-78.381,-112.581],[-73.42,-118.997],[-96.048,-59.961],[-97.487,-60.236],[-102.932,-31.77]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[0,0],[4.904,4.808],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.308,2.522],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-93.513,-26.86],[-14.74,108.357],[-25.032,103.849],[-97.052,-25.115],[-97.784,-28.574],[-96.13,-60.2],[-96.86,-60.828],[-79.693,-106.831],[-74.733,-113.247],[-94.673,-59.899],[-96.112,-60.173],[-97.807,-28.645]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[0,0],[2.263,3.401],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.395,0.768],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-88.388,-23.735],[-12.186,108.482],[-18.47,104.974],[-91.927,-21.99],[-92.659,-25.449],[-94.755,-60.137],[-95.485,-60.765],[-81.006,-101.081],[-76.045,-107.497],[-93.298,-59.836],[-94.737,-60.111],[-92.682,-25.52]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[1.198,3.378],[0,0],[0,0],[0,0],[0,0],[-2.33,-0.621],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[-1.698,-5.003],[0,0],[0,0],[0,0],[0.006,-9.162],[0,0],[0,0],[0,0],[0,0]],"v":[[-78.263,-22.992],[-10.561,106.974],[-21.095,101.842],[-87.052,-20.122],[-83.484,-24.404],[-87.845,-48.46],[-92.003,-48.974],[-101.631,-87.838],[-93.42,-99.004],[-82.423,-51.907],[-87.866,-48.442],[-83.524,-24.412]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,0],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.559,-0.44],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0,0],[0,0],[0,0]],"v":[[-49.588,-20.649],[-14.811,103.877],[-25.595,105.857],[-100.118,-66.077],[-101.748,-69.844],[-103.134,-73.046],[-103.174,-73.139],[-106.878,-81.519],[-103.148,-96.06],[-52.936,-28.375],[-52.87,-28.225],[-51.219,-24.413]],"c":true}]},{"t":58,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-12.813,-21.897],[-13.061,105.036],[-26.595,108.016],[-129.478,-51.384],[-131.685,-54.802],[-133.559,-57.707],[-133.614,-57.791],[-144.378,-74.468],[-134.648,-82.509],[-17.286,-29.624],[-16.656,-29.291],[-13.631,-26.429]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":1,"k":[{"t":0,"s":[179.897,270.405],"h":1},{"t":31,"s":[329.897,270.405],"h":1}]},"a":{"a":0,"k":[-76.103,14.405]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"h":1},{"t":31,"s":[-100,100],"h":1}]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":21,"s":[0],"h":1},{"t":31,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"L","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[9.813,-21.949],[10.061,104.985],[23.595,107.964],[141.378,-74.519],[131.648,-82.56],[14.286,-29.675]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.014},"t":8,"s":[{"i":[[0.5,-1.926],[0,0],[-4.884,7.121],[0,0],[4.977,-6.565],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.122,-7.481],[0,0],[-1.098,1.55]],"v":[[69.125,-20.949],[28.061,98.403],[31.845,105.383],[108.503,-99.644],[103.898,-103.685],[73.598,-31.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[9.813,-21.949],[10.061,104.985],[23.595,107.964],[141.378,-74.519],[131.648,-82.56],[14.286,-29.675]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[-94.937,-32.699],[-5.689,106.949],[12.345,107.428],[136.128,-65.269],[126.398,-73.31],[-90.464,-40.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,-3.797],[0,0],[-16.33,13.572],[0,0],[8.38,-3.676],[0,0]],"o":[[0,0],[7.865,6.015],[0,0],[3.592,-5.48],[0,0],[-3.981,1.845]],"v":[[-144.476,-47.699],[-17.449,106.949],[21,107.428],[143.908,-46.269],[133.42,-54.31],[-139.655,-55.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[8.475,1.06],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[-138.054,-68.199],[-9.439,106.699],[5.345,104.928],[80.006,-23.269],[73.275,-36.56],[-133.581,-75.925]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[6.926,1.268],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[1.995,-5.873],[0,0],[-3.693,1.845]],"v":[[-135.164,-75.799],[-16.039,106.264],[-0.58,103.755],[31.208,-21.677],[22.074,-34.718],[-130.691,-83.525]],"c":true}]},{"t":58,"s":[{"i":[[-3.903,-6.785],[0,0],[0.28,5.393],[0,0],[4.415,1.955],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[-0.074,-7.149],[0,0],[-4.376,-2.434]],"v":[[-140.722,-74.59],[-22.314,109.377],[-9.53,106.607],[-9.739,-19.601],[-16.102,-30.267],[-134.499,-82.942]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[332.103,270.405]},"a":{"a":0,"k":[76.103,14.405]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"R","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[-3.141,1.409],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[4.282,-1.921],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[5.157,-47.3],[131.853,-103.149],[130.071,-112.474],[-129.633,-112.474],[-131.415,-103.149],[-4.719,-47.3]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.095},"t":8,"s":[{"i":[[-4.407,9.1],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[3.647,-4.152],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[64.407,-48.1],[94.853,-116.598],[91.071,-125.923],[-133.133,-84.474],[-134.915,-75.149],[50.281,-40.1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-3.141,1.409],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[4.282,-1.921],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[5.157,-47.3],[131.853,-103.149],[130.071,-112.474],[-129.633,-112.474],[-131.415,-103.149],[-4.719,-47.3]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-3.735,0.905],[0,0],[4.446,0.573],[0,0],[-0.281,-2.571],[0,0]],"o":[[0,0],[4.562,-1.329],[0,0],[-3.585,-0.274],[0,0],[0.147,1.766]],"v":[[-71.636,-55.66],[130.183,-92.501],[129.351,-102.532],[-80.466,-120.843],[-86.458,-115.393],[-78.274,-58.279]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[-3.883,0.779],[0,0],[4.384,0.717],[0,0],[0.719,-2.733],[0,0]],"o":[[0,0],[4.632,-1.181],[0,0],[-3.308,-0.343],[0,0],[-0.601,1.855]],"v":[[-85.834,-57.438],[129.765,-89.838],[129.171,-100.046],[-63.174,-122.623],[-70.219,-118.142],[-91.663,-60.712]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[-4.626,-0.1],[0,0],[4.076,1.204],[0,0],[1.978,-0.848],[0,0]],"o":[[0,0],[4.981,-0.064],[0,0],[-1.923,-0.576],[0,0],[-4.344,1.708]],"v":[[-130.384,-71.791],[129.552,-72.5],[130.145,-80.33],[2.522,-126.625],[-2.786,-126.422],[-132.166,-77.294]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[-4.626,-0.109],[0,0],[0.581,2.975],[0,0],[1.978,-0.93],[0,0]],"o":[[0,0],[6.476,1.395],[0,0],[-1.924,-0.632],[0,0],[-4.344,1.873]],"v":[[-130.187,-94.699],[80.4,-54.395],[86.669,-61.35],[66.994,-117.152],[63.936,-119.429],[-131.969,-100.731]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[-4.626,-0.111],[0,0],[-2.616,2.343],[0,0],[1.978,-0.943],[0,0]],"o":[[0,0],[5.878,0.829],[0,0],[-1.924,-0.641],[0,0],[-4.344,1.899]],"v":[[-125.399,-102.121],[37.027,-50.663],[46.116,-55.343],[93.31,-112.129],[91.152,-115.305],[-127.181,-108.239]],"c":true}]},{"t":58,"s":[{"i":[[-6.407,-2.769],[0,0],[-5.038,2.278],[0,0],[5.273,-0.726],[0,0]],"o":[[0,0],[3.157,1.572],[0,0],[6.591,-2.37],[0,0],[-7.125,0.298]],"v":[[-130.593,-103.106],[-4.907,-47.572],[7.288,-48.528],[131.034,-103.255],[128.727,-112.274],[-127.875,-113.298]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256.219,176.641]},"a":{"a":0,"k":[0.219,-79.359]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Top","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/msg_antispam.json b/TMessagesProj/src/main/res/raw/msg_antispam.json new file mode 100644 index 000000000..2e28cfb50 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/msg_antispam.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":62,"w":512,"h":512,"nm":"MAIN 3","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 19","parent":2,"sr":1,"ks":{"p":{"a":0,"k":[11,81,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[22.633,80.31],[48,25]],"o":[[-31,-110],[-40.692,-21.194]],"v":[[142,74],[-61.5,-172]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":53},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[138]},{"t":49,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":23},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":41,"s":[100],"h":1},{"t":48,"s":[0],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[40.327,73.046],[64,-122.5]],"o":[[-53,-96],[-66.658,127.588]],"v":[[214,-140],[-41,-156.5]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":52},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[138]},{"t":52,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":18},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":40,"op":52,"st":46,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 18","sr":1,"ks":{"p":{"a":0,"k":[256,266,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[244,-168],[-73.5,-71.5]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":44},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[-138]},{"t":41,"s":[138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":30},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":34,"op":42,"st":33,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 17","parent":4,"sr":1,"ks":{"p":{"a":0,"k":[17.2,33.289,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[23.268,80.129],[67,19]],"o":[[-26.772,-92.194],[-44.14,-12.517]],"v":[[116.402,52.791],[-77,-127]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":53},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[138]},{"t":40,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":23},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[47.235,68.781],[80,-106]],"o":[[-57,-83],[-86.717,114.9]],"v":[[236.737,-175.327],[-74,-158]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":52},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":28,"s":[138]},{"t":40,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":17},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":29,"op":40,"st":34,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 16","sr":1,"ks":{"r":{"a":0,"k":19},"p":{"a":0,"k":[226,366,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[245.1,-201.69],[-99,-87]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":44},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[-138]},{"t":29,"s":[138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":30},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":22,"op":29,"st":21,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 15","parent":6,"sr":1,"ks":{"p":{"a":0,"k":[11,46,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[42.482,71.814],[43,29]],"o":[[-42,-71],[-38.038,-25.654]],"v":[[33,11],[-77,-127]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":53},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[138]},{"t":24,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":22},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[61.92,55.928],[64,-61]],"o":[[-31,-28],[-104.202,99.318]],"v":[[141,-191],[-74,-158]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":52},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[138]},{"t":24,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":22},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":14,"op":24,"st":20,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 14","sr":1,"ks":{"p":{"a":0,"k":[256,256,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[186,-254],[-99,-87]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":44},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[-138]},{"t":15,"s":[138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":30},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":8,"op":16,"st":7,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 21","parent":8,"sr":1,"ks":{"p":{"a":0,"k":[21,46,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[65.56,51.612],[59,13.5]],"o":[[-23.5,-18.5],[-44.724,-10.234]],"v":[[112.5,-63.5],[-54,-143.5]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":53},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[138]},{"t":15,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":16},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":3,"s":[100],"h":1},{"t":14,"s":[0],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.101,82.825],[41,50]],"o":[[-5,-41],[-29.092,-35.478]],"v":[[-11,83],[-77,-127]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":53},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[138]},{"t":18,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":22},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[47.235,68.781],[80,-106]],"o":[[-57,-83],[-86.717,114.9]],"v":[[214,-140],[-74,-158]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":52},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[138]},{"t":18,"s":[-138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":22},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":7,"op":19,"st":13,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 20","sr":1,"ks":{"p":{"a":0,"k":[256,416,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[246,49],[-70,-102]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":44},"e":{"a":0,"k":55},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[-138]},{"t":7,"s":[138]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":30},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":3,"op":8,"st":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shield 2","sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.501],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[48]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[-14]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[-7]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[-15]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[-8]},{"i":{"x":[0.41],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[-17]},{"i":{"x":[0.41],"y":[1]},"o":{"x":[0.566],"y":[0]},"t":40,"s":[-6]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.306],"y":[0]},"t":47,"s":[-10]},{"t":61,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[295.472,423.265,0],"to":[-16.667,0,0],"ti":[7.667,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.249,"y":0},"t":10,"s":[195.472,423.265,0],"to":[-0.606,0,0],"ti":[0.375,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[194.006,423.265,0],"to":[-2.009,0,0],"ti":[-2.739,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[185.901,423.265,0],"to":[1.121,0,0],"ti":[-3.123,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":27,"s":[202.744,423.265,0],"to":[3.541,0,0],"ti":[-0.592,0,0]},{"i":{"x":0.41,"y":1},"o":{"x":0.167,"y":0},"t":33,"s":[197.405,423.265,0],"to":[0.206,0,0],"ti":[-3.02,0,0]},{"i":{"x":0.707,"y":1},"o":{"x":0.352,"y":0},"t":39,"s":[213.726,423.265,0],"to":[2.606,0,0],"ti":[-0.59,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[219.472,423.265,0],"to":[10,0,0],"ti":[-6,0,0]},{"t":58,"s":[255.472,423.265,0]}]},"a":{"a":0,"k":[-5.127,171.315,0]},"s":{"a":1,"k":[{"i":{"x":[0.41,0.41,0.41],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.824]},"t":0,"s":[38.824,33,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[102,102,100]},{"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]},"t":14,"s":[102,102,100]},{"i":{"x":[0.41,0.41,0.41],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.018]},"t":17,"s":[97,97,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[102,102,100]},{"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]},"t":27,"s":[102,102,100]},{"i":{"x":[0.41,0.41,0.41],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.351]},"t":30,"s":[97,97,100]},{"t":36,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[6.053,-2.446],[41.492,-19.234],[-7.069,-1.676],[0,0],[-8.649,5.944],[0,0],[3.491,-3.211],[0,0],[-7.453,-5.901],[-17.07,-12.037],[-1.639,11.142]],"o":[[1.133,-6.43],[-36.83,14.879],[-6.591,3.055],[0,0],[10.212,2.42],[0,0],[3.94,-2.64],[0,0],[-6.759,6.685],[14.513,11.489],[9.204,6.49],[0,0]],"v":[[91.767,-70.773],[80.475,-79.927],[-110.244,0.632],[-108.787,15.016],[-73.738,22.79],[-44.118,17.256],[30.364,-32.044],[35.102,-26.026],[-18.833,26.526],[-17.781,51.197],[39.986,95.109],[63.637,84.989]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.65,"y":0},"t":22,"s":[{"i":[[0,0],[2.965,-2.446],[20.324,-19.234],[-3.463,-1.676],[0,0],[-4.237,5.944],[0,0],[1.71,-3.211],[0,0],[-3.651,-5.901],[-8.361,-12.037],[-0.803,11.142]],"o":[[0.555,-6.43],[-18.04,14.879],[-3.229,3.055],[0,0],[5.002,2.42],[0,0],[1.93,-2.64],[0,0],[-3.311,6.685],[7.109,11.489],[4.508,6.49],[0,0]],"v":[[63.345,-70.773],[57.814,-79.927],[-35.607,0.632],[-34.893,15.016],[-17.725,22.79],[-3.216,17.256],[33.268,-32.044],[35.589,-26.026],[9.169,26.526],[9.685,51.197],[37.981,95.109],[49.566,84.989]],"c":true}]},{"t":59,"s":[{"i":[[0,0],[6.053,-2.446],[41.492,-19.234],[-7.069,-1.676],[0,0],[-8.649,5.944],[0,0],[3.491,-3.211],[0,0],[-7.453,-5.901],[-17.07,-12.037],[-1.639,11.142]],"o":[[1.133,-6.43],[-36.83,14.879],[-6.591,3.055],[0,0],[10.212,2.42],[0,0],[3.94,-2.64],[0,0],[-6.759,6.685],[14.513,11.489],[9.204,6.49],[0,0]],"v":[[91.767,-70.773],[80.475,-79.927],[-110.244,0.632],[-108.787,15.016],[-73.738,22.79],[-44.118,17.256],[30.364,-32.044],[35.102,-26.026],[-18.833,26.526],[-17.781,51.197],[39.986,95.109],[63.637,84.989]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tr","p":{"a":0,"k":[5.804,8.673]},"a":{"a":0,"k":[5.804,8.673]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[100,100]},{"i":{"x":[0.41,0.41],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":8,"s":[90,90]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.41,0.41],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":17,"s":[85,85]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":27,"s":[100,100]},{"i":{"x":[0.41,0.41],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[90,90]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":39,"s":[100,100]},{"i":{"x":[0.41,0.41],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":42,"s":[90,90]},{"t":48,"s":[100,100]}]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0],[-64.8,-27.595],[-1.194,-27.419],[0,0],[29.3,0],[17.61,9.401],[24.991,36.518],[0.881,34.208],[0,0],[0,0],[-21.6,0]],"o":[[0,0],[21.6,1.58],[0,0],[0,0],[0,116.112],[-7.822,0],[-28.476,-15.201],[-17.445,-25.491],[0,0],[1.461,-27.963],[65.433,-30.86],[0,0]],"v":[[-6.1,-185.7],[-3.1,-185.7],[126.5,-133.12],[155.4,-90.885],[155.4,5.1],[-4.6,191.85],[-44.872,177.51],[-134.056,98.923],[-164.6,9.032],[-164.6,-89.2],[-135.466,-129.855],[-6.1,-185.7]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.65,"y":0},"t":22,"s":[{"i":[[0,0],[0,0],[-31.321,-27.595],[-0.577,-27.419],[0,0],[15.566,0],[9.355,9.401],[13.277,36.518],[0.468,34.208],[0,0],[0,0],[-10.44,0]],"o":[[0,0],[10.44,1.58],[0,0],[0,0],[0,116.112],[-4.155,0],[-15.128,-15.201],[-9.268,-25.491],[0,0],[0.776,-27.963],[34.761,-30.86],[0,0]],"v":[[2.34,-185.7],[3.79,-185.7],[66.431,-133.12],[80.4,-90.885],[80.4,5.1],[-4.6,191.85],[-25.994,177.51],[-73.374,98.923],[-89.6,9.032],[-89.6,-89.2],[-74.123,-129.855],[2.34,-185.7]],"c":true}]},{"t":59,"s":[{"i":[[0,0],[0,0],[-64.8,-27.595],[-1.194,-27.419],[0,0],[29.3,0],[17.61,9.401],[24.991,36.518],[0.881,34.208],[0,0],[0,0],[-21.6,0]],"o":[[0,0],[21.6,1.58],[0,0],[0,0],[0,116.112],[-7.822,0],[-28.476,-15.201],[-17.445,-25.491],[0,0],[1.461,-27.963],[65.433,-30.86],[0,0]],"v":[[-6.1,-185.7],[-3.1,-185.7],[126.5,-133.12],[155.4,-90.885],[155.4,5.1],[-4.6,191.85],[-44.872,177.51],[-134.056,98.923],[-164.6,9.032],[-164.6,-89.2],[-135.466,-129.855],[-6.1,-185.7]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"User-promoted","bm":0,"hd":false}],"ip":1,"op":180,"st":-102,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/qr_matrix.json b/TMessagesProj/src/main/res/raw/qr_matrix.json new file mode 100644 index 000000000..ef25e61fc --- /dev/null +++ b/TMessagesProj/src/main/res/raw/qr_matrix.json @@ -0,0 +1 @@ +{"v":"5.9.6","fr":60,"ip":0,"op":180,"w":259,"h":259,"nm":"qr2","ddd":0,"assets":[{"id":"comp_0","nm":"48","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.723,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.583,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,137.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.645,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.723,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.648,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_1","nm":"47","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.519,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.607,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.677,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.583,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.723,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248.648,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_2","nm":"46","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.793,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.704,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.607,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.607,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.723,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.583,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.535,72.579,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.13,0],[-0.26,0.1],[0,0],[0.49,0],[0,2.44],[0,0],[-1.49,0],[0,-2.05],[0,0],[0.42,0],[0,0],[0,0],[0.38,0],[0,-0.46],[0,0],[-0.42,0],[0,0],[0,0.91],[0,0],[1.89,0],[0,-2.85],[0,0]],"o":[[0.45,0],[0,0],[-0.22,0.09],[-1.66,0],[0,0],[0,-2.41],[1.42,0],[0,0],[0,0.42],[0,0],[0,0],[0,-0.46],[-0.39,0],[0,0],[0,0.46],[0,0],[0.79,0],[0,0],[0,-2.38],[-2.01,0],[0,0],[0,2.83]],"v":[[0.221,4.518],[1.461,4.338],[1.461,3.548],[0.281,3.698],[-2.059,0.258],[-2.059,-0.332],[0.041,-3.692],[2.101,-0.762],[2.101,0.598],[1.511,1.188],[0.761,1.188],[0.761,-1.152],[0.131,-1.902],[-0.519,-1.152],[-0.519,1.178],[0.181,1.928],[1.691,1.928],[2.921,0.518],[2.921,-0.952],[0.061,-4.522],[-2.919,-0.312],[-2.919,0.368]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_3","nm":"45","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.723,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.607,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.519,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.607,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.723,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.519,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.519,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.723,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.645,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[234.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_4","nm":"44","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-3.233,3.875],[-1.703,3.875],[-0.083,1.185],[-0.023,1.185],[1.597,3.875],[3.217,3.875],[0.867,-0.005],[3.237,-3.875],[1.647,-3.875],[0.077,-1.105],[0.007,-1.105],[-1.553,-3.875],[-3.223,-3.875],[-0.933,-0.025]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.704,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.607,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.723,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.607,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_5","nm":"43","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.607,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.793,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.607,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.677,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.645,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.723,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_6","nm":"42","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.607,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.704,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.519,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.583,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,150.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.607,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_7","nm":"41","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.962,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.563,3.875],[-1.563,1.515],[-0.883,0.645],[1.237,3.875],[3.017,3.875],[0.177,-0.455],[2.837,-3.875],[1.227,-3.875],[-1.483,-0.345],[-1.563,-0.345],[-1.563,-3.875],[-3.013,-3.875],[-3.013,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.677,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.607,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.583,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.704,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.503,150.122,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.86,0],[0,2.58],[1.86,0],[0,-2.58]],"o":[[1.86,0],[0,-2.58],[-1.86,0],[0,2.58]],"v":[[-0.004,4.041],[2.916,0.001],[-0.004,-4.039],[-2.914,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.07],[-0.92,0],[-0.22,-0.79],[0,0]],"o":[[0,-1.8],[0.6,0],[0,0],[0,-0.07]],"v":[[-1.421,0.003],[-0.001,-2.777],[1.239,-1.567],[-1.421,0.203]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.92,0],[0.22,0.79],[0,0],[0,-0.07]],"o":[[-0.6,0],[0,0],[0,0.06],[0,1.8]],"v":[[-0.003,2.772],[-1.243,1.572],[1.417,-0.188],[1.417,0.002]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.607,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.793,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.607,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.645,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_8","nm":"40","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.519,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.607,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.583,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.519,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.76,3.875],[0.76,1.015],[3.25,-3.875],[1.6,-3.875],[0.05,-0.575],[-0.05,-0.575],[-1.6,-3.875],[-3.25,-3.875],[-0.76,1.015],[-0.76,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.607,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.648,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.793,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.793,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0}]},{"id":"comp_9","nm":"39","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.607,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.551,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.648,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.519,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.793,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.648,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-3.233,3.875],[-1.703,3.875],[-0.083,1.185],[-0.023,1.185],[1.597,3.875],[3.217,3.875],[0.867,-0.005],[3.237,-3.875],[1.647,-3.875],[0.077,-1.105],[0.007,-1.105],[-1.553,-3.875],[-3.223,-3.875],[-0.933,-0.025]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.607,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.583,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.607,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.607,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.551,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_10","nm":"38","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.497,252.552,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.691,0.664],[2.921,0.664],[2.921,-0.666],[0.691,-0.666],[0.691,-2.906],[-0.689,-2.906],[-0.689,-0.666],[-2.919,-0.666],[-2.919,0.664],[-0.689,0.664],[-0.689,2.904],[0.691,2.904]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.583,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.793,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.648,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.519,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.519,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.723,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.793,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.704,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.645,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.793,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[185.5,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_11","nm":"37","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.793,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.648,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-3.233,3.875],[-1.703,3.875],[-0.083,1.185],[-0.023,1.185],[1.597,3.875],[3.217,3.875],[0.867,-0.005],[3.237,-3.875],[1.647,-3.875],[0.077,-1.105],[0.007,-1.105],[-1.553,-3.875],[-3.223,-3.875],[-0.933,-0.025]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.607,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.704,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.519,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.723,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,20.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[178.5,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_12","nm":"36","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.607,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.519,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.583,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,150.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.519,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.723,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.704,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.704,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.76,3.875],[0.76,1.015],[3.25,-3.875],[1.6,-3.875],[0.05,-0.575],[-0.05,-0.575],[-1.6,-3.875],[-3.25,-3.875],[-0.76,1.015],[-0.76,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.723,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.645,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_13","nm":"35","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.648,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.648,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_14","nm":"34","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.607,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.793,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.583,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_15","nm":"33","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.723,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.583,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.519,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_16","nm":"32","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.793,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.583,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,33.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.583,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_17","nm":"31","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.793,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_18","nm":"30","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.607,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,33.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[100]},{"t":63,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":184,"st":4,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.723,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_19","nm":"29","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.723,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.583,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.607,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.723,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_20","nm":"28","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.519,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[143.645,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_21","nm":"27","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.607,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.723,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.723,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,187.703,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.583,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_22","nm":"26","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.76,3.875],[0.76,1.015],[3.25,-3.875],[1.6,-3.875],[0.05,-0.575],[-0.05,-0.575],[-1.6,-3.875],[-3.25,-3.875],[-0.76,1.015],[-0.76,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.519,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.607,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[136.645,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_23","nm":"25","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.607,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.793,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.551,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.551,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_24","nm":"24","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.607,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.607,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.723,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.677,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_25","nm":"23","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.607,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.551,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.723,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.5,187.703,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.519,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_26","nm":"22","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.76,3.875],[0.76,1.015],[3.25,-3.875],[1.6,-3.875],[0.05,-0.575],[-0.05,-0.575],[-1.6,-3.875],[-3.25,-3.875],[-0.76,1.015],[-0.76,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.519,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.519,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.583,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.607,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_27","nm":"21","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.551,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.607,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.704,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_28","nm":"20","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.76,3.875],[0.76,1.015],[3.25,-3.875],[1.6,-3.875],[0.05,-0.575],[-0.05,-0.575],[-1.6,-3.875],[-3.25,-3.875],[-0.76,1.015],[-0.76,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.704,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.519,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,20.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.28,7.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.57,0],[0,1.63],[0,0],[0,0],[0,0],[0,0],[0,0],[0.71,0],[0.02,0.65],[0,0]],"o":[[1.64,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.79],[-0.65,0],[0,0],[0.01,1.49]],"v":[[-0.005,3.957],[2.605,1.377],[2.605,-3.953],[-1.705,-3.953],[-1.705,-2.643],[1.075,-2.643],[1.075,1.357],[-0.025,2.577],[-1.135,1.497],[-2.605,1.497]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_29","nm":"19","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.723,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.583,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.5,200.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_30","nm":"18","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.723,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.723,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.723,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.677,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_31","nm":"17","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.519,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,239.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.723,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.607,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_32","nm":"16","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.607,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.723,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.5,7.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_33","nm":"15","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.607,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.583,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.723,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.607,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.519,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_34","nm":"14","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.723,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.793,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.583,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.519,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_35","nm":"13","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-3.233,3.875],[-1.703,3.875],[-0.083,1.185],[-0.023,1.185],[1.597,3.875],[3.217,3.875],[0.867,-0.005],[3.237,-3.875],[1.647,-3.875],[0.077,-1.105],[0.007,-1.105],[-1.553,-3.875],[-3.223,-3.875],[-0.933,-0.025]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.677,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,175.703,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.645,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.723,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.607,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.793,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.519,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.962,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.563,3.875],[-1.563,1.515],[-0.883,0.645],[1.237,3.875],[3.017,3.875],[0.177,-0.455],[2.837,-3.875],[1.227,-3.875],[-1.483,-0.345],[-1.563,-0.345],[-1.563,-3.875],[-3.013,-3.875],[-3.013,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.607,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.519,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_36","nm":"12","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.723,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.519,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,213.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.704,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.583,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.607,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.519,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.723,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.645,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.5,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_37","nm":"11","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.793,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.607,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.607,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.704,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.645,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.723,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.648,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.76,3.875],[0.76,1.015],[3.25,-3.875],[1.6,-3.875],[0.05,-0.575],[-0.05,-0.575],[-1.6,-3.875],[-3.25,-3.875],[-0.76,1.015],[-0.76,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.793,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.648,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.607,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.607,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.645,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.5,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_38","nm":"10","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":95,"s":[100]},{"t":154,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.607,252.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":275,"st":95,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":149,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.793,239.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":270,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":144,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.583,226.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":265,"st":85,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[100]},{"t":139,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,213.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":260,"st":80,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":134,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,200.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":75,"op":255,"st":75,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.607,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.519,59.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.607,46.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.723,33.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.648,20.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":59,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.5,7.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}]},{"id":"comp_39","nm":"9","fr":60,"layers":[{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":129,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.551,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":250,"st":70,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[100]},{"t":124,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":245,"st":65,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"t":119,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.04,-0.685],[0.85,3.875],[2.2,3.875],[3.4,-3.875],[2.01,-3.875],[1.7,-1.205],[1.4,1.865],[1.31,1.865],[0.59,-2.105],[-0.59,-2.105],[-1.31,1.865],[-1.4,1.865],[-1.7,-1.205],[-2.01,-3.875],[-3.4,-3.875],[-2.2,3.875],[-0.85,3.875],[-0.04,-0.685]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":240,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":114,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":235,"st":55,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.723,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0}]},{"id":"comp_40","nm":"8","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.723,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.519,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.551,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_41","nm":"7","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.5,163.554,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.32,0],[0,1.33],[1.32,0],[0,-1.34]],"o":[[1.32,0],[0,-1.34],[-1.32,0],[0,1.33]],"v":[[-0.001,2.42],[2.399,0],[-0.001,-2.42],[-2.401,0]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.723,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.551,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.607,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.793,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.448,2.525],[-0.942,2.525],[-0.942,-3.875],[-2.452,-3.875],[-2.452,3.875],[2.448,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_42","nm":"6","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.519,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.723,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.607,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.082,2.355],[0.012,2.355],[-1.578,-3.875],[-3.228,-3.875],[-0.898,3.875],[0.902,3.875],[3.232,-3.875],[1.702,-3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_43","nm":"5","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.723,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.607,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.723,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.5,124.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.5,111.471,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,1.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0],[-0.3,0.09]],"o":[[0,0],[0,0],[0.59,-0.59],[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[0.36,0],[0,0]],"v":[[1.489,4.373],[2.929,4.373],[2.059,2.903],[2.979,0.243],[2.979,-0.937],[-0.001,-4.377],[-2.981,-0.937],[-2.981,0.243],[-0.001,3.683],[0.989,3.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.11,0],[0,1.44],[0,0],[-0.95,0],[0,-1.43],[0,0],[0.14,-0.34],[0,0],[0,0],[0,0]],"o":[[-0.95,0],[0,0],[0,-1.43],[0.96,0],[0,0],[0,0.53],[0,0],[0,0],[0,0],[-0.1,0.02]],"v":[[-0.002,2.416],[-1.472,0.256],[-1.472,-0.864],[-0.002,-3.024],[1.468,-0.864],[1.468,0.256],[1.258,1.556],[0.958,1.056],[-0.482,1.056],[0.308,2.386]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.645,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.6],[2.17,0]],"o":[[0,0],[0,0],[2.18,0],[0,-2.51],[0,0]],"v":[[-2.895,-3.875],[-2.895,3.875],[-0.405,3.875],[2.895,-0.055],[-0.405,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.71],[1.34,0],[0,0]],"o":[[0,0],[1.32,0],[0,1.78],[0,0],[0,0]],"v":[[-1.37,-2.559],[-0.62,-2.559],[1.34,-0.029],[-0.62,2.561],[-1.37,2.561]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_44","nm":"4","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.607,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.723,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.5,163.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.583,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.704,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.919,3.875],[-0.919,0.805],[2.141,0.805],[2.141,-0.455],[-0.919,-0.455],[-0.919,-2.555],[2.451,-2.555],[2.451,-3.875],[-2.449,-3.875],[-2.449,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.5,98.203,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.87,0],[0,1.05],[0,0],[0,0],[0,0],[-1.81,0],[0,1.82],[0,0],[0,0],[0,0]],"o":[[-0.87,0],[0,0],[0,0],[0,0],[0,1.82],[1.82,0],[0,0],[0,0],[0,0],[0,1.05]],"v":[[-0.004,2.577],[-1.354,0.957],[-1.354,-3.953],[-2.884,-3.953],[-2.884,1.057],[-0.004,3.957],[2.886,1.057],[2.886,-3.953],[1.356,-3.953],[1.356,0.957]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_45","nm":"3","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.648,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.61],[1.62,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.67,0],[0,-1.62],[0,0]],"v":[[-2.747,-3.875],[-2.747,3.875],[-1.217,3.875],[-1.217,1.415],[0.013,1.415],[2.743,-1.225],[0.093,-3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.93],[1,0],[0,0]],"o":[[0,0],[1,0],[0,0.94],[0,0],[0,0]],"v":[[-1.222,-2.624],[-0.302,-2.624],[1.198,-1.234],[-0.302,0.156],[-1.222,0.156]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.583,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.8,0],[0,1.23],[0,0],[-0.94,0],[-0.02,-0.93],[0,0],[1.78,0],[0,-2.04],[0,0],[-1.92,0],[0,1.76],[0,0]],"o":[[-0.96,0],[0,0],[0,-1.23],[0.79,0],[0,0],[-0.01,-1.83],[-1.92,0],[0,0],[0,2.04],[1.76,0],[0,0],[-0.02,0.9]],"v":[[0.089,2.659],[-1.371,0.789],[-1.371,-0.791],[0.069,-2.661],[1.399,-1.131],[2.949,-1.131],[0.099,-4.031],[-2.951,-0.791],[-2.951,0.789],[0.099,4.029],[2.949,1.199],[1.409,1.199]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.759,3.875],[0.759,-2.555],[2.979,-2.555],[2.979,-3.875],[-2.981,-3.875],[-2.981,-2.555],[-0.761,-2.555],[-0.761,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.5,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_46","nm":"2","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.5,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.723,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.677,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.36],[1.03,0.08],[0,0],[0,0.84],[1.49,0],[0,0],[0,0]],"o":[[1.66,0],[0,-1],[0,0],[0.81,-0.12],[0,-1.21],[0,0],[0,0],[0,0]],"v":[[0.116,3.875],[2.806,1.665],[1.036,-0.195],[1.036,-0.285],[2.436,-1.945],[0.046,-3.875],[-2.804,-3.875],[-2.804,3.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.67],[0.84,0],[0,0]],"o":[[0,0],[0.81,0],[0,0.62],[0,0],[0,0]],"v":[[-1.311,-2.699],[-0.361,-2.699],[0.899,-1.669],[-0.431,-0.689],[-1.311,-0.689]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-0.73],[1.06,0]],"o":[[0,0],[0,0],[1.04,0],[0,0.79],[0,0]],"v":[[-1.311,2.682],[-1.311,0.432],[-0.361,0.432],[1.209,1.532],[-0.351,2.682]],"c":true},"ix":2},"nm":"Path 3","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.5,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.764,3.875],[2.764,-3.875],[1.264,-3.875],[1.264,-0.715],[-1.266,-0.715],[-1.266,-3.875],[-2.766,-3.875],[-2.766,3.875],[-1.266,3.875],[-1.266,0.595],[1.264,0.595],[1.264,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.551,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.81,0],[0,1.24],[0,0],[-0.95,0],[-0.03,-0.82],[0,0],[1.71,0],[0,-2.05],[0,0],[-1.91,0],[0,1.61],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0.83],[-0.96,0],[0,0],[0,-1.24],[0.75,0],[0,0],[-0.05,-1.69],[-1.91,0],[0,0],[0,2.05],[1.71,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.385,1.339],[0.075,2.659],[-1.385,0.789],[-1.385,-0.791],[0.055,-2.661],[1.375,-1.311],[2.935,-1.311],[0.095,-4.031],[-2.935,-0.791],[-2.935,0.789],[0.095,4.029],[2.935,1.369],[2.935,-0.241],[-0.065,-0.241],[-0.065,0.909],[1.385,0.909]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.607,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.446,2.555],[-0.914,2.555],[-0.914,0.565],[2.246,0.565],[2.246,-0.655],[-0.914,-0.655],[-0.914,-2.555],[2.446,-2.555],[2.446,-3.875],[-2.444,-3.875],[-2.444,3.875],[2.446,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]},{"id":"comp_47","nm":"1","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":109,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.5,187.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.16],[0,0],[1.86,0],[0,-2.16],[0,0],[-1.86,0]],"o":[[0,0],[0,-2.16],[-1.86,0],[0,0],[0,2.16],[1.86,0]],"v":[[2.979,0.589],[2.979,-0.591],[-0.001,-4.031],[-2.981,-0.591],[-2.981,0.589],[-0.001,4.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.93,0],[0,1.4],[0,0],[-0.94,0],[0,-1.4],[0,0]],"o":[[-0.94,0],[0,0],[0,-1.4],[0.93,0],[0,0],[0,1.4]],"v":[[0.001,2.673],[-1.429,0.573],[-1.429,-0.577],[0.001,-2.677],[1.431,-0.577],[1.431,0.573]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50,"op":230,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":104,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.5,175.625,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":225,"st":45,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.519,163.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":220,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.519,150.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":215,"st":35,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.5,137.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.371,3.875],[2.371,2.565],[0.761,2.565],[0.761,-2.565],[2.371,-2.565],[2.371,-3.875],[-2.369,-3.875],[-2.369,-2.565],[-0.759,-2.565],[-0.759,2.565],[-2.369,2.565],[-2.369,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":210,"st":30,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":84,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.5,124.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.626,1.315],[-1.816,-1.775],[-1.706,-1.775],[-0.516,2.055],[0.514,2.055],[1.704,-1.775],[1.814,-1.775],[1.624,1.315],[1.624,3.875],[2.904,3.875],[2.904,-3.875],[1.314,-3.875],[0.044,0.565],[-0.046,0.565],[-1.316,-3.875],[-2.906,-3.875],[-2.906,3.875],[-1.626,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":205,"st":25,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":79,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.519,111.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.76,0],[0,1.53],[1.5,0.33],[0,0],[0,0.55],[-0.77,0],[-0.06,-0.64],[0,0],[1.62,0],[0,-1.44],[-1.4,-0.32],[0,0],[0,-0.52],[0.84,0],[0.07,0.67]],"o":[[0.05,1.45],[1.81,0],[0,-1.19],[0,0],[-0.84,-0.18],[0,-0.58],[0.76,0],[0,0],[-0.05,-1.38],[-1.68,0],[0,1.15],[0,0],[0.89,0.2],[0,0.63],[-0.88,0],[0,0]],"v":[[-2.908,1.709],[0.002,4.029],[2.912,1.579],[0.752,-0.611],[-0.038,-0.801],[-1.218,-1.831],[0.022,-2.771],[1.332,-1.741],[2.772,-1.741],[0.012,-4.031],[-2.738,-1.671],[-0.648,0.539],[0.162,0.729],[1.402,1.729],[0.032,2.759],[-1.468,1.709]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":74,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.5,98.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.398,3.875],[-1.398,-1.305],[-1.308,-1.305],[1.362,3.875],[2.722,3.875],[2.722,-3.875],[1.392,-3.875],[1.392,1.275],[1.302,1.275],[-1.358,-3.875],[-2.718,-3.875],[-2.718,3.875]],"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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.5,85.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.582,3.875],[3.232,3.875],[0.902,-3.875],[-0.898,-3.875],[-3.228,3.875],[-1.698,3.875],[-1.208,1.975],[1.092,1.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.082,-2.355],[-0.012,-2.355],[0.788,0.785],[-0.902,0.785]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":190,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":64,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.723,72.125,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,1.01],[1.69,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.84,-0.34],[0,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.225,1.025],[1.135,3.875],[2.855,3.875],[1.305,0.775],[2.675,-1.405],[-0.045,-3.875],[-2.855,-3.875],[-2.855,3.875],[-1.335,3.875],[-1.335,1.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.77],[0.86,0],[0,0]],"o":[[0,0],[0.86,0],[0,0.78],[0,0],[0,0]],"v":[[-1.335,-2.629],[-0.235,-2.629],[1.125,-1.399],[-0.255,-0.149],[-1.335,-0.149]],"c":true},"ix":2},"nm":"Path 2","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,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":185,"st":5,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"48","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-105,"op":75,"st":-105,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"48","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":75,"op":255,"st":75,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"47","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-145,"op":35,"st":-145,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"47","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":35,"op":215,"st":35,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"46","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-130,"op":50,"st":-130,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"46","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":50,"op":230,"st":50,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"45","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-94,"op":86,"st":-94,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"45","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":86,"op":266,"st":86,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"44","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-145,"op":35,"st":-145,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"44","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":35,"op":215,"st":35,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"43","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-100,"op":80,"st":-100,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"43","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":80,"op":260,"st":80,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"42","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-135,"op":45,"st":-135,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"42","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":45,"op":225,"st":45,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"41","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-160,"op":20,"st":-160,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"41","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":20,"op":200,"st":20,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"40","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-125,"op":55,"st":-125,"bm":0},{"ddd":0,"ind":18,"ty":0,"nm":"40","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":55,"op":235,"st":55,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"39","refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-125,"op":55,"st":-125,"bm":0},{"ddd":0,"ind":20,"ty":0,"nm":"39","refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":55,"op":235,"st":55,"bm":0},{"ddd":0,"ind":21,"ty":0,"nm":"38","refId":"comp_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-85,"op":95,"st":-85,"bm":0},{"ddd":0,"ind":22,"ty":0,"nm":"38","refId":"comp_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":95,"op":275,"st":95,"bm":0},{"ddd":0,"ind":23,"ty":0,"nm":"37","refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-135,"op":45,"st":-135,"bm":0},{"ddd":0,"ind":24,"ty":0,"nm":"37","refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":45,"op":225,"st":45,"bm":0},{"ddd":0,"ind":25,"ty":0,"nm":"36","refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-120,"op":60,"st":-120,"bm":0},{"ddd":0,"ind":26,"ty":0,"nm":"36","refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":27,"ty":0,"nm":"35","refId":"comp_13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-160,"op":20,"st":-160,"bm":0},{"ddd":0,"ind":28,"ty":0,"nm":"35","refId":"comp_13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":20,"op":200,"st":20,"bm":0},{"ddd":0,"ind":29,"ty":0,"nm":"34","refId":"comp_14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-125,"op":55,"st":-125,"bm":0},{"ddd":0,"ind":30,"ty":0,"nm":"34","refId":"comp_14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":55,"op":235,"st":55,"bm":0},{"ddd":0,"ind":31,"ty":0,"nm":"33","refId":"comp_15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-90,"op":90,"st":-90,"bm":0},{"ddd":0,"ind":32,"ty":0,"nm":"33","refId":"comp_15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":90,"op":270,"st":90,"bm":0},{"ddd":0,"ind":33,"ty":0,"nm":"32","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-140,"op":40,"st":-140,"bm":0},{"ddd":0,"ind":34,"ty":0,"nm":"32","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":40,"op":220,"st":40,"bm":0},{"ddd":0,"ind":35,"ty":0,"nm":"31","refId":"comp_17","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-150,"op":30,"st":-150,"bm":0},{"ddd":0,"ind":36,"ty":0,"nm":"31","refId":"comp_17","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":30,"op":210,"st":30,"bm":0},{"ddd":0,"ind":37,"ty":0,"nm":"30","refId":"comp_18","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-160,"op":20,"st":-160,"bm":0},{"ddd":0,"ind":38,"ty":0,"nm":"30","refId":"comp_18","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":20,"op":200,"st":20,"bm":0},{"ddd":0,"ind":39,"ty":0,"nm":"29","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-125,"op":55,"st":-125,"bm":0},{"ddd":0,"ind":40,"ty":0,"nm":"29","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":55,"op":235,"st":55,"bm":0},{"ddd":0,"ind":41,"ty":0,"nm":"28","refId":"comp_20","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-170,"op":9.99999999999999,"st":-170,"bm":0},{"ddd":0,"ind":42,"ty":0,"nm":"28","refId":"comp_20","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":10,"op":190,"st":10,"bm":0},{"ddd":0,"ind":43,"ty":0,"nm":"27","refId":"comp_21","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":44,"ty":0,"nm":"26","refId":"comp_22","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-150,"op":30,"st":-150,"bm":0},{"ddd":0,"ind":45,"ty":0,"nm":"26","refId":"comp_22","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":30,"op":210,"st":30,"bm":0},{"ddd":0,"ind":46,"ty":0,"nm":"25","refId":"comp_23","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-100,"op":80,"st":-100,"bm":0},{"ddd":0,"ind":47,"ty":0,"nm":"25","refId":"comp_23","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":80,"op":260,"st":80,"bm":0},{"ddd":0,"ind":48,"ty":0,"nm":"24","refId":"comp_24","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-155,"op":25,"st":-155,"bm":0},{"ddd":0,"ind":49,"ty":0,"nm":"24","refId":"comp_24","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":25,"op":205,"st":25,"bm":0},{"ddd":0,"ind":50,"ty":0,"nm":"23","refId":"comp_25","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-110,"op":70,"st":-110,"bm":0},{"ddd":0,"ind":51,"ty":0,"nm":"23","refId":"comp_25","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":70,"op":250,"st":70,"bm":0},{"ddd":0,"ind":52,"ty":0,"nm":"22","refId":"comp_26","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-175,"op":5.00000000000001,"st":-175,"bm":0},{"ddd":0,"ind":53,"ty":0,"nm":"22","refId":"comp_26","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":5,"op":185,"st":5,"bm":0},{"ddd":0,"ind":54,"ty":0,"nm":"21","refId":"comp_27","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-160,"op":20,"st":-160,"bm":0},{"ddd":0,"ind":55,"ty":0,"nm":"21","refId":"comp_27","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":20,"op":200,"st":20,"bm":0},{"ddd":0,"ind":56,"ty":0,"nm":"20","refId":"comp_28","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-140,"op":40,"st":-140,"bm":0},{"ddd":0,"ind":57,"ty":0,"nm":"20","refId":"comp_28","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":40,"op":220,"st":40,"bm":0},{"ddd":0,"ind":58,"ty":0,"nm":"19","refId":"comp_29","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-105,"op":75,"st":-105,"bm":0},{"ddd":0,"ind":59,"ty":0,"nm":"19","refId":"comp_29","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":75,"op":255,"st":75,"bm":0},{"ddd":0,"ind":60,"ty":0,"nm":"18","refId":"comp_30","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-125,"op":55,"st":-125,"bm":0},{"ddd":0,"ind":61,"ty":0,"nm":"18","refId":"comp_30","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":55,"op":235,"st":55,"bm":0},{"ddd":0,"ind":62,"ty":0,"nm":"17","refId":"comp_31","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-175,"op":5.00000000000001,"st":-175,"bm":0},{"ddd":0,"ind":63,"ty":0,"nm":"17","refId":"comp_31","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":5,"op":185,"st":5,"bm":0},{"ddd":0,"ind":64,"ty":0,"nm":"16","refId":"comp_32","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-100,"op":80,"st":-100,"bm":0},{"ddd":0,"ind":65,"ty":0,"nm":"16","refId":"comp_32","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":80,"op":260,"st":80,"bm":0},{"ddd":0,"ind":66,"ty":0,"nm":"15","refId":"comp_33","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-85,"op":95,"st":-85,"bm":0},{"ddd":0,"ind":67,"ty":0,"nm":"15","refId":"comp_33","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":95,"op":275,"st":95,"bm":0},{"ddd":0,"ind":68,"ty":0,"nm":"14","refId":"comp_34","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-140,"op":40,"st":-140,"bm":0},{"ddd":0,"ind":69,"ty":0,"nm":"14","refId":"comp_34","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":40,"op":220,"st":40,"bm":0},{"ddd":0,"ind":70,"ty":0,"nm":"13","refId":"comp_35","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":71,"ty":0,"nm":"12","refId":"comp_36","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-155,"op":25,"st":-155,"bm":0},{"ddd":0,"ind":72,"ty":0,"nm":"12","refId":"comp_36","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":25,"op":205,"st":25,"bm":0},{"ddd":0,"ind":73,"ty":0,"nm":"11","refId":"comp_37","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-175,"op":5.00000000000001,"st":-175,"bm":0},{"ddd":0,"ind":74,"ty":0,"nm":"11","refId":"comp_37","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":5,"op":185,"st":5,"bm":0},{"ddd":0,"ind":75,"ty":0,"nm":"10","refId":"comp_38","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-170,"op":9.99999999999999,"st":-170,"bm":0},{"ddd":0,"ind":76,"ty":0,"nm":"10","refId":"comp_38","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":10,"op":190,"st":10,"bm":0},{"ddd":0,"ind":77,"ty":0,"nm":"9","refId":"comp_39","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-125,"op":55,"st":-125,"bm":0},{"ddd":0,"ind":78,"ty":0,"nm":"9","refId":"comp_39","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":55,"op":235,"st":55,"bm":0},{"ddd":0,"ind":79,"ty":0,"nm":"8","refId":"comp_40","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-95,"op":85,"st":-95,"bm":0},{"ddd":0,"ind":80,"ty":0,"nm":"8","refId":"comp_40","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":85,"op":265,"st":85,"bm":0},{"ddd":0,"ind":81,"ty":0,"nm":"7","refId":"comp_41","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":82,"ty":0,"nm":"6","refId":"comp_42","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-135,"op":45,"st":-135,"bm":0},{"ddd":0,"ind":83,"ty":0,"nm":"6","refId":"comp_42","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":45,"op":225,"st":45,"bm":0},{"ddd":0,"ind":84,"ty":0,"nm":"5","refId":"comp_43","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-140,"op":40,"st":-140,"bm":0},{"ddd":0,"ind":85,"ty":0,"nm":"5","refId":"comp_43","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":40,"op":220,"st":40,"bm":0},{"ddd":0,"ind":86,"ty":0,"nm":"4","refId":"comp_44","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-160,"op":20,"st":-160,"bm":0},{"ddd":0,"ind":87,"ty":0,"nm":"4","refId":"comp_44","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":20,"op":200,"st":20,"bm":0},{"ddd":0,"ind":88,"ty":0,"nm":"3","refId":"comp_45","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-110,"op":70,"st":-110,"bm":0},{"ddd":0,"ind":89,"ty":0,"nm":"3","refId":"comp_45","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":70,"op":250,"st":70,"bm":0},{"ddd":0,"ind":90,"ty":0,"nm":"2","refId":"comp_46","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-150,"op":30,"st":-150,"bm":0},{"ddd":0,"ind":91,"ty":0,"nm":"2","refId":"comp_46","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":30,"op":210,"st":30,"bm":0},{"ddd":0,"ind":92,"ty":0,"nm":"1","refId":"comp_47","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":-130,"op":50,"st":-130,"bm":0},{"ddd":0,"ind":93,"ty":0,"nm":"1","refId":"comp_47","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.5,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[129.5,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":259,"h":259,"ip":50,"op":230,"st":50,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index fe6b7c60e..b9e673359 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -36,7 +36,9 @@ We\'ve sent the code to the **Telegram** app on your other device. We\'ve sent the code to the **Telegram** app for %1$s on your other device. Check your Telegram messages + Get the code for %1$s in the Anonymous Numbers section on Fragment. Enter code + Open Fragment We\'re calling your phone **%1$s**.\n\nDon\'t accept the call, Telegram will process everything automatically. Calling your phone **%1$s** to dictate the code. Telegram will call you in %1$d:%2$02d @@ -192,6 +194,10 @@ 1 week 1 day 1 hour + After 3 weeks + After 1 month + After 1 week + After 1 day Automatically delete new messages sent in this chat after a certain period of time. Never Never @@ -238,6 +244,7 @@ Secret GIF %1$s is using an older version of Telegram, so secret photos will be shown in compatibility mode.\n\nOnce %2$s updates Telegram, photos with timers for 1 minute or less will start working in \'Tap and hold to view\' mode, and you will be notified whenever the other party takes a screenshot. Messages + Messages in %s Search Mute forever Mute for %1$s @@ -503,6 +510,11 @@ Invite via Link Dismiss admin Edit permissions + Telegram Anti-Spam + Aggressive Anti-Spam + Telegram will filter more spam, but may occasionally affect ordinary messages. You can report False Positives in Recent Actions. + You can manage anti-spam settings in %s + Telegram moderators will review your report. Thank you! Only channel administrators can see this list. Anyone on Telegram will be able to join your channel by following this link. You can add administrators to help you manage your channel. Tap and hold to remove admins. @@ -1318,6 +1330,16 @@ Messages forwarded to **%1$s**. Message forwarded to **%1$s**. Messages forwarded to **%1$s**. + Message forwarded to **a chat**. + Message forwarded to **%1$d chats**. + Message forwarded to **%1$d chats**. + Message forwarded to **%1$d chats**. + Message forwarded to **%1$d chats**. + Messages forwarded to **a chat**. + Messages forwarded to **%1$d chats**. + Messages forwarded to **%1$d chats**. + Messages forwarded to **%1$d chats**. + Messages forwarded to **%1$d chats**. Background shared to **Saved Messages**. Background shared to **%1$s**. Background shared to **%1$s**. @@ -1682,6 +1704,41 @@ Add Stickers Add %1$s Remove %1$s + Add sticker + Add %1$d stickers + Add %1$d stickers + Add %1$d stickers + Add %1$d stickers + Remove sticker + Remove %1$d stickers + Remove %1$d stickers + Remove %1$d stickers + Remove %1$d stickers + Add emoji + Add %1$d emoji + Add %1$d emoji + Add %1$d emoji + Add %1$d emoji + Remove emoji + Remove %1$d emoji + Remove %1$d emoji + Remove %1$d emoji + Remove %1$d emoji + Remove emoji pack + Remove %1$d emoji packs + Remove %1$d emoji packs + Remove %1$d emoji packs + Remove %1$d emoji packs + Add mask + Add %1$d masks + Add %1$d masks + Add %1$d masks + Add %1$d masks + Remove mask + Remove %1$d masks + Remove %1$d masks + Remove %1$d masks + Remove %1$d masks Add Masks Add to Stickers Add to Favorites @@ -2303,7 +2360,7 @@ Free up disk space on your device; your media will stay in the cloud. Change Phone Number Move your account, chats and media to a new number. - Your phone number has been successfully changed. + Your phone number has been successfully changed to %1$s. Contact Support Tell us about any issues; logging out doesn\'t usually help. Log Out @@ -2790,6 +2847,7 @@ %1$s ft from you %1$s mi from you Directions + Get Directions No places found There are no matches with **%1$s** near you. Send my current location @@ -3353,6 +3411,7 @@ Decline & Delete Next Enable + Report False Positive You joined the group via invite link un1 deleted invite link un2 @@ -3493,8 +3552,17 @@ Number of last messages to forward: Add %1$s to the group? Add %1$s + Add member + Add %1$d members + Add %1$d members + Add %1$d members + Add %1$d members Add member Are you sure you want to add %1$s to **%2$s**? + Are you sure you want to add member to **%2$s**? + Are you sure you want to add %1$d members to **%2$s**? + Are you sure you want to add %1$d members to **%2$s**? + Are you sure you want to add %1$d members to **%2$s**? Are you sure you want to add %1$s to **%2$s**? Show the last 100 messages to the new members Show the last 100 messages to **%1$s** @@ -4872,6 +4940,7 @@ Group Channel + Topic Secret chat Sent %s Received %s @@ -4974,6 +5043,8 @@ Record video Swipe down for archive Release for archive + Swipe down for #general + Release for #general Smaller size Higher quality %1$s of %2$s @@ -5390,6 +5461,7 @@ Auto-Delete Disable Auto-delete after %s + After %s Choose time for auto-delete Choose time Enable sound @@ -5678,12 +5750,14 @@ Too many active links Sorry, you have too many active public links already. Please hide one of your active public links first. Hide + Unhide Show Drag and drop links to change the order in which they will be displayed on your info page. Drag and drop links to change the order in which they will be displayed on the channel info page. Topics New Topic Choose topic title and icon + Choose topic title What do you want to discuss? Topic was created Create topic @@ -5691,8 +5765,11 @@ Topic isn’t created, because you haven\'t posted a message.\n\nDo you want to discard this topic? Discard Edit topic + Show in Topics + If the \'General\' topic is hidden, group members can pull down in the topic list to view it. No topics here yet - You can start you first topic or tap on the\n%sicon to switch to the messages list. + Tap the button below to start your first topic. + Older messages from this group have been move to the **’%s’** topic. Tap to create a topic View as messages Close topic @@ -5721,6 +5798,10 @@ There are **%d topics** that are listed as exceptions. In %s Topic closed + General topic was hidden + %s hid general + General topic was unhidden + %s unhid general Topic reopened %s closed topic %s reopened topic @@ -5752,6 +5833,10 @@ Only groups with more than **%1$d members** can have topics enabled. Only groups with more than **%1$d members** can have topics enabled. Only groups with more than **%1$d members** can have topics enabled. + Only groups with more than **%1$d member** can have Anti-Spam enabled. + Only groups with more than **%1$d members** can have Anti-Spam enabled. + Only groups with more than **%1$d members** can have Anti-Spam enabled. + Only groups with more than **%1$d members** can have Anti-Spam enabled. Topics are currently unavailable in groups connected to channels. topic creator Manage topics @@ -5788,4 +5873,43 @@ Saturation Alternative navigation General + Test Backend + Device usage by chats + This video has invalid URL. + An error occurred while trying to play this video. + Video not found. + This video can\'t be played inside this app. + Watch on YouTube + Anonymous Number + This number is not tied to a SIM card and was acquired on *Fragment.* + Auto-Delete Messages + Set Custom Time + If enabled, all new messages in chats you start will be automatically deleted for everyone at some point after they have been sent. You can also **apply this setting for your existing chats.** + auto-deletion disabled + Are you sure you want all messages in new chats started by you to be automatically deleted for everyone %s after they have been sent? + to disable the self-destruct timer + Messages in all new chats you start will be automatically deleted after **%s.** + Self-destruct timer disabled for all new chats. + Automatically delete messages for everyone after a period of time in all new chats you start. + Self-destruct timer for **%1$s** has been enabled in %2$s. + Self-destruct timer has been disabled in %s. + You can also set your default **self-destruct timer** for all chats in Settings. + Automatically delete messages in this group for everyone after a period of time. + **un1** uses a self-destruct timer for all chats.\nAll new messages in this chat will be automatically deleted after **%1$s** they’ve been sent. + **You** set a self-destruct timer for all chats.\nAll new messages in this chat will be automatically deleted after **%s** they’ve been sent. + You need admin rights in this group to enable auto-delete. + Set Auto-Delete + Set custom time + Other Chats + Are you sure you want to delete cached data for selected chats? + to apply the self-destruct timer + will have the self-destruct timer + will have the self-destruct timer + will have the self-destruct timer + will have the self-destruct timer + will remove the self-destruct timer + will remove the self-destruct timer + will remove the self-destruct timer + will remove the self-destruct timer + Disable Auto-Delete diff --git a/gradle.properties b/gradle.properties index 4856ec79d..25a68b5ba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Sat Mar 12 05:53:50 MSK 2016 -APP_VERSION_NAME=9.1.6 -APP_VERSION_CODE=2929 +APP_VERSION_NAME=9.2.0 +APP_VERSION_CODE=2956 APP_PACKAGE=org.telegram.messenger RELEASE_KEY_PASSWORD=TelegramAndroidPswd RELEASE_KEY_ALIAS=tmessages