dodo hold 1 gadu atpakaļ
vecāks
revīzija
c65f11accf

+ 1 - 1
molilian.api/Controllers/admin/AliyunController.cs

@@ -111,7 +111,7 @@ namespace molilian.api.Controllers
                             if (item.balance != amout && amout <= item.balance_alert_threshold)
                             {
                                 string message = $"【{item.company}】阿里云当前余额:{amout} 元";
-                                NotifyCore.AnPushNotify("余额预警", message);
+                                _ = NotifyCore.QYWeixinPushNotifyAsync("余额预警", message);
                                 NotifyCore.Notify(new NifyMessage
                                 {
                                     message = message,

+ 7 - 6
molilian.api/Controllers/admin/MessageController.cs

@@ -20,7 +20,7 @@ namespace molilian.api.Controllers
         [HttpGet]
         public async Task<ActionResult> AccountWarning()
         {
-            IEnumerable<TkPoolDTO> tb_list = await TkPoolCore.ListAsync();
+            IEnumerable<TkPoolDTO> tb_list = await TkPoolCore.AllListAsync();
 
             List<string> typeKeys = new List<string>();
             List<string> riskStrategyKeys = new List<string>();
@@ -50,10 +50,10 @@ namespace molilian.api.Controllers
             {
                 // riskStrategyKey 格式为 "riskStrategy-launchScene"
                 string[] parts = riskStrategyKey.Split('-');
-                if (parts.Length == 2)
+                if (parts.Length >= 2)
                 {
                     string riskStrategy = parts[0];
-                    if (int.TryParse(parts[1], out int launchScene))
+                    if (int.TryParse(parts[^1], out int launchScene))
                     {
                         var riskAccounts = tb_list.Where(tb =>
                             tb.riskStrategy == riskStrategy &&
@@ -67,7 +67,7 @@ namespace molilian.api.Controllers
                 }
             }
 
-            IEnumerable<JdPoolDTO> jd_list = await JdPoolCore.ListAsync();
+            IEnumerable<JdPoolDTO> jd_list = await JdPoolCore.AllListAsync();
 
             List<string> jdTypeKeys = new List<string>();
             List<string> jdRiskStrategyKeys = new List<string>();
@@ -77,6 +77,7 @@ namespace molilian.api.Controllers
             // 收集京东的 typeKeys 和 riskStrategyKeys
             foreach (JdPoolDTO jd in jd_list)
             {
+                if (jd.id < 38) continue;
                 if (!string.IsNullOrEmpty(jd.parse_type) && !jdTypeKeys.Contains(jd.parse_type)) jdTypeKeys.Add(jd.parse_type);
                 if (!string.IsNullOrEmpty(jd.riskStrategy))
                 {
@@ -100,10 +101,10 @@ namespace molilian.api.Controllers
             {
                 // riskStrategyKey 格式为 "riskStrategy-launchScene"
                 string[] parts = riskStrategyKey.Split('-');
-                if (parts.Length == 2)
+                if (parts.Length >= 2)
                 {
                     string riskStrategy = parts[0];
-                    if (int.TryParse(parts[1], out int launchScene))
+                    if (int.TryParse(parts[^1], out int launchScene))
                     {
                         var riskAccounts = jd_list.Where(jd =>
                             jd.riskStrategy == riskStrategy &&

+ 8 - 0
molilian.api/Controllers/public/TaskController.cs

@@ -29,6 +29,14 @@ namespace molilian.api.Controllers
         }
 
 
+        [HttpGet]
+        public ActionResult NotifyNotPushed()
+        {
+            PushDataReportCore core = new();
+            int count = core.NotifyNotPushed();
+            return new APIResult(new { success = true, count });
+        }
+
         [HttpGet]
         public async Task<ActionResult> FillPushReortData(DateTime date = default)
         {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
molilian.api/Properties/PublishProfiles/latest.pubxml.user


+ 4 - 0
molilian.api/Properties/launchSettings.json

@@ -9,6 +9,7 @@
         "EndPoint": "bj2",
         "NtfyServer": "https://ntfy.yunhui800.com/5Sq9BytXXM5WDY3G",
         "ANPush": "",
+        "QYWeixinPush": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6e745143-62b1-4d33-a85f-9a76e6c2c239",
         "DBType": "MySQL",
         "DBConfig": "Server=rm-2ze74506m3gfsqe7mco.rwlb.rds.aliyuncs.com; Port=3306; Database=coupon; Uid=coupon; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60;",
         "RedisConfig": "101.200.46.46:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook",
@@ -19,6 +20,7 @@
         "ASPNETCORE_ENVIRONMENT": "Development",
         "EndPoint": "bj",
         "NtfyServer": "https://ntfy.yunhui800.com/5Sq9BytXXM5WDY3G",
+        "QYWeixinPush": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6e745143-62b1-4d33-a85f-9a76e6c2c239",
         "ANPush": "",
         "DBType": "MySQL",
         "DBConfig": "Server=rm-2zey1jqxnoqy9mcc0uo.rwlb.rds.aliyuncs.com; Port=3306; Database=taoke; Uid=taoke; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60",
@@ -30,6 +32,7 @@
         "ASPNETCORE_ENVIRONMENT": "Development",
         "EndPoint": "bj5",
         "NtfyServer": "https://ntfy.yunhui800.com/5Sq9BytXXM5WDY3G",
+        "QYWeixinPush": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6e745143-62b1-4d33-a85f-9a76e6c2c239",
         "ANPush": "",
         "DBType": "MySQL",
         "DBConfig": "Server=49.7.231.136; Port=3306; Database=taoke; Uid=taoke; Pwd=btJ2h2TwFPka8hi2;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60;",
@@ -41,6 +44,7 @@
         "ASPNETCORE_ENVIRONMENT": "Development",
         "EndPoint": "cadmin",
         "NtfyServer": "https://ntfy.yunhui800.com/5Sq9BytXXM5WDY3G",
+        "QYWeixinPush": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6e745143-62b1-4d33-a85f-9a76e6c2c239",
         "ANPush": "",
         "DBType": "MySQL",
         "DBConfig": "Server=rm-2ze74506m3gfsqe7mco.rwlb.rds.aliyuncs.com; Port=3306; Database=coupon; Uid=coupon; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60;",

+ 42 - 0
molilian.core/Core/NotifyCore.cs

@@ -14,10 +14,12 @@ namespace molilian.core
     {
         static string _base_url = string.Empty;
         static string _anpush_url = string.Empty;
+        static string _qyweixin_push_url = string.Empty;
 
         static NotifyCore()
         {
             _anpush_url = Environment.GetEnvironmentVariable("ANPush");
+            _qyweixin_push_url = Environment.GetEnvironmentVariable("QYWeixinPush");
 
             string? publish_url = Environment.GetEnvironmentVariable("NtfyServer");
             if (!string.IsNullOrEmpty(publish_url))
@@ -62,6 +64,46 @@ namespace molilian.core
             }
         }
 
+        public static async Task QYWeixinPushNotifyAsync(string title, string content)
+        {
+#if DEBUG
+            await Task.CompletedTask;
+#else
+            if (!string.IsNullOrEmpty(_qyweixin_push_url))
+            {
+                var args = new
+                {
+                    msgtype = "markdown",
+                    markdown = new
+                    {
+                        content = $"# {title}\n{content}",
+                    }
+                };
+                string body = string.Empty;
+                try
+                {
+                    WebClientUtility client = new WebClientUtility();
+                    client.Post(args.Convert2Json());
+                    client.SetContentType("application/json");
+                    var response = await client.RequestAsync(_qyweixin_push_url, "POST");
+                    body = response.Body();
+
+                    new LoggerLibrary("qyweixin").Info(title, content).Info(body).Save();
+                }
+                catch (Exception ex)
+                {
+                    new LoggerLibrary("qyweixin", "error")
+                        .Info(title, content)
+                        .Info(body)
+                        .Info(ex.Message, ex.StackTrace)
+                        .Save();
+                }
+            }
+#endif
+        }
+
+
+
         // 同步版本保持不变
         public static void AnPushNotify(string title, string content)
         {

+ 24 - 1
molilian.core/Core/PushDataReport/PushDataReportCore.cs

@@ -259,7 +259,6 @@ namespace molilian.core
             }
         }
 
-
         public async Task<int> PushReportData(DateTime report_date, bool repush = false, CancellationToken cancellationToken = default)
         {
             string filter = "report_date=@report_date";
@@ -297,5 +296,29 @@ namespace molilian.core
             }
             return count;
         }
+
+        public int NotifyNotPushed(CancellationToken cancellationToken = default)
+        {
+            DateTime report_date = DateTime.Now.Date.AddDays(-1);
+            string filter = "report_date=@report_date and status=@status";
+
+            var list = new DBContext.Table("push_data_report")
+                .Where(filter, new { report_date = report_date.Date, status = 0 })
+                .Select<PushDataReportDTO>();
+
+            int count = list.Count();
+
+            if (count > 0)
+            {
+                NotifyCore.Notify(new NifyMessage
+                {
+                    message = $"【数据回传】未推送警告\n当日还有:{count} 条数据未推送",
+                    priority = NifyMessagePriority.high,
+                    tags = ["red_circle"]
+                });
+                _ = NotifyCore.QYWeixinPushNotifyAsync("【数据回传】未推送警告", $"当日还有:{count}条数据未推送");
+            }
+            return count;
+        }
     }
 }

+ 1 - 1
molilian.core/Core/aliyun/AliyunPoolCore.cs

@@ -86,7 +86,7 @@ namespace molilian.core
                         if (item.balance != amout && amout <= item.balance_alert_threshold)
                         {
                             string message = $"【{item.company}】阿里云当前余额:{amout} 元";
-                            NotifyCore.AnPushNotify("余额预警", message);
+                            _ = NotifyCore.QYWeixinPushNotifyAsync("余额预警", message);
                             NotifyCore.Notify(new NifyMessage
                             {
                                 message = message,

+ 1 - 1
molilian.core/Core/cps/CpsPoolCore.cs

@@ -205,7 +205,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【CPS优惠券】没有匹配账号");
+            _ = NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【CPS优惠券】没有匹配账号");
         }
 
     }

+ 1 - 1
molilian.core/Core/cps/ElePoolCore.cs

@@ -96,7 +96,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【饿了么联盟】没有匹配账号");
+            NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【饿了么联盟】没有匹配账号");
         }
 
     }

+ 1 - 1
molilian.core/Core/cps/MeituanPoolCore.cs

@@ -92,7 +92,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【美团联盟】没有匹配账号");
+            _ = NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【美团联盟】没有匹配账号");
         }
 
     }

+ 3 - 3
molilian.core/Core/jd/JdPoolCore.cs

@@ -348,7 +348,7 @@ namespace molilian.core
                 tags = ["green_circle"]
             });
             _ = EndPointCore.NotifyReload(true);
-            //NotifyCore.AnPushNotify("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
+            //NotifyCore.QYWeixinPushNotifyAsync("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
             return accountId;
         }
 
@@ -377,7 +377,7 @@ namespace molilian.core
                 tags = ["red_circle"]
             });
 
-            //NotifyCore.AnPushNotify("掉线", $"【京东{accountId}:{name}】cookie 掉线");
+            //NotifyCore.QYWeixinPushNotifyAsync("掉线", $"【京东{accountId}:{name}】cookie 掉线");
             _ = EndPointCore.NotifyReload(true);
         }
 
@@ -396,7 +396,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【京东联盟】没有匹配账号");
+            _ = NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【京东联盟】没有匹配账号");
         }
     }
 

+ 3 - 3
molilian.core/Core/ks/KsPoolCore.cs

@@ -186,7 +186,7 @@ namespace molilian.core
                 tags = ["green_circle"]
             });
             EndPointCore.NotifyReload(true);
-            //NotifyCore.AnPushNotify("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
+            //NotifyCore.QYWeixinPushNotifyAsync("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
             return accountId;
         }
 
@@ -217,7 +217,7 @@ namespace molilian.core
                 tags = ["red_circle"]
             });
 
-            //NotifyCore.AnPushNotify("掉线", $"【快手{accountId}:{name}】cookie 掉线");
+            //NotifyCore.QYWeixinPushNotifyAsync("掉线", $"【快手{accountId}:{name}】cookie 掉线");
             EndPointCore.NotifyReload(true);
         }
 
@@ -234,7 +234,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【快手联盟】没有匹配账号");
+            _ = NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【快手联盟】没有匹配账号");
         }
 
 

+ 5 - 1
molilian.core/Core/log/coupon.cs

@@ -115,6 +115,10 @@ namespace molilian.core
                 }
 
                 if (response.success) await saveClientRequestTotalAsync(response.channel, response.ip, response.oaid);
+
+                var account = await TkPoolCore.ALLGetOneAsync(response.accountId);
+                bool is_hide = account.is_hide;
+
                 if (!response.success && "nologin".Equals(response.message))
                 {
                     switch (response.channel)
@@ -125,7 +129,7 @@ namespace molilian.core
                                 (bool success, string message) = alimamaPlus.RenewCookie();
                                 if (success) return;
                             }
-                            TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}");
+                            TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}", is_hide);
                             break;
                     }
                 }

+ 1 - 1
molilian.core/Core/log/jd.cs

@@ -195,7 +195,7 @@ namespace molilian.core
                                 priority = NifyMessagePriority.high,
                                 tags = ["red_circle"]
                             });
-                            NotifyCore.AnPushNotify(response.reason, message);
+                            _ = NotifyCore.QYWeixinPushNotifyAsync(response.reason, message);
                         }
                     }
                 }

+ 6 - 2
molilian.core/Core/log/taobao.cs

@@ -120,6 +120,10 @@ namespace molilian.core
                 }
                 if (!string.IsNullOrEmpty(response.itemId)) TkOrderTrackingCore.SaveLinkSummary(response);
 
+
+                var account = await TkPoolCore.ALLGetOneAsync(response.accountId);
+                bool is_hide = account.is_hide;
+
                 if (!response.success && "nologin".Equals(response.message))
                 {
                     switch (response.channel)
@@ -130,13 +134,13 @@ namespace molilian.core
                                 (bool success, string message) = alimamaPlus.RenewCookie();
                                 if (success) return;
                             }
-                            TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}");
+                            TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}", is_hide);
                             break;
                     }
                 }
                 if (response.subCode == TkSubCodeEnum.ParseDeny && "接口风控ALL".Equals(response.reason))
                 {
-                    TkPoolCore.Disabled(response.accountId, response.accountName, "接口风控NONE");
+                    TkPoolCore.Disabled(response.accountId, response.accountName, "接口风控NONE", is_hide);
                     //todo  计数器+1
                 }
 

+ 6 - 3
molilian.core/Core/log/第三方旧接口.cs

@@ -111,20 +111,23 @@ namespace molilian.core
                     saveCache(response.channel.ToString(), response.accountId, response.accountName, response.success, response.message, response.reason);
                 }
 
+
+                var account = await TkPoolCore.ALLGetOneAsync(response.accountId);
+                bool is_hide = account.is_hide;
                 if (!response.success && "nologin".Equals(response.message))
                 {
                     switch (response.channel)
                     {
                         case TkChannelEnum.tb:
 
-                            await Task.Run(() =>
+                            await Task.Run(async () =>
                             {
                                 if (alimamaPlus != null)
                                 {
                                     (bool success, string message) = alimamaPlus.RenewCookie();
                                     if (success) return;
                                 }
-                                TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}\n{response.rawContent2}");
+                                TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}\n{response.rawContent2}", is_hide);
                             });
                             break;
                     }
@@ -132,7 +135,7 @@ namespace molilian.core
 
                 if ("接口风控ALL".Equals(response.reason))
                 {
-                    TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}\n{response.rawContent2}");
+                    TkPoolCore.Disabled(response.accountId, response.accountName, $"{response.rawContent}\n{response.rawContent2}", is_hide);
                 }
 
                 if ("没有匹配账号".Equals(response.reason))

+ 3 - 3
molilian.core/Core/pdd/PddPoolCore.cs

@@ -293,7 +293,7 @@ namespace molilian.core
                 tags = ["red_circle"]
             });
 
-            //NotifyCore.AnPushNotify("掉线", $"【多多{accountId}:{name}】cookie 掉线");
+            //NotifyCore.QYWeixinPushNotifyAsync("掉线", $"【多多{accountId}:{name}】cookie 掉线");
             EndPointCore.NotifyReload(true);
         }
 
@@ -309,7 +309,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【多多】没有匹配账号");
+            _ = NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【多多】没有匹配账号");
         }
 
         internal static async Task<JsonElement> GetUserInfo(string cookies)
@@ -389,7 +389,7 @@ namespace molilian.core
                 tags = ["green_circle"]
             });
             EndPointCore.NotifyReload(true);
-            //NotifyCore.AnPushNotify("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
+            //NotifyCore.QYWeixinPushNotifyAsync("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
             return accountId;
         }
 

+ 17 - 8
molilian.core/Core/taoke/TkPoolCore.cs

@@ -31,6 +31,12 @@ namespace molilian.core
             if (!list.Any()) return null;
             return list.Where(e => e.id == id).FirstOrDefault();
         }
+        public static async Task<TkPoolDTO> ALLGetOneAsync(int id)
+        {
+            var list = await AllListAsync();
+            if (!list.Any()) return null;
+            return list.Where(e => e.id == id).FirstOrDefault();
+        }
 
         public static async Task<TkPoolDTO> GetOneAsync2(TkAction action)
         {
@@ -345,11 +351,11 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("暂停", $"【淘客{accountId}:{name}】{endpoint} 暂停");
-            EndPointCore.NotifyReload(true);
+            _ = NotifyCore.QYWeixinPushNotifyAsync("暂停", $"【淘客{accountId}:{name}】{endpoint} 暂停");
+            _ = EndPointCore.NotifyReload(true);
         }
 
-        public static void Disabled(int accountId, string name, string content)
+        public static void Disabled(int accountId, string name, string content, bool is_hide)
         {
 #if DEBUG
 #else
@@ -378,8 +384,11 @@ namespace molilian.core
                 tags = ["red_circle"]
             });
 
-            NotifyCore.AnPushNotify("掉线", $"【淘客{accountId}:{name}】cookie 掉线");
-            EndPointCore.NotifyReload(true);
+            if (!is_hide)
+            {
+                _ = NotifyCore.QYWeixinPushNotifyAsync("掉线", $"【淘客{accountId}:{name}】cookie 掉线");
+            }
+            _ = EndPointCore.NotifyReload(true);
         }
 
         public static int UpdateCookies(string cookies, string user_agent)
@@ -433,8 +442,8 @@ namespace molilian.core
                 message = $"【淘客{accountId}:{company}】cookie 上线",
                 tags = ["green_circle"]
             });
-            EndPointCore.NotifyReload(true);
-            //NotifyCore.AnPushNotify("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
+            _ = EndPointCore.NotifyReload(true);
+            //NotifyCore.QYWeixinPushNotifyAsync("上线", $"【淘宝联盟:{dnk}】cookie 上报更新");
             return accountId;
         }
 
@@ -450,7 +459,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("没账号", $"【淘客】没有匹配账号");
+            _ = NotifyCore.QYWeixinPushNotifyAsync("没账号", $"【淘客】没有匹配账号");
         }
     }
 

+ 1 - 1
molilian.core/Core/taoke/VeapiPoolCore.cs

@@ -71,7 +71,7 @@ namespace molilian.core
                 priority = NifyMessagePriority.high,
                 tags = ["red_circle"]
             });
-            NotifyCore.AnPushNotify("掉线", $"【第三方接口:{name}】cookie 掉线");
+            NotifyCore.QYWeixinPushNotifyAsync("掉线", $"【第三方接口:{name}】cookie 掉线");
         }
 
     }

+ 1 - 1
molilian.core/Plus/Alimama/RefundOrders.cs

@@ -341,7 +341,7 @@ namespace molilian.core
                         (success, string message) = RenewCookie();
                         if (!success)
                         {
-                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}");
+                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}", _account.is_hide);
                         }
                         return (0, DateTime.MinValue, new List<DateTime>());
                     }

+ 1 - 1
molilian.core/Plus/Alimama/account.cs

@@ -195,7 +195,7 @@ namespace molilian.core
                     tags = ["green_circle"]
                 });
                 EndPointCore.NotifyReload(true);
-                //NotifyCore.AnPushNotify("Cookie更新", $"【淘宝联盟:{_accountName}】cookie 续期");
+                //NotifyCore.QYWeixinPushNotifyAsync("Cookie更新", $"【淘宝联盟:{_accountName}】cookie 续期");
 
                 return (true, string.Empty);
             }

+ 1 - 1
molilian.core/Plus/Alimama/bills.cs

@@ -61,7 +61,7 @@ namespace molilian.core
                         (success, string message) = RenewCookie();
                         if (!success)
                         {
-                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}");
+                            TkPoolCore.Disabled(_accountId, _accountName, $"{body}", _account.is_hide);
                         }
                         return 0;
                     }

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
molilian.core/Plus/Alimama/orders.cs


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels