From 2e8267412338aaee55b69b736b8349eb332875fc Mon Sep 17 00:00:00 2001 From: Edward Zhu Date: Thu, 20 Nov 2025 20:58:50 +0800 Subject: [PATCH] first commit --- .../tortoisehare/TortoiseHareRace.java | 438 ++++++++++++++---- .../tortoisehare/TortoiseHareRace$Hare.class | Bin 0 -> 3362 bytes .../TortoiseHareRace$RaceReporter.class | Bin 0 -> 4256 bytes .../tortoisehare/TortoiseHareRace$Racer.class | Bin 0 -> 391 bytes .../TortoiseHareRace$Tortoise.class | Bin 0 -> 2824 bytes .../tortoisehare/TortoiseHareRace.class | Bin 0 -> 3765 bytes 6 files changed, 351 insertions(+), 87 deletions(-) create mode 100644 src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Hare.class create mode 100644 src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$RaceReporter.class create mode 100644 src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Racer.class create mode 100644 src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Tortoise.class create mode 100644 src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace.class diff --git a/src/main/java/com/example/tortoisehare/TortoiseHareRace.java b/src/main/java/com/example/tortoisehare/TortoiseHareRace.java index ed1866f..fe5b29a 100644 --- a/src/main/java/com/example/tortoisehare/TortoiseHareRace.java +++ b/src/main/java/com/example/tortoisehare/TortoiseHareRace.java @@ -1,123 +1,387 @@ package com.example.tortoisehare; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + public class TortoiseHareRace { - private static final int RACE_DISTANCE = 50; - private static volatile int tortoisePosition = 0; - private static volatile int harePosition = 0; - private static volatile boolean raceFinished = false; + private static final int RACE_DISTANCE = 30; + private static final Lock mainLock = new ReentrantLock(); + private static final Condition raceCondition = mainLock.newCondition(); + private static final AtomicBoolean raceFinished = new AtomicBoolean(false); private static volatile String winner = ""; - public static void main(String[] args) { - System.out.println("龟兔赛跑开始!"); - System.out.println("终点距离: " + RACE_DISTANCE + " 步\n"); - - // 创建乌龟线程 - Thread tortoiseThread = new Thread(() -> { - while (tortoisePosition < RACE_DISTANCE && !raceFinished) { - // 乌龟稳步前进 - tortoisePosition++; - - // 检查是否到达终点 - if (tortoisePosition >= RACE_DISTANCE) { - raceFinished = true; - winner = "T"; - break; + // 参赛者接口 + static interface Racer extends Runnable { + String getName(); + int getPosition(); + String getSymbol(); + void stopRacing(); + } + + // 乌龟实现类 + static class Tortoise implements Racer { + private final String name; + private volatile int position; + private final String symbol; + private final Lock printLock; + private volatile boolean stopped = false; + + public Tortoise(String name, Lock printLock) { + this.name = name; + this.position = 0; + this.symbol = "🐢"; + this.printLock = printLock; + } + + @Override + public void run() { + try { + while (!stopped && position < RACE_DISTANCE && !raceFinished.get()) { + // 乌龟稳步前进 + position += 2; + if (position > RACE_DISTANCE) position = RACE_DISTANCE; + + // 检查是否到达终点 + checkFinish(); + + // 打印状态 + printStatus(); + + // 使用条件等待替代sleep,可被立即唤醒 + mainLock.lock(); + try { + // 等待100ms或直到比赛结束 + raceCondition.awaitNanos(100_000_000); // 100ms + } finally { + mainLock.unlock(); + } } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + private void checkFinish() { + if (position >= RACE_DISTANCE && raceFinished.compareAndSet(false, true)) { + winner = name; + // 通知所有线程比赛结束 + mainLock.lock(); try { - Thread.sleep(200); // 乌龟较慢 - printTortoiseStatus(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - break; + raceCondition.signalAll(); + } finally { + mainLock.unlock(); } + printFinishStatus(); } - }, "Tortoise"); - - // 创建兔子线程 - Thread hareThread = new Thread(() -> { - while (harePosition < RACE_DISTANCE && !raceFinished) { - // 兔子跳跃前进 - harePosition += 2; - - // 检查是否到达终点 - if (harePosition >= RACE_DISTANCE) { - raceFinished = true; - winner = "H"; - break; + } + + private void printStatus() { + if (!raceFinished.get()) { + printLock.lock(); + try { + System.out.printf("%s%s: %2d %s%n", + symbol, name, position, + generateProgressBar(position)); + } finally { + printLock.unlock(); } + } + } + + private void printFinishStatus() { + printLock.lock(); + try { + System.out.printf("%s%s: %2d %s 🏁%n", + symbol, name, position, + generateProgressBar(position)); + } finally { + printLock.unlock(); + } + } + + @Override + public String getName() { return name; } + @Override + public int getPosition() { return position; } + @Override + public String getSymbol() { return symbol; } + @Override + public void stopRacing() { stopped = true; } + } + // 兔子实现类 + static class Hare implements Racer { + private final String name; + private volatile int position; + private final String symbol; + private final Lock printLock; + private static final Random random = new Random(); + private volatile boolean stopped = false; + + public Hare(String name, Lock printLock) { + this.name = name; + this.position = 0; + this.symbol = "🐇"; + this.printLock = printLock; + } + + @Override + public void run() { + try { + while (!stopped && position < RACE_DISTANCE && !raceFinished.get()) { + // 随机睡觉(概率降低,时间缩短) + if (position > RACE_DISTANCE / 2 && random.nextDouble() < 0.15) { + printSleepStatus(); + + // 使用条件等待替代sleep + mainLock.lock(); + try { + // 等待500ms或直到比赛结束 + raceCondition.awaitNanos(500_000_000); // 500ms + } finally { + mainLock.unlock(); + } + } else { + // 兔子跳跃前进 + position += 4; + if (position > RACE_DISTANCE) position = RACE_DISTANCE; + + // 检查是否到达终点 + checkFinish(); + + // 打印状态 + printStatus(); + + // 使用条件等待替代sleep + mainLock.lock(); + try { + raceCondition.awaitNanos(50_000_000); // 50ms + } finally { + mainLock.unlock(); + } + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private void checkFinish() { + if (position >= RACE_DISTANCE && raceFinished.compareAndSet(false, true)) { + winner = name; + // 通知所有线程比赛结束 + mainLock.lock(); try { - Thread.sleep(100); // 兔子较快 - printHareStatus(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - break; + raceCondition.signalAll(); + } finally { + mainLock.unlock(); } + printFinishStatus(); } - }, "Hare"); + } - // 启动所有线程 - tortoiseThread.start(); - hareThread.start(); + private void printStatus() { + if (!raceFinished.get()) { + printLock.lock(); + try { + System.out.printf("%s%s: %2d %s%n", + symbol, name, position, + generateProgressBar(position)); + } finally { + printLock.unlock(); + } + } + } - try { - // 等待所有线程完成 - tortoiseThread.join(); - hareThread.join(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + private void printSleepStatus() { + printLock.lock(); + try { + System.out.printf("%s%s: 开始睡觉了😴 (当前位置: %d)%n", + symbol, name, position); + } finally { + printLock.unlock(); + } } + + private void printFinishStatus() { + printLock.lock(); + try { + System.out.printf("%s%s: %2d %s 🏁%n", + symbol, name, position, + generateProgressBar(position)); + } finally { + printLock.unlock(); + } + } + + @Override + public String getName() { return name; } + @Override + public int getPosition() { return position; } + @Override + public String getSymbol() { return symbol; } + @Override + public void stopRacing() { stopped = true; } } - private static void printTortoiseStatus() { - // 生成乌龟进度条 - String tortoiseProgress = generateProgressBar(tortoisePosition, RACE_DISTANCE); + // 赛况输出线程 + static class RaceReporter implements Runnable { + private final List racers; + private final Lock printLock; + private volatile boolean stopped = false; + + public RaceReporter(List racers, Lock printLock) { + this.racers = racers; + this.printLock = printLock; + } - System.out.println("T: " + tortoisePosition + " [" + tortoiseProgress + "]"); + @Override + public void run() { + try { + while (!stopped && !raceFinished.get()) { + printProgress(); - if (raceFinished) { - System.out.println("\n比赛结束!"); - if (winner.equals("T")) { - System.out.println("乌龟获胜!坚持不懈,终会成功!"); - } else if (winner.equals("H")) { - System.out.println("兔子获胜!速度优势明显!"); + // 使用条件等待替代sleep + mainLock.lock(); + try { + raceCondition.awaitNanos(200_000_000); // 200ms + } finally { + mainLock.unlock(); + } + } + + // 输出最终结果 + printFinalResults(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private void printProgress() { + printLock.lock(); + try { + System.out.print("\r当前进度: "); + for (Racer racer : racers) { + System.out.printf("%s%s:%2d ", + racer.getSymbol(), racer.getName(), racer.getPosition()); + } + System.out.print(" "); + } finally { + printLock.unlock(); } } - } - private static void printHareStatus() { - // 生成兔子进度条 - String hareProgress = generateProgressBar(harePosition, RACE_DISTANCE); + private void printFinalResults() { + printLock.lock(); + try { + System.out.println("\n\n====================================="); + System.out.println("🏆 比赛结束!获胜者是: " + winner + " 🏆"); + System.out.println("最终排名:"); - System.out.println("H: " + harePosition + " [" + hareProgress + "]"); + // 按位置排序 + racers.sort((r1, r2) -> Integer.compare(r2.getPosition(), r1.getPosition())); - if (raceFinished) { - System.out.println("\n比赛结束!"); - if (winner.equals("T")) { - System.out.println("乌龟获胜!坚持不懈,终会成功!"); - } else if (winner.equals("H")) { - System.out.println("兔子获胜!速度优势明显!"); + for (int i = 0; i < racers.size(); i++) { + System.out.printf("%d. %s%s - 位置: %d%n", + i + 1, racers.get(i).getSymbol(), + racers.get(i).getName(), racers.get(i).getPosition()); + } + System.out.println("====================================="); + } finally { + printLock.unlock(); } } + + public void stopReporting() { stopped = true; } } - private static String generateProgressBar(int position, int total) { - StringBuilder sb = new StringBuilder(); - int progressBarLength = 19; // 进度条长度,确保箭头'>'在最后位置时格式正确 - int filledLength = (int) ((double) position / total * progressBarLength); - - for (int i = 0; i <= progressBarLength; i++) { - if (i < filledLength) { - sb.append('-'); - } else if (i == filledLength && position < total) { - sb.append('>'); - } else if (i < progressBarLength) { - sb.append(' '); + // 生成进度条 + private static String generateProgressBar(int position) { + StringBuilder sb = new StringBuilder("["); + int barLength = 20; + int filled = (int) ((double) Math.min(position, RACE_DISTANCE) / RACE_DISTANCE * barLength); + + for (int i = 0; i < barLength; i++) { + sb.append(i < filled ? '=' : ' '); + } + sb.append(']'); + return sb.toString(); + } + + public static void main(String[] args) { + Lock printLock = new ReentrantLock(); + + printLock.lock(); + try { + System.out.println("🐢🐇 龟兔赛跑开始啦!🐇🐢"); + System.out.println("终点距离: " + RACE_DISTANCE + " 步"); + System.out.println("-------------------------------------\n"); + } finally { + printLock.unlock(); + } + + // 创建参赛者列表 + List racers = new ArrayList<>(); + racers.add(new Tortoise("一号", printLock)); + racers.add(new Tortoise("二号", printLock)); + racers.add(new Hare("一号", printLock)); + racers.add(new Hare("二号", printLock)); + + // 创建赛况报告器 + RaceReporter reporter = new RaceReporter(racers, printLock); + + // 创建线程列表 + List threads = new ArrayList<>(); + for (Racer racer : racers) { + threads.add(new Thread(racer, racer.getName())); + } + Thread reporterThread = new Thread(reporter, "Reporter"); + threads.add(reporterThread); + + // 启动所有线程 + for (Thread thread : threads) { + thread.start(); + } + + // 等待比赛结束 + mainLock.lock(); + try { + while (!raceFinished.get()) { + raceCondition.await(); } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + mainLock.unlock(); } - return sb.toString(); + // 停止所有线程 + for (Racer racer : racers) { + racer.stopRacing(); + } + reporter.stopReporting(); + + // 通知所有等待的线程 + mainLock.lock(); + try { + raceCondition.signalAll(); + } finally { + mainLock.unlock(); + } + + // 等待所有线程完成 + for (Thread thread : threads) { + try { + thread.join(1000); // 最多等待1秒 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Hare.class b/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Hare.class new file mode 100644 index 0000000000000000000000000000000000000000..2218d6a29437ce7d2d63cbfd27534dd1ad42742b GIT binary patch literal 3362 zcmb_eYitzP75>I+@9eGzOx7lZBpA0~Vy~%}21F8;hT52iiERu^2sSNcygRWMc4xLT zvpm|Qfiy3dkhBdX4uKX3ij_wZ25jsk4oag`RjX8Kq^PaZN>v3-{~+~Wr2c68-8;MM zN31kIYRPl%+&TB$?|kRn@9uB@{pLFW*5PFpB?{^jRwim3&@b~ z5Xf3i%1v1&m$wFR3&GtuJ$~cDlfvm%4Y!F9k1J z)L@C(n`E*c35BNkE^HN!1{b+0S;P-IuE7@dSvhVx*F&DNqMhOZ@yYFd{4#qH9Ulex#d(Adkve?u}@FujLppL=DOC&oCu!jK~fYvqTvt@ zE2!)>n49hzown6$8;;YgGsN7f3-byS!VmG7ipMoPfhW0C?mZPVn?sVo%~#h=Dn~xT z&Ph|AY{v2cr-otb{R)<=6IOHM^xHSC9u~Ysg?vAwfMWI~C4aHdeX_A~hD^LfrmNJ%QI6Gb z=gC=XB`G2mZ7I{}$YpvAdzyBdxW$^B*GRYHacoa(6T1VkWSlm{Wpk{F&(T2s9BQ5V4+FONE z%kR7%Y0J4z#j||=m~Wd=0w3+d$QAe^zF`C-4a2AqqsmBl-Z17zmJZ|gA-X8|37^$m z3_QZ^A4ZUkJsXEniAOP?9b1jZ==DbE?nc%th3UVDSkI z$eD_BXu62V2pX%fV&EiJaJcd!?is^s1sBm&g>_@t;KL3%*REg?v)c;ehO2}Bc{$R> z$m(u^S#EKTY0Rk>uOsN>e|$=`?VpR*UWm4o(e58asBIM8BiKDe_%Upt@B;lfj?=Wj zc?@9(c@uQ(!aP3vnf?*B{nJ=ZW@Dsa1CEi~<6L=+x_BJBF@QaIk&<$f#QmJ4o#m=? z{PGG;F`?76uhO2!8;t%M(|#SJ_ywM0^m(lIXV{|RSg7Qd2c>CNvBOUYyb)iX6)3w49S|q9+w+CahWDxC zDDCobZhpM0RG^M`mC;m=;y}F1?~Q&CAHky!aLjcQd_`OFrQxbT9ww6ZBJxJIJn#;? z^(w!-%QF2E_uxI=vhULGeQd(7=>0w(pzXr1CHf#rK0`b4mlH03h2-HM%fsK`Z7AC_ z8-B|F1*rcQ)*u?Os)%(7Q3Ai^^8+lw?+~GF#D};Gzo*xSXrWz?k0eI^s^;}15%NyV zBRrQ!xMd2$AN_xL4U&qMB37>>J|@;b5bGbY41dB3j_<}N5N}a{*})G9ve@rCc9R?G0pXFbUHC()cMn+UZd+vMarsK zVgbM(DW&{PD4mDk@ANxa^j##omm>NWqFq<;^d&^5FL;Ot@f5?A;AcGN!YWcX!W@a8 N17{fQDD7E);J=~IGWY-h literal 0 HcmV?d00001 diff --git a/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$RaceReporter.class b/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$RaceReporter.class new file mode 100644 index 0000000000000000000000000000000000000000..da22062950bcee677677ffe25cae0defcf0f78a8 GIT binary patch literal 4256 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Racer.class b/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace$Racer.class new file mode 100644 index 0000000000000000000000000000000000000000..bab76e93c11a43e7fc2cec8ae697147ddf9bda8f GIT binary patch literal 391 zcma)2%TB{U3>^27gtS0g+CSjXT*wD-M4(ne1vQBKCbB}RWVhPgBKS29d;lL+;YO7z zapJJH$2-=H{j>l225^sAhz=nwOq245YPL0}-dJxc$8XAV`f>yd0c%z8^&!|0J;G?C z-c?#FU8Ya@h6^7eAWTl(^-gP**GvdY_AAv$HJvAqCr0LNrOR8wKnTyqRlYKs(48ks z!kP54&n7oDA$HzuMOxVH_p7urv$F+1R0o0CU!OMz5kj>te_#N@m8xswSX6(A)rAtsMR4E!$2|oWnpKTV zba-M)OF0t!-MXPWM?0aH6Z6(7JWZNLOE zLZzYRGzp>D3WkJZ=|-kYNHr>G!X^oUylLx>ZW_Ek5Wv#}xOD5$(!JY4=otmi3RQl4 zE;nIj1?xElE!ZNVI!{$j%uG#7*jhAEaP(|6Wg4l1Wod>J&GOKW3K3eQl!E86O@d-E zPA3@zds2YzT>rA_m^nQa?Qu!3X=XLm=nA48+hy!f5Jm^n;(E5$?0PpD?Tp6YGv?z# zdeNz1r^ruDYEny07r_YrZUs@7?|PSTRHtAI?0XgL6J7^$s%{96YH$EA$T+CrMIpas zT_h_3U^c`?s5-3R2)ZQHiZJwWS zatUG(ugHig7(#qip^r{ln##o1dUa6RH-==F6F7Hk=gf&ylE)wR7EGjr?)fyTSTW$ExVTqt7|2UeE{aJ3q` zew`@FU2k2w_4Cr>8|{XS*CcQbJmJJ_6JwJu9b5-a5zX2LUumnZjxknopPA;ItBdJ| z7BA!`G;36y$dco;3Y==S%yepcNX@%k88=FSai=oN(3~xb%bXB#cVw=vR4+6f78Dp+ zo|YUX1FTu{67FzhZ;3%nZ#ZJPNtgvo%sGLisWh!i&%|z#8jh2=W;^|+%?eWnL=E?4 zRom9snt{>{7Q7oEw6c&ZSr~JuLP$(_&VgPr!%0J8OuLk`+2!*&Ar)OB<8^-D;BFWd z@R4qb{0Lvfw}9$M=K|`)sv#13Y5~oWoeS7JPZ0@k^4r48z&4uQN>y!C*^UNmM>BTt zEKI4l5b%`$PSq8Zwjw{E`X*8&4fQRzF@7Jdi)g!v(~%@uRab;D_v{Ys*SCo6A|m|X zbsu{kV!wp@IMj&lhdAoPd6#!w!d+~LmDZh)@BaPGT?AtfFtCW>dD`to97$RSGMK_C zas>XPsN;7R@kZ&z9**$+ILN;vILsT}ymJ&|oEk~e3DOMuc)N$4+ly;Bj<f1si~GMnDy*;5+7_oQFV- zl~g1MZL=5Z%OOpEgvz9kyyir*QlL&Gt4JCiAd^V?i>q8>5!cRf&3i8Ry4doj^RYl4 zB9ftH~%eG)V@194~R*gNyX#5~VNV9BC4lUG&wc_!C3KUqiSY*dF{l z9{kfqgKmLb4$b~QsH<^^iC!J=38GH3%r%zGRlbgC%1jcqPRU6|U1!9nRuCU|5leU% z?|F!yBbBIBM6vE37sYn+yUZNF@8bi0MNgKCHhi~6)TGdd>uPOYtMwX1KUxl13j-(s p_#>6<@|A`zBCuJtAM>;VpWsuMO8AU4M2>iRKBt~J(l7jhe*je)i!1;D literal 0 HcmV?d00001 diff --git a/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace.class b/src/main/java/com/example/tortoisehare/com/example/tortoisehare/TortoiseHareRace.class new file mode 100644 index 0000000000000000000000000000000000000000..05fd94fba5ff3fdd487c349752fb654b02acb4cc GIT binary patch literal 3765 zcma)9Yfx0@8Gc^a3WGRnm)X)CwXd_MVx}blPz`)0s}&KP}Pz$mGA%mOkG(yCBN6?2q%F z_dDNvf1mgJ_P77J{4sz{_>CVq$kpJ{;YFUHaG&v{5sVpDPwN{$Xgq=qIR7i zw<54jgHLex#HJ2A8MS&E($QGNO#0v#$WA{r=t|!VL2*UP?VD?rmRW*8INlpH4;a0P zm>IO=Njn}*nR|_-8SKn350Pm%!loa0p-97Q9dl4Dm^q=b)v)){vEHa9@K!W61)B0U z)G;vrlousB=HVWOU?dWz6%ov@XbjxpP{#XOC9yz9DHaNRcH9k3FsI^9ky;Il1Qm`W zX*(JVhT~Q^olKgR9gM}p`%}SolkZ8xvRladQHIY?BrqNsLLr}2tv-dyx?88&e^Jv*W zKYnlYg*R?oJaJ>__0cQ+qXRFEzIo>JD~H|B?p8lmVwHx~I@YKn&URd#tXiNYl%bgA zLp76hedO5nBf~d_PF_DVQd72iMcJokPy6tIpnTbMetwmm8XdJNHF;@Eg|1;;*0z)5 z`ef2L*b+_IeymkJyFsvO+C8)++f+U@(8511^^d+fP(4Mbx;dS?z^X=U zSM4=YA@hLBTt#4qk}!1aL6~r`oaM=I%;ZvoDIf@^IZ&3U zBqTNTOafHrUScLvfC!>G_NghL^_X_Z=w+h25mR|0+yb}uNqgF|j6E?klPhO#x^siA z;X|BRnaFiFzM>mAY%kH<{I;=DVAr!_pI<5^XXz(hH2nPyW-vNlYN^5U?LBX~|Q zLwV5{w<1wH8s{u7pV|$D>Qr!i9~eR(Pu<$4KE5x9SJAx zO%~fMnNHYdWYdALnNW_Xy1lI9>v)AOX6Cb7<=e-)yULVw<24Zns z&#vAVSBICUqFK$7B{-$yyZ9dKYMFiGiQ-W+2~oGy=eF!PMLnZhbwDZIp}O$<0;ppB zP{)sOmJ_EhYFQ>>TI5#g)~;nF?e&eDp4iyb(ODmAge$4quAC~#!=m{f1r=GJ7qCuycq4F-)BS2Rs=j#77rZG`u?8i|aw zM<69e!Wv(#(j(9q$@S^-I&K?Qbd&Y9r zO@e}unX+3=6;XhEfMLD}uu}Lgq!gH7?FK-|}#!n#l zkX#PVktgE$K2Jf%p#(B%v#JiMhkJP!hl~pmi1H522u?aL&4Ug{7BJcytct#^)d1|4LnMwWruK{}k@2EcPro1z+L1 z0eB0`2JwaM&wFHGY_zg)mtrahG2eAr*;@=BO|RkwZ#8cOYp_77Q7-rMfUicKJjesI z27}xefM<-C9j|E6MCfB1U&iR*_)3oYa+3|2k0D%gUC(`yj{9lgZzCw{8p7h1%3<8A zqN*rbK8O{HeknumC*{`%1q0Aq-M6Z%BUnqhy4I=@tnVtSuN*?-FgE94ySvabX(8n9 z*gC$03u;GZVFYbmRb)Ft8Lc&*s$pys)Obt0!`LBs2TRr4mjypVq$aP#GlK4}lDv|< zVemRSg#E7Ofw61q!?GfaOBD7fA>~ww$JOUZIQs5ZvW~v)8m&YdM1qw#k5ncNeS>)F zUCca>{$V`N$j3f+zBx&_wCjK)_i_!#i6GUE*LX37)bY>A2F#QO%#}ut zq>XIJ&8VV$khGfg0cqwn@nN({3-(AWQW9eR+ISvx;w^a;7iAlMC)@D{c?^G%E_^DF zi&u7uUv|q3G3Z@bN+m*Hqq0)=(aUbBmLB>Vm5t=LkhYO_O0Oivl7kYLLz0kwNil*n zW9XB&cFghq`iyaQXuJiaxl2A54s=B90=k z)_%-FF$!t=E^1PLIdgE8pizI%JUl)_ynsjWbMlMHucyQ>Xg@^yOVT#dUy(*gf1T(1 EFQkLrHvj+t literal 0 HcmV?d00001 -- Gitee