499 lines
20 KiB
Java
499 lines
20 KiB
Java
package com.ubt.jimu.blockly.view;
|
|
|
|
import android.app.Activity;
|
|
import android.app.Fragment;
|
|
import android.graphics.drawable.AnimationDrawable;
|
|
import android.os.Bundle;
|
|
import android.text.TextUtils;
|
|
import android.view.LayoutInflater;
|
|
import android.view.MotionEvent;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.animation.Animation;
|
|
import android.view.animation.AnimationUtils;
|
|
import android.webkit.WebSettings;
|
|
import android.webkit.WebView;
|
|
import android.widget.ImageView;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.TextView;
|
|
import com.ubt.jimu.R;
|
|
import com.ubt.jimu.base.dialog.IDialogListener;
|
|
import com.ubt.jimu.base.dialog.SimpleQuestionDialog;
|
|
import com.ubt.jimu.base.entities.Course;
|
|
import com.ubt.jimu.blockly.JimuRobot;
|
|
import com.ubt.jimu.blockly.Utils;
|
|
import com.ubt.jimu.blockly.command.JimuBlocklyCommand;
|
|
import com.ubt.jimu.blockly.command.JimuJavascriptInterface;
|
|
import com.ubt.jimu.blockly.command.JimuUnityCommand;
|
|
import com.ubt.jimu.blockly.command.UnityCommandController;
|
|
import com.ubt.jimu.blockly.exception.BlocklyEvent;
|
|
import com.ubt.jimu.blockly.exception.JimuRobotMessage;
|
|
import com.ubt.jimu.blockly.feature.sensor.DeviceDirection;
|
|
import com.ubt.jimu.diy.view.BrowseCompletedActivity;
|
|
import com.ubt.jimu.diy.view.DiyBrowseActivity;
|
|
import com.ubt.jimu.unity.bluetooth.ConnectionStatus;
|
|
import com.ubt.jimu.unity.bluetooth.UnityActivity;
|
|
import com.ubt.jimu.utils.JsonHelper;
|
|
import com.ubt.jimu.utils.PackageHelper;
|
|
import com.ubt.jimu.utils.SPUtils;
|
|
import com.ubtech.utils.AndroidVersionCheckUtils;
|
|
import com.ubtech.view.widget.ToastView;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import org.greenrobot.eventbus.EventBus;
|
|
import org.greenrobot.eventbus.Subscribe;
|
|
import org.greenrobot.eventbus.ThreadMode;
|
|
|
|
/* loaded from: classes.dex */
|
|
public class DialogBlocklyWebView extends Fragment {
|
|
public static final String BASE_URL = "https://jimu.ubtrobot.com";
|
|
public static String CODE = "code";
|
|
public static String STEP = "step";
|
|
private final String TAG = DialogBlocklyWebView.class.getSimpleName();
|
|
private int bleState;
|
|
private JimuBlocklyCommand blocklyObj;
|
|
private Course course;
|
|
private DeviceDirection direction;
|
|
private SimpleQuestionDialog exceptionDialog;
|
|
protected ImageView imgNextStep;
|
|
protected ImageView imgPreviousStep;
|
|
private ImageView imgWait;
|
|
private JimuUnityCommand javaInterface;
|
|
private JimuJavascriptInterface javascriptInterface;
|
|
private String jimuRobotJSON;
|
|
protected View llBrowseStep;
|
|
private LinearLayout llWait;
|
|
private JimuRobot mJimuRobot;
|
|
private long modelId;
|
|
private int moduleType;
|
|
private Animation rotateAnimaLow;
|
|
protected TextView tvStep;
|
|
private JimuWebChromeClient webChromeClient;
|
|
private WebView webView;
|
|
private JimuWebViewClient webViewClient;
|
|
|
|
private void bleDisconnected(BlocklyEvent blocklyEvent) {
|
|
commonTips((String) blocklyEvent.getMessage(), 2);
|
|
JimuBlocklyCommand jimuBlocklyCommand = this.blocklyObj;
|
|
if (jimuBlocklyCommand == null || jimuBlocklyCommand.getJimuRobot() == null) {
|
|
return;
|
|
}
|
|
this.blocklyObj.getJimuRobot().setBlueState(ConnectionStatus.DIS_CONNECT.getStatus());
|
|
this.bleState = ConnectionStatus.DIS_CONNECT.getStatus();
|
|
}
|
|
|
|
public static DialogBlocklyWebView getInstance(String str, int i, long j, int i2, int i3, int i4, Course course) {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putString("jimuRobotJSON", str);
|
|
bundle.putInt("bleState", i);
|
|
bundle.putLong("modelId", j);
|
|
bundle.putInt("moduleType", i2);
|
|
bundle.putInt(CODE, i3);
|
|
bundle.putInt(STEP, i4);
|
|
bundle.putSerializable("course", course);
|
|
DialogBlocklyWebView dialogBlocklyWebView = new DialogBlocklyWebView();
|
|
dialogBlocklyWebView.setArguments(bundle);
|
|
return dialogBlocklyWebView;
|
|
}
|
|
|
|
private void initView() {
|
|
if (this.mJimuRobot == null) {
|
|
this.mJimuRobot = (JimuRobot) JsonHelper.a(this.jimuRobotJSON, (Class<?>) JimuRobot.class);
|
|
this.mJimuRobot.setBlueState(this.bleState);
|
|
this.mJimuRobot.setServerModelId(this.modelId);
|
|
}
|
|
if (1007 == getArguments().getInt(CODE)) {
|
|
this.llBrowseStep.setOnTouchListener(new View.OnTouchListener() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.1
|
|
@Override // android.view.View.OnTouchListener
|
|
public boolean onTouch(View view, MotionEvent motionEvent) {
|
|
return true;
|
|
}
|
|
});
|
|
final int i = getArguments().getInt(STEP);
|
|
this.llBrowseStep.setVisibility(0);
|
|
this.imgPreviousStep.setOnClickListener(new View.OnClickListener() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.2
|
|
@Override // android.view.View.OnClickListener
|
|
public void onClick(View view) {
|
|
DiyBrowseActivity.start(DialogBlocklyWebView.this.getActivity(), i - 1, UnityActivity.modelBrowse);
|
|
((UnityActivity) DialogBlocklyWebView.this.getActivity()).setIsBack(true);
|
|
((UnityActivity) DialogBlocklyWebView.this.getActivity()).closeBlockly();
|
|
}
|
|
});
|
|
this.imgNextStep.setOnClickListener(new View.OnClickListener() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.3
|
|
@Override // android.view.View.OnClickListener
|
|
public void onClick(View view) {
|
|
BrowseCompletedActivity.start(DialogBlocklyWebView.this.getActivity());
|
|
SPUtils.b(String.format(DiyBrowseActivity.DIYSTEP, DialogBlocklyWebView.this.mJimuRobot.getModelId()), -5);
|
|
((UnityActivity) DialogBlocklyWebView.this.getActivity()).setIsBack(true);
|
|
((UnityActivity) DialogBlocklyWebView.this.getActivity()).closeBlockly();
|
|
}
|
|
});
|
|
this.tvStep.setText(String.format("%s/%s", String.valueOf(i), String.valueOf(i)));
|
|
} else {
|
|
this.llBrowseStep.setVisibility(8);
|
|
}
|
|
this.blocklyObj = new JimuBlocklyCommand(this.webView, (UnityActivity) getActivity(), this.mJimuRobot);
|
|
this.blocklyObj.setModuleType(this.moduleType);
|
|
this.javascriptInterface = new JimuJavascriptInterface(this.webView, getActivity(), this.mJimuRobot);
|
|
this.javascriptInterface.setDialogBlocklyWebView(this);
|
|
this.javascriptInterface.setCourse(this.course);
|
|
this.webChromeClient = new JimuWebChromeClient();
|
|
this.webViewClient = new JimuWebViewClient(getActivity(), this.blocklyObj);
|
|
this.webViewClient.setDialog(this);
|
|
this.webView.removeJavascriptInterface("blocklyObj");
|
|
this.webView.addJavascriptInterface(this.javascriptInterface, "blocklyObj");
|
|
this.webView.setWebViewClient(this.webViewClient);
|
|
this.webView.setWebChromeClient(this.webChromeClient);
|
|
if (1 != this.moduleType) {
|
|
this.webView.loadUrl("file:///" + Utils.baseUrl + "teachMaterial/index.html");
|
|
} else if (this.course != null) {
|
|
this.webView.loadUrl("file:///" + Utils.baseUrl + "teachOldCourse/course.html");
|
|
} else {
|
|
this.webView.loadUrl("file:///" + Utils.baseUrl + "teachCourse/course.html");
|
|
}
|
|
this.javaInterface = new JimuUnityCommand(this.webView);
|
|
showWait();
|
|
}
|
|
|
|
private void initWebView() {
|
|
PackageHelper.a("CHANNEL_ID");
|
|
this.webView.getSettings().setTextZoom(100);
|
|
this.webView.getSettings().setDisplayZoomControls(false);
|
|
this.webView.getSettings().setSupportZoom(false);
|
|
this.webView.getSettings().setUseWideViewPort(false);
|
|
this.webView.getSettings().setJavaScriptEnabled(true);
|
|
this.webView.getSettings().setLoadWithOverviewMode(true);
|
|
if (AndroidVersionCheckUtils.c()) {
|
|
this.webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
|
|
}
|
|
if (AndroidVersionCheckUtils.d()) {
|
|
this.webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
|
|
}
|
|
this.webView.getSettings().setAllowContentAccess(true);
|
|
this.webView.getSettings().setAllowFileAccess(true);
|
|
this.webView.getSettings().setDatabaseEnabled(true);
|
|
this.webView.getSettings().setDomStorageEnabled(true);
|
|
this.webView.getSettings().setAppCacheEnabled(false);
|
|
this.webView.getSettings().setCacheMode(2);
|
|
this.webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
|
|
this.webView.setScrollContainer(false);
|
|
}
|
|
|
|
private void setJSResult(final String str) {
|
|
if (TextUtils.isEmpty(str)) {
|
|
return;
|
|
}
|
|
this.webView.post(new Runnable() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.8
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
DialogBlocklyWebView.this.webView.loadUrl(str);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void showException(String str) {
|
|
JimuBlocklyCommand jimuBlocklyCommand = this.blocklyObj;
|
|
if (jimuBlocklyCommand != null) {
|
|
jimuBlocklyCommand.stopSensorTimer("");
|
|
}
|
|
this.javaInterface.jsShowException("Error");
|
|
this.exceptionDialog = SimpleQuestionDialog.newInstance(str);
|
|
this.exceptionDialog.setListener(new IDialogListener() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.7
|
|
@Override // com.ubt.jimu.base.dialog.IDialogListener
|
|
public void onCancle() {
|
|
UnityActivity.communityWithUnity(DialogBlocklyWebView.this.getActivity(), UnityCommandController.SHOW_EXCEPTION_CALLBACK, "0");
|
|
}
|
|
|
|
@Override // com.ubt.jimu.base.dialog.IDialogListener
|
|
public void onOk() {
|
|
UnityActivity.communityWithUnity(DialogBlocklyWebView.this.getActivity(), UnityCommandController.SHOW_EXCEPTION_CALLBACK, "1");
|
|
DialogBlocklyWebView.this.showWait();
|
|
if (DialogBlocklyWebView.this.blocklyObj != null) {
|
|
DialogBlocklyWebView.this.blocklyObj.startSensorTimer(DialogBlocklyWebView.this.blocklyObj.getQueryUrl(), DialogBlocklyWebView.this.blocklyObj.getQueryCallback());
|
|
}
|
|
}
|
|
});
|
|
this.exceptionDialog.show(getFragmentManager(), "");
|
|
}
|
|
|
|
public void blueConnectCallBack(String str) {
|
|
JimuRobot jimuRobot = (JimuRobot) JsonHelper.a(str, (Class<?>) JimuRobot.class);
|
|
if (jimuRobot != null) {
|
|
this.mJimuRobot.setLights(jimuRobot.getLights());
|
|
this.mJimuRobot.setGyroscopeId(jimuRobot.getGyroscopeId());
|
|
this.mJimuRobot.setInfraredId(jimuRobot.getInfraredId());
|
|
this.mJimuRobot.setTouchId(jimuRobot.getTouchId());
|
|
this.mJimuRobot.setIsLithium(jimuRobot.getIsLithium());
|
|
this.mJimuRobot.setUltrasonicId(jimuRobot.getUltrasonicId());
|
|
this.mJimuRobot.setColorId(jimuRobot.getColorId());
|
|
this.mJimuRobot.setUnicornId(jimuRobot.getUnicornId());
|
|
jimuRobot.setBlueState(this.mJimuRobot.getBlueState());
|
|
String a = JsonHelper.a(jimuRobot);
|
|
JimuUnityCommand jimuUnityCommand = this.javaInterface;
|
|
if (jimuUnityCommand != null) {
|
|
jimuUnityCommand.blueConnectCallBack(a);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void chargeProtected(String str) {
|
|
JimuUnityCommand jimuUnityCommand = this.javaInterface;
|
|
if (jimuUnityCommand != null) {
|
|
jimuUnityCommand.chargeProtected(str);
|
|
}
|
|
}
|
|
|
|
public void commonTips(String str, int i) {
|
|
ToastView.a(getActivity(), str, i == 2 ? ToastView.Type.ERROR : i == 1 ? ToastView.Type.SUCCESS : ToastView.Type.NORMAL).a();
|
|
}
|
|
|
|
public DeviceDirection getDirection() {
|
|
return this.direction;
|
|
}
|
|
|
|
public int getModuleType() {
|
|
return this.moduleType;
|
|
}
|
|
|
|
public void hideWait() {
|
|
Animation animation = this.rotateAnimaLow;
|
|
if (animation != null) {
|
|
animation.cancel();
|
|
}
|
|
this.llWait.postDelayed(new Runnable() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.6
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
DialogBlocklyWebView.this.llWait.setVisibility(8);
|
|
}
|
|
}, 100L);
|
|
}
|
|
|
|
public void jsShowException(String str) {
|
|
JimuUnityCommand jimuUnityCommand = this.javaInterface;
|
|
if (jimuUnityCommand != null) {
|
|
jimuUnityCommand.jsShowException(str);
|
|
}
|
|
}
|
|
|
|
public void notifyKeyboardHidden(String str) {
|
|
JimuUnityCommand jimuUnityCommand = this.javaInterface;
|
|
if (jimuUnityCommand != null) {
|
|
jimuUnityCommand.notifyKeyboardHidden(str);
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onAttach(Activity activity) {
|
|
super.onAttach(activity);
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onCreate(Bundle bundle) {
|
|
super.onCreate(bundle);
|
|
Bundle arguments = getArguments();
|
|
if (arguments != null) {
|
|
this.jimuRobotJSON = arguments.getString("jimuRobotJSON");
|
|
this.bleState = arguments.getInt("bleState");
|
|
this.modelId = arguments.getLong("modelId");
|
|
this.moduleType = arguments.getInt("moduleType");
|
|
this.course = (Course) arguments.getSerializable("course");
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
|
|
View inflate = layoutInflater.inflate(R.layout.dialog_blockly_webview, (ViewGroup) null);
|
|
this.webView = (WebView) inflate.findViewById(R.id.webView);
|
|
this.llWait = (LinearLayout) inflate.findViewById(R.id.ll_wait);
|
|
this.imgWait = (ImageView) inflate.findViewById(R.id.wait_img);
|
|
this.llBrowseStep = inflate.findViewById(R.id.llStep);
|
|
this.imgPreviousStep = (ImageView) inflate.findViewById(R.id.imgPreviousStep);
|
|
this.imgNextStep = (ImageView) inflate.findViewById(R.id.imgNextStep);
|
|
this.tvStep = (TextView) inflate.findViewById(R.id.tvStep);
|
|
initWebView();
|
|
initView();
|
|
this.llWait.setOnClickListener(new View.OnClickListener() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.4
|
|
@Override // android.view.View.OnClickListener
|
|
public void onClick(View view) {
|
|
DialogBlocklyWebView.this.llWait.setVisibility(8);
|
|
}
|
|
});
|
|
return inflate;
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onDestroy() {
|
|
WebView webView = this.webView;
|
|
if (webView != null) {
|
|
webView.stopLoading();
|
|
this.webView.clearHistory();
|
|
this.webView.removeAllViews();
|
|
this.webView.destroy();
|
|
}
|
|
super.onDestroy();
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onDetach() {
|
|
super.onDetach();
|
|
}
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
public void onMessageEvent(BlocklyEvent blocklyEvent) {
|
|
switch (blocklyEvent.getType()) {
|
|
case 1001:
|
|
JimuRobotMessage jimuRobotMessage = (JimuRobotMessage) blocklyEvent.getMessage();
|
|
if (jimuRobotMessage != null) {
|
|
commonTips(jimuRobotMessage.getMsg(), jimuRobotMessage.getLevel());
|
|
break;
|
|
}
|
|
break;
|
|
case 1002:
|
|
showException((String) blocklyEvent.getMessage());
|
|
break;
|
|
case 1003:
|
|
bleDisconnected(blocklyEvent);
|
|
break;
|
|
case 1004:
|
|
setJSResult((String) blocklyEvent.getMessage());
|
|
break;
|
|
case 1006:
|
|
this.bleState = ConnectionStatus.DIS_CONNECT.getStatus();
|
|
break;
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onPause() {
|
|
SimpleQuestionDialog simpleQuestionDialog = this.exceptionDialog;
|
|
if (simpleQuestionDialog != null && simpleQuestionDialog.isVisible()) {
|
|
this.exceptionDialog.dismiss();
|
|
}
|
|
super.onPause();
|
|
WebView webView = this.webView;
|
|
if (webView != null) {
|
|
try {
|
|
webView.getClass().getMethod("onPause", new Class[0]).invoke(this.webView, null);
|
|
} catch (IllegalAccessException e) {
|
|
e.printStackTrace();
|
|
} catch (NoSuchMethodException e2) {
|
|
e2.printStackTrace();
|
|
} catch (InvocationTargetException e3) {
|
|
e3.printStackTrace();
|
|
} catch (Exception e4) {
|
|
e4.printStackTrace();
|
|
}
|
|
}
|
|
stopQueryTimer();
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onResume() {
|
|
super.onResume();
|
|
WebView webView = this.webView;
|
|
if (webView != null) {
|
|
try {
|
|
webView.getClass().getMethod("onResume", new Class[0]).invoke(this.webView, null);
|
|
} catch (IllegalAccessException e) {
|
|
e.printStackTrace();
|
|
} catch (NoSuchMethodException e2) {
|
|
e2.printStackTrace();
|
|
} catch (InvocationTargetException e3) {
|
|
e3.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onStart() {
|
|
super.onStart();
|
|
EventBus.b().c(this);
|
|
}
|
|
|
|
@Override // android.app.Fragment
|
|
public void onStop() {
|
|
EventBus.b().d(this);
|
|
super.onStop();
|
|
}
|
|
|
|
public void refreshAllServo(String str, String str2) {
|
|
JimuRobot jimuRobot = this.mJimuRobot;
|
|
if (jimuRobot != null) {
|
|
jimuRobot.setServo(str);
|
|
this.mJimuRobot.setCircleServos(str2);
|
|
}
|
|
}
|
|
|
|
public void refreshDirection(DeviceDirection deviceDirection) {
|
|
this.direction = deviceDirection;
|
|
}
|
|
|
|
public void setBlueState(int i) {
|
|
JimuRobot jimuRobot = this.mJimuRobot;
|
|
if (jimuRobot != null) {
|
|
jimuRobot.setBlueState(i);
|
|
}
|
|
setJSResult("BLEStateChanged", String.valueOf(i));
|
|
}
|
|
|
|
public void showInfraredRef(String str, String str2) {
|
|
JimuUnityCommand jimuUnityCommand = this.javaInterface;
|
|
if (jimuUnityCommand != null) {
|
|
jimuUnityCommand.showInfraredRef(str, str2);
|
|
}
|
|
}
|
|
|
|
public void showWait() {
|
|
if (this.rotateAnimaLow == null) {
|
|
this.rotateAnimaLow = AnimationUtils.loadAnimation(getActivity(), R.anim.anima_dialog_wait);
|
|
}
|
|
this.llWait.setVisibility(0);
|
|
this.imgWait.startAnimation(this.rotateAnimaLow);
|
|
((AnimationDrawable) this.imgWait.getBackground()).start();
|
|
this.webView.postDelayed(new Runnable() { // from class: com.ubt.jimu.blockly.view.DialogBlocklyWebView.5
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
DialogBlocklyWebView.this.hideWait();
|
|
}
|
|
}, 10000L);
|
|
}
|
|
|
|
public void stopQueryTimer() {
|
|
JimuBlocklyCommand jimuBlocklyCommand = this.blocklyObj;
|
|
if (jimuBlocklyCommand != null) {
|
|
jimuBlocklyCommand.stopSensorTimer("");
|
|
}
|
|
}
|
|
|
|
public void updateJimuRobot(String str) {
|
|
JimuRobot jimuRobot;
|
|
JimuRobot jimuRobot2 = (JimuRobot) JsonHelper.a(str, (Class<?>) JimuRobot.class);
|
|
if (jimuRobot2 == null || (jimuRobot = this.mJimuRobot) == null) {
|
|
return;
|
|
}
|
|
jimuRobot.setGyroscopeId(jimuRobot2.getGyroscopeId());
|
|
this.mJimuRobot.setInfraredId(jimuRobot2.getInfraredId());
|
|
this.mJimuRobot.setLights(jimuRobot2.getLights());
|
|
this.mJimuRobot.setTouchId(jimuRobot2.getTouchId());
|
|
this.mJimuRobot.setMotor(jimuRobot2.getMotor());
|
|
this.mJimuRobot.setIsLithium(jimuRobot2.getIsLithium());
|
|
this.mJimuRobot.setUltrasonicId(jimuRobot2.getUltrasonicId());
|
|
this.mJimuRobot.setColorId(jimuRobot2.getColorId());
|
|
this.mJimuRobot.setUnicornId(jimuRobot2.getUnicornId());
|
|
}
|
|
|
|
public void wakeupBlockly(String str, int i, String str2, String str3) {
|
|
JimuUnityCommand jimuUnityCommand = this.javaInterface;
|
|
if (jimuUnityCommand != null) {
|
|
jimuUnityCommand.wakeupBlockly(str, i, str2, str3);
|
|
}
|
|
}
|
|
|
|
public void setJSResult(String str, String... strArr) {
|
|
Utils.setJSResult(this.webView, str, strArr);
|
|
}
|
|
|
|
public void refreshAllServo(String str) {
|
|
this.javaInterface.refreshAllServo(str);
|
|
}
|
|
}
|