From b2114fb151791b80be66b35784514385abb3df92 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 15 Jun 2018 09:53:58 +0800 Subject: [PATCH] auto commit --- notes/Java 并发.md | 10 +++--- notes/Leetcode 题解.md | 2 +- notes/Redis.md | 31 +++++++++++++++--- pics/0ea37ee2-c224-4c79-b895-e131c6805c40.png | Bin 0 -> 26624 bytes pics/beba612e-dc5b-4fc2-869d-0b23408ac90a.png | Bin 0 -> 25600 bytes 5 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 pics/0ea37ee2-c224-4c79-b895-e131c6805c40.png create mode 100644 pics/beba612e-dc5b-4fc2-869d-0b23408ac90a.png diff --git a/notes/Java 并发.md b/notes/Java 并发.md index cf221ce8..15a06274 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -1585,7 +1585,7 @@ ThreadLocal 从理论上讲并不是用来解决多线程并发问题的,因 互斥同步的进入阻塞状态的开销都很大,应该尽量避免。在许多应用中,共享数据的锁定状态只会持续很短的一段时间。自旋锁的思想是让一个线程在请求一个共享数据的锁时执行忙循环(自旋)一段时间,如果在这段时间内能获得锁,就可以避免进入阻塞状态。 -自选锁虽然能避免进入阻塞状态从而减少开销,但是它需要进行忙循环操作占用 CPU 时间,它只适用于共享数据的锁定状态很短的场景。自旋次数的默认值是 10 次,用户可以使用虚拟机参数 -XX:PreBlockSpin 来更改。 +自选锁虽然能避免进入阻塞状态从而减少开销,但是它需要进行忙循环操作占用 CPU 时间,它只适用于共享数据的锁定状态很短的场景。 在 JDK 1.6 中引入了自适应的自旋锁。自适应意味着自旋的次数不再固定了,而是由前一次在同一个锁上的自旋次数及锁的拥有者的状态来决定。 @@ -1593,7 +1593,7 @@ ThreadLocal 从理论上讲并不是用来解决多线程并发问题的,因 锁消除是指对于被检测出不可能存在竞争的共享数据的锁进行消除。 -锁消除主要是通过逃逸分析来支持,如果堆上的共享数据不可能逃逸出去被其它线程访问到,那么就可以把它们当成私有数据对待,也就可以将它们上的锁进行消除。 +锁消除主要是通过逃逸分析来支持,如果堆上的共享数据不可能逃逸出去被其它线程访问到,那么就可以把它们当成私有数据对待,也就可以将它们的锁进行消除。 对于一些看起来没有加锁的代码,其实隐式的加了很多锁。例如下面的字符串拼接代码就隐式加了锁: @@ -1603,7 +1603,7 @@ public static String concatString(String s1, String s2, String s3) { } ``` -String 是一个不可变的类,Javac 编译器会对 String 的拼接自动优化。在 JDK 1.5 之前,会转化为 StringBuffer 对象的连续 append() 操作,在 JDK 1.5 及以后的版本中,会转化为 StringBuilder 对象的连续 append() 操作,即上面的代码可能会变成下面的样子: +String 是一个不可变的类,编译器会对 String 的拼接自动优化。在 JDK 1.5 之前,会转化为 StringBuffer 对象的连续 append() 操作: ```java public static String concatString(String s1, String s2, String s3) { @@ -1615,7 +1615,7 @@ public static String concatString(String s1, String s2, String s3) { } ``` -每个 StringBuffer.append() 方法中都有一个同步块,锁就是 sb 对象。虚拟机观察变量 sb,很快就会发现它的动态作用域被限制在 concatString() 方法内部。也就是说,sb 的所有引用永远不会“逃逸”到 concatString() 方法之外,其他线程无法访问到它。因此,虽然这里有锁,但是可以被安全地消除掉。 +每个 append() 方法中都有一个同步块。虚拟机观察变量 sb,很快就会发现它的动态作用域被限制在 concatString() 方法内部。也就是说,sb 的所有引用永远不会“逃逸”到 concatString() 方法之外,其他线程无法访问到它,因此可以进行消除。 ## 锁粗化 @@ -1647,8 +1647,6 @@ JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态: 偏向锁的思想是偏向于让第一个获取锁对象的线程,这个线程在之后获取该锁就不再需要进行同步操作,甚至连 CAS 操作也不再需要。 -可以使用 -XX:+UseBiasedLocking=true 开启偏向锁,不过在 JDK 1.6 中它是默认开启的。 - 当锁对象第一次被线程获得的时候,进入偏向状态,标记为 1 01。同时使用 CAS 操作将线程 ID 记录到 Mark Word 中,如果 CAS 操作成功,这个线程以后每次进入这个锁相关的同步块就不需要再进行任何同步操作。 当有另外一个线程去尝试获取这个锁对象时,偏向状态就宣告结束,此时撤销偏向(Revoke Bias)后恢复到未锁定状态或者轻量级锁状态。 diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index 8c1fd1f2..89940768 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -366,7 +366,7 @@ public int maxProfit(int[] prices) { 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。 -**有序数组的 Tow Sum** +**有序数组的 Two Sum** [Leetcode :167. Two Sum II - Input array is sorted (Easy)](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/) diff --git a/notes/Redis.md b/notes/Redis.md index 09246c53..2e10bb7a 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -6,7 +6,9 @@ * [SET](#set) * [HASH](#hash) * [ZSET](#zset) -* [三、字典](#三字典) +* [三、数据结构](#三数据结构) + * [字典](#字典) + * [跳跃表](#跳跃表) * [四、使用场景](#四使用场景) * [缓存](#缓存) * [计数器](#计数器) @@ -205,7 +207,9 @@ OK 2) "982" ``` -# 三、字典 +# 三、数据结构 + +## 字典 以下是 Redis 字典的主要数据结构,从上往下分析,一个 dict 有两个 dictht,一个 dictht 有一个 dictEntry 数组,每个 dictEntry 有 next 指针因此是一个链表结构。从上面的分析可以看出 Redis 的字典是一个基于拉链法解决冲突的哈希表结构。 @@ -309,6 +313,24 @@ int dictRehash(dict *d, int n) { } ``` +## 跳跃表 + +是有序集合的底层实现之一。 + +跳跃表是基于多指针有序链表实现的,可以看成多个有序链表。 + +
&LX;?E zPd;HiGdfGd|Ie3&pC&fl_l52SNtkRToarqqRJ&|qSiO+gw#r8X!(e2BH@|<6j)g6f zGvJ)|xEUSeRU;1i^LMEhBzSm1pS~4L3t{~|-{T8Ee_<+CTJY6h+6lQ_oGryLP2aa= zdI06I-nOzvECwS3Xzg~6_5wZL(T4x^b#t5#+x-TO3GsGHmWAA#D}vCgbvA+Pqh30V zG@)llIHi*Vgn!RsLGz?N!BDZT*X542SF7&zA%Vcn<HJh;qVnDX^iZW aV@Ho7Jsv!g}fMzOcL;x`0JRAcm)KAl}s2h+Z-~Cl8ic z<8~|yoE?h``LU=8ov4`i!blm@Rt&?3JL35nO3yniDNz63ciT2gZKh{u=eY_5T-o t#i3vQ-wIhANnRgRu}V @li#$Sfo&+Vr(!e zTKqBfeW3>aR9ImkU7G)9etTesVa=4uSfTLcjyrD@QBV2@)mwZ|;NGYo^ID G;=ECU%aM39CGGbxK$1OsT3 znch7Zn@(>^+RoVcGn#e7102ySw+y9`9=cZ>j+|RY^MN_>j6KvEFWLY2JE^%Piu?YQ z;(?#}Kav;Mze2yd!1>z3LSS(7zSZPgYT9`Xp919STa}XiXs$B0QLl=`@s^5Wr83H> z+1$NG_tFgkjoZ9baFjfU=fX{? Bx2nBNPrapkv_1U5vA4 2ZovCeZLL|(?gc&n zho8Uy|N5Z$?;QXqY;PpJ_fwTT_2>^Mn0cL>%%!}x!+1VESaw7m!3n8u !fIw6|)rZ<~OohkR^Ali2u zetyBIp@g@?2_z>=jhK3SS(*ySv+KI`BWUD+8#jPyl$)fH(<1!x(U9RmJAv+KLx{#* zJ_$b69?D;3som-2YDac+Po>-xLPlo)efCp#(r+aBsVpRlqc|s&<#aE_bD6(h{r*MI z+cgnk3PX|+?Nb%z+1h-CBwXg>%ArxEQrC >`R{X~ z)UQ-ZYEA@JPV=`J6cQnt>Lv%r>RWIG$NwD+l)pjvb80tWpew*;%tik)j-hxF5T|_l z0V2I{XGKWi-M^!c|3@#Vj%U %p?(5&9ED~Q@*R9lFYU}=9=G?T)Jqd=~ zX8T!?Yx` *0fGIM2!*^GlKX@{nZ2qDqnq}%)6@FVj9D}~ZP7*)1}*zltS -HDKce_m^8EGe8p zvP$pRc!X^?373%Df_IKc_+g4y8Ht`Py(vli@>$*~n`fIM*2|`jrr>T&ZoT<-{%@7+ z#F66q;^T!k i1} bAsZHdV{+)G!F+QL zl#0!6Wg7j*5Qbx~>I?6=k&>(5dz9Q)KzrtBWRMP8`q{PrqF49&!yOcibOT8i*(7eH zY3Iu &jmoBo8H0}H&Wb6&!N=vlYKZeDslb-eunON)>zYio& z-XLK`Zj}sa$qC!j9}j2Z#e+z~sJ$>g3qHvxPxd@F w)SQ99QQpj2lzo z1-s#^CVfsVD5O|ItMhxw^8T<4OMd5d%FU%@lmvyYu%rLhkO8g3>BGK=c12`*%bl-Z zANd%b3s6(v_w;;Ebk+7(fXfVj+_*8)KvL_l8Q>}8xqnLGpPYP8G1Em4ulO6|pQ%pY z@2}cc6s!3q-73mpo+~>n#%=QLwIlDxId$tYLn!5wCn(+B-595z@Vrp!qJ#Xb`B~1q z_8HQ{N4V`+5vQ)RNV0y{(Fa5rzByqpLM%-g%wBBPS TD^0JhPI}ZQUe;AIR64(apO;La0AK4TgrbYvfG)wEw|N7U1L7Q=y|+bde`B1zf7W zN~6wI@H6S&O2Omr2BB%vQF(*{XH1Ur8FO7s>xM%}j;_pKi|l#AOf;)TEyHoW7%(P^ ze3m6-Ntc$bA76Ii#B!u!2fFzz#7yTpIgVGSGhzr^UZXH+R`l%G2^@A&(W&HdUS1-7 zaXEMZPJZ@YN^y`meBp6*FbQ7kpH7$2)kV$+@kUoMMQx>N;JIA=0$I2z1%E2zQxlZe zwTy2bBR4h(41H-ar&G-e8#tX@&MPH!`jz)gOVn51#HjFKBjZLj({^LJbrha@6l5CJ zEepG(dKG5#mcNm71SdJkcL9D?^<(RJ7!x?zHtkQ@aLuZn=V6rM>{`8ChpWAz@=0|I ztvKsB3dAhB0g9&_)&u(N`pi4crK#t1(>A1@O&Q(#a?0k!L3b(oI>YgG4X)N2c=0_k z?{=T)F4Du>@}%6P*BE<7$){auFE8eApqaMc_i@!5)-)>wGyCbCPP+A@XdcH37~hUA zQr;RLY+61Vo0cjs`TBW!k+*Cetw6mLJ;iIETvWh3&1~EDJN`0xDP5AmLmJtZpM%0F zi#)j3AT!7?%zcFpHMHCuUgdRPQ9u9UF=EJOa;vty0N!KNlm4m@vN6+1;wj|uE%z;% zG9&cCs(F=o)1#y-tUpPSu@M_y^KGPW6)M`wPoWr5Bu- E<}PnO4~;f@pt)ZjWPh)*$H|gQ$@Sb#WXxL9nc*UxKBGsi zFbR_1vuZgu{KbjNPjf7`9zr%Wluz}n-27v7@)g^qw{^*>DCh3f+qelsDDkT6x`LDr zyG?4<6up7wyv46|;hWr^XsKoA`K#2Bnc-*7KVsSmEhy$O$)=rsVl=8Wo;sS}lIVwp zdJtGYep#rQ>)%vLk+6m>9vZUqEnP%T`Pk&cdwWm6r9h{TG;kEm#wEL*na5(j>FOo= zM4s@zdN3jASQx4)wGRE3>2Ao!w47Yr@xXi<^#jrEe+oM!5nQPR<(AEye3 z7#=A*Q)B=nqx?=69}EwABr$jr3@vjvjm(`QO!8o7@-?_62SJ&Zob}>1#A?){#vouW zxSp1U$u`;(&kqv&kds}qUMG}E$zIIFeKQ2nmz2ceI!o#RG=?7S(7Mxz4gaMrkIkEl zSF*?3@5Vi77W`zU@CEKpgzj~wMG)8=yCO4_&iN?#IlRa?7i2w$?^Gw6=)zS%)~7{8 z^i-!o;-2FZS2^aL2=Tj_R%932xtauf6NO?V2M3Q7MvLb$4G6A$8B84+xK_!-A4GCH zj^ZayRX|c2c<`u%=7MAnrfgIU(z?_4jjh&u5+ybrBDe%r=HGOs-zWZ#lN9fg`W;hY zq1*UphRG^qgKQ&_4nRC0g|d@?;6t&LUksH!&WmCAIDrrS!O2QD!rk%B5UQ#bu0y3J z%B&nJaBkuXGnQb+U=J-(OcUK0u1Gj{fV#e3;Rk0B%8*}-L3k)Z{hc>@Bdc|$Df|Q= z`^0$fx-O6Y*o($+wDX~YK-eO2GEohA&q(_-$F02L$xqp&hcyPJvFU+JxlHiLZD%)e zyiSAJ$!ZIdG&Zy~{ZDG >sW(VK#hR+kf)!VW#6ud}n+~SV zZh-Rf%3w&}`|yv%^% zAU{=1f~`EzS~@2P8Zp= qNnh~ zBBHoD{W{lVWpY#HE)3V%+Ec}OrHHq}Wkzh9Q`~)T%P FrI2(IE~WNjZ>= zvzKSDG_Ah8?qyjQ8%%B}G1@+1yx^mT=f0{6(eGcfF0s71n}}2QZka!3xgj}NvF`f0 z?1ihaRhv#n^A5=uhfU|RoqhU5K{sT6)&6&04R& {0-ie-yFiVC)~XXJn-8N1l^&W(-9mM+4j^vF zNVEC%W}_FyDp8E#mY-3{*M}}EDL0A{qRS~ap4gfBYT}cxKJFhi-NYT#NnZP@1*%M3 zxlJzSmGT;_6<{ggXWkLK_))eomqF_}St{pD(X0iN75(0ki@x=Zd~R87={s4Oau~=| zY$>qGgaWxOr?PYhE6iPM>{iFxEq>=qgCGPAxF(aC+YTI7xYi_d%|6)hN)~Ch^Z0Ti z!5(hl+5X*$oG$K$PvE$z^Pp|y7c?u4 `JBEXkMkCO6fy`QV;Hy)^YUg4d4~Hkv zRyLTdgjpYUkQMB1`%ghQZKjoA1cea^+Jg5U4wcp#6^&L)vCOV1D<7L#o1)F VwF#w7Oi=;UD^2o>%2m>(=Hhkc4QR8yE}{eYM^G>}K; z!HrCQ4rYo_@3~*-H^*#U5E${f5M||66}Pr3MxmO&(ihM-(6_lb*%4N}CUc`DKV8u% zvWOsbMk^^{^M?wB1_X#(Onu>PG!DCjeab$Ti|3ZHR_LA)f9sc0-y^a0#%YJ%&k!n_ zZ8Zzsj;^!`#*&kJahdeJd=FpW0GA-epBjx=qlgYZEV8z !=yu)6uO$2BQZe5qS|L#@Qt84-!7-ji*qq2y6PZ2S4SMoI`~ zA#p!gH6iv-e@D;@rygiy1bcACo)#`l2=l9$)tHbbw3q3=Z}(t*zrb!~VE5>db&PU( z%y}etEWR%>t%TjH&+Nz0lP;iApk5MweqKJ;aG`&7elPDi$l{fp-8B0m+Y^0Cb5ikd z0bpSuxh^MU(Q~`7DhhKn)NHUUtS18jKioHeq`*AxUZ$Glbv-#VI7T324(B8UjD`O) zh#Dn~y6bXQ1ENl-b*&MA7+>p0cnq6sU!9qz^KrcO*g%>2M1}(*5C2W1s716hEKZCj zZvcR7`bhxDIYrS+P={Hg^laQtb|t^B=GRUeq5<@#^QE;ylEAX!A3T9|#M>_ {+C#6pD&{@;9oOi`Eq`asem0{Jo<%}GN*VM_$M?(hBm(R)iB zHeVrFvGMhpUoyOo=ZU?KI`f^$`Q+Lvq-K{(*zNjU*F_87)4<8e$!jN|4A4wz{9|=+ zzwZS7@^5IXA+ZW$crIeufd@ne4LWu6PyH#nZ8820;zfw7y)QNKkdAs L=cJDXtRSpO= z14T%{ <@aj$f}HjEmlE8>bv#Kq_o;*QFL~G_^JExnA(=@S_NZ|jX=Y4*#q_h zXh>A4i6tj&g;iM}63?ibuPS%yT>c=6K}|K3tJo;4Rk0An%cQ<$*jft`?=ff8IjX+~ zZ>M%IRn2=QoNU858ZUPFk9mJ;K#bCG^8FZNDLbWM<=i0Zcu#_8a6DIub| {SQ;D z#s04|@S9Xb;D-}nzJUR e>9bReUHcYys;1|Ugr5d(hoFZ;LQg4Gj|d2eWz)XozD z@4&unAzuS$lqPx!+w?%7gWW-8eBv |_LkswD?0_R($K zyTD#*3m8Fg9e<#}xFNf(vjZi7!Ak?Y&xQb2k4qG+ls%|-n(P7i%)r0yvgHQ*oti^K zerK|7z9i9(3g&P!Ckg8#Dgx+8vzVj}fcIZ$!T(K?g6;~q?NZ*k y?nxzje3tb=y;oF;VAB>(`sa0SNcr(c+my+&eYo_ZycePv{p$3x3*j9 zst9@chB~|PmlK(Q;52`vQlxk|QFkuae1VGn7D&p!rzlxb!-ta(kAHS9G+Wc3`ceF_ zQUHVZ#Ux-cIEr;1bL!sWnqOMUEpzG?0Pd=Q0iM>3zJK5w>cuK5TINYXOzLw>Sl7i3 zr|s+e9w*P+=);o(=)j}36r36_S4`-LrHOvLk4O4JPWY xwcsux#@2usf=sPdrdd*HO3Ka*L#s>Fuvu|*g!Yip=w;*5Qdo6 z`w%C5o;~V?&{1fkg7UR+k*?f@&Y~SJrPT{6X8I?VB+GgoiR~U2IB81j%q}Zol93(O zOztHMGKsuzQ2{Sa{>-9-2qybd`nkoCqgI0*QA{f{l>jA%ZMUgzUf2hp1l+hS1Hu;T z8HpL~i(UX3yLCkb%O^cs4wIx12c+Rn551oe8yAZ6vVqM=mX&tngZJA!dkdisH7QDJ zvOV-Y`nx5kr%3yUTc6jIccvV_07$r^*^(|>Hmn`*c*^7F7QWWqrjXb=Q-b4B>Y19i zNVtn?k=wB=Np?(iP7m1*UP?KocE1K=AmT7ilM16Wb9+i{c;9pC629n`0_Nhw8C~YC zQITdCo2jEr&FPaFk@DS!!RrrpTrfO{XAL1fgK7($rQx&73*8E;i_4F!V(bdwRD$>D zqkp)nO>?@Yg?=%UJW}&v<7_=m+ut0=uvT`t$0B@6O@1@a(WP4pd3NSIWnn<77AgMr za0JAmmsfjUYN1!FF+ZC-Cvci9CbQ 7cMqM;0*DH=jF3I9IpjOc z?hWxK&esweG?=BXl_*BDMX@~-ICQ~o@`a=N&ZskB3x0S9@ >`dHgzDRZHQvnykG_I~D3QJn)=7AE?8? z5Y8`8NUojt46j`sTK6cJq{#IDNtSr^_O^s`PRIlCmAM!kl)y;wofB)lp=+tSJr58J zQu@x#37sL(DDsQ4K_NJ^cAZ`;PQs{O-sBZ?R*yc=6*y8zbgzfJ^+Pp+iZHxO{3PBa zq`f#+bWek;ICN_@5bW?-83@Yey%A<*;#YCCj(cg``^P7^vTmhxg1RqXRwu;zzj*wZ zn6@#+TaQem*}O|y%O>@-mm5rVs6fehFMZAPn=c2nvmVF*hPg}NrSqYkVPbiD@Xoh# z2_>v#YX 2<_YRU54%nFAw_<@TV_@i-pC zGCIEeIhenbOTl9~J}YS>4-r(X>vX?#J@24!+}6>Ul~&pHP#aioYi>0?ZA4F;ta%Vo zH}*WYHsgzC&FQ3)GFayi0@?+NY5KnNt4%joEE?q&nbH|^LLW>^35l_U#nl@cuI?v_ z5aKJ`JrbW668eY0#2YUGM?^{r{myxX Jbc1{$m%TdHRi{NQz>!hFIA7Xrfka(1Ix#%$QMgiq z*Ic-fu<;sW)=V9|&N|N>QEU!K#7R)?XitI3#exToS^140YSn;!i zf;&l^nHo+$tdy?dggsPr`(X5wT|~0`W;4M-w4QF|1s^l~6?S)Zi~~VQ%<1dd^5mSW zTQG}nGN$f{!K$3oHHZU7!cN*Z(0G7e(g;et8?F!#;2aj2m_AzU=6`S6&)SzuBA3`& zZ`#r{XfCGxyrJ>yfc=oX?g+v_Rz?BjAi$apXfgz4_^I8-;?!Oh5|JLV;8(MkTBSx& z&p$@t$Y8DjiIQsY^EpGFk*oDHT%Ae|PkhIriz8XAs?B<|ELZ)>#fu{YB=*v7d5+uM zL{mzK^LBd?P;Nojli?j7XI04diH1)@jMesdVbEz~UA2cTZM4t0 r}UY$a$zto}+QvD#0Qp_lNmof4%(lh@i&n=0ccGG4;_ihmD+*uO?CS#sDwm!6|BU zm=D<} MGC22#=#WW=@yC3c{%yeUTYrZ%gyityCQ;6K>p>n>jtm3*w>n8F9O< z?*|bklX)t>TEkt5N@& ~Igqf>DJU 3`FmK68;Z7@J#!qNgeG!D){{eIMV^>Y&PeA{*zugFGZZ-KB(`PAx55 zqiX7xY;)lJz~UR%S?TtqpVK9FS_H>)r?qx_3>x+98uxCn)pqJnYw{R-7&swJ8Xpc< z84S @i Q`{Ci;n)?;A4TrIEeR<>(~GR}tbh z9UDo)Y!q(xW-UH1UEIFg9NVuOvJpAA;Jm(C5i(J%BFVD8+j(_jc1Pa&3_~|_eUuZ~ z*&;BDY_7vt7=*Y0)8>-cyA1e+#{z9BN{r{VW%q3ql)akqgw^|zpf$DAW{BbnSltWp zO={bHVlAW&QF>@=JA!pqVd?$eps6JUUg9+9J!Uu*l=x~|si&d2(!v7Q)cr?E=kT;r zscW7?a*y*#ufBl1M-w_+t)R6d#j~vno<;e^!+>*#_s&nAq_&;%4^kmb0r|!!2AzZR z2JP7o?@vt-?0MLC?7F4U!0oJAl(GtTe`(^w925*^5y-XxeayV5?;(qJtyazW=qm(A z^6}fFv(xRMXve2%F3p#8>MLB4bT_C|$A==X{Rd8*K$iCni(OL2T4(J%};u5gQG0mHyJFPqFW+H79J2 zrfoOoD+MpJ-GjxP KyF^JJZLlK4TZQT=Kn9 z1$>Sx38&wR<=l{EH7%XxO#u)XfF4s&L=Fh(b89!FgWcdObq+UVQB=9+2|vm(n~NXb zAo3<(=N@>Wm>sfD{*#ZJJotG5(l)6{X>5WNKXgh-CZ {$MBTEypCmD#gk7Fo zLggmk6HNQAb?okREJ4ABdomrr(lph)WOXV?V)RQ>MDN?%kk3UXx;o=JO~oO$j&ua# z@%4;QA=RF%Yo%zk$E{~mm6q9!5l}m`t#YERb-=(rO~+wwZSy=<%(8Ig-1&ZQ_F0A4 z&u2!TZa%i;%*_!PL?^#Ue0IYOp&gfh-=rpa)^LjADPV_RMdpGJ_o0D%Uf-@=x5g Le56sqI0VQQsl5hSSTyv%-I21O`WXh9{C-_|5C`)sKKajjG=)(av-Z ztW>CDH>6pRKTtM8oCtTt>^I@KB_CWOF46aLJ+45R8S@*L*{J%}3?2;YKzt8dPO;1# z7Fnn$S2OOKYSCSqGhU79er7oIw)_s@FEEui-+4BQphIJd?ls&rZE+v&-A6t#52Yc` zgqAzVxw!g$cef@5k}t~veE BkzV^_Sl3Mt9fN`Zy5ck`av6dY(!FK z$oAxfS5@IiBxayFw(=TlX=jgg6ez~{jM+{ ;(^F=dC4^M@rX$@jx# 9;zSa_r`Qyj@3qCGmHWgx6w|`wdntArg^Fkg} z{a+uEXJj-5S-99p(N4+RKl+=@1cZt?oQV`9?FMrP*R!5w1oK8*mv^cE7KPS$M=Qmt z8IFF!#*Sloa?f=-(a!ySf{PEu%)3Efw+zX_N3t4~WX9 Z_Xv<`8bW)@bBVwelc%- z(05_Myw;!KHz*YAkBbzaYPcA hBHU8Eo~Q19(k8kCtFgnc7}18Lg}+T@r%*nzw-`vbvzDp eRhuW=+RdSBsb^x#xg9(183yx zOFNoEGmNmv)5u^~ gw&nTP(2M1}GGu$WMS*b}`C zZtjBa873(4d(Or^`JI_pbDSNFh?r=U-p7b33U>0ix=&s6kR6$dhOuRlpI$29ij1O( ztRO-u#b9~SrfoXzPqb&&)&;HQds0053FXkizNZ<*>XnjVwISt$VV!Jz=PSZWCUnuH zKqj_>Dk*B3Cy)6KY3paJkq;Xb@whadC57jobM1-F#|LE!Q;7N`6&rKQKqdeIK~`(x zwiod$U^w{!Q5dbN>#2|*$o79-yXE=K2s`I$dcLZfa(X`>i*mMUg1ofU^2PW{D=6G8 zrD^8kk~LM0pxk;4rMZlIq26w tWO?MO}-olF@PVK2B_72!Bb>p^$dhv|D zE*YBBZ%ovih^9^n{hvE>jlM>9IepRj<`|kUf`;{(@tL3MEf9~;iGHXbsxcKDEmDzb zXf_$m8@X>;d(wWZ{YQfa*NdchFL&L1RqavhDTtu^&1I>}lgs!i%#%Kj!JN)(kSHoN zd_zI=)9(&9+KPD5aD{Ad#D-EecpZ3;A=+TJ(x7^Ar4HZH8>G8Z-Xd#bo2!vnnqjm7 zt`~O)x|Wh2&g<_MbQ20&k *4P-VD~U0O{R2fKQeb@Y;}x-r;#%;yuB;p`_EY|*-EBt z+lOqcS1cu0TiVpLzIxk-Z_i9R@MPn8Z$G3R{F=xzVX)qv?{Ax`^9o{*(@k%RXEZ<$ zb5!?5?&)o&h(xeYqP*DFSHu)@#3{)NX7a%)L2(pb-VwHejC1!|qmAqj^r903ZRoP8 z_f`Sxz!$m_Sx>=Qml#fvu)VYWBcG#OO0GVDLDI9WrKWd(dW^c{<>#4a?~Ev9+o=<_ zffl^SSiR}z=V4!|>B-lzj{(FQzIbx@6!n)T$ny9C*qxP<)dPYyc4&Fe4RM`W7Gs{I zEFmS-9v`IdeYrT|YU_D%=~jj7WXRB%%tJCVyz8N4Jkb0>MR++D=~M{da@~U^2A#P{ zBz8ZBZJF#JtX9R}w6|DHQv>Z+4&~w8+?E@}+d@t7-aSyv@x3?&=YvI66(ET~DFZN! z-KD@%y5&_PTU;Xc$2SbY?r|1LzdT;L#xlV92oM>Os*^ouc4Aoj3>H8l<}Ntj^r<_d zh{WAIR`8&aOU@fOu0denLc{}I`c`O0;1GMp4Olf0SSWam0%^->8sBOT ^wJAKp_-adm4ngtmzGSqE0tj|NU(mm6)aAJB6(rL(c+6oxQxrfX< zc5jv5OD(;-jdaldfn`h$YtzyiZdw}K`decFw6!uX+U_~tz5XMrRcpxU{=(Z}d7R1^ z-e (Ab2-N@N^D}#SQ~Pvs zKr0wZxV>V6n{%1ZiF%NA%+2Ev4$||4i`SfX3%DQ8WtV417poghG=u`>EkNs)349_h zcV_E~p9V|@$M$0Vi^^Lc&~5oKNs&iT@sps%p{g4j@t&2il}N0bu(!;v(}sQsxc;l* zS#&+e!Gx~!=5HxJK;`K--`#)dK>eF52v<5(mY_bUns-7d^>+~vef;sYMIFBs7lOuY zmr)x{%K}X6a1z5g5HTV+K0q2o>b;amF$A?GfXLv^o)L#+29b07FaY9^nqy!M4-Bzm z^MB9})Lt0?!@U|n|04kh0_ta&fLRIV?}s^nYPLTt4iKDgVErExE&u h!{ebW%j-j1-T?bo9lJX!2VF*(z zHJN6$M_H-O19WXLAW2{7^rq)8Sb=^asuV!8j7nKpdCIx^FboJ|4ubVf&(5ax#U?X@ zJ#+ezLv9T2Ka$-fONr`A5pHrV0I%Aau9^@O%Kw%ohW4A`{JGkj?dGmZDVTkz4q4?H z;TOtJT~!9pUFx`Y8b3ieWx#_LCM(&IMJ@N4!yG;)4omp1Rsc9neDAE_!(T-YnI6Rx zyHyxVl6Hw75KQg>Oc@kWm`msk!bT0DYcJFV4Xpx5&2@Sy*BRf0(!dkT&TKegT2)rs zQ@AjWm9rHD+sbErum}j}iQ5c*T9T{({tXCT$3YG~0OJI-B`5#|^$?uofFJ$ed>|?< zfNBp=q8|_>DS{jYWF>;6{KuDnF!mjQ!e<2c{kIRG1^6S5(D+TNBFI$0>;gs?Fs%Rn z@{h8NAs6t!C`SMN0~CA!fhE|$n7>I_K)wPd7{LGoM)u!d{-I1D#_351+|GafKu8k6 zX#+e5=nkq8f~*DHIpECy@#UZ8C(Gbg2pGeE`v7$(0Nr>8^beq(w5@-G5Y#CxFqaZK z{;bqcb)6?_PBI*tOtd3_IRMZ15|Y$U?;Iv>Y~S;*U;klt`vE;SU_-^O(QnZ3ccBxa z1Oyahu)Xc!WYnpDab?|LS=y>?$hM?G4M;akMCnH1wA02PM-1HiEBh@(u?65>fgS|m z&7+m5Btq=y5bs@`;xs)}W>l~4N<(xeGI0tB_zC&8$o%X;SD?MQA9b0Xz@6fdC)u7e z<*@!-%W1DMP;mmDeUeQhAD_N98dpZ}``iE>U0gCco;vBywzmZ(oU@jtU_}rmziI#z z!|jqw)oD227%C%Z)H;gN=8<=HEu{-C1_G_8JPoyZoVznMoi;4#{N12`*7Z=FS+}F| zI<_@=1@Iz`DyxjONU7xkZMS>tk>Hk<$jH!Wr4ya(na%Dcz@cQWM~;fQ{qD1!bkVZo zc4OMy1wbVA)#PhNA`p%&Z!I!1Dq3l%O5d?+FbL7a=$Az*_LWG%VJQT+tsUCZ2iwbl zW^^E!P#qvb7S63J1RKO2n2axFR};n5L}3uSQBO`JlNvex)3>Qk1`0=n3!w{&Ms?qA z9UYi`%nFXr(8kgA*|=sh0H+fMiPz=bG4s){h_@z({Rpu_z;NTO^OEq8u2#D$+Uv ?}zDNJKJ8hVHYF|5_^l? zS=?Lqd-tj8VD1M#C_lXACesUp;ZbMP$j160c*0FSuC1gYGkHOajhN+9IzC52&6uk& zrB+(zzDOlo-g*~-Iqak6TZPOgr|tfs<9h3pgsUvy2?l!7A5G+%NnhDgXOl*>D}Sc> zXwW%4Nho|NhkSm~qClUItJKt%<*ip8_1RF?4yy&*vLigsU_Uxs$ 2rwhV_IcLxo?9d4RD7$kj8FL@h`n1G<~!Y5QR#Oc z3TGDFVLMBLsW+|?wit};+SA)sJL&VQHVPAa-$A;6v_>ZzcY`E9Bi(q@K!#Yfa3w$l z==A5t=niDBjq+!7686%A__1esh1;F)4f-4@7m2Wztg?{1&DA9|KgG!xEDDgt(kd6a z3TOAk6sN95I>aU;YO>rkNh8Gh26;&}cp+kuClQvj#K#AyKWZL1GT=^xShhZWl7fmh z-*k%Ni`80 D6aXSGe)5u #D?gCG7?xWjdid!q8Z7Zi9FUj$tR ztK8) ^zm&BSWofNxzY?*dSwMJh#xk^*sOvL0CksU&S8WcT0LpEd!lpT-v+%p zy44FwAK= L R#Y6K5a$lL zuhmcy0K||tpm}}RJMp6uI>0#b &Pd;p2yD5tFjuhqO zKAU*4sxftkfiWnLm}g5u%B*YRPjh+ct`!PWPC zPm;WG`slMkYHq8BqrZ%HZKAyE7)dveI&wPO-RRl)t3*S1XNQFg@dQFo^rLJr&r7B^ z_dQa>*vaT3RVOII0*VO}_jPUjRdXlFt}ffy^zlMiY?Bj@yaXMnS-7o+1OCJV-&BJ& zWd}A+^E-K+4W1KCE#+O06TB#f9(|C8RTyxCzbCL&B7DBlq+%LL`<23z7Yz-EYzXK> z6d+>v@$SES_bycyCsPzRU8=s=`jIGyyA{RnaELU#opNxo9fNFv3@@GYwb*^$FAuk( zn0?fGxvOuehx(16XS;P2k*K0%$26%?#{ia~h@@A70NsMwU~DpH{1f;CdU|>(RjbIB zhHBQ!+A~2ci)kVeioF)Ob*&*h7# 3{xQ{pq6ox>=9 zECgSiD-{&-H8Vo;%gw~GI%g%O+34{AHJrZM@tPHzOz@+(xn%kk3Df?X@mmIX%jvxJ zXg_^7QJBPL^F%K&*`X}bMzWAf$9RJ-cTJeAh`uZ*B~{Vmr`+Us@3H~c# R_Z$nR?o`lT!?W(w%E7Ew(Pg_eAjA6>)e>t&Ki&|7ArmT98c(uYfkK3s?x_2eg&D z(mRe0oWu}=9Ru9FMunL$Yc{z ^{8l;`!9eLXFx}p)iT=+~rREfZp;HgHpOMpA81RY6zKkwa*LcHm&C3l=BSB z1}DP91Bt}ChXF|W*^j^XVqVdDg(^Wy{2RYK?3Hv&la|vhsCAhr+Kxo%I_S`Angr>x zSBPo&qF}^HQSB?$Hl*j*N $;1cNTN7KX`nkDZR<$Oe|Ft^YqZet$)Lrq#{ru^?+KL cFb60?1f zBD67@etV14B=mN3+(`-2@6dOkD?PL;{qU{Ha~w`)O=R(2uFs5Fj|t9r=1D&oC%>g> zDBvQ0djvhEq-`*=3*&eF@xs-JT?umIuiU0P^#LX0{A*e7w7SDarC9LYX`r(*y7ui; zi6p0=W*`1UVw|s9IQDY)@H6zq^Ame5@KoKzi9u_hPEM3K_@Y^tmFkwE8vRL}DZ89p zRg--^@@UHxVQJU6RZjAvF{n%js;IDfikDR_Hu@J&`z}_f`r>)9gbMRA%%)#{f0)1n zVvyr$>$;JTG#o7TXZo)4-Aa$+3Rn>P#j9=B-{Z_mLSb|~3e-K0+dT4BaG^-)(|ng{ zUbVd6PS-ZABxQ;aH^_HC+(uhfo-AD*O$@IQ1%5e}aqEQ{X$T{!k5%FM>m!0`+~iEQ z_@LM?4eI1)sM0*7ejc_bTrGX!;%^@uZ5P)8*%VQD6fn)`c1ByADwf@j@OQ3s(}s6W z7*=g`A?7U^&Ci2kU4*m2c@jbuL)uGUW(c*DmKYb -6{-8%Lj_6+tcEYwASe_g_8@Oh_D<`cg))fk^ z&KJt%f&i9(Wi&+B8HmCRhf=W+fO%FM)#X=L_mkb%$ia#4S%fj$Nus!5qjw8ED|fHn zoyU2^J^^l@9iwF~(GE~#nW#c8#)lT}dE KNJdeAbm9tH!{fVr2bA@K< zu731q+6dVWlC}zDHMf|tkyfGI((B 2}S+ zb+*{Pj(a|Hdj&1IE^f>Q=b&b-D{-!7x)orwi_k(1-_q_N&NrD=DprZ5yk9|W`q-fM zONiUak3zTWlSh0}EV|cNMh5U`C80)7uN7qtDn`Iq0;Wf@#PUG>>}2P?d?87iYH$|e z*} T32zm_9g|oZ>~c22dMeiEVyO#35 8!%g}rVV8#^4e z4`ee8Wwm^$c5s$n^xT&^(0+i*SGtstHbsVj{`&$p4sD2zL;Fm-0JZe&kBg-1BXN12 zE*&%iNA~jWLSCXwNX&kjc($)*M|vU^)jc}Pgrw2EAt1r^m=ERWsWe06k4}L1r>s0t z8`Qf-G=3gR^coP3w3l=d=>|R`uHS5zWtf7>ZK1roRhc1qGtC|oLpah3peL;83yvQw z$Zd~WYk_Xbt~ K_O`jX;Nn0pBfb*z6C%JH(yA#y$<>dVLkE|I{f?>{B zJ3hYxX+8|!bH44tB&}O%t8%IUE4Mj29x6};n};0k4k+?I%n(z5%lE=8msS;(JOjgd z@oa5hP_&_JOg1@4J7^CU5c|=KxZ5r4V1+kxZXwHxWes0tIep!W;MJ(@4zfP#hgF3> zIy*7mut?i?M1VfDDkD1@?wl0mH`fzc--EHZ#`TSzTl&=8F5z!Mm&a;jyZa`#;%WLj zO%sK}%3e)lWMm_8#T#p&Gk#4uK`z|fx|Z5$O1d_}vAz~I(vf8<86JH=E;I;bxJ|s) z8E>GS@B$cUdn}@PQg*nikUo=pFIjE(mWELg6TR8vX8yAt=A2KwHx 5?>)|cg&?`m-mk4f!Ga8UXLjanM34VBGZ^lSG-f_D4R?Y-L#`Qc~Y_zm%gLC7vj zt*?+?5w+pv7Q7jlHeb+BxP`1Rmak4&_NeyF8OEmjGLnOo8o+)$(h@W(=BPC9l|y3g zFMdx~lHzmYe~@m_;9GNO8sAZ>pcRfRWidT=#f}o5jkRV pS)4yg?bJ|@@@-T#n-;wQk;rHQy8a*Zbtkdy0C+1 F>G?Vs}A;2 zgSBu&VeN25VWZ1N^HCop8{W*0)X-r}Hm#moA|p)nc9KTY!eso0+}*4$et5!6aH`_F zz2fuHtZq-LoY7bx%u1J8B9XP+nhwbF^jscPJ4>X>yUWZGbxd=nS 4CT(8zE?)aZ6W;TIH*jVD+={x+t+C#VrAuETRSKNd4JhUnKFk4{*;cb@ z>CUvvGfR=xWfJc#U8=&ReeT(;p@3|rx8|$SIceJYlmT=O^);I%Nz$82OSm7v*{sSv zA73ro9}B Cc zlgcn;yKMx2+e;qMaKsg t%OQ`U6cnM6FoF*n7g?4%@mJfZ-=F&hS z`ZC2-8|13ao$nnOr99^8qy)l>LCn>uPMnttjZf+s+rs&Plm5WY)5sCFlcVvWDLE5> z2YcskWZh%ZHxJXWd29JTb))e*sn N2bnT6zUu2YnkMTkX++xe`yLe1JmXOXjppsZEeP#G5!k&`fj9V z^{LlpIETDQ@P7P95u?z(Dgobp&WJHhUHJk@F{G<|Tk>>hX#V#klQ4VDrca7U>RZi_ zIe^<@>l`n4B2o41iH_gMvY8*C-%!&(H^4haKiOqn<>Fyq{dVWD_zM;GWtG23x!JO9 z;3FVzgtdU@FsNs;?gcvxM4^I#qGgRvx(;f(tvHobjZ3+|BDTAM=5)H28~5On(}6C< z =xajdtVI~eN`%ah247#Vz~T0lox1BaX5PobyC+hn zF}q)9`mN{qtbpuw(;AeFi`dZ)F|crTEX`mf3`ZT18WDA^jW%Du@o?OMggo QxJe5HG3 zy;I>U_n1oI1NpbFyB6nuX>4~_b^IPR_>IFIQ@}4Ap@PN>%X+)yQ1;7F^_Vlmy1!Hp zjZz(&8W~a@;>W}o2nHoVV?DV}SNTqod4S!{F8aybpwr`nVNxA+v9J9jBEVV$ w!vL;u2p-g18@xm^`9vkG!+M-(tlF}%g;2$dhNoYO|rSfo83M=+*_ zCF$)2&-e7L{aQNQ+7UlN^aq>(b_Ar1aR$TZoz>@6g#BcX68AJj&bjln>4B>Fvjf5_ zO_NJ1#%ePpES;HJ##<}=TT0a@N6($>JQ&(91<-4dk?srhs8Dv+4Dj8n37O kHV>xq*Hvx^7Oo~4kiIY71Y=HhxskSZ}v#^p=2AY^|*wm>U)Hx^g24t zc)7Qx@}Rubd89G?vNY7ZI;W;$V&(oo%H`3qrxdvMhl<*hgjh4@$7h5RWM7RTDuN`6 z7E{KaZRVLCJu iXf?>X?2tP!m+h*$m>P)D?6 zcQ->AlCDCzs#Rv`gKu(%rF)oP%%1JBZDIL1tzFa>EeLhfbmn7#ctn_O*V6WXa+9QF zh6awv`@9hG(SL6$Dz9<$RGwpHxm5Bl= !qaf zJkQdnl`kT3GG3Q>w2W_kZPmNRtuom$$guuM?}GRcMQw#K<-}LAnS)52)2w%CS2Q*= z<_B@J$xh1fedm2#1|qj=-@t;1%8P72yhiCQN_(0~TPfRJX?>4w$hkBF^ZY@Sx~5O% zld>2%X>Xi vwYD?+)J|Bv+~@XYc6H+ zpl>3><=szD >xyM}m%e{I zd!;vpj8Tm0>vB;DH3L)dX@kCrW?@~k$l-&XqhL0=djVR{@o7EYG`_@wMWg144pPQx zvhcH9z#$#5@>iq6Dbcuz_;ObrZ8n1 nrU-71zxndOgH+#ei6W%UZKpi Jq`=w#6OtHxD`bz2CP*orKj zo#wZ}5fRYUR);phS&%E*zoOniaTZNaD}CZo^`+fo=A*IiT=?W)V(gwXkeZ`t3drG~ zC6#+0 szYHav)zftsXwm%xK^4Qsyde+ &Y7*a?YK}_DxVXU~9AiZ9g (P=Z^o-YrWO zP^WBuCS>{J&WZ=BLj18wjw~zSA?Lb$zWVS$= O zo<%3L@YE+Q;0Qus>LYP&8FknX8;vQR43fgla%-anT15Llwmyzr^jL(|%{tUyL1LZJ z8xMFs3L7QJ8BQnwq_B(ybVX&5*rd;0fIbq2LGuQCR>^IT-#9{_Ztc!udN|RinQ# zr4Z0fgmNj37sjDg?80X;=HT-3EyPhQ;|6S4QvujOr{qV|ga12xrPi$7;4G#>)f})w zK;@ZyBQUD~2JXhb0v#KW08q+JkUdRDHn0wfNFK`%z~1f@4F0lj_%uc-Kbmv`%s>{4 zE?71}s4M-dQggvGkm3;|Fnj$E24I%6a=UAZt1{EEa=Un+wFcx6bTxEZhumzM1TN!b zp94x;VbhV%j%jtUIw5175P{pdSnx)GC4EC1wsB`eT{i&SDb*}goHGw7FgCUx=eF&l zCO&pCunVh8qT%4gHbbHwoeCSwiO0pjZ-{jy#5n_}d>k4ViY5jM*8Nlab!}`Eqiuq` zdtL3^YrAa}5bTU^wSXmPH=kn^$Bh;X6VnPpz@R>4pIVv9top7pcx{k*`p aVPiz(U))578NEr-&aAM_Ho)^R^ z)6J+_Ick 8b*RhERSPxd ^K_zQ3F&4d-;_=ytKBheM`lR`=!|MU zuO%nP4M4|)I0M_A=pTvFx{2#}^>6gTMm4V*ZAOSl7%{~f zAYcB1kog0b0r*QR7s8^myBjV@o%uVn9mJ-}AFeCKNjcT#x5VE>0ER279z@zLu_j{E z49oJ5(IuDJmQH{!tq)l5GJOXq6L4Sm0Co$O{vh=LifzdM*~F7L&zh+7W-5|MDq+U% z0zfHnx{`<;B^#1%MYQuZx@kv<=32s5`H67T^e=&im_A~7E69!bw+R>Qxt5*SMnFK( zZs^k)y{L#%LHxy`nh}dmYzN4izlAIW84X}a{zQ8Ih3^4Bd{+U1_KFezh*uA!?hE{% z62wo;F!`N}{onNQ0WWU;^y8^fx?jA9;0B+qaN>@NrgDy=Nx=Wl|3A5}|1#3+|K$At EJ8pF literal 0 HcmV?d00001