得物.apk(点击下载) / MiniApi.java


package com.shizhuang.duapp.modules.rn;

import a40.f;
import a91.i;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.os.MessageQueue;
import android.text.TextUtils;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.ReactMarker;
import com.facebook.react.bridge.ReactMarkerConstants;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.image.IImageUrlParser;
import com.facebook.react.image.ReactImageUrlManager;
import com.facebook.react.util.ReactEventRecorder;
import com.meituan.robust.ChangeQuickRedirect;
import com.meituan.robust.PatchProxy;
import com.meituan.robust.PatchProxyResult;
import com.shizhuang.duapp.modules.rn.iface.IMiniBridgeFactory;
import com.shizhuang.duapp.modules.rn.iface.IMiniFontFamilyFactory;
import com.shizhuang.duapp.modules.rn.iface.IMiniLoadInterceptor;
import com.shizhuang.duapp.modules.rn.iface.IMiniStorageFactory;
import com.shizhuang.duapp.modules.rn.iface.MiniExceptionHandler;
import com.shizhuang.duapp.modules.rn.mini.MiniEnvironment;
import com.shizhuang.duapp.modules.rn.mini.MiniReactActivity;
import com.shizhuang.duapp.modules.rn.models.MiniOption;
import com.shizhuang.duapp.modules.rn.modules.event.MiniEventHandlerRegister;
import com.shizhuang.duapp.modules.rn.net.DownloadHelper;
import com.shizhuang.duapp.modules.rn.net.download.MaxRequestDownloadStrategy;
import com.shizhuang.duapp.modules.rn.utils.ILog;
import com.shizhuang.duapp.modules.rn.utils.MiniFileUtils;
import com.shizhuang.duapp.modules.rn.utils.MiniThreadUtil;
import com.shizhuang.duapp.modules.rn.utils.MiniUpdateTask;
import com.shizhuang.duapp.modules.rn.utils.MiniUpdateTask$testLocalBundle$2;
import com.shizhuang.duapp.modules.rn.utils.MiniUpdateTask$testLocalBundle$3;
import com.shizhuang.duapp.modules.rn.utils.MiniUpdateTask$testLocalBundle$4;
import i91.g;
import i91.k;
import i91.r;
import java.util.Arrays;
import java.util.Locale;
import kotlin.Lazy;
import kotlin.LazyKt__LazyJVMKt;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.internal.Intrinsics;
import kotlin.text.StringsKt__StringsJVMKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import z81.e;

/* compiled from: MiniApi.kt */
public final class MiniApi {
    @NotNull

    /* renamed from: a  reason: collision with root package name */
    public static z81.c f24702a = null;
    private static MiniActivityLifecycle activityLifecycle = null;
    @NotNull
    public static Application b = null;
    @NotNull
    private static final Lazy bridgeFactory$delegate = LazyKt__LazyJVMKt.lazy(MiniApi$bridgeFactory$2.INSTANCE);
    @NotNull

    /* renamed from: c  reason: collision with root package name */
    public static e f24703c = null;
    public static ChangeQuickRedirect changeQuickRedirect = null;
    public static final MiniApi d = new MiniApi();
    @Nullable
    private static final Lazy extendPackage$delegate = LazyKt__LazyJVMKt.lazy(MiniApi$extendPackage$2.INSTANCE);
    @Nullable
    private static final Lazy fontFamilyFactory$delegate = LazyKt__LazyJVMKt.lazy(MiniApi$fontFamilyFactory$2.INSTANCE);
    private static boolean isOversea = false;
    private static boolean isTest = false;
    private static boolean mIsInit = false;
    @Nullable
    private static final Lazy storageFactory$delegate = LazyKt__LazyJVMKt.lazy(MiniApi$storageFactory$2.INSTANCE);
    @NotNull
    private static final Lazy urlParser$delegate = LazyKt__LazyJVMKt.lazy(MiniApi$urlParser$2.INSTANCE);
    @NotNull
    private static final String versionName = versionName;

    /* compiled from: MiniApi.kt */
    public static final class a implements ReactMarker.MarkerListener {

        /* renamed from: a  reason: collision with root package name */
        public static final a f24704a = new a();
        public static ChangeQuickRedirect changeQuickRedirect;

        @Override // com.facebook.react.bridge.ReactMarker.MarkerListener
        public final void logMarker(ReactMarkerConstants reactMarkerConstants, @Nullable String str, int i) {
            if (!PatchProxy.proxy(new Object[]{reactMarkerConstants, str, new Integer(i)}, this, changeQuickRedirect, false, 311604, new Class[]{ReactMarkerConstants.class, String.class, Integer.TYPE}, Void.TYPE).isSupported) {
                g.e("ReactMarker", reactMarkerConstants + ' ' + str);
            }
        }
    }

    /* compiled from: MiniApi.kt */
    public static final class b implements IImageUrlParser {
        public static ChangeQuickRedirect changeQuickRedirect;

        @Override // com.facebook.react.image.IImageUrlParser
        @Nullable
        public String parse(@Nullable String str) {
            PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, this, changeQuickRedirect, false, 311605, new Class[]{String.class}, String.class);
            return proxy.isSupported ? (String) proxy.result : MiniApi.d.n().parse(str);
        }

        @Override // com.facebook.react.image.IImageUrlParser
        @Nullable
        public String parseSource(@NotNull ReadableMap readableMap) {
            PatchProxyResult proxy = PatchProxy.proxy(new Object[]{readableMap}, this, changeQuickRedirect, false, 311606, new Class[]{ReadableMap.class}, String.class);
            if (proxy.isSupported) {
                return (String) proxy.result;
            }
            MiniApi miniApi = MiniApi.d;
            Object[] objArr = {readableMap};
            PatchProxyResult proxy2 = PatchProxy.proxy(objArr, miniApi.n(), b91.a.changeQuickRedirect, false, 312458, new Class[]{ReadableMap.class}, String.class);
            if (proxy2.isSupported) {
                return (String) proxy2.result;
            }
            String string = readableMap.getString("uri");
            String k = k.k(readableMap, "filePath");
            String k6 = k.k(readableMap, "miniId");
            miniApi.f().f();
            if (!(k == null || k6 == null)) {
                String h12 = MiniFileUtils.h(MiniFileUtils.f24782a, MiniEnvironment.f24725a.g(k6), false, 2);
                i91.c cVar = i91.c.f33354a;
                String i = cVar.i(h12, k);
                boolean h13 = cVar.h(i);
                miniApi.f().f();
                if (h13) {
                    return f.g("file://", i);
                }
            }
            return string;
        }
    }

    /* compiled from: MiniApi.kt */
    public static final class c implements MessageQueue.IdleHandler {
        public static final c b = new c();
        public static ChangeQuickRedirect changeQuickRedirect;

        public final boolean queueIdle() {
            PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311607, new Class[0], Boolean.TYPE);
            if (proxy.isSupported) {
                return ((Boolean) proxy.result).booleanValue();
            }
            if (!PatchProxy.proxy(new Object[]{null}, MiniUpdateTask.f24785a, MiniUpdateTask.changeQuickRedirect, false, 312857, new Class[]{Function0.class}, Void.TYPE).isSupported) {
                MiniApi miniApi = MiniApi.d;
                String d = miniApi.f().d();
                if (d != null) {
                    Application c5 = miniApi.c();
                    g.f("MiniUpdateTask", "testLocalBundle configAssetPath:" + d);
                    r.b(MiniThreadUtil.f24784a.a(new MiniUpdateTask$testLocalBundle$2(c5, d)), new MiniUpdateTask$testLocalBundle$3(null), MiniUpdateTask$testLocalBundle$4.INSTANCE, null, 4);
                } else {
                    throw new IllegalStateException("can not found config localPackageConfigAssetPath".toString());
                }
            }
            return false;
        }
    }

    public final void b() {
        if (!PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311580, new Class[0], Void.TYPE).isSupported && !r()) {
            throw new IllegalStateException("Please MiniApi.initialize First!!!".toString());
        }
    }

    @NotNull
    public final Application c() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311561, new Class[0], Application.class);
        if (proxy.isSupported) {
            return (Application) proxy.result;
        }
        Application application = b;
        if (application == null) {
            Intrinsics.throwUninitializedPropertyAccessException("application");
        }
        return application;
    }

    public final String d() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311572, new Class[0], String.class);
        if (proxy.isSupported) {
            return (String) proxy.result;
        }
        return isOversea ? "https://oversea-apk.poizon.com" : "https://apk.poizon.com";
    }

    @NotNull
    public final IMiniBridgeFactory e() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311567, new Class[0], IMiniBridgeFactory.class);
        return (IMiniBridgeFactory) (proxy.isSupported ? proxy.result : bridgeFactory$delegate.getValue());
    }

    @NotNull
    public final z81.c f() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311559, new Class[0], z81.c.class);
        if (proxy.isSupported) {
            return (z81.c) proxy.result;
        }
        z81.c cVar = f24702a;
        if (cVar == null) {
            Intrinsics.throwUninitializedPropertyAccessException("config");
        }
        return cVar;
    }

    public final String g() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311573, new Class[0], String.class);
        if (proxy.isSupported) {
            return (String) proxy.result;
        }
        return k.n(d(), isTest ? "/du_rn/test/config/%s_%d_android_%s.json?t=%d" : "/du_rn/config/%s_%d_android_%s.json");
    }

    @Nullable
    public final ReactPackage h() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311569, new Class[0], ReactPackage.class);
        return (ReactPackage) (proxy.isSupported ? proxy.result : extendPackage$delegate.getValue());
    }

    @Nullable
    public final IMiniFontFamilyFactory i() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311568, new Class[0], IMiniFontFamilyFactory.class);
        return (IMiniFontFamilyFactory) (proxy.isSupported ? proxy.result : fontFamilyFactory$delegate.getValue());
    }

    @NotNull
    public final String j() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311583, new Class[0], String.class);
        if (proxy.isSupported) {
            return (String) proxy.result;
        }
        String string = MiniEnvironment.f24725a.i().getString("mini_package_mode", "");
        return string != null ? string : "";
    }

    @NotNull
    public final String k() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311575, new Class[0], String.class);
        if (proxy.isSupported) {
            return (String) proxy.result;
        }
        String g3 = g();
        Locale locale = Locale.US;
        Object[] objArr = new Object[4];
        z81.c cVar = f24702a;
        if (cVar == null) {
            Intrinsics.throwUninitializedPropertyAccessException("config");
        }
        objArr[0] = cVar.b();
        objArr[1] = 4;
        objArr[2] = u();
        objArr[3] = Long.valueOf(System.currentTimeMillis());
        return String.format(locale, g3, Arrays.copyOf(objArr, 4));
    }

    @NotNull
    public final e l() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311563, new Class[0], e.class);
        if (proxy.isSupported) {
            return (e) proxy.result;
        }
        e eVar = f24703c;
        if (eVar == null) {
            Intrinsics.throwUninitializedPropertyAccessException("snapShotConfig");
        }
        return eVar;
    }

    @Nullable
    public final IMiniStorageFactory m() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311570, new Class[0], IMiniStorageFactory.class);
        return (IMiniStorageFactory) (proxy.isSupported ? proxy.result : storageFactory$delegate.getValue());
    }

    @NotNull
    public final b91.a n() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311571, new Class[0], b91.a.class);
        return (b91.a) (proxy.isSupported ? proxy.result : urlParser$delegate.getValue());
    }

    public final void o(@NotNull Application application, @NotNull z81.c cVar) {
        e eVar;
        boolean z;
        boolean z4;
        ILog iLog;
        MiniEventHandlerRegister miniEventHandlerRegister;
        MiniExceptionHandler miniExceptionHandler;
        IMiniLoadInterceptor iMiniLoadInterceptor;
        boolean z5;
        boolean z12;
        boolean z13;
        int i;
        boolean z14;
        if (!PatchProxy.proxy(new Object[]{application, cVar}, this, changeQuickRedirect, false, 311579, new Class[]{Application.class, z81.c.class}, Void.TYPE).isSupported && !mIsInit) {
            MiniThreadUtil miniThreadUtil = MiniThreadUtil.f24784a;
            if (!PatchProxy.proxy(new Object[]{"MiniApi.initialize"}, miniThreadUtil, MiniThreadUtil.changeQuickRedirect, false, 312829, new Class[]{String.class}, Void.TYPE).isSupported) {
                PatchProxyResult proxy = PatchProxy.proxy(new Object[0], miniThreadUtil, MiniThreadUtil.changeQuickRedirect, false, 312828, new Class[0], Boolean.TYPE);
                if (proxy.isSupported) {
                    z14 = ((Boolean) proxy.result).booleanValue();
                } else {
                    z14 = Looper.getMainLooper().getThread() == Thread.currentThread();
                }
                if (!z14) {
                    throw new IllegalAccessException("Expected to run on UI thread! MiniApi.initialize");
                }
            }
            mIsInit = true;
            b = application;
            f24702a = cVar;
            PatchProxyResult proxy2 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311636, new Class[0], e.class);
            if (proxy2.isSupported) {
                eVar = (e) proxy2.result;
            } else {
                eVar = cVar.y;
            }
            f24703c = eVar;
            Class cls = Boolean.TYPE;
            PatchProxyResult proxy3 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311617, new Class[0], cls);
            if (proxy3.isSupported) {
                z = ((Boolean) proxy3.result).booleanValue();
            } else {
                z = cVar.f;
            }
            isOversea = z;
            PatchProxyResult proxy4 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311618, new Class[0], cls);
            if (proxy4.isSupported) {
                z4 = ((Boolean) proxy4.result).booleanValue();
            } else {
                z4 = cVar.f40597g;
            }
            isTest = z4;
            PatchProxyResult proxy5 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311623, new Class[0], ILog.class);
            if (proxy5.isSupported) {
                iLog = (ILog) proxy5.result;
            } else {
                iLog = cVar.l;
            }
            if (iLog != null) {
                g.d(iLog);
            }
            MiniEnvironment miniEnvironment = MiniEnvironment.f24725a;
            miniEnvironment.f().add(new a91.a());
            PatchProxyResult proxy6 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311622, new Class[0], MiniEventHandlerRegister.class);
            if (proxy6.isSupported) {
                miniEventHandlerRegister = (MiniEventHandlerRegister) proxy6.result;
            } else {
                miniEventHandlerRegister = cVar.k;
            }
            if (miniEventHandlerRegister != null) {
                miniEnvironment.f().add(miniEventHandlerRegister);
            }
            PatchProxyResult proxy7 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311625, new Class[0], MiniExceptionHandler.class);
            if (proxy7.isSupported) {
                miniExceptionHandler = (MiniExceptionHandler) proxy7.result;
            } else {
                miniExceptionHandler = cVar.n;
            }
            miniEnvironment.t(miniExceptionHandler);
            PatchProxyResult proxy8 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311628, new Class[0], IMiniLoadInterceptor.class);
            if (proxy8.isSupported) {
                iMiniLoadInterceptor = (IMiniLoadInterceptor) proxy8.result;
            } else {
                iMiniLoadInterceptor = cVar.f40599q;
            }
            miniEnvironment.u(iMiniLoadInterceptor);
            MiniActivityLifecycle miniActivityLifecycle = new MiniActivityLifecycle();
            activityLifecycle = miniActivityLifecycle;
            application.registerActivityLifecycleCallbacks(miniActivityLifecycle);
            if (cVar.f()) {
                ReactMarker.addListener(a.f24704a);
            }
            ReactImageUrlManager.setUrlParser(new b());
            PatchProxyResult proxy9 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311642, new Class[0], cls);
            if (proxy9.isSupported) {
                z5 = ((Boolean) proxy9.result).booleanValue();
            } else {
                z5 = cVar.E;
            }
            if (z5) {
                ReactEventRecorder.registerEventRecorder(new i(application));
            }
            PatchProxyResult proxy10 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311616, new Class[0], cls);
            if (proxy10.isSupported) {
                z12 = ((Boolean) proxy10.result).booleanValue();
            } else {
                z12 = cVar.e;
            }
            if (z12) {
                String d12 = cVar.d();
                if (!(d12 == null || StringsKt__StringsJVMKt.isBlank(d12))) {
                    Looper.myQueue().addIdleHandler(c.b);
                }
            }
            PatchProxyResult proxy11 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311644, new Class[0], cls);
            if (proxy11.isSupported) {
                z13 = ((Boolean) proxy11.result).booleanValue();
            } else {
                z13 = cVar.G;
            }
            if (z13) {
                DownloadHelper downloadHelper = DownloadHelper.f24764a;
                PatchProxyResult proxy12 = PatchProxy.proxy(new Object[0], cVar, z81.c.changeQuickRedirect, false, 311645, new Class[0], Integer.TYPE);
                if (proxy12.isSupported) {
                    i = ((Integer) proxy12.result).intValue();
                } else {
                    i = cVar.H;
                }
                downloadHelper.d(new MaxRequestDownloadStrategy(i));
            }
        }
    }

    public final boolean p() {
        return TextUtils.equals(j(), "debug");
    }

    public final boolean q() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311581, new Class[0], Boolean.TYPE);
        return proxy.isSupported ? ((Boolean) proxy.result).booleanValue() : MiniEnvironment.f24725a.i().getBoolean("mini_is_develop", false);
    }

    public final boolean r() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311578, new Class[0], Boolean.TYPE);
        return proxy.isSupported ? ((Boolean) proxy.result).booleanValue() : mIsInit;
    }

    public final boolean s() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311565, new Class[0], Boolean.TYPE);
        return proxy.isSupported ? ((Boolean) proxy.result).booleanValue() : isOversea;
    }

    public final void t(@Nullable Context context, @NotNull MiniOption miniOption) {
        Context context2;
        Class<? extends Activity> cls;
        MiniOption miniOption2;
        if (!PatchProxy.proxy(new Object[]{context, miniOption}, this, changeQuickRedirect, false, 311587, new Class[]{Context.class, MiniOption.class}, Void.TYPE).isSupported) {
            b();
            if (context != null) {
                context2 = context;
            } else {
                context2 = b;
                if (context2 == null) {
                    Intrinsics.throwUninitializedPropertyAccessException("application");
                }
            }
            if (miniOption.isTranslucent()) {
                cls = MiniReactActivity.MiniUITranslucentReactActivity.class;
            } else if (miniOption.getMultiPage()) {
                cls = MiniReactActivity.MiniUIXReactActivity.class;
            } else {
                cls = MiniEnvironment.f24725a.c(miniOption.getMiniId());
            }
            Intent intent = new Intent(context2, cls);
            if (!(context2 instanceof Activity)) {
                intent.addFlags(268435456);
            }
            if (miniOption.getAnim() == null) {
                z81.c cVar = f24702a;
                if (cVar == null) {
                    Intrinsics.throwUninitializedPropertyAccessException("config");
                }
                if (cVar.a() != null) {
                    z81.c cVar2 = f24702a;
                    if (cVar2 == null) {
                        Intrinsics.throwUninitializedPropertyAccessException("config");
                    }
                    miniOption2 = MiniOption.copy$default(miniOption, null, null, null, null, null, null, null, null, null, null, false, false, false, false, cVar2.a(), false, null, 114687, null);
                    intent.putExtra("mini_options", miniOption2);
                    context2.startActivity(intent);
                    if ((context2 instanceof Activity) && miniOption2.getAnim() != null) {
                        ((Activity) context2).overridePendingTransition(miniOption2.getAnim().getOpenEnter(), miniOption2.getAnim().getOpenExit());
                        return;
                    }
                }
            }
            miniOption2 = miniOption;
            intent.putExtra("mini_options", miniOption2);
            context2.startActivity(intent);
            if (context2 instanceof Activity) {
            }
        }
    }

    @NotNull
    public final String u() {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[0], this, changeQuickRedirect, false, 311599, new Class[0], String.class);
        if (proxy.isSupported) {
            return (String) proxy.result;
        }
        String j = j();
        int hashCode = j.hashCode();
        if (hashCode != -2035589148) {
            if (hashCode == 95458899 && j.equals("debug")) {
                return "debug";
            }
        } else if (j.equals("preRelease")) {
            return "preRelease";
        }
        return "release";
    }

    public final void v(@NotNull String str, @NotNull Bundle bundle) {
        if (!PatchProxy.proxy(new Object[]{str, bundle}, this, changeQuickRedirect, false, 311588, new Class[]{String.class, Bundle.class}, Void.TYPE).isSupported) {
            b();
            MiniEnvironment.f24725a.q(str, bundle);
        }
    }

    public final void w(boolean z) {
        MiniActivityLifecycle miniActivityLifecycle = activityLifecycle;
        if (miniActivityLifecycle != null) {
            miniActivityLifecycle.b();
        }
        String str = z ? "debug" : "release";
        if (!PatchProxy.proxy(new Object[]{str}, this, changeQuickRedirect, false, 311584, new Class[]{String.class}, Void.TYPE).isSupported) {
            MiniActivityLifecycle miniActivityLifecycle2 = activityLifecycle;
            if (miniActivityLifecycle2 != null) {
                miniActivityLifecycle2.b();
            }
            MiniEnvironment.f24725a.i().putString("mini_package_mode", str);
        }
    }

    public final void x(boolean z) {
        if (!PatchProxy.proxy(new Object[]{new Byte(z ? (byte) 1 : 0)}, this, changeQuickRedirect, false, 311582, new Class[]{Boolean.TYPE}, Void.TYPE).isSupported) {
            MiniActivityLifecycle miniActivityLifecycle = activityLifecycle;
            if (miniActivityLifecycle != null) {
                miniActivityLifecycle.b();
            }
            MiniEnvironment.f24725a.i().putBoolean("mini_is_develop", z);
        }
    }
}