导航菜单

页面标题

页面副标题

Petal Maps v4.7.0.310001 - FaqSdk.java 源代码

正在查看: Petal Maps v4.7.0.310001 应用的 FaqSdk.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package com.huawei.phoneservice.faq.base.util;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Pair;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.Gson;
import com.huawei.hms.framework.network.grs.GrsBaseInfo;
import com.huawei.hms.framework.network.grs.GrsClient;
import com.huawei.hms.framework.network.grs.IQueryUrlsCallBack;
import com.huawei.hms.framework.network.restclient.hwhttp.Callback;
import com.huawei.hms.framework.network.restclient.hwhttp.Submit;
import com.huawei.phoneservice.faq.base.constants.FaqConstants;
import com.huawei.phoneservice.faq.base.entity.Builder;
import com.huawei.phoneservice.faq.base.entity.FaqSdkServiceUrlResponse;
import com.huawei.phoneservice.faq.base.entity.ModuleConfigRequest;
import com.huawei.phoneservice.faq.base.entity.ModuleConfigResponse;
import com.huawei.phoneservice.faq.base.network.FaqCallback;
import com.huawei.phoneservice.faq.base.network.FaqRestClient;
import com.huawei.phoneservice.faq.base.network.FaqSdkAddressApi;
import com.huawei.phoneservice.faq.base.network.SdkAppInfo;
import com.huawei.phoneservice.faq.base.tracker.HiAnalyticsUtils;
import com.huawei.phoneservice.faq.base.util.FaqHandler;
import java.io.File;
import java.lang.ref.WeakReference;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import org.json.JSONObject;

public final class FaqSdk implements ISdk, Sdk, FaqHandler.CallBack {
    public Application a;
    public Handler b;
    public volatile com.huawei.phoneservice.faq.base.b c;
    public volatile com.huawei.phoneservice.faq.base.c d;
    public WeakReference<SdkListener> e;
    public WeakReference<SdkClickListener> f;
    public Map<String, String> g;
    public Map<String, String> h;
    public String i;
    public Map<String, String> j;
    public FaqBaseCallback k;
    public List<SdkUpdateListener> l;

    public class a extends FaqCallback<FaqSdkServiceUrlResponse> {
        public final String d;

        public a(Class cls, Activity activity, String str) {
            super(cls, activity);
            this.d = str;
        }

        @Override
        public void onResult(@Nullable Throwable th, @Nullable FaqSdkServiceUrlResponse faqSdkServiceUrlResponse) {
            FaqSdk faqSdk;
            String str;
            if (th != null || faqSdkServiceUrlResponse == null) {
                FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.NO_ADDRESS_SERVICE;
                faqSdk = FaqSdk.this;
                str = "no address, network err";
            } else {
                if (!FaqCommonUtils.isEmpty(faqSdkServiceUrlResponse.a())) {
                    FaqSdk.this.e(faqSdkServiceUrlResponse, this.d);
                    return;
                }
                FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.NO_ADDRESS;
                faqSdk = FaqSdk.this;
                str = "no address in countryCode data is null";
            }
            faqSdk.onSdkInit(-1, str);
            FaqLogger.print("SDK_ERROR", str);
        }
    }

    public class b extends FaqCallback<ModuleConfigResponse> {
        public b(Class cls, Activity activity) {
            super(cls, activity);
        }

        @Override
        public void onResult(@Nullable Throwable th, @Nullable ModuleConfigResponse moduleConfigResponse) {
            String str;
            String str2;
            ModuleConfigUtils.cleanSdkModuleList(FaqSdk.this.a);
            if (th == null && moduleConfigResponse != null) {
                FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.INIT_SUCCESS;
                List<ModuleConfigResponse.ModuleListBean> moduleList = moduleConfigResponse.getModuleList();
                if (!FaqCommonUtils.isEmpty(moduleList)) {
                    ModuleConfigUtils.genSdkModuleList(FaqSdk.this.a, moduleList);
                    for (ModuleConfigResponse.ModuleListBean moduleListBean : moduleList) {
                        if (FaqConstants.MODULE_CONTACT.equals(moduleListBean.getModuleCode())) {
                            str = moduleListBean.getLinkAddress();
                            str2 = moduleListBean.getOpenType();
                            break;
                        }
                    }
                } else {
                    FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.NO_MODULE;
                    FaqLogger.print("FaqSdk", "MODULE LIST IS NULL");
                }
            } else {
                FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.NO_MODULE_SERVICE;
            }
            str = "";
            str2 = "";
            if (FaqSdk.this.a != null) {
                FaqSharePrefUtil.save(FaqSdk.this.a, FaqSharePrefUtil.FAQ_IPCC_FILENAME, FaqSharePrefUtil.FAQ_IPCC_KEY, str);
                FaqSharePrefUtil.save(FaqSdk.this.a, FaqSharePrefUtil.FAQ_IPCC_FILENAME, FaqSharePrefUtil.FAQ_IPCC_TYPE, str2);
            }
            FaqSdk.this.onSdkInit(0, null);
        }
    }

    public class c implements IQueryUrlsCallBack {
        public final GrsClient a;
        public final String b;

        public c(GrsClient grsClient, String str) {
            this.a = grsClient;
            this.b = str;
        }

        public void onCallBackFail(int i) {
            FaqLogger.print("FaqSdk", "testsynGetGrsUrlsGRSIndependent method failed and the errorCode is" + i);
            FaqLogger.d("FaqSdk", "IS_CONSUMER");
            FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.NO_GRS_ADDRESS;
            FaqSdk.this.onSdkInit(-1, "can not get address from GRS. errorCode" + i);
            FaqLogger.print("FaqSdk", "can not get address from GRS. errorCode" + i);
        }

        public void onCallBackSuccess(Map<String, String> map) {
            FaqLogger.print("FaqSdk", "getGrsUrls success ");
            if (map == null || map.isEmpty()) {
                FaqLogger.e("FaqSdk", "urlMap is null");
                return;
            }
            String synGetGrsUrl = this.a.synGetGrsUrl(FaqConstants.GRS_LOGSERVER_SERVICE_NAME, FaqConstants.GRS_SERVICE_KEY_LOGSERVICE);
            if (!TextUtils.isEmpty(synGetGrsUrl)) {
                map.put(FaqConstants.GRS_SERVICE_KEY_LOGSERVICE, synGetGrsUrl);
            }
            FaqUtil.d(map, FaqSdk.this.g);
            try {
                FaqSdk.this.k(this.b);
            } catch (Exception e) {
                FaqSdk.this.c = com.huawei.phoneservice.faq.base.b.NO_ADDRESS_SERVICE;
                FaqSdk.this.onSdkInit(-1, "FaqSdk getServiceByNet " + e.getMessage());
            }
        }
    }

    public static class d {
        public static final FaqSdk a = new FaqSdk(null);
    }

    public static class e extends TimerTask {
        public final SdkUpdateListener a;

        public e(SdkUpdateListener sdkUpdateListener) {
            this.a = sdkUpdateListener;
        }

        @Override
        public void run() {
            this.a.onSdkUpdate("accessToken", null, null);
            FaqLogger.print("FaqSdk", "GET TOKEN TIME OUT");
        }
    }

    public FaqSdk() {
        this.c = com.huawei.phoneservice.faq.base.b.INIT_FAIL;
        this.d = com.huawei.phoneservice.faq.base.c.INIT_PROGRESS;
        this.h = new HashMap();
        this.j = new HashMap();
    }

    public static FaqSdk c() {
        return d.a;
    }

    @Keep
    public static ISdk getISdk() {
        return c();
    }

    @Keep
    public static Sdk getSdk() {
        return c();
    }

    private void h(@NonNull String str) {
        ModuleConfigRequest moduleConfigRequest = new ModuleConfigRequest(str, getSdk("language"), FaqUtil.getBrand(), getSdk(FaqConstants.FAQ_CHANNEL), getSdk().getSdk(FaqConstants.FAQ_SHASN), FaqDeviceUtils.getSpecialEmuiVersion(), getSdk(FaqConstants.FAQ_APPVERSION), getSdk(FaqConstants.FAQ_MODEL), FaqDeviceUtils.getMachineType());
        FaqLogger.print("FaqSdk", moduleConfigRequest.toString());
        FaqSdkAddressApi.d.a(this.a).a(moduleConfigRequest, new b(ModuleConfigResponse.class, null));
    }

    @Override
    public synchronized int apply() {
        if (this.g == null || this.a == null) {
            return -1;
        }
        ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(this.g);
        this.h.putAll(this.g);
        concurrentHashMap.remove("accessToken");
        concurrentHashMap.remove(FaqConstants.FAQ_REFRESH);
        concurrentHashMap.remove(FaqConstants.FAQ_LOG_SERVER_SECRET_KEY);
        FaqSharePrefUtil.delete(this.a, FaqConstants.SDK_SP_FILE_NAME, FaqConstants.SDK_SP_KEY);
        FaqSharePrefUtil.save(this.a, FaqConstants.SDK_SP_FILE_NAME, FaqConstants.SDK_SP_KEY, new JSONObject(concurrentHashMap).toString());
        return 0;
    }

    @Override
    public void canceledSubmit(Context context) {
        FaqRestClient.initRestClientAnno(context).canceledSubmit(context);
    }

    @Override
    public boolean clearDownloadFile(Application application) {
        if (FaqStringUtil.isEmpty(FaqFileUtils.getCompressFolder(application))) {
            return false;
        }
        String compressFolder = FaqFileUtils.getCompressFolder(application);
        return !TextUtils.isEmpty(compressFolder) && i(FaqFileUtils.getDownloadFolder(application)) && i(new File(compressFolder));
    }

    public final void d(GrsClient grsClient, String str) {
        grsClient.ayncGetGrsUrls(FaqConstants.GRS_SERVICE_NAME, new c(grsClient, str));
    }

    public final void e(@NonNull FaqSdkServiceUrlResponse faqSdkServiceUrlResponse, @NonNull String str) {
        boolean z;
        Iterator<FaqSdkServiceUrlResponse.ServiceUrl> it = faqSdkServiceUrlResponse.a().iterator();
        while (true) {
            if (!it.hasNext()) {
                z = false;
                break;
            }
            FaqSdkServiceUrlResponse.ServiceUrl next = it.next();
            if (str.equals(next.a())) {
                FaqUtil.c(next, this.g);
                Application application = this.a;
                if (application != null) {
                    HiAnalyticsUtils.a(application, next.b(), true, false);
                }
                z = !TextUtils.isEmpty("Y".equals(getSdk().getSdk(FaqConstants.FAQ_USE_OLD_DOMAIN)) ? next.c() : next.d());
            }
        }
        if ("Y".equals(getSdk().getSdk(FaqConstants.FAQ_IS_DEEPLICK))) {
            this.c = com.huawei.phoneservice.faq.base.b.INIT_SUCCESS;
            onSdkInit(0, null);
        } else {
            if (z) {
                h(str);
                return;
            }
            this.c = com.huawei.phoneservice.faq.base.b.NO_ADDRESS;
            onSdkInit(-1, "no address in countryCode:" + str);
            FaqLogger.print("SDK_ERROR", "no address in countryCode:");
        }
    }

    @Override
    public FaqBaseCallback getCallback() {
        return this.k;
    }

    @Override
    public String getMap() {
        return new Gson().toJson(FaqUtil.b(this.g));
    }

    @Override
    public String getMapOnSaveInstance() {
        this.j.clear();
        return new JSONObject(this.h).toString();
    }

    @Override
    public void getModuleList() {
        h(this.i);
    }

    @Override
    public int getSdkInitCode() {
        return this.c.a();
    }

    @Override
    public synchronized SdkListener getSdkListener() {
        WeakReference<SdkListener> weakReference = this.e;
        if (weakReference == null) {
            return null;
        }
        return weakReference.get();
    }

    @Override
    public String getSdkVersion() {
        return "24.9.0.1";
    }

    @Override
    public void getServiceUrl() {
        k(this.i);
    }

    @Override
    public boolean hadAddress() {
        return this.c.c();
    }

    @Override
    public void handleMessage(int i, Message message) {
        SdkListener sdkListener;
        if (i != 0) {
            return;
        }
        Object obj = message.obj;
        if (obj instanceof Pair) {
            Pair pair = (Pair) obj;
            WeakReference<SdkListener> weakReference = this.e;
            if (weakReference == null || weakReference.get() == null || (sdkListener = this.e.get()) == null) {
                return;
            }
            sdkListener.onSdkErr((String) pair.first, (String) pair.second);
        }
    }

    @Override
    public boolean haveSdkErr(String str) {
        SdkListener sdkListener;
        WeakReference<SdkListener> weakReference = this.e;
        if (weakReference == null || this.b == null || (sdkListener = weakReference.get()) == null) {
            return false;
        }
        return sdkListener.haveSdkErr(str);
    }

    public final boolean i(File file) {
        boolean z = true;
        if (file == null || !file.exists()) {
            FaqLogger.print("FILE DELETE", "FILE IS NOT EXISTS" + file);
            return true;
        }
        if (!file.isDirectory()) {
            return false;
        }
        File[] listFiles = file.listFiles();
        if (listFiles == null) {
            return true;
        }
        for (File file2 : listFiles) {
            z &= file2.delete();
            if (!z) {
                FaqLogger.print("FILE DELETE", "FILE CLEAR IS FAILED " + file2);
            }
        }
        return z;
    }

    @Override
    public int init(@NonNull Activity activity, @NonNull String str) {
        return init(activity.getApplication(), str, (SdkListener) null);
    }

    @Override
    public boolean initIsDone() {
        return this.d == com.huawei.phoneservice.faq.base.c.INIT_DONE;
    }

    public final void k(@NonNull String str) {
        FaqLogger.print("FaqSdk getServiceByNet", "code:" + str);
        com.huawei.phoneservice.faq.base.entity.a aVar = new com.huawei.phoneservice.faq.base.entity.a();
        aVar.a(str);
        FaqSdkAddressApi.d.a(this.a).b(aVar, new a(FaqSdkServiceUrlResponse.class, null, str));
    }

    public final void l(@NonNull String str) {
        this.i = str;
        SdkAppInfo.initAppInfo(this.a);
        GrsBaseInfo grsBaseInfo = new GrsBaseInfo();
        grsBaseInfo.setSerCountry(str);
        grsBaseInfo.setRegCountry(str);
        try {
            d(new GrsClient(this.a, grsBaseInfo), str);
        } catch (Exception e2) {
            this.c = com.huawei.phoneservice.faq.base.b.NO_GRS_ADDRESS;
            onSdkInit(-1, "can not get address from GRS " + e2.getMessage());
        }
    }

    @Override
    public void onClick(String str, String str2, Object obj) {
        SdkClickListener sdkClickListener;
        WeakReference<SdkClickListener> weakReference = this.f;
        if (weakReference == null || (sdkClickListener = weakReference.get()) == null) {
            return;
        }
        sdkClickListener.onClick(str, str2, obj);
    }

    @Override
    public void onSdkErr(@NonNull String str, String str2) {
        Handler handler = this.b;
        if (handler != null) {
            handler.removeMessages(0);
            Handler handler2 = this.b;
            handler2.sendMessageDelayed(handler2.obtainMessage(0, new Pair(str, str2)), 1000L);
        }
    }

    @Override
    public void onSdkInit(int i, String str) {
        SdkListener sdkListener;
        WeakReference<SdkListener> weakReference = this.e;
        if (weakReference == null || (sdkListener = weakReference.get()) == null) {
            return;
        }
        this.d = com.huawei.phoneservice.faq.base.c.INIT_DONE;
        if (i != 0 || this.c.a() == 0) {
            sdkListener.onSdkInit(i, this.c.a(), this.c.b() + str);
            return;
        }
        sdkListener.onSdkInit(-1, this.c.a(), this.c.b() + str);
    }

    @Override
    public Submit queryModuleList(Context context, ModuleConfigRequest moduleConfigRequest, Callback callback) {
        return FaqSdkAddressApi.d.a(context).a(moduleConfigRequest, callback);
    }

    @Override
    public void registerUpdateListener(@NonNull SdkUpdateListener sdkUpdateListener) {
        if (this.l == null) {
            this.l = new ArrayList();
        }
        ((BaseSdkUpdateRequest) sdkUpdateListener).a(new e(sdkUpdateListener));
        this.l.add(sdkUpdateListener);
    }

    @Override
    public void release() {
        WeakReference<SdkListener> weakReference = this.e;
        if (weakReference != null) {
            weakReference.clear();
            this.e = null;
        }
        WeakReference<SdkClickListener> weakReference2 = this.f;
        if (weakReference2 != null) {
            weakReference2.clear();
            this.f = null;
        }
        List<SdkUpdateListener> list = this.l;
        if (list != null) {
            list.clear();
            this.l = null;
        }
        Map<String, String> map = this.g;
        if (map != null) {
            map.clear();
            this.g = null;
        }
        Handler handler = this.b;
        if (handler != null) {
            handler.removeCallbacksAndMessages(null);
            this.b = null;
        }
        this.c = com.huawei.phoneservice.faq.base.b.INIT_FAIL;
        this.a = null;
    }

    @Override
    public void saveMapOnSaveInstanceState(String str) {
        String a2 = FaqSharePrefUtil.a(this.a);
        if (TextUtils.isEmpty(str)) {
            return;
        }
        Map<String, String> map = this.g;
        if (map == null) {
            this.g = new Builder().setJson(str).build();
            if (!TextUtils.isEmpty(a2)) {
                this.g.put("language", a2);
                FaqSharePrefUtil.b(this.a, "");
            }
        } else {
            map.putAll(new Builder().setJson(str).build());
            if (!TextUtils.isEmpty(a2)) {
                this.g.put("language", a2);
                FaqSharePrefUtil.b(this.a, "");
            }
            Map<String, String> map2 = this.j;
            if (map2 != null) {
                this.g.putAll(map2);
            }
        }
        this.h.putAll(this.g);
        this.c = com.huawei.phoneservice.faq.base.b.INIT_SUCCESS;
    }

    @Override
    public synchronized Sdk saveSdk(@NonNull String str, String str2) {
        if (str != null) {
            try {
                String sdk = getSdk(str);
                Map<String, String> map = this.g;
                if (map != null) {
                    if (str2 != null) {
                        map.put(str, str2);
                        Map<String, String> map2 = this.j;
                        if (map2 != null) {
                            map2.put(str, str2);
                        }
                    }
                    List<SdkUpdateListener> list = this.l;
                    if (list != null) {
                        for (int size = list.size() - 1; size >= 0; size--) {
                            this.l.get(size).onSdkUpdate(str, sdk, str2);
                        }
                    }
                }
            } catch (Throwable th) {
                throw th;
            }
        }
        return this;
    }

    @Override
    public void setCallback(FaqBaseCallback faqBaseCallback) {
        this.k = faqBaseCallback;
    }

    @Override
    public void setClickListener(SdkClickListener sdkClickListener) {
        if (sdkClickListener != null) {
            WeakReference<SdkClickListener> weakReference = this.f;
            if (weakReference != null) {
                weakReference.clear();
            }
            this.f = new WeakReference<>(sdkClickListener);
            return;
        }
        WeakReference<SdkClickListener> weakReference2 = this.f;
        if (weakReference2 != null) {
            weakReference2.clear();
            this.f = null;
        }
    }

    @Override
    public void setLanguage(String str) {
        FaqSharePrefUtil.b(this.a, str);
    }

    @Override
    public synchronized void setSdkListener(SdkListener sdkListener) {
        try {
            if (sdkListener != null) {
                WeakReference<SdkListener> weakReference = this.e;
                if (weakReference != null) {
                    weakReference.clear();
                }
                this.e = new WeakReference<>(sdkListener);
            } else {
                WeakReference<SdkListener> weakReference2 = this.e;
                if (weakReference2 != null) {
                    weakReference2.clear();
                    this.e = null;
                }
            }
        } catch (Throwable th) {
            throw th;
        }
    }

    @Override
    public void setUriFromFaq(Uri uri) {
        if (uri != null) {
            try {
                if (!FaqConstants.HOST_NAME.equals(URI.create(uri.toString()).getHost())) {
                    FaqLogger.print("SDK INIT SET URI", " ERROR, HOST ILLEGAL !!!");
                    return;
                }
                if (this.g == null) {
                    this.g = new Builder().build();
                }
                this.g.putAll(new Builder().setUri(uri).build());
            } catch (IllegalArgumentException unused) {
                FaqLogger.print("SDK INIT SET URI", "ERROR, IllegalArgumentException !!!");
            }
        }
    }

    @Override
    public void showReleaseLog(boolean z) {
        FaqLogger.l(z, this.a);
    }

    @Override
    public void unregisterUpdateListener(@NonNull SdkUpdateListener sdkUpdateListener) {
        if (this.l != null) {
            ((BaseSdkUpdateRequest) sdkUpdateListener).a();
            this.l.remove(sdkUpdateListener);
        }
    }

    public FaqSdk(a aVar) {
        this();
    }

    @Override
    public String getSdk(@NonNull String str) {
        if (this.g == null) {
            if (this.a == null) {
                FaqLogger.print("FaqSdk", "CONTENXT IS NULL");
                return null;
            }
            this.g = new Builder().setJson(FaqSharePrefUtil.getString(this.a, FaqConstants.SDK_SP_FILE_NAME, FaqConstants.SDK_SP_KEY, "")).build();
        }
        Map<String, String> map = this.g;
        if (map == null) {
            return null;
        }
        return map.get(str);
    }

    @Override
    public int init(@NonNull Application application, @NonNull Uri uri, @Nullable SdkListener sdkListener) {
        if (uri == null) {
            return -1;
        }
        try {
            if (FaqConstants.HOST_NAME.equals(URI.create(uri.toString()).getHost())) {
                return init(application, new Builder().setUri(uri), sdkListener);
            }
            FaqLogger.print("SDK INIT", "ERROR, HOST ILLEGAL !!!");
            return -1;
        } catch (IllegalArgumentException e2) {
            FaqLogger.e("SDK INIT", e2.getMessage());
            return -1;
        }
    }

    @Override
    public int init(@NonNull Application application, @NonNull Builder builder, @Nullable SdkListener sdkListener) {
        this.a = application;
        this.c = init() ? com.huawei.phoneservice.faq.base.b.INIT_AGAIN : com.huawei.phoneservice.faq.base.b.INIT_FAIL;
        this.d = com.huawei.phoneservice.faq.base.c.INIT_PROGRESS;
        if (sdkListener != null) {
            WeakReference<SdkListener> weakReference = this.e;
            if (weakReference != null) {
                weakReference.clear();
            }
            this.e = new WeakReference<>(sdkListener);
        }
        if (builder.isEmpty()) {
            this.c = com.huawei.phoneservice.faq.base.b.PARAMETER_ERROR;
            onSdkInit(-1, "ERROR, parameter EMPTY !!!");
            return -1;
        }
        Map<String, String> build = builder.build();
        this.g = build;
        l(build.get(FaqConstants.FAQ_COUNTRY));
        return 0;
    }

    @Override
    public int init(@NonNull Application application, @NonNull String str, @Nullable SdkListener sdkListener) {
        String str2;
        if (TextUtils.isEmpty(str)) {
            str2 = "ERROR, uriStr EMPTY !!!";
        } else {
            Uri parse = Uri.parse(str);
            if (parse != null) {
                return init(application, parse, sdkListener);
            }
            str2 = "ERROR, Uri NULL !!!";
        }
        FaqLogger.print("SDK INIT", str2);
        return -1;
    }

    @Override
    public boolean init() {
        return this.c != com.huawei.phoneservice.faq.base.b.INIT_FAIL;
    }

    @Override
    public boolean init(Application application) {
        this.a = application;
        this.b = new FaqHandler(this);
        return this.c != com.huawei.phoneservice.faq.base.b.INIT_FAIL;
    }
}