From 8bc5f80dc566d58f2548c2a9927b7782d6f23b3c Mon Sep 17 00:00:00 2001 From: Yanyutin753 <153794571+YuWanTingbb@users.noreply.github.com> Date: Fri, 15 Mar 2024 09:45:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8ConcurrentHashMap=EF=BC=8C?= =?UTF-8?q?=E7=B2=97=E7=95=A5=E7=9A=84=E5=AF=B9=E4=BA=8E=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E6=8C=89=E6=AF=8F=E5=88=86=E9=92=9F=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E9=99=90=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.json | 5 +- .../copilot/controller/ChatController.java | 159 ++++++++++++++++-- .../com/gpt4/copilot/copilotApplication.java | 6 +- .../com/gpt4/copilot/pojo/SystemSetting.java | 15 ++ .../copilot/controller/ChatController$1.class | Bin 1380 -> 1380 bytes .../copilot/controller/ChatController.class | Bin 40070 -> 43796 bytes .../com/gpt4/copilot/copilotApplication.class | Bin 10690 -> 10969 bytes .../com/gpt4/copilot/pojo/SystemSetting.class | Bin 6199 -> 8014 bytes 8 files changed, 165 insertions(+), 20 deletions(-) diff --git a/config.json b/config.json index 5c7c2d8..b00e8b1 100644 --- a/config.json +++ b/config.json @@ -4,8 +4,11 @@ "get_token_url": "", "copilot_chat_version": "0.14.2024031401", "prefix": "", + "one_selfCopilot_limit": 2, + "one_copilot_limit": 2, "vscode_version": "vscode\/1.85.2", "serverPort": 8080, "maxPoolSize": 300, - "gpt4_sleepTime": 100 + "gpt4_sleepTime": 100, + "one_coCopilot_limit": 2 } \ No newline at end of file diff --git a/src/main/java/com/gpt4/copilot/controller/ChatController.java b/src/main/java/com/gpt4/copilot/controller/ChatController.java index 800572c..235a1b8 100644 --- a/src/main/java/com/gpt4/copilot/controller/ChatController.java +++ b/src/main/java/com/gpt4/copilot/controller/ChatController.java @@ -1,6 +1,5 @@ package com.gpt4.copilot.controller; -import com.alibaba.fastjson2.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.gpt4.copilot.copilotApplication; @@ -17,6 +16,7 @@ import org.json.JSONException; import org.json.JSONObject; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -56,6 +56,18 @@ public class ChatController { * 缓存selfToken */ private static final HashMap selfTokenList; + /** + * 缓存cocopilotToken_limit + */ + private static final ConcurrentHashMap copilotTokenLimitList; + /** + * 缓存copilotToken_limit + */ + private static final ConcurrentHashMap coCopilotTokenLimitList; + /** + * 缓存selfToken_limit + */ + private static final ConcurrentHashMap selfTokenLimitList; /** * 模型 */ @@ -108,6 +120,45 @@ public class ChatController { * 自定义maxPoolSize */ private static Integer maxPoolSize; + /** + * one copilot_token max requests per minute + */ + private static Integer one_copilot_limit; + + public static Integer getOne_copilot_limit() { + return one_copilot_limit; + } + + public static void setOne_copilot_limit(Integer one_copilot_limit) { + ChatController.one_copilot_limit = one_copilot_limit; + } + + public static Integer getOne_coCopilot_limit() { + return one_coCopilot_limit; + } + + public static void setOne_coCopilot_limit(Integer one_coCopilot_limit) { + ChatController.one_coCopilot_limit = one_coCopilot_limit; + } + + public static Integer getOne_selfCopilot_limit() { + return one_selfCopilot_limit; + } + + public static void setOne_selfCopilot_limit(Integer one_selfCopilot_limit) { + ChatController.one_selfCopilot_limit = one_selfCopilot_limit; + } + + /** + * one coCopilot_token max requests per minute + */ + private static Integer one_coCopilot_limit; + + /** + * one selfCopilot_token max requests per minute + */ + private static Integer one_selfCopilot_limit; + /** * 定义okhttp库 */ @@ -139,6 +190,9 @@ public class ChatController { selfTokenList = new HashMap<>(); copilotTokenList = new HashMap<>(); coCopilotTokenList = new HashMap<>(); + selfTokenLimitList = new ConcurrentHashMap<>(); + copilotTokenLimitList = new ConcurrentHashMap<>(); + coCopilotTokenLimitList = new ConcurrentHashMap<>(); machineId = generateMachineId(); SystemSetting systemSetting = selectSetting(); setGpt4_sleepTime(systemSetting.getGpt4_sleepTime()); @@ -149,6 +203,10 @@ public class ChatController { setCopilot_chat_version(systemSetting.getCopilot_chat_version()); setMaxPoolSize(systemSetting.getMaxPoolSize()); setExecutor(systemSetting.getMaxPoolSize()); + setOne_copilot_limit(systemSetting.getOne_copilot_limit()); + setOne_coCopilot_limit(systemSetting.getOne_coCopilot_limit()); + setOne_selfCopilot_limit(systemSetting.getOne_selfCopilot_limit()); + } public static String getCopilot_chat_version() { @@ -211,6 +269,8 @@ public class ChatController { ChatController.get_token_url = get_token_url; } + public static final MediaType JSON = MediaType.get("application/json; charset=utf-8"); + /** * 初始化获取环境变量 */ @@ -306,6 +366,30 @@ public class ChatController { log.info("config.json没有新增get_token_url参数,现已增加!"); exist = false; } + + try { + jsonObject.getString("one_copilot_limit"); + } catch (JSONException e) { + jsonObject.put("get_token_url", 30); + log.info("config.json没有新增one_copilot_limit参数,现已增加!"); + exist = false; + } + + try { + jsonObject.getString("one_coCopilot_limit"); + } catch (JSONException e) { + jsonObject.put("one_coCopilot_limit", 30); + log.info("config.json没有新增one_coCopilot_limit参数,现已增加!"); + exist = false; + } + + try { + jsonObject.getString("one_selfCopilot_limit"); + } catch (JSONException e) { + jsonObject.put("one_selfCopilot_limit", 30); + log.info("config.json没有新增one_selfCopilot_limit参数,现已增加!"); + exist = false; + } // 将 JSONObject 转换为 Config 类的实例 SystemSetting config = new SystemSetting(); config.setPassword(jsonObject.optString("password")); @@ -315,6 +399,9 @@ public class ChatController { config.setVscode_version(jsonObject.optString("vscode_version")); config.setCopilot_chat_version(jsonObject.optString("copilot_chat_version")); config.setGet_token_url(jsonObject.optString("get_token_url")); + config.setOne_copilot_limit(jsonObject.optInt("one_copilot_limit")); + config.setOne_coCopilot_limit(jsonObject.optInt("one_coCopilot_limit")); + config.setOne_selfCopilot_limit(jsonObject.optInt("one_selfCopilot_limit")); if (exist == false) { // 将修改后的 JSONObject 转换为格式化的 JSON 字符串 @@ -328,6 +415,15 @@ public class ChatController { return null; } + @Scheduled(cron = "0 */1 * * * ?") + public void resetLimit() { + ExecutorService updateExecutor = Executors.newFixedThreadPool(3); + updateExecutor.submit(() -> copilotTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0))); + updateExecutor.submit(() -> coCopilotTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0))); + updateExecutor.submit(() -> selfTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0))); + updateExecutor.shutdown(); + } + private static String generateMachineId() { try { UUID uuid = UUID.randomUUID(); @@ -484,17 +580,22 @@ public class ChatController { if (token == null) { return new ResponseEntity<>(Result.error("Github Copilot APIKey is wrong"), HttpStatus.UNAUTHORIZED); } + copilotTokenLimitList.putIfAbsent(apiKey, new AtomicInteger(1)); copilotTokenList.put(apiKey, token); log.info("Github CopilotToken初始化成功!"); } + else { + int requestNum = copilotTokenLimitList.get(apiKey).incrementAndGet(); + if(requestNum > one_copilot_limit){ + return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS); + } + } // 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions String chat_token = copilotTokenList.get(apiKey); Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, chat_token); String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); - // 创建一个 RequestBody 对象 - MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_chat_url).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -573,17 +674,22 @@ public class ChatController { if (token == null) { return new ResponseEntity<>(Result.error("cocopilot APIKey is wrong"), HttpStatus.UNAUTHORIZED); } + coCopilotTokenLimitList.put(apiKey, new AtomicInteger(1)); coCopilotTokenList.put(apiKey, token); log.info("coCopilotToken初始化成功!"); } + else { + int requestNum = coCopilotTokenLimitList.get(apiKey).incrementAndGet(); + if(requestNum > one_coCopilot_limit){ + return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS); + } + } // 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions String chat_token = coCopilotTokenList.get(apiKey); Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, chat_token); String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); - // 创建一个 RequestBody 对象 - MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_chat_url).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -638,17 +744,21 @@ public class ChatController { return new ResponseEntity<>(Result.error("自定义self APIKey is wrong"), HttpStatus.UNAUTHORIZED); } selfTokenList.put(apiKey, token); + selfTokenLimitList.put(apiKey,new AtomicInteger(1)); log.info("自定义selfToken初始化成功!"); } + else { + int requestNum = selfTokenLimitList.get(apiKey).incrementAndGet(); + if(requestNum > one_selfCopilot_limit){ + return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS); + } + } // 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions String chat_token = selfTokenList.get(apiKey); Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, chat_token); String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); - log.info(conversation.toString()); - // 创建一个 RequestBody 对象 - MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_chat_url).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -697,9 +807,7 @@ public class ChatController { Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, token); - String json = JSON.toJSONString(conversation); - // 创建一个 RequestBody 对象 - MediaType JSON = MediaType.get("application/json; charset=utf-8"); + String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_chat_url).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -753,17 +861,22 @@ public class ChatController { if (token == null) { return new ResponseEntity<>(Result.error("Github Copilot APIKey is wrong"), HttpStatus.UNAUTHORIZED); } + copilotTokenLimitList.put(apiKey, new AtomicInteger(1)); copilotTokenList.put(apiKey, token); log.info("Github CopilotToken初始化成功!"); } + else { + int requestNum = copilotTokenLimitList.get(apiKey).incrementAndGet(); + if(requestNum > one_copilot_limit){ + return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS); + } + } // 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions String chat_token = copilotTokenList.get(apiKey); Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, chat_token); String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); - // 创建一个 RequestBody 对象 - MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_embaddings).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -846,16 +959,22 @@ public class ChatController { if (token == null) { return new ResponseEntity<>(Result.error("copilot APIKey is wrong"), HttpStatus.UNAUTHORIZED); } + coCopilotTokenLimitList.put(apiKey, new AtomicInteger(1)); coCopilotTokenList.put(apiKey, token); log.info("coCopilotToken初始化成功!"); } + else { + int requestNum = coCopilotTokenLimitList.get(apiKey).incrementAndGet(); + if(requestNum > one_coCopilot_limit){ + return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS); + } + } // 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions String chat_token = coCopilotTokenList.get(apiKey); Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, chat_token); String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); - MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_embaddings).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -923,15 +1042,21 @@ public class ChatController { if (token == null) { return new ResponseEntity<>(Result.error("自定义APIKey is wrong"), HttpStatus.UNAUTHORIZED); } + selfTokenLimitList.put(apiKey,new AtomicInteger(1)); selfTokenList.put(apiKey, token); log.info("自定义selfToken初始化成功!"); } + else { + int requestNum = selfTokenLimitList.get(apiKey).incrementAndGet(); + if(requestNum > one_selfCopilot_limit){ + return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS); + } + } String chat_token = selfTokenList.get(apiKey); Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, chat_token); String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); - MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_embaddings).post(requestBody); headersMap.forEach(requestBuilder::addHeader); @@ -968,9 +1093,7 @@ public class ChatController { Map headersMap = new HashMap<>(); //添加头部 addHeader(headersMap, token); - String json = JSON.toJSONString(conversation); - // 创建一个 RequestBody 对象 - MediaType JSON = MediaType.get("application/json; charset=utf-8"); + String json = com.alibaba.fastjson2.JSON.toJSONString(conversation); RequestBody requestBody = RequestBody.create(json, JSON); Request.Builder requestBuilder = new Request.Builder().url(github_embaddings).post(requestBody); headersMap.forEach(requestBuilder::addHeader); diff --git a/src/main/java/com/gpt4/copilot/copilotApplication.java b/src/main/java/com/gpt4/copilot/copilotApplication.java index 9522c97..c4be9c9 100644 --- a/src/main/java/com/gpt4/copilot/copilotApplication.java +++ b/src/main/java/com/gpt4/copilot/copilotApplication.java @@ -209,11 +209,15 @@ public class copilotApplication { System.out.println("vscode_version:" + ChatController.getVscode_version()); System.out.println("copilot_chat_version:" + ChatController.getCopilot_chat_version()); System.out.println("get_token_url:" + ChatController.getGet_token_url()); + System.out.println("one_copilot_limit:" + ChatController.getOne_copilot_limit()); + System.out.println("one_coCopilot_limit:" + ChatController.getOne_coCopilot_limit()); + System.out.println("one_selfCopilot_limit:" + ChatController.getOne_selfCopilot_limit()); System.out.println("gpt4-copilot-java 初始化接口成功!"); System.out.println("======================================================"); - System.out.println("******原神gpt4-copilot-java-native v0.0.6启动成功******"); + System.out.println("******原神gpt4-copilot-java-native v0.0.7启动成功******"); System.out.println("* 采用graalvm打包,运行内存大幅度减小"); System.out.println("* 适配官方requestBody,减小被查询异常"); + System.out.println("* 使用ConcurrentHashMap,粗略的对于每个密钥按每分钟进行限速"); System.out.println("URL地址:http://0.0.0.0:" + config.getServerPort() + config.getPrefix() + ""); System.out.println("======================================================"); } diff --git a/src/main/java/com/gpt4/copilot/pojo/SystemSetting.java b/src/main/java/com/gpt4/copilot/pojo/SystemSetting.java index ef7d616..eb655b2 100644 --- a/src/main/java/com/gpt4/copilot/pojo/SystemSetting.java +++ b/src/main/java/com/gpt4/copilot/pojo/SystemSetting.java @@ -56,4 +56,19 @@ public class SystemSetting { */ private Integer maxPoolSize; + /** + * one copilot_token max requests per minute + */ + private Integer one_copilot_limit; + + /** + * one coCopilot_token max requests per minute + */ + private Integer one_coCopilot_limit; + + /** + * one selfCopilot_token max requests per minute + */ + private Integer one_selfCopilot_limit; + } \ No newline at end of file diff --git a/target/classes/com/gpt4/copilot/controller/ChatController$1.class b/target/classes/com/gpt4/copilot/controller/ChatController$1.class index 2ef1c1b759a3a0c74b624cdaf3444bef5e347618..1e3a06a55932dcfcb18a71e26afa086357f6658f 100644 GIT binary patch delta 23 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 HrriGrwDEPm diff --git a/target/classes/com/gpt4/copilot/copilotApplication.class b/target/classes/com/gpt4/copilot/copilotApplication.class index f25f74e9ee919a627b9571a6471ab0b9b20fa074..c4634c99c5b97e99dcf8f41babf20b39fcb8b503 100644 GIT binary patch delta 2200 zcmb7Ed2mx@5dZB<(xhn`ph;Vrl7s+lvDng4Ditk*oH{syQv?}tYAI<6lqS=JV-%;J z9Eym30*Xknh=||;)lyk3Neh?)tpXVonfpW=0zYy%PCUZ(hmqfbqvlC*WE0ul| z4KDYcr}#YVubSYm8XT;OoM@cK=YJBcp(=k_V3Ho6A=pAC;qb&@)hPYR--K4TgEJmm2nKUaQLzJXt#F;f4!Naac98dR@)xZg&g}e+JHo`@(UW&;G zI|wGkaYij?bmfTnZpvN-S|MMdMQr()t&d(~Yts{GF}==FJT0L&SngUerd>B$Bx>4u z`^v2LFtF`NOX*F%+mTGmWLY@SnwHaBjQch}H*(oBdWSs|(Nexy;f99~YlY^{8zoDp zFgqX@@yx9?@)+a>q#<8X(TjK$G*dwez00IoEX2`Ds$-n@_+1O=9Gqq@94oX;70PE& zS!j;CAM-xw_7+OsDJ)V4?&^K2SAAZugDW62v=TG!i@y@505>a~0?z=(dBl_2zomZ% z{b*iz(bz#3|QptS}6g0@(?U2(8WVG_qv*)4Y*A~ zN167(7;TNShr~3Io>YQV12$-9(94X9JGc$iMZCs|pp{CI@tB|rpY-{(sx}Cxkh%ik5x!S7^#R{w#jXkq-YuHa!!t?-dN9?)r#%D%}jAY zhoWjJ#R%RpD;}b?^dUz{2-8ROF%R`FbfFam~2Jj16XNJCAfTjfVGEJ{xT^%%MmgBxf{l%`*bo{G{lEs=v} z>PZe7)#A)*ah`8+UeKNFderl^E=qI6qn({*xne_+EarF4sh*2nSd85){T>#5FK^O5 zY{h<#4&Vq5;uH?y91dT$g3Z^ipoMl{{3!cWKdf|;tASps!$SFC<~3lef0#Wm(jJa9 z+DkjC*|D;_k8}3(b%5gt9CVOh`9|5J${tttdu4xA_Ge{(RraK^zbpHPvZs~(OWCu^ eo>TU`v>KGv*rt(YR6(3(QB+8a*Alcur2PxEVCK94 delta 2005 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 BKCS=& literal 6199 zcmb_gU2hy`6@F&D-#fcrukARKq-jbw5U=ApkPy;w9Nd~DO|er`hZI`CovbJJ#_Jt- zcbq2SoAOycTD~JL;Eo6s36O9QQH9`wB5}na5r5jytjLTyiEB zuC`ozZNYZkT4Py5wq-Xj+s%2W>1r69y<}asChAsWdE!jNwU_PYq_C!SWRTU6TyNSJ zYgaUs0>A~gNhXEUb>!u%3-Yy#t-5WmpR29eLea0I*ft#wn@Tzcg+0A)wOTJa%_YGP z>)0X6{IcyXy3VTISlnpV#j;a}A(q1BR@GUu7y0z9n$r-|ZXJ8XG~};%vASZpLBL)e z56V;I)~qY@j#FQ#U9+=vd`QRJ@Gu{tYBf&2uwm6T3?B%r@u>@!?5aCC`mBKW>v%if z;XT?yAbP_GMguPG_+>GQN(y5-4$3zayAk$C8C6@pu_e@x=$H`d0j~OVD28Hvr;c|8 ztbs6!^@xsli?u-Cx$yGdqvIGJ)sUfS-rvHZ(9`;xC_Ixojte*^V1GwMe?rH5MPHO> z3vP-SAJg%;80EpwhxSFR@6&NotRu9}c*z*r8i~>rY>b4qodGyi7{DNy$SLdvCKY0`LPoJ4P$=zZHNH*=( zMxDn|F0=*x<=!|eO(>XpITW;1xgDWQxqY}WMapbL-7|$5Q0`sVa5?(1)2`#CxQ3rZ z)k~nkY;6?nCJ+EcsJ8mOHBFmZYB9UuY&5I(shVmYp$Xs-IgeO(k2{Xra+}t=SM9C- zB)*!(*YNcez9H@R6%FO?(N$|)=8-(%J(<^$PgzyhXf#Bq^QOlCZFC9m%!g-+Ad4HrcC#neNpRvp`ty8WlC|J*2-9+l;H2sy{J)2 zqK><`L@9+P{*6^ioG|cb>X&$wejj(RMk$M1*hGU;4zJ;7a46~c3tq)Kr9A$Im+=Cn z0#D0TGA*HBOY%utl#1GZoPtYfKpVp}HYk;}CwX{ZrZlL{V>e!;G=wW$>l*f^(*Hpr zh1eU|k-{kd(%Ku?>4};Duh?$DRVI2|-k$gkSWXq`=?Tej*@Anu^hA3L7*v~!=#-AF zN{254sA5a+yG{z7ME@#I9*<9{0@+iXTw!^ni(@yC8oz~8&x?NCjEljD`)XaTV7Xumt{rk5h^<@&1laFs^;v znmhO;r8rLD*Z35r1b6R;_%x*?)9WRChEfWzFvUMhDUF|E4xgix!SDIX=_N{8{1qek zJf)l@TdWVIyHv!PY?{UdgQnf(S9R~HzROZev;l2QJgo9z$pEa2?A7|6ijmmFK*dOIVyI%IHZf8$(wo>-F*2Lja*pe2zP!lP zCTFJ^9b<9GIW9UG3#FGGW1mhkyG4>AEUqM(of1ltkw<<49g{cHEF_U+z(^}e=7NlB zm-{nxDDtLALK)zSeDhu8i|!&Fi*zaS^|Z{hd>hFBvgq#bC@#8p63Iu**M0aB-D3DM ZzQSvoG%xe>D!#=#8F{{q@A7Oi{s+^1whsUR