Browse Source

refactor: unified node online detection method

M1Screw 2 years ago
parent
commit
33fe5d7307

+ 42 - 36
resources/views/tabler/auth/login.tpl

@@ -36,19 +36,21 @@
                             <span class="form-check-label">记住此设备</span>
                         </label>
                     </div>
-                    {if $public_setting['enable_login_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                    <div class="mb-2">
-                        <div class="input-group mb-2">
-                            <div class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
-                        </div>
-                    </div>
-                    {/if}
-                    {if $public_setting['enable_login_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                    <div class="mb-2">
-                        <div class="input-group mb-2">
-                            <div id="geetest"></div>
-                        </div>
-                    </div>
+                    {if $public_setting['enable_login_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                            <div class="mb-3">
+                                <div class="input-group mb-3">
+                                    <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                                </div>
+                            </div>
+                        {/if}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
+                            <div class="mb-3">
+                                <div class="input-group mb-3">
+                                    <div id="geetest"></div>
+                                </div>
+                            </div>
+                        {/if}
                     {/if}
                     <div class="form-footer">
                         <button id="login-dashboard" class="btn btn-primary w-100">登录</button>
@@ -72,11 +74,13 @@
                     email: $('#email').val(),
                     passwd: $('#passwd').val(),
                     remember_me: $('#remember_me').val(),
-                    {if $public_setting['enable_login_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                    turnstile: turnstile.getResponse(),
-                    {/if}
-                    {if $public_setting['enable_login_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                    geetest: geetest.getValidate(),
+                    {if $public_setting['enable_login_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                            turnstile: $('input[name=cf-turnstile-response]').val(),
+                        {/if}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
+                            geetest: geetest.getValidate(),
+                        {/if}
                     {/if}
                 },
                 success: function(data) {
@@ -93,24 +97,26 @@
         });
     </script>
 
-    {if $public_setting['enable_login_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha" async defer></script>
-    {/if}
-    {if $public_setting['enable_login_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-        <script src="https://static.geetest.com/v4/gt4.js"></script>
-        <script>
-            var geetest_result = '';
-            initGeetest4({
-                captchaId: '{$captcha['geetest_id']}',
-                product: 'float',
-                language: "zho",
-                riskType:'slide'
-            }, function (geetest) {
-                geetest.appendTo("#geetest");
-                geetest.onSuccess(function() {
-                    geetest_result = geetest.getValidate();
+    {if $public_setting['enable_login_captcha']}
+        {if $public_setting['captcha_provider'] === 'turnstile'}
+            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+        {/if}
+        {if $public_setting['captcha_provider'] === 'geetest'}
+            <script src="https://static.geetest.com/v4/gt4.js"></script>
+            <script>
+                var geetest_result = '';
+                initGeetest4({
+                    captchaId: '{$captcha['geetest_id']}',
+                    product: 'float',
+                    language: "zho",
+                    riskType:'slide'
+                }, function (geetest) {
+                    geetest.appendTo("#geetest");
+                    geetest.onSuccess(function() {
+                        geetest_result = geetest.getValidate();
+                    });
                 });
-            });
-        </script> 
+            </script>
+        {/if}
     {/if}
 {include file='tabler_footer.tpl'}

+ 43 - 37
resources/views/tabler/auth/register.tpl

@@ -67,19 +67,21 @@
                                 </span>
                             </label>
                         </div>
-                        {if $public_setting['enable_reg_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                        <div class="mb-3">
-                            <div class="input-group mb-2">
-                                <div class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
-                            </div>
-                        </div>
-                        {/if}
-                        {if $public_setting['enable_reg_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                        <div class="mb-2">
-                            <div class="input-group mb-2">
-                                <div id="geetest"></div>
-                            </div>
-                        </div>
+                        {if $public_setting['enable_reg_captcha']}
+                            {if $public_setting['captcha_provider'] === 'turnstile'}
+                                <div class="mb-3">
+                                    <div class="input-group mb-3">
+                                        <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                                    </div>
+                                </div>
+                            {/if}
+                            {if $public_setting['captcha_provider'] === 'geetest'}
+                                <div class="mb-3">
+                                    <div class="input-group mb-3">
+                                        <div id="geetest"></div>
+                                    </div>
+                                </div>
+                            {/if}
                         {/if}
                         <div class="form-footer">
                             <button id="confirm-register" type="submit" class="btn btn-primary w-100">注册新账户</button>
@@ -139,11 +141,13 @@
                     email: $('#email').val(),
                     passwd: $('#passwd').val(),
                     repasswd: $('#repasswd').val(),
-                    {if $public_setting['enable_reg_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                    turnstile: turnstile.getResponse(),
-                    {/if}
-                    {if $public_setting['enable_reg_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                    geetest: geetest_result,
+                    {if $public_setting['enable_reg_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                            turnstile: $('input[name=cf-turnstile-response]').val(),
+                        {/if}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
+                            geetest: geetest_result,
+                        {/if}
                     {/if}
                 },
                 success: function(data) {
@@ -160,24 +164,26 @@
         });
     </script>
 
-    {if $public_setting['enable_reg_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha" async defer></script>
-    {/if}
-    {if $public_setting['enable_reg_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-    <script src="https://static.geetest.com/v4/gt4.js"></script>
-    <script>
-        var geetest_result = '';
-        initGeetest4({
-            captchaId: '{$captcha['geetest_id']}',
-            product: 'float',
-            language: "zho",
-            riskType:'slide'
-        }, function (geetest) {
-            geetest.appendTo("#geetest");
-            geetest.onSuccess(function() {
-                geetest_result = geetest.getValidate();
-            });
-        });
-    </script>
+    {if $public_setting['enable_reg_captcha']}
+        {if $public_setting['captcha_provider'] === 'turnstile'}
+            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+        {/if}
+        {if $public_setting['captcha_provider'] === 'geetest'}
+            <script src="https://static.geetest.com/v4/gt4.js"></script>
+            <script>
+                var geetest_result = '';
+                initGeetest4({
+                    captchaId: '{$captcha['geetest_id']}',
+                    product: 'float',
+                    language: "zho",
+                    riskType:'slide'
+                }, function (geetest) {
+                    geetest.appendTo("#geetest");
+                    geetest.onSuccess(function() {
+                        geetest_result = geetest.getValidate();
+                    });
+                });
+            </script>
+        {/if}
     {/if}
 {include file='tabler_footer.tpl'}

+ 41 - 35
resources/views/tabler/password/reset.tpl

@@ -18,19 +18,21 @@
                         <label class="form-label">注册邮箱</label>
                         <input id="email" type="email" class="form-control">
                     </div>
-                    {if $public_setting['enable_reset_password_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                    <div class="mb-3">
-                        <div class="input-group mb-3">
-                            <div class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                    {if $public_setting['enable_reset_password_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                        <div class="mb-3">
+                            <div class="input-group mb-3">
+                                <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                            </div>
                         </div>
-                    </div>
-                    {/if}
-                    {if $public_setting['enable_reset_password_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                    <div class="mb-3">
-                        <div class="input-group mb-3">
-                            <div id="geetest"></div>
+                        {/if}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
+                        <div class="mb-3">
+                            <div class="input-group mb-3">
+                                <div id="geetest"></div>
+                            </div>
                         </div>
-                    </div>    
+                        {/if}
                     {/if}
                     <div class="form-footer">
                         <button id="send" class="btn btn-primary w-100">
@@ -54,11 +56,13 @@
                 dataType: "json",
                 data: {
                     email: $('#email').val(),
-                    {if $public_setting['enable_reset_password_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                    turnstile: turnstile.getResponse(),
-                    {/if}
-                    {if $public_setting['enable_reset_password_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                    geetest: geetest_result,
+                    {if $public_setting['enable_reset_password_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                            turnstile: $('input[name=cf-turnstile-response]').val(),
+                        {/if}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
+                            geetest: geetest_result,
+                        {/if}
                     {/if}
                 },
                 success: function(data) {
@@ -78,24 +82,26 @@
         });
     </script>
 
-    {if $public_setting['enable_reset_password_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha" async defer></script>
+    {if $public_setting['enable_reset_password_captcha']}
+        {if $public_setting['captcha_provider'] === 'turnstile'}
+            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+        {/if}
+        {if $public_setting['captcha_provider'] === 'geetest'}
+            <script src="https://static.geetest.com/v4/gt4.js"></script>
+            <script>
+                var geetest_result = '';
+                initGeetest4({
+                    captchaId: '{$captcha['geetest_id']}',
+                    product: 'float',
+                    language: "zho",
+                    riskType:'slide'
+                }, function (geetest) {
+                    geetest.appendTo("#geetest");
+                    geetest.onSuccess(function() {
+                        geetest_result = geetest.getValidate();
+                    });
+                });
+            </script>
+        {/if}
     {/if}
-    {if $public_setting['enable_reset_password_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-    <script src="https://static.geetest.com/v4/gt4.js"></script>
-    <script>
-        var geetest_result = '';
-        initGeetest4({
-            captchaId: '{$captcha['geetest_id']}',
-            product: 'float',
-            language: "zho",
-            riskType:'slide'
-        }, function (geetest) {
-            geetest.appendTo("#geetest");
-            geetest.onSuccess(function() {
-                geetest_result = geetest.getValidate();
-            });
-        });
-    </script>    
-    {/if}    
 {include file='tabler_footer.tpl'}

+ 49 - 39
resources/views/tabler/user/index.tpl

@@ -483,12 +483,14 @@
                                     {if !$user->isAbleToCheckin()}
                                     <button id="check-in" class="btn btn-primary ms-auto" disabled>已签到</button>
                                     {else}
-                                    {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                                    <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                                    {if $public_setting['enable_checkin_captcha']}
+                                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                                            <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                                        {/if}
+                                        {if $public_setting['captcha_provider'] === 'geetest'}
+                                            <div id="geetest"></div>
+                                        {/if}
                                     {/if}
-                                    {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                                    <div id="geetest"></div>
-                                    {/if} 
                                     <button id="check-in" class="btn btn-primary ms-auto">签到</button>
                                     {/if}
                                 </div>
@@ -509,11 +511,13 @@
         });
 
         const checkin_button = document.querySelector('#check-in');
-        {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-        const turnstile_recaptcha = document.querySelector('#cf-turnstile');
-        {/if}
-        {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-        const geetest_recaptcha = document.querySelector('#geetest');
+        {if $public_setting['enable_checkin_captcha']}
+            {if $public_setting['captcha_provider'] === 'turnstile'}
+                const turnstile_recaptcha = document.querySelector('#cf-turnstile');
+            {/if}
+            {if $public_setting['captcha_provider'] === 'geetest'}
+            const geetest_recaptcha = document.querySelector('#geetest');
+            {/if}
         {/if}
 
         $("#check-in").click(function() {
@@ -522,21 +526,25 @@
                 url: "/user/checkin",
                 dataType: "json",              
                 data: {
-                    {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                    turnstile: turnstile.getResponse(),
-                    {/if}
-                    {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                    geetest: geetest_result,
+                    {if $public_setting['enable_checkin_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
+                            turnstile: $('input[name=cf-turnstile-response]').val(),
+                        {/if}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
+                            geetest: geetest_result,
+                        {/if}
                     {/if}
                 },
                 success: function(data) {
                     if (data.ret == 1) {
                         checkin_button.disabled = true;
-                        {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-                        turnstile_recaptcha.remove();
-                        {/if}
-                        {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-                        geetest_recaptcha.remove();
+                        {if $public_setting['enable_checkin_captcha']}
+                            {if $public_setting['captcha_provider'] === 'turnstile'}
+                                turnstile_recaptcha.remove();
+                            {/if}
+                            {if $public_setting['captcha_provider'] === 'geetest'}
+                                geetest_recaptcha.remove();
+                            {/if}
                         {/if}
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -549,24 +557,26 @@
         });
     </script>
 
-    {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'turnstile'}
-    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha" async defer></script>
-    {/if}
-    {if $public_setting['enable_checkin_captcha'] === true && $public_setting['captcha_provider'] === 'geetest'}
-    <script src="https://static.geetest.com/v4/gt4.js"></script>
-    <script>
-        var geetest_result = '';
-        initGeetest4({
-            captchaId: '{$captcha['geetest_id']}',
-            product: 'float',
-            language: "zho",
-            riskType:'slide'
-        }, function (geetest) {
-            geetest.appendTo("#geetest");
-            geetest.onSuccess(function() {
-                geetest_result = geetest.getValidate();
-            });
-        });
-    </script>
+    {if $public_setting['enable_checkin_captcha']}
+        {if $public_setting['captcha_provider'] === 'turnstile'}
+            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+        {/if}
+        {if $public_setting['captcha_provider'] === 'geetest'}
+            <script src="https://static.geetest.com/v4/gt4.js"></script>
+            <script>
+                var geetest_result = '';
+                initGeetest4({
+                    captchaId: '{$captcha['geetest_id']}',
+                    product: 'float',
+                    language: "zho",
+                    riskType:'slide'
+                }, function (geetest) {
+                    geetest.appendTo("#geetest");
+                    geetest.onSuccess(function() {
+                        geetest_result = geetest.getValidate();
+                    });
+                });
+            </script>
+        {/if}
     {/if}
 {include file='user/tabler_footer.tpl'}

+ 9 - 11
resources/views/tabler/user/server.tpl

@@ -36,7 +36,7 @@
                                     {foreach $servers as $server}
                                         <div class="col-lg-4 col-md-6 col-sm-12">
                                             <div class="card">
-                                                {if $server["class"] == 0}
+                                                {if $server["class"] === 0}
                                                 <div class="ribbon bg-blue">免费</div>
                                                 {else}
                                                 <div class="ribbon bg-blue">LV. {$server["class"]}</div>
@@ -46,11 +46,11 @@
                                                         <div class="col-auto">
                                                             <span
                                                                 class="status-indicator
-                                                                {if $server["traffic_limit"] != '0' && $server["traffic_used"] >= $server["traffic_limit"]}
+                                                                {if $server["traffic_limit"] !== 0 && $server["traffic_used"] >= $server["traffic_limit"]}
                                                                 status-yellow 
-                                                                {elseif $server["online"] == "1"}
+                                                                {elseif $server["online"] === 1}
                                                                 status-green 
-                                                                {elseif $server["online"] == "0"}
+                                                                {elseif $server["online"] === 0}
                                                                 status-orange 
                                                                 {else}
                                                                 status-red 
@@ -66,7 +66,7 @@
                                                                 {$server["name"]}&nbsp;
                                                                 <span class="card-subtitle my-2"
                                                                     style="font-size: 10px;">
-                                                                    {if $server["traffic_limit"] == "0"}
+                                                                    {if $server["traffic_limit"] === 0}
                                                                         {round($server["traffic_used"])} GB /
                                                                         不限
                                                                     {else}
@@ -87,13 +87,11 @@
                                                                     </li>
                                                                     <li class="list-inline-item">
                                                                         <i class="ti ti-server-2"></i>&nbsp;
-                                                                        {if $server['sort'] == 0}
+                                                                        {if $server['sort'] === 0}
                                                                         Shadowsocks
-                                                                        {elseif $server['sort'] == 9}
-                                                                        Shadowsocksr
-                                                                        {elseif $server['sort'] == 11}
-                                                                        V2ray
-                                                                        {elseif $server['sort'] == 14}
+                                                                        {elseif $server['sort'] === 11}
+                                                                        V2Ray
+                                                                        {elseif $server['sort'] === 14}
                                                                         Trojan
                                                                         {/if}
                                                                     </li>

+ 2 - 2
src/Command/Job.php

@@ -263,7 +263,7 @@ EOL;
 
             foreach ($nodes as $node) {
                 $notice_text = '';
-                if ($node->isNodeOnline() === false && $node->online === true) {
+                if ($node->getNodeOnlineStatus() === 0 && $node->online) {
                     if ($_ENV['useScFtqq'] === true) {
                         $ScFtqq_SCKEY = $_ENV['ScFtqq_SCKEY'];
                         $text = '管理员您好,系统发现节点 ' . $node->name . ' 掉线了,请您及时处理。';
@@ -312,7 +312,7 @@ EOL;
 
                     $node->online = false;
                     $node->save();
-                } elseif ($node->isNodeOnline() === true && $node->online === false) {
+                } elseif ($node->getNodeOnlineStatus() === 1 && ! $node->online) {
                     if ($_ENV['useScFtqq'] === true) {
                         $ScFtqq_SCKEY = $_ENV['ScFtqq_SCKEY'];
                         $text = '管理员您好,系统发现节点 ' . $node->name . ' 恢复上线了。';

+ 2 - 2
src/Controllers/LinkController.php

@@ -34,14 +34,14 @@ final class LinkController extends BaseController
 
         $link = Link::where('token', $token)->first();
 
-        if (! $link->isValid()) {
+        if ($link === null || ! $link->isValid()) {
             return ResponseHelper::error($response, $err_msg);
         }
 
         $user = $link->user();
 
         $sub_type = '';
-        $sub_info = [];
+        $sub_info = '';
 
         if (isset($params['clash']) && $params['clash'] === '1') {
             $sub_type = 'clash';

+ 3 - 3
src/Controllers/SubController.php

@@ -36,7 +36,7 @@ final class SubController extends BaseController
 
         $link = Link::where('token', $token)->first();
 
-        if (! $link->isValid()) {
+        if ($link === null || ! $link->isValid()) {
             return ResponseHelper::error($response, $err_msg);
         }
 
@@ -289,8 +289,8 @@ final class SubController extends BaseController
                     $trojan_port = $node_custom_config['trojan_port'] ?? ($node_custom_config['offset_port_user']
                         ?? ($node_custom_config['offset_port_node'] ?? 443));
                     $network = $node_custom_config['network']
-                        ?? array_key_exists('grpc', $node_custom_config)
-                        && $node_custom_config['grpc'] === '1' ? 'grpc' : 'tcp';
+                        ?? (array_key_exists('grpc', $node_custom_config)
+                            && $node_custom_config['grpc'] === '1' ? 'grpc' : 'tcp');
                     $host = $node_custom_config['host'] ?? '';
                     $allow_insecure = $node_custom_config['allow_insecure'] ?? false;
                     // Clash 特定配置

+ 2 - 2
src/Controllers/User/ServerController.php

@@ -38,8 +38,8 @@ final class ServerController extends BaseController
             $array_node = [];
             $array_node['id'] = $node->id;
             $array_node['name'] = $node->name;
-            $array_node['class'] = $node->node_class;
-            $array_node['sort'] = $node->sort;
+            $array_node['class'] = (int) $node->node_class;
+            $array_node['sort'] = (int) $node->sort;
             $array_node['info'] = $node->info;
             $array_node['online_user'] = $node->online_user;
             $array_node['online'] = $node->getNodeOnlineStatus();

+ 1 - 12
src/Models/Node.php

@@ -55,7 +55,7 @@ final class Node extends Model
     public function getNodeOnlineStatus(): int
     {
         // 类型 9 或者心跳为 0
-        if ($this->node_heartbeat === 0 || $this->sort === 9) {
+        if ($this->node_heartbeat === 0) {
             return 0;
         }
         return $this->node_heartbeat + 300 > time() ? 1 : -1;
@@ -75,17 +75,6 @@ final class Node extends Model
         return $this->node_speedlimit . 'Mbps';
     }
 
-    /**
-     * 节点是在线的
-     */
-    public function isNodeOnline(): ?bool
-    {
-        if ($this->node_heartbeat === 0) {
-            return false;
-        }
-        return $this->node_heartbeat > time() - 300;
-    }
-
     /**
      * 节点流量已耗尽
      */

+ 1 - 1
src/Services/Boot.php

@@ -21,7 +21,7 @@ final class Boot
 
     public static function bootSentry(): void
     {
-        if (! isset($_ENV['sentry_dsn'])) {
+        if ($_ENV['sentry_dsn'] !== '') {
             init([
                 'dsn' => $_ENV['sentry_dsn'],
             ]);