Browse Source

[new]增加隐私政策以及用户协议

zk 1 year ago
parent
commit
928b09cf07

+ 8 - 0
lib/data/consts/constants.dart

@@ -1,4 +1,6 @@
 class Constants {
+  Constants._();
+
   static const String env = envDev;
 
   static const String envDev = 'dev';
@@ -14,6 +16,12 @@ class Constants {
   static const String _prodBaseUrl = "http://xxxx.litoxxxxxlive.xyz";
 
   static String baseUrl = getBaseUrl();
+
+  static String privacyPolicy =
+      "https://cdn.v8dashen.com/static/xt-xm-privacy.html";
+
+  static String userAgreement =
+      "https://cdn.v8dashen.com/static/xt-xm-clause.html";
 }
 
 String getBaseUrl() {

+ 51 - 0
lib/module/browser/controller.dart

@@ -0,0 +1,51 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:get/get.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+
+class BrowserController extends BaseController {
+  String url = (Get.arguments is String) ? (Get.arguments as String) : '';
+
+  final WebViewController webViewController = WebViewController();
+
+  final title = ''.obs;
+
+  @override
+  void onInit() {
+    super.onInit();
+    webViewController.setNavigationDelegate(
+      NavigationDelegate(
+        onPageFinished: (String url) {
+          webViewController.getTitle().then((title) {
+            if (title != null) {
+              this.title.value = title;
+            }
+          });
+        },
+        onNavigationRequest: (NavigationRequest request) {
+          return NavigationDecision.navigate;
+        },
+      ),
+    );
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    loadUrl();
+  }
+
+  void loadUrl() {
+    if (url.isEmpty) {
+      return;
+    }
+    webViewController.loadRequest(Uri.parse(url));
+  }
+
+  Future<bool> handleBack() async {
+    if (await webViewController.canGoBack()) {
+      webViewController.goBack();
+      return false;
+    }
+    return true;
+  }
+}

+ 55 - 0
lib/module/browser/view.dart

@@ -0,0 +1,55 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/resource/colors.gen.dart';
+import 'package:electronic_assistant/router/app_pages.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+
+import '../../resource/assets.gen.dart';
+import 'controller.dart';
+
+class BrowserPage extends BasePage<BrowserController> {
+  const BrowserPage({super.key});
+
+  static start(String url) {
+    Get.toNamed(RoutePath.browser, arguments: url);
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return WillPopScope(
+      onWillPop: () async {
+        return await controller.handleBack();
+      },
+      child: Scaffold(
+        backgroundColor: Colors.transparent,
+        appBar: AppBar(
+          systemOverlayStyle: SystemUiOverlayStyle.dark,
+          backgroundColor: Colors.transparent,
+          title: Obx(() => Text(controller.title.value,
+              style: TextStyle(
+                  fontSize: 17.sp, color: ColorName.primaryTextColor))),
+          leading: IconButton(
+            icon: SizedBox(
+                width: 24.w,
+                height: 24.w,
+                child: Assets.images.iconBack.image()),
+            // Custom icon
+            onPressed: () {
+              Get.back();
+            },
+          ),
+        ),
+        body: _buildContentView(),
+      ),
+    );
+  }
+
+  Widget _buildContentView() {
+    return WebViewWidget(controller: controller.webViewController);
+  }
+}

+ 1 - 1
lib/module/chat/start/view.dart

@@ -51,7 +51,7 @@ class ChatStartPage extends BasePage<ChatStartController> {
               scrolledUnderElevation: 0,
               leading: IconButton(
                 onPressed: () {
-                  Navigator.pop(context);
+                  Get.back();
                 },
                 icon: UnconstrainedBox(
                   child: SizedBox(

+ 1 - 1
lib/module/chat/view.dart

@@ -60,7 +60,7 @@ class ChatPage extends BasePage<ChatController> {
             leading: IconButton(
               icon: const Icon(Icons.arrow_back_ios_new_rounded),
               onPressed: () {
-                Navigator.pop(context);
+                Get.back();
               },
             ),
             scrolledUnderElevation: 0,

+ 1 - 1
lib/module/files/search/view.dart

@@ -113,7 +113,7 @@ class FileSearchPage extends BasePage<FileSearchController> {
         leading: IconButton(
           icon: const Icon(Icons.arrow_back_ios_new_rounded),
           onPressed: () {
-            Navigator.pop(context);
+            Get.back();
           },
         ),
       ),

+ 2 - 1
lib/module/home/view.dart

@@ -437,7 +437,8 @@ class HomePage extends BasePage<HomePageController> {
                       style: TextStyle(
                           fontSize: 13.sp, color: ColorName.secondaryTextColor),
                     ),
-                    SizedBox(
+                    Container(
+                        margin: const EdgeInsets.only(bottom: 1),
                         width: 16.w,
                         height: 16.w,
                         child: Assets.images.iconHomeTalkArrow.image()),

+ 0 - 6
lib/module/main/controller.dart

@@ -34,12 +34,6 @@ class MainController extends BaseController {
 
   int get currentIndex => _currentIndex.value;
 
-  String get versionName => "v${appInfoUtil.appVersionName}";
-
-  String get loginTxt =>
-      accountRepository.getUserSubName(accountRepository.phone);
-
-  String get electricityTxt => '${StringName.mainLoginChargeTips.tr}';
 
   void changeIndex(int index) {
     _currentIndex.value = index;

+ 15 - 0
lib/module/main/drawer/controller.dart

@@ -0,0 +1,15 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:get/get.dart';
+
+import '../../../data/repositories/account_repository.dart';
+import '../../../resource/string.gen.dart';
+import '../../../utils/app_info_util.dart';
+
+class MainDrawerController extends BaseController {
+  String get versionName => "v${appInfoUtil.appVersionName}";
+
+  String get loginTxt =>
+      accountRepository.getUserSubName(accountRepository.phone);
+
+  String get electricityTxt => '${StringName.mainLoginChargeTips.tr}';
+}

+ 262 - 0
lib/module/main/drawer/view.dart

@@ -0,0 +1,262 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/data/consts/Constants.dart';
+import 'package:electronic_assistant/module/browser/view.dart';
+import 'package:electronic_assistant/utils/expand.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import '../../../data/repositories/account_repository.dart';
+import '../../../resource/assets.gen.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
+import '../../chat/start/view.dart';
+import 'controller.dart';
+
+class MainDrawerView extends BasePage<MainDrawerController> {
+  const MainDrawerView({super.key});
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return SafeArea(
+      child: Padding(
+        padding: EdgeInsets.symmetric(horizontal: 16.w),
+        child: Column(
+          children: [
+            SizedBox(height: 12.h),
+            buildUserInfoView(),
+            SizedBox(height: 12.h),
+            Container(
+              height: 72.w,
+              decoration: BoxDecoration(
+                borderRadius: BorderRadius.circular(12.w),
+                border: Border.all(color: ColorName.white20, width: 2.w),
+                gradient: LinearGradient(
+                  colors: ['#5B618D'.toColor(), '#283B58'.toColor()],
+                  begin: Alignment.centerLeft,
+                  end: Alignment.centerRight,
+                  transform: const GradientRotation(-1.64061),
+                  stops: const [0, 1.0],
+                ),
+              ),
+              child: Row(
+                children: [
+                  SizedBox(width: 16.w),
+                  IntrinsicHeight(
+                    child: Column(
+                      children: [
+                        SizedBox(
+                            height: 18.h,
+                            child: Assets.images.iconChargeCenterTxt.image()),
+                        SizedBox(height: 4.h),
+                        Text(controller.electricityTxt,
+                            style: TextStyle(
+                                fontSize: 12.sp, color: ColorName.white))
+                      ],
+                    ),
+                  ),
+                  const Spacer(),
+                  DecoratedBox(
+                    decoration: BoxDecoration(
+                      color: Colors.white,
+                      borderRadius: BorderRadius.circular(12.w),
+                    ),
+                    child: Padding(
+                      padding: const EdgeInsets.symmetric(
+                              vertical: 4, horizontal: 11)
+                          .w,
+                      child: Text(
+                        StringName.mainGoCharge.tr,
+                        style: TextStyle(
+                            fontSize: 14.sp,
+                            color: '#374668'.toColor(),
+                            fontWeight: FontWeight.bold),
+                      ),
+                    ),
+                  ),
+                  SizedBox(width: 18.w),
+                ],
+              ),
+            ),
+            SizedBox(height: 12.h),
+            _buildContent1(),
+            SizedBox(height: 8.h),
+            _buildContent2(),
+            SizedBox(height: 8.h),
+            _buildLogOut(),
+            const Spacer(),
+            Padding(
+              padding: const EdgeInsets.only(bottom: 22).h,
+              child: Text(StringName.mainDrawerRecordNumber.tr,
+                  style: TextStyle(
+                      fontSize: 12.sp, color: ColorName.tertiaryTextColor)),
+            )
+          ],
+        ),
+      ),
+    );
+  }
+
+  GestureDetector _buildLogOut() {
+    return GestureDetector(
+      onTap: () {
+        accountRepository.logout();
+        Get.back();
+      },
+      child: Container(
+        height: 44.h,
+        alignment: Alignment.center,
+        decoration: BoxDecoration(
+          color: ColorName.white,
+          borderRadius: BorderRadius.circular(8.w),
+        ),
+        child: Text(
+          StringName.mainDrawerLogout.tr,
+          style: TextStyle(
+            color: "#25262A".toColor(),
+          ),
+        ),
+      ),
+    );
+  }
+
+  Container _buildContent2() {
+    return Container(
+      padding: EdgeInsets.symmetric(vertical: 8.h),
+      decoration: BoxDecoration(
+        color: ColorName.white,
+        borderRadius: BorderRadius.circular(12.w),
+      ),
+      child: Column(
+        children: [
+          buildOperationItem(
+            Assets.images.iconDrawerPrivacyPolicy.image(),
+            StringName.privacyPolicy.tr,
+            () {
+              BrowserPage.start(Constants.privacyPolicy);
+            },
+          ),
+          buildOperationItem(
+            Assets.images.iconDrawerUserAgreement.image(),
+            StringName.userAgreement.tr,
+            () {
+              BrowserPage.start(Constants.userAgreement);
+            },
+          ),
+          buildOperationItem(
+            Assets.images.iconDrawerCheckUpdates.image(),
+            StringName.mainDrawerCheckUpdates.tr,
+            () {},
+            rightView: Text(
+              controller.versionName,
+              style: TextStyle(
+                  fontSize: 12.sp, color: ColorName.tertiaryTextColor),
+            ),
+          ),
+          buildOperationItem(
+            Assets.images.iconComplaintAndReport.image(),
+            StringName.mainDrawerComplaintAndReport.tr,
+            () {},
+          ),
+          buildOperationItem(
+            Assets.images.iconLogoff.image(),
+            StringName.mainDrawerLogoff.tr,
+            () {},
+          ),
+        ],
+      ),
+    );
+  }
+
+  Container _buildContent1() {
+    return Container(
+      padding: EdgeInsets.symmetric(vertical: 8.h),
+      decoration: BoxDecoration(
+        color: ColorName.white,
+        borderRadius: BorderRadius.circular(12.w),
+      ),
+      child: Column(
+        children: [
+          // buildOperationItem(
+          //   Assets.images.iconTempManagement.image(),
+          //   StringName.mainDrawerTemplateManagement.tr,
+          //       () {},
+          // ),
+          Builder(builder: (context) {
+            return buildOperationItem(
+              Assets.images.iconIndustryChange.image(),
+              StringName.mainDrawerIndustryPositionChange.tr,
+              () {
+                showStartSheet(context);
+              },
+            );
+          })
+        ],
+      ),
+    );
+  }
+
+  Widget buildUserInfoView() {
+    return Row(
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: [
+        SizedBox(
+            width: 44.w,
+            height: 44.w,
+            child: Assets.images.iconHomeLogged.image()),
+        SizedBox(width: 10.w),
+        Text(controller.loginTxt,
+            style: TextStyle(
+                fontSize: 20.sp,
+                color: ColorName.primaryTextColor,
+                fontWeight: FontWeight.bold)),
+        SizedBox(width: 8.w),
+      ],
+    );
+  }
+
+  Widget buildOperationItem(Image icon, String title, Function onTap,
+      {Widget? rightView = const SizedBox.shrink()}) {
+    return GestureDetector(
+      onTap: () {
+        onTap();
+      },
+      child: Container(
+        padding: const EdgeInsets.symmetric(vertical: 12).h,
+        color: Colors.transparent,
+        child: Row(
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: [
+            SizedBox(width: 16.w),
+            SizedBox(width: 20.w, height: 20.w, child: icon),
+            SizedBox(width: 8.w),
+            Expanded(
+              child: Text(title,
+                  style: TextStyle(
+                      fontSize: 14.sp, color: ColorName.primaryTextColor)),
+            ),
+            const Spacer(),
+            rightView ?? const SizedBox.shrink(),
+            SizedBox(width: 16.w)
+          ],
+        ),
+      ),
+    );
+  }
+
+  void showStartSheet(BuildContext context) {
+    showModalBottomSheet(
+      context: context,
+      isScrollControlled: true,
+      barrierColor: ColorName.black55,
+      backgroundColor: ColorName.transparent,
+      builder: (BuildContext context) {
+        return const ChatStartPage();
+      },
+    );
+  }
+
+  @override
+  Color backgroundColor() {
+    return '#F6F5F8'.toColor();
+  }
+}

+ 0 - 236
lib/module/main/drawer_view.dart

@@ -1,236 +0,0 @@
-import 'package:electronic_assistant/data/repositories/account_repository.dart';
-import 'package:electronic_assistant/module/main/controller.dart';
-import 'package:electronic_assistant/utils/app_info_util.dart';
-import 'package:electronic_assistant/utils/expand.dart';
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_screenutil/flutter_screenutil.dart';
-import 'package:get/get.dart';
-
-import '../../resource/assets.gen.dart';
-import '../../resource/colors.gen.dart';
-import '../../resource/string.gen.dart';
-import '../../router/app_pages.dart';
-import '../chat/start/view.dart';
-
-void showStartSheet(BuildContext context) {
-  showModalBottomSheet(
-    context: context,
-    isScrollControlled: true,
-    barrierColor: ColorName.black55,
-    backgroundColor: ColorName.transparent,
-    builder: (BuildContext context) {
-      return const ChatStartPage();
-    },
-  );
-}
-
-Widget buildDrawerContent(MainController controller, BuildContext context) {
-  return SafeArea(
-    child: Padding(
-      padding: EdgeInsets.symmetric(horizontal: 16.w),
-      child: Column(
-        children: [
-          SizedBox(height: 12.h),
-          buildUserInfoView(controller),
-          SizedBox(height: 12.h),
-          Container(
-            height: 72.w,
-            decoration: BoxDecoration(
-              borderRadius: BorderRadius.circular(12.w),
-              border: Border.all(color: ColorName.white20, width: 2.w),
-              gradient: LinearGradient(
-                colors: ['#5B618D'.toColor(), '#283B58'.toColor()],
-                begin: Alignment.centerLeft,
-                end: Alignment.centerRight,
-                transform: const GradientRotation(-1.64061),
-                stops: const [0, 1.0],
-              ),
-            ),
-            child: Row(
-              children: [
-                SizedBox(width: 16.w),
-                IntrinsicHeight(
-                  child: Column(
-                    children: [
-                      SizedBox(
-                          height: 18.h,
-                          child: Assets.images.iconChargeCenterTxt.image()),
-                      SizedBox(height: 4.h),
-                      Text(controller.electricityTxt,
-                          style: TextStyle(
-                              fontSize: 12.sp, color: ColorName.white))
-                    ],
-                  ),
-                ),
-                const Spacer(),
-                DecoratedBox(
-                  decoration: BoxDecoration(
-                    color: Colors.white,
-                    borderRadius: BorderRadius.circular(12.w),
-                  ),
-                  child: Padding(
-                    padding:
-                        const EdgeInsets.symmetric(vertical: 4, horizontal: 11)
-                            .w,
-                    child: Text(
-                      StringName.mainGoCharge.tr,
-                      style: TextStyle(
-                          fontSize: 14.sp,
-                          color: '#374668'.toColor(),
-                          fontWeight: FontWeight.bold),
-                    ),
-                  ),
-                ),
-                SizedBox(width: 18.w),
-              ],
-            ),
-          ),
-          SizedBox(height: 12.h),
-          Container(
-            padding: EdgeInsets.symmetric(vertical: 8.h),
-            decoration: BoxDecoration(
-              color: ColorName.white,
-              borderRadius: BorderRadius.circular(12.w),
-            ),
-            child: Column(
-              children: [
-                buildOperationItem(
-                  Assets.images.iconTempManagement.image(),
-                  StringName.mainDrawerTemplateManagement.tr,
-                  () {},
-                ),
-                Builder(builder: (context) {
-                  return buildOperationItem(
-                    Assets.images.iconIndustryChange.image(),
-                    StringName.mainDrawerIndustryPositionChange.tr,
-                    () {
-                      showStartSheet(context);
-                    },
-                  );
-                })
-              ],
-            ),
-          ),
-          SizedBox(height: 8.h),
-          Container(
-            padding: EdgeInsets.symmetric(vertical: 8.h),
-            decoration: BoxDecoration(
-              color: ColorName.white,
-              borderRadius: BorderRadius.circular(12.w),
-            ),
-            child: Column(
-              children: [
-                buildOperationItem(
-                  Assets.images.iconDrawerPrivacyPolicy.image(),
-                  StringName.privacyPolicy.tr,
-                  () {},
-                ),
-                buildOperationItem(
-                  Assets.images.iconDrawerUserAgreement.image(),
-                  StringName.userAgreement.tr,
-                  () {},
-                ),
-                buildOperationItem(
-                  Assets.images.iconDrawerCheckUpdates.image(),
-                  StringName.mainDrawerCheckUpdates.tr,
-                  () {},
-                  rightView: Text(
-                    controller.versionName,
-                    style: TextStyle(
-                        fontSize: 12.sp, color: ColorName.tertiaryTextColor),
-                  ),
-                ),
-                buildOperationItem(
-                  Assets.images.iconComplaintAndReport.image(),
-                  StringName.mainDrawerComplaintAndReport.tr,
-                  () {},
-                ),
-                buildOperationItem(
-                  Assets.images.iconLogoff.image(),
-                  StringName.mainDrawerLogoff.tr,
-                  () {},
-                ),
-              ],
-            ),
-          ),
-          SizedBox(height: 8.h),
-          GestureDetector(
-            onTap: () {
-              accountRepository.logout();
-              Navigator.pop(context);
-            },
-            child: Container(
-              height: 44.h,
-              alignment: Alignment.center,
-              decoration: BoxDecoration(
-                color: ColorName.white,
-                borderRadius: BorderRadius.circular(8.w),
-              ),
-              child: Text(
-                StringName.mainDrawerLogout.tr,
-                style: TextStyle(
-                  color: "#25262A".toColor(),
-                ),
-              ),
-            ),
-          ),
-          const Spacer(),
-          Padding(
-            padding: const EdgeInsets.only(bottom: 22).h,
-            child: Text(StringName.mainDrawerRecordNumber.tr,
-                style: TextStyle(
-                    fontSize: 12.sp, color: ColorName.tertiaryTextColor)),
-          )
-        ],
-      ),
-    ),
-  );
-}
-
-Widget buildUserInfoView(MainController controller) {
-  return Row(
-    crossAxisAlignment: CrossAxisAlignment.center,
-    children: [
-      SizedBox(
-          width: 44.w,
-          height: 44.w,
-          child: Assets.images.iconHomeLogged.image()),
-      SizedBox(width: 10.w),
-      Text(controller.loginTxt,
-          style: TextStyle(
-              fontSize: 20.sp,
-              color: ColorName.primaryTextColor,
-              fontWeight: FontWeight.bold)),
-      SizedBox(width: 8.w),
-    ],
-  );
-}
-
-Widget buildOperationItem(Image icon, String title, Function onTap,
-    {Widget? rightView = const SizedBox.shrink()}) {
-  return GestureDetector(
-    onTap: () {
-      onTap();
-    },
-    child: Padding(
-      padding: const EdgeInsets.symmetric(vertical: 12).h,
-      child: Row(
-        crossAxisAlignment: CrossAxisAlignment.center,
-        children: [
-          SizedBox(width: 16.w),
-          SizedBox(width: 20.w, height: 20.w, child: icon),
-          SizedBox(width: 8.w),
-          Expanded(
-            child: Text(title,
-                style: TextStyle(
-                    fontSize: 14.sp, color: ColorName.primaryTextColor)),
-          ),
-          const Spacer(),
-          rightView ?? const SizedBox.shrink(),
-          SizedBox(width: 16.w)
-        ],
-      ),
-    ),
-  );
-}

+ 2 - 2
lib/module/main/view.dart

@@ -1,6 +1,7 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/main.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
+import 'package:electronic_assistant/module/main/drawer/view.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
@@ -13,7 +14,6 @@ import 'package:get/get.dart';
 import '../../router/app_pages.dart';
 import '../files/view.dart';
 import '../home/view.dart';
-import 'drawer_view.dart';
 
 class MainTabPage extends BasePage<MainController> {
   MainTabPage({super.key});
@@ -38,7 +38,7 @@ class MainTabPage extends BasePage<MainController> {
           borderRadius: BorderRadius.zero,
         ),
         backgroundColor: "#F6F5F8".toColor(),
-        child: buildDrawerContent(controller, context),
+        child: const MainDrawerView(),
       ),
     );
   }

+ 8 - 0
lib/router/app_pages.dart

@@ -1,7 +1,10 @@
+import 'package:electronic_assistant/module/browser/controller.dart';
+import 'package:electronic_assistant/module/browser/view.dart';
 import 'package:electronic_assistant/module/chat/start/controller.dart';
 import 'package:electronic_assistant/module/files/controller.dart';
 import 'package:electronic_assistant/module/files/search/controller.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
+import 'package:electronic_assistant/module/main/drawer/controller.dart';
 import 'package:electronic_assistant/module/record/controller.dart';
 import 'package:electronic_assistant/module/store/controller.dart';
 import 'package:electronic_assistant/module/store/view.dart';
@@ -54,6 +57,8 @@ abstract class RoutePath {
   static const talkDetail = '/talkDetail';
 
   static const store = '/store';
+
+  static const browser = '/browser';
 }
 
 class AppBinding extends Bindings {
@@ -73,6 +78,8 @@ class AppBinding extends Bindings {
     lazyPut(() => FilesController());
     lazyPut(() => FileSearchController());
     lazyPut(() => ChatStartController());
+    lazyPut(() => BrowserController());
+    lazyPut(() => MainDrawerController());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {
@@ -92,4 +99,5 @@ final generalPages = [
   GetPage(name: RoutePath.record, page: () => const RecordPage()),
   GetPage(name: RoutePath.store, page: () => const StorePage()),
   GetPage(name: RoutePath.talkDetail, page: () => const TalkPage()),
+  GetPage(name: RoutePath.browser, page: () => const BrowserPage()),
 ];