summaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/stackcollapse.py
blob: 1697b5e18c9622bdc82f7f9355745febb0a28705 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# stackcollapse.py - format perf samples with one line per distinct call stack
# SPDX-License-Identifier: GPL-2.0
#
# This script's output has two space-separated fields.  The first is a semicolon
# separated stack including the program name (from the "comm" field) and the
# function names from the call stack.  The second is a count:
#
#  swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 2
#
# The file is sorted according to the first field.
#
# Input may be created and processed using:
#
#  perf record -a -g -F 99 sleep 60
#  perf script report stackcollapse > out.stacks-folded
#
# (perf script record stackcollapse works too).
#
# Written by Paolo Bonzini <pbonzini@redhat.com>
# Based on Brendan Gregg's stackcollapse-perf.pl script.

import os
import sys
from collections import defaultdict
from optparse import OptionParser, make_option

sys.path.append(os.environ['PERF_EXEC_PATH'] + \
                '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')

from perf_trace_context import *
from Core import *
from EventClass import *

# command line parsing

option_list = [
    # formatting options for the bottom entry of the stack
    make_option("--include-tid", dest="include_tid",
                 action="store_true", default=False,
                 help="include thread id in stack"),
    make_option("--include-pid", dest="include_pid",
                 action="store_true", default=False,
                 help="include process id in stack"),
    make_option("--no-comm", dest="include_comm",
                 action="store_false", default=True,
                 help="do not separate stacks according to comm"),
    make_option("--tidy-java", dest="tidy_java",
                 action="store_true", default=False,
                 help="beautify Java signatures"),
    make_option("--kernel", dest="annotate_kernel",
                 action="store_true", default=False,
                 help="annotate kernel functions with _[k]")
]

parser = OptionParser(option_list=option_list)
(opts, args) = parser.parse_args()

if len(args) != 0:
    parser.error("unexpected command line argument")
if opts.include_tid and not opts.include_comm:
    parser.error("requesting tid but not comm is invalid")
if opts.include_pid and not opts.include_comm:
    parser.error("requesting pid but not comm is invalid")

# event handlers

lines = defaultdict(lambda: 0)

def process_event(param_dict):
    def tidy_function_name(sym, dso):
        if sym is None:
            sym = '[unknown]'

        sym = sym.replace(';', ':')
        if opts.tidy_java:
            # the original stackcollapse-perf.pl script gives the
            # example of converting this:
            #    Lorg/mozilla/javascript/MemberBox;.<init>(Ljava/lang/reflect/Method;)V
            # to this:
            #    org/mozilla/javascript/MemberBox:.init
            sym = sym.replace('<', '')
            sym = sym.replace('>', '')
            if sym[0] == 'L' and sym.find('/'):
                sym = sym[1:]
            try:
                sym = sym[:sym.index('(')]
            except ValueError:
                pass

        if opts.annotate_kernel and dso == '[kernel.kallsyms]':
            return sym + '_[k]'
        else:
            return sym

    stack = list()
    if 'callchain' in param_dict:
        for entry in param_dict['callchain']:
            entry.setdefault('sym', dict())
            entry['sym'].setdefault('name', None)
            entry.setdefault('dso', None)
            stack.append(tidy_function_name(entry['sym']['name'],
                                            entry['dso']))
    else:
        param_dict.setdefault('symbol', None)
        param_dict.setdefault('dso', None)
        stack.append(tidy_function_name(param_dict['symbol'],
                                        param_dict['dso']))

    if opts.include_comm:
        comm = param_dict["comm"].replace(' ', '_')
        sep = "-"
        if opts.include_pid:
            comm = comm + sep + str(param_dict['sample']['pid'])
            sep = "/"
        if opts.include_tid:
            comm = comm + sep + str(param_dict['sample']['tid'])
        stack.append(comm)

    stack_string = ';'.join(reversed(stack))
    lines[stack_string] = lines[stack_string] + 1

def trace_end():
    list = lines.keys()
    list.sort()
    for stack in list:
        print "%s %d" % (stack, lines[stack])
*Çكz1qPO$ }$d$),R/qU6P~'^r36ZՎj llWA|~CD ~jP3O`?MsUhq8`Ά<|$ٝ. d՛H1eFN\$zh^ oK+RFR(qhj BTUBkv "թ~Zi46h>itPTUd̛kdЛmQ^}ݭ?Cd^RzH$#IB {3yR^BL #+eLPO@1)al@_H}ɾ|R*fעTIV:ZUnziW x[W.# eIEےN.ď4+gH`82}37qjU62vuIO-ܨjb`qD}ѮiO)u6 0̎_=s{FTm֨^5+~?7U*X;Ȇ}U2<_FxgGQ@Y9̸+\ o0ݍbc@nN Y4L6RO`T*@"Ky#\؜FasyKg;?(q.WzIZ8*98$^hrqJƟLA}ں@]iX) `j;qMЄb/~loUHQ3􀬑CKQl7xNe0aw+[#R"K#ل&N0,' /ua5U+r[ tiY2$GTG؅zA-jߑʎk 8E^0ޟn!V!p !;`NM{jje 虙kF%zfWAj`owH^JݮH8jU 5V]UG&-J")J+e"K W(\n4)֩o+:Xni1N:8=o3ɬ1= 0T% tcDN;Ezds%5)$I2*B@*B^]@ l^Z[ F M_UjHҧÐ A\fCrVqF/ZƆ 褾1+o=;6)3;u}{я3| ٷݳ0?" |'*{~s}h o''ôGg26z t|Iϟa!Iٻy]HU!,p\O=QiWԍVU;$eSwNSHJMrlsjfkn|v3pi,ɤRi.,} \KpTr܍adJoDw[G܏:,\ hB!\96O3R]w(P{Dd1!VܲFN`U@> Lc8ivVy^T^%jsA:924_熐y 셠_rhm2W*\Tih/Q$@DHCl_qdN)Nkf5tYūBν~f`vkR/#?u- i*Ȧ; V^;Y¥bNvUS4#943&޾3.Le߁:snUGpN0Dx[-Bo#P_ЬQMe'Oq$B%Sz23VѯMEF~m"i@CoUD7in5Z*mK,G^{Ht M|p3xA'sM sL  NVTۡq~疶zbNʶ>jlha HwEF]Y1kל9qCzOEAwZn+&֏qM['*;ѰOr5%o J;ԐY*%iBr7wFF&>tP޾6꺜YtE'6;g)3]4EOOu*IZ0?:Y`>^IQ ^Ҕ@ KeOơyjP~ 5j+WIIک#CPAT>NgL{% $ȱd܋ KڇCavؐF|۸K[) jdP gЏ]9$(F퍧$yj<|.П;!teTpXutam[d!)Yep`V/ۈجHIOcWWW|ȾFq$Hv'yy Y>1`<u vt/ZxmfO'0LفéO@%Rnu b;F V|l %BɝhE#js]IR;Կҏ( aqqZm|ӽ ;XAHD8 ]FQd瀔{pƂxY_{ FOoxOΪw(b֝ֈGQ`n^lWPGB3? NӎY_\oW-5<^ۃ/c<`eOSi"J3jP ӝ WeX;G^<Ng7N@?֤O}k5ZCrWկMZ oB?]DAjtr ^_J͎jՂ@C?4ɚEQ09o퀝Fy9brWŗ$zВ@ t7-Jq8Ow]A6jq*[/HaJ{j6ԍMSoK"ߋҍxm/ad6I.P@1]kx"Yt_^_. 'LTI92*פ  >jC#}@!B,`jӕ'qaNF >};J7;5Q㤯C9NESW߳7M?k^Ѱ7Rjެ`H r\^=Z+464? 0L{Yߒ׽@% n~ğ} j&cfH,񂔏gp298Jr*q}ۉO}׺XfkC6:7x,#>n`%RGb^qgp 0&{t!0{Jd%) ,n9[OnEL39|v W|~$ W%hy܆$.ȴ簠-}mhLzR5γ-4(+dI[S8OV'TC fz;'gm圥3hjrC=(5'"9J"?gX}L>2'u`pYÓR1efˤ.rbHQ/tQߪJyk|*޻R!]C 4">G-gwotՙ_ ^`z.q Y*1޸sǯ˛KcZ ?_"IÑ!Iߵd4SS0=سHq`W= Vta(K]9ߛ[F̒_A=E Z},f 45O $bD}?+'Y<4P÷` $L'/^[6=0 ڹр[3zNmfWZA e^a%YO!ڋr$?˂sFbYLCwm4FRsb4#]Οg<7H5_nh0_ ߡǼT.f3u*vGR</ަ<8Mvt/QVA7B+x/GjЃ "yX5ć9ovܒxpD:c{|8)ԣ٪+ $bTҺոmMki\N. 6终_O;W 5"v]x9ݜ?J }sTlh1T+Hsb.^o ܄P3e(":-gd/C~FFEJ ;bj>ܪ7sVd$L |&%!gYxjƏ4 5n~ZWv͠؋*Zdny AeKj"a;lGǴ3@VoԛX"#sK:P"¤#YoC&fhCkLC0r .SYzg}!0B~4Qj$nTj! ze]wT.zÞ zFwm>G E:bɽ~ Rk5M<e:U S ?.!fv %spΗe%iجN/`ϒv'tMk =r GVqG^srе ;ZfzPKWK}y'\%BB!DCyDŽ֡`}I:[;T-Qm G5Fz'Q_ᡞm9M-Iiab$Jّpu8,DŽ -DZnNP3# +ARחiD=?_~'xR$tVm4ӵZ)ؒPNSv@sLH3+6&U i8SB]u0͜ZKH  ~]ϞCffuo9)1,]TnT;#+p5i`PpQ.a^i-ZE&{<!MxoF[4Nǜ%Pڕz nHmFhWKtGjj0SOȫ$5 hh ("vt|5\^^` ʨ}# 0T:wLQ p46C3MTFj^Z8Rh%҉ B ?pEjnykG6X 2҉`7:nu ]jn+B4?3Zi(4@\@,mtr[kӝI uiAsͥT~`N(xy RTB0VN Lfz"bǣ 6j׿a񖌎;}qS&9>ILe > 5IiuMq;garHP&%W8l5w4p4eq9+Lm:(+A'kVQ0').wDcm@HXF | XP5&׷a~A={z+'>^h.9impE<5^}6ars[+L,Z󌗤oB(;tg%Wx<ޫq>69pΤ+pԕ FidlIZm;TW80VeT`& e"5\)a|d'z4Qidv/8[΁Cj&sH^8DVܱ l,n-Ql+)TmK]uHM.рgg3R)O0c 6ߺhߢR*uC73GF˨^&5(KfAP?z^L kej4/$,"o>ōF QAj2JIO n!!Է0g)!o Η?OpQ2xӕ4 QZV$&j; #N¶5WG[BoeѰzMPg5#?ys!3|8H,I-FwidLk|qcWl<]6Y )\P0#(V˧x$ 2)^&кn3½^jTӉ'Ua:ʒԍf4 iC_D4Y.. q(yCxa *w~oip!lJ=) >~ cfF;p1S{cӚ!:H^+P̈́cϾ,캛ͼ^e)doIMnԜ4UH{-N|Sg/_-裡Ъ75L1hB>41u T0JcIB뜃rjtZ-k\}lUx#)Af%w@[Pd}}D> 40߆@Y5TٗUPH ݐlJ{ _0DB#JB~% :M`m4n$j[LSAQ9 {j5P$^Ռ[Fl$ W:6 @?,hum=V^\};Gc } j Xjꐷ%1h#@!g!,ƧC׎EמC'jU'aNnw@L|2ˏU=fL4L1-w}pvLc"056ZkeI61s1ˢ9SPߍt[}BxK}5) wuI(dB (IcܩMW 7\~}aOӥ=/-g^K>!Cj<< Ms;M^o]PNY(C'5_%7)4< $m/mlDҶ-NUOZXt:Nd|i[".;/lpbh$M _`kkd&܎3n1x&"T7sw$P!]!6 |A54OpFc!|ބ]_mb?p!hc#`Q'*M'c=@_fpP痼O8,Q5.~2oWnuS/ Dϵ$.PQ21G,lWQhc ϶vٝS5Z _Ҋ\8 RC3NVF{sHy\x_wi-H +QfqeDʉ"TRzV/mUYg2ć)=ˢigB悳-!.U6Wy&,0 6*CUƤW[2lWEQ:MUcPpI6s{ 4='&E%׻O~9OP7sq2^&YbkGi:k z|64΀ ?uY={ncm )k݁av0USI .c^c+4 |.x 3fd\,1Y_YP#j[G)r:{+2`"5pKo Rު<EҘLZJYUlQ_DfVH]pʦ]A~Ers 얛yS" xMpd8ditSǰHU̅^#ޅ+?>d+?[Ft ?r]Rr_94wriφ̎u/ ))'orCjC\ۄS=/&34Y@:ǚlyN!#)\-7M!˛K^cߤ8҇{H™|n?Pj-f1ivT%$>oo9V y.*)vN"6c,WUoKyLxn]&;K R`~-Ms|g7&¾"̖vaںvYlJ-|WxeZJ=w6nRJGfPW7¦@v YGik6}G!Z`xAso]=\8}ޅv][[9l} 2) તXjxݭ&[^1ny<{zE?Psc/S~n &,9bHIY>CcS%w١r& 9OI؋=OS#> D "5Ł.s ]K?|jxSW*f\ru7"ˮl0~8)'-MO+pb+amfVue&l=$=]O^mWm+VDG_j seھRݣ+j2Ķa}TgkP"oyf`BBeU`)Ii։+ͫ'@:4.~3|4ؕel(fɊt);6`45욍+ީ]=eԿǫA߬S'pf}fUdLA2Y"[˿Tj#Ԕш"M2>(5fGGiO)fw> |pSlw;y+,6 P0>08A}!gj ĉEjEAL' lsˠuaI뎞( =tNT$FF2+EeO|@_;JfGwG'4t} iY^Ta616M@ br̕MI0cyrMÊ>GE #}8蘵ECI= .AtX=>o?f; AF9aUf_oz+ծ7+b'E'yomx7 UO#(-hrluעCF^|AR\V;K|0_xqM=Hivl (2a !bu*MAu#p(X!3lr%]BL^TGcRBѧf=Gс21h}vceu9ƦNL\ƴb2dMiZ\ԵK3W1nG&\:ܦ㴲|e5U _>dܻV; ^G`9#3OBm2ff^ylr<\ Kw>NM`d!Z: DA9:1wBT 'Ov45Gh(6Y /z2 j(5/҃HKAVUl5l-"ڡ7Z]t[.IpnI=z `n͂ u;;\3/$`P%\ȌKLׯ؝d'aQ]]etp]fa`hvAlF5 J$7_4U]LKè}'A~)h,GO_ky_/>`qE$LpY,Jx+y>vǭf6hFMuH ԨZ5$';^UEB.1*hUSi9=,,k#GR~n۬I5qs7+[َ .i*Iㄗ$H%]O?XV̘(yPO) 35UѠZl}^zXf=jO(^iMuV%ت |RP6Vx(x| =O+ou:ܐmKb 3(/Z-w UM] l ws}1`A] ǪU/V>KgMHo]DIqO ʛi9iW/Ҏ lSףd';s2NUϪԡa9Mb<ދS2| ).B=–;/^Pw|$ ַTIek0ƠVW^^UvIszc̸BARm|"; 3GapmMkmR$&m]|ʕ[p6Htd*/$sPF2^@"^43IKZƬ G:Y )gz& *#gJ ϥ!]eT|#EٮSEΖ]K|!t@=',Į5N=^H6}ZӰU;$31^6Rdsj+%h K:fpZ$7[0sZ`qwwizD1%WJ6n숡 `1RasY&DcБ3])ͪ.5݊|`CI;:G1DյA6wn3& γ#uR"Nz#E5?@ң(a䙹)چk,6Zz`>+u9L 9fZuou4hj4) Nbgƕa(-[oUi&+.a*tfmpSk2J/sXo(FC_L 0'Ä֚JETLb) lE=ɬvbN0z~dk9l9wйG2G4d6 f`gگvg@sSg:婗&,sSdlõjH5^voC[ pK8W\_⾝Фzԋ 'vLu$*(OZn:dUA)f§j Ř"54]\1gdsߎ`>}K!h~lݵ?%%mjuݟ zg=6prRnm-R_ѻ"433Sw^A#̒z|O]aF4**hXĉ=-,'[_O&ϟi=畳!I'Nd0NjsfV:+HN6zٌSAL$윥Ms=EH)SK-Hȥ|-^9ȑxu^ ks܂B<] Vk0iqRg60ʑ -n&+¾>q%ߥ~YJa37\ #In$IM$s gWȳƤ`Kv.J=Wtu%p!c&㬇O)=%Q|15NҠ@w0[ XemҳIasI & Mq0Fè6%,yeG{!U3zUYzo!Tߺ5{dEyQ,%8I٫7]\[*dz9=sD\Ї$0ZZڞ? ]J4G|kVY{)T1=7uu$/ۍF;? #\Xd[hFˠNc$|rAH;KMi'&8B$4A"uғ:1 !@KO >dJQ k\Kl+ d@8"gbrG9J_Dڣ=7+jkO5G9r`EqqN U*x(ӏ(@;LB:rJJ1A{n7Y4Վ"BJaE -E渮 J6og%@(4sqMa#b.S%OZ`c Vσ䬄6Y,J?ٴ$H$5CK)pv $%q/5ܞmu;.\h"%  [Vй7:{|oƳ U4ni: (ds=_ҷb轞'WH/!lpcN&|MeLBZBzIVZ,:d>-D-'h}e7,7;r6w ^GS4G=Ԟp0n'gNzyF0!'TD8Z!㈽x{; ?qX6GK-?C-mM^I=h`oZc5YsO&O4ĺRU S>iFSHQ!E}b~+H9ٰDw44/wpH)&3Yzu!*z#xxs_(? Ll-{kӋ@{ȠJK7uQo.5fmVE_W Iw id)vO9{VVQJ/*Q?L;H˜;#=[؂aK h*,C/%{ #V>AzR/Y$q}cpW8&Q_.P%bMq"xgA"o`X.HI iSIV\cKf,jEvRWףɄۮR<8At8*v߆jP Y35k\WoHKWdvkg:RKuNsf/!M7ŒN M,Epۓӛ$Șy^z9vrPHsU`;$ ɜ̕80Q1e*EDD(G;/^ @"|D|¿seu`ݸnYZKQ TӪ_&|sZڳAzz.3J(.\jhWvMCK':_Wؒwkxr6SQbؑO']5Itl $!,<$遂 ״՝)s\Ynabf-HA_qn}YI=|zMz6ph z h)ҽ) {^B7"jG)( MDM)sFkҤѨ56-)] .g6Os:yEkM)"LvKWhB4F| 1R\zUgՏN!d{k3ق!U,D!$= 5JM7b{ ,=LD~ |Ҟoի=RVTIv>#βӮ+ &V畸՘m*OO]mx!>3V8%}k'!yfہ$>l}X旄B ;?K/VRdV||\U^\o 2=t+T_sY`Donr'.t!0iך̧֥2H^ͺ'PS7'rA ӗi]Ovp$߉7 [n!sht54oxSǃ#cqAĩT*JA %ߙ/4OP0~I*Q<GN}Z^+ k-e'{99)t֎VH$CN!SPьgG Nvڭa}HK Jͦ")2l~kTzU0ЁXu6Ɋ hZT+Ij4ϻѦm}=5,OlS4l8Pv^P;/6}ū $A{o|N3$xϤ]]ݥ`0W٘;way{[ C׉{j!n?guP" C@F^ AR)XJ_\;؄Ѯ$^7 9CILϛ( I,gJ[yEපXlJ E<g N/M`F &e[GUC?_#A1Y{pHڢc2ZZacinx{~vl8kii9lLOGԪ7W: Cj㥍%oL C* {8q'HɅĈH{OvtPY'"V7j7#fA~A6BE(azVM.z4&`C`4>enSH$* b= `!1iJGFL\GѾ?N blBgy"G9Ʌ=MՏM^S 1{t\,#)6s+?,W -xp/K#4?Geh9qc]nIWu /Hl[5:&c}ɋ6vqDŽbHpwƾIu3!m%yg(!&JH.zqL#qb.+5)*wPoUҿ-YUzRZ ;E~H}6Pp"4m_h$X,^ Vuw~M@.J?[*R؉C& }kIV]%=1eIǧ9SrN_qc ,РZ'Y\dbb7g@mR#W X.窖O綔Qoh;'Xx`2c~ EB54V_ͱ\%mBg@c"kU5p:ZʨDy%49zP l̘)񔔆N ba`T$04˝p<u>Tg4`XQWAToZjPiVh+."!r%}j>ldW a|.L@`ٔI~^ďÔ㢮T;JG\8)#v|BL?KjgCιPkEl.I=$@3GوDv9l-2cwMPQ"@Q]̔,|.U JAߕhX_\pnBr5#"yܯTA;!=ZN^s[~wp:CQz0]}zr\>JKFWL^Ce&c2a~ Sy1J8 "3 8s6U]-D3k\zK6+uQ A6}[6F#td(F.Sj2fjT+ԠG#CO';i}' $0w=5(bm?biI$AZIn2E#3iqYYʪ ծNt h&8|Z$GLz" yz5f 9BGB:7>j+i7rHT+dѡ?:5TmD86hP绰f܍LZhu 2Q%/klgF%ՌNY KL3#vm5hQ{,ƗUs?ɯ6Y8[x~UĤ`yI.L"9onYx^̹/2iX8OT]JMDFpĂc!HK0\~ ض1k/1hr0ͳAP dY␩/=MρR>#-%,U;$( șPWƎx?39 r@|rk={*hBT'^Re%'~@ *(CN#%+4zWI-%?Ĥ]WX:wadMF M7za/ $Lқ7*MVJ  IvE5 iɞ+.[eܡVLBJ[0͟88M&OxGgk}$M0%7/pccu}CZl`@f Zܐ#o0?v3,T7*vyr>;5e- K<^r)ɚӹuo`BdxcAr h xԠ X&3^&{]i=.yݣFv(Ա0]D"koΞwt^jbO=CWUVZ^8d_Q&eЪӨD&6$R. Y0;꿋7vt79N%Raƽuy~shT+ vd><,v*uR.bjc|ǭ푒8D7N҆N/g|rK%*W,5l jTQVm4UnTz Ap OQ!u鳳AA~V%Ϋ5*{d",.E-)PN4nxK&Nd'虌GW#x+r=F `n23dR(HшR촆(fKɷ _Β]Iܻ4V%"ͪTD" N 6ja;irXbv.y}f ztKQ1'ƞ𗖿0ۀՌ w:+/g3QʁQ7ߋ7l5 R,,`RRݪ0׬R&7unvDJ0gsAM% ĵD@="eN Pߎ;ߛH}jVJ5=I/crFs~D<*kIKCtfL"H I ImTATLنS{~W6J@Fv,Mcc~&wÑ9Ӻr;wBKx!Zɖ Jx~n<[Wv71cBLvDAge@t{[Ǚe{(UiAbC/:I8(Ѥ"[& t0|]#d0DӔ~<4IT!<`|[~n`v2,KzI ƺ#IhTb|9e9d~ؕ xLӭI]s#&F8X IN'ꊮ$ZVuS#^ۤ6~Ԯ+QSZE'VJ+ve3[7#7 g#+ࡀQh&L޲s$B{]}0"d\$=Ӫh >;z?v|Y]͗BIm |Nw7nQSDv^5D2B9vxŬ'PTw2pXɿ`#gs}d!{ڇ;SڅZÇp qMT*}}9){C>tNqR$ ͍LU_ :v>mT@3f,q`BQ]ծpăDuny!yP9~2 ;횪C<rUUo*uZd6P$El6N*>qt\,Ieݷ8SVjb2; ۻc\srn,UC꺥cbFRjT RgVy?,lw+@'(%˄n*J8Bc^]> Ttcj%| s^j+`Z5Iyʏ9X-2f+66 'N=4 W{~y6KBmNjwR%B$c:Zm:[҅ `r*G.-# GjgvSEF\'jWLkSIW'IemnΉB~owQx`} 29X6>ǾUľAqte&K14({%z~cA1[OT?.?۝4R]}4R-횏vXXDj!\#4L#Wyj0\ee7`  H/$M&k'd{A4cx kgq[ݭ? c!=7.5-0w:_P!7/vݔIkw]Y 4!'lȺL 8L;a0pfΕ:eZ.BB;Whȝ_޿]_SxsgXI'8X*GC?4l8(fr<y1$ajgn9)m%[L9^zR_SpƷ8QęǞuX*킚-Um7SM~2]KoyH||λSͅqB_wZATNϑ`}jUtإf@ΗAu@0w"f{" ߈$:)`MūU`&uh lB>ZNnOCQVV9}{BH|=Yk:.E_WfȮ.1 SXMRdoYslj[I+\jUڤvՐGT)NdToy?٬?ArF}IE[ٓ{qŌ EI.cVt9T* HjF_1SO+bTN>DY|Ǖ~=TkFBĈi~3 g %7qi.NvɁt"!ef:lC0),} aJ wjLq:h:j:uhQÃ*q-qv aH8݃ {ѣwFǤŚz.y8Y5|w#.zÞ#RmkP|ol3Cq\3sn+OH 9㌴|V 8qwQ)0Y$!뫡vf↤uRXAhhζ~ۗo+uRad,!0gOZkA=2:9G%'Ҹ+_/ȵ$0$[iq:Y\%j6֟pMJڴ#>B[C1)LMfI]?Ew{BKyNg:3H{W'UpI ]@u@>[Zv P5y U wd;Ki+Z 5)P!ҽ1ƥl."}zץtawzSiB慑,&W5H5 Yޱ̼+Uy6+SB˧J}IUuH|PH6NmgG1 (u(1OgюZm0Ў ujUi+3X4dQ :;BY 4&s$Zi,58i~kgjmZAGFT\h1b0Sza%WVd0,^_'Q咠%L3y'}M Y9[i[AfoñR{VkԞ R+׀ovaSÿbN6DTu-s}cg8u?eX;S lhZhn$[v^|O d e\MzfGf= H?ˍx]li% nѰoZjkMUUZR']R[N?B?JM 7&^)Is+d .Qe"r>M"p[Smd)ol,`0G}af $jL9ҭ̱}Iouˬk!x;sSN7ɚױ FL[]xfN&Ƥ8L޵)pP ;S !dH L׀ӞWЉ <-Lܯ+&gf]|"&?̠sW>v jkƟ5\ЃGk2_bf$0@ܤ? XKr,'00#4^6J9i.˓n0/uw erTi2-^oY^.;zE)pJyRQsεk[%)?[2d݈"u0Xz$Wt)fQK&B3PՖL` r+C^a1/rڻ$ .\mB_'o9HRxV<=vlHtVo~Xr/>[sȶI( a[74w{ޒ߄=\-m@e^EEUz[qJER ><~GZM;E\F+3{;-q̎'faRWAv.Bp[tD5G5RR lG؃6؍z:Q+OcY ;տtz2|۽QRVՉ&tT]=gIGE7ХõO"_e صj!BԝC\@O(+ Ӳe<ʸ#U!+ރC6Cr*r%iaxdo2-6`8]&>uʰH #mUyiؒps8y]Ndۄ/8N/pq0ٝ%k\ZP- %iFd2RG;1 5Gy涫N9@C eU@Efrl=TA5Wd^w^^ޖ'z88\)pffP+.)&4,AǑ8:U=f#LSl_c핮Hf.n:$-ٿqwU,LsL Fy,UOdҒAf2~!g $^&u'̯W)f|2+8n=5AlGhvPC}C-Q; )w$t|V#;w5;4tw",InkM%cgb( !c_~@< uEDP%t^pҗi @,˖a ͘iTޓ*Z Wz2nɳy=DNfuzz+bf.s#=/ Ϯgg;~Zγ˫:}w\vy"EH .3rĄ?K;%b<$dn]6q&đdQZF.C| gj3.ID?#cs=]c##Y &kb#}N.̦YE1׊y凸KauBvQ ' A@g-6y7{D:R8aGHHHܻ3%߮F)dEsrsq\2v'R Brxyܺ%t(a%yvDPi4EέLp45 C%A2ىmwn : {x(hzstl3:x<Y-?XfC8"#`x.4=/He>,omW@v)o?^̥uWOK/뢈Q ZmK>rr{`ƙV|uzQeW_>n^:nLߛf{)B%@%(S OZ˃NDŽ1p&r+L6T*Yƨ=KZ0I4$"BYn`09\&­IVi,/^+QWh`q8vd䈞o\;3tFFGHT" ބh_I99;ol])ՀjC4<5pj ߤ/Gq%[B\Jh,3 zWWD#brޞQi7@U|(X}ɪmelV2 zڵ~LV[.!x>?Wy&?8zs]ʨBSJiijkZR Ds׵*'7,# \ogCOA&cb3/}O /\YJX: 96KӢ 8;3Wob}ci!<[jdnڤN@ZS+B A bQϝlF:׺z=tG&͇M!;7w WjGef!@9`9wb򶠪fKddF/mCrC]QVG S|,N{)dmԖLqErĞS4ss'P2﷡(fƒ4`Iy2Aj.{R$0(#awX=\9Ukh46VB[s<Q۴"9,Vv:bIs"5"R92< `o p?l7GS&[ yaq1#I'֨29;/͎[>ϧӬ4C Z'{ H3=R^trـdPM^-I%!fݷ$/y. 41d )(-:M8'9*4&9Wf*zlM@'N˒lcМ̑ I8ܝG7ßz ӳnlM3"Afg qf}Xr̘w'Ћ8A bRJX1PsDո]QYLceJO=|bb..ؔ,>/h_3P abCz211pL3ziv(z֣:vL &cЫ}̡JXfXRV)@9a =y>6ΫY2@ކ- RIzvd!JŇ(cRr)Y˶] QSwbHDg1Lm/eA(.졂h+iOۑg{lޫII VRtTg(] AӶ: %ŠW[Jgvʋ|9)A5TԹm5[d;c2F́_LJUkd Kʁ=ReOt-ev9>8Wf ^  zfdvN:vmA5V~L_8v6U{1{~>0 4ԉ'EypoJCyϐ4>iN;"t2'ukm6_?KXzwy/㝷ٯ׬zoC?--Akf_peI &iAsT}1"X J0.Ni% iG7-Hl'%O__=K< /R3&)Zu;+4 e5j2tFz(JV%+?t^\^CJ) Ǽe9{r9T[}Ebi2A`(/ZVh'>[񹳒_J!5ߟ$ )`>fHvq[6Nu _Kz?œt9D bUJCcz;=LZ8NoԵOF@9k"g{؊QƏ> a3KDE GP<[ش*96 3Ǝܚf)-5yb3z%؛3rMnN,:Rg)[dC'3~uƏOAu+ՈD=ȕX5U9Ѫ!Q^x W^T<qio~I-q."&[g16F3` ߉pO$:5?ՄQl׾^fc%QIn b'4fH(qznwKNrIUQIhW=z}Ya@mfvNJ/#`" V}ۥ=%FlXB}/ n^Vb! ś]8QR(]Z hب4 T;8scP(TƬ^W͠(<o9S 9˻Y y:U\Mʯ98}{{ًfo>)3AmbTO!nLK=ҨO65y?A`B=0DK uڏϔcEr}j4l(<Ƨ[iݲxa qL^t2(*!c [e 劐f.Tҍ/ {@+߹{) @͔8;8ӦNϏ˩^]oWzP7Ѹf ږjI7F4T+p ]mܥ'׀og8# wf?tnxA=ҏs]d`pn72,v0zIj5a[sJoN^UsV<|h"HPkٳ&yWls澆dr0y7ŖJY2Fj3q"-]%whu&wӱdi7g<MGfĂ w@WSZ"w9qfʤ: :#;#[s=,ZZA#n6%' 7犄&z0ZL7x1[.Y%'56d+t@JELhKk.W>)`*/Wz᷅zrƭnj{ÅJtBԞF<wvHvQ+(1Jt e;{6D!_"P)1u#hN[! v` BO1^:`aokךa,2Çҭ\3!sB2s3{% 9fE@DgqRhՋ̠h>A7oaovAv\ 9=/e7^vSk/c@`K'VL.k䚔5S 8:iid<ߢJ#",٬oP#u ֠G&b7ʘVUWN:T#(Ъ`TBᒃ1޽=4#Q^i,raA,b&?{~vQAuP`l.LDԸ4Sk.Et,1zhdocIkQLi繳9>..iTQylx\+I|?+N^)9Q:tA{pxB3s~.WE.` 0}2sQ >aobA }M1V A۷b\1eP8R1'I7;yT 6_3RͱrP 5j kYig_p]dSn" vҜծVNTU,T9̆i/}z<:^#ug>BeAc)l*3d[fXu6=;w;/,jOܷ6,<{ɂ]^JCGs+cx;[5~8Ͼ⊪v^R|1> #zͪy۪d&%XW [;[w18mz o3#.aÒLz's8U4$u'2YƓ '3;!!ap{g$4r bܪ5W:\dkڻk юnHmr͢Hߺv1X'`Z g[Zt]ۻIoct m"! HS:(iJSHUF…:|K 7"q̿O\Ml4ǐXqS.^9>͜Ԓ|cg%COSiɏyaM+2E߿\RD.:6l2>aNomg"s3)>~8 t#nxM IV}X`R-K!og01Y'O Ț!*, [tY;@J{j=d5KP]d"uֽH,J5rH&Tjg ՘eԐy֎M IcyPRX+JJQ00Ig5)3 >2 }"6l"dLV9_'''!XI=Vxc*)d7Hov?WPf,h>y6)V*-eOB(A@:LB/.]5Fs` 0ϻ31"'܇eDl;.%@')kjVC$ TS$ E %/x]GFoj!-\֢RkSYy Ud@cYzz}|]i!4 gkNס(5z(Eװ e[RoZ` Hgʧ=y$6wՃt`˱Tu\0,V%8t&A!$\5Ӷ~2wVuK%M&5e]hDƖ@KZ~u%b{ ,'Bow$`kr/ʥE+j w檿j|G\2&uB!~f4:z'eIa\ZJS>VwItkޥC޶@Vkt߆́q/ۮvwn/ vlhpb\Q*d ~q^PV_7neAVN A˘&9GfBq])$JߥmY!j\Q5Jj<Gkd5JĒIbzS {2h}ǫo)IL FGP;M$._*EP؛\JF.U! NR ,$L gCQ&VTPC2siҞI̻I\eXɞ9(w~/3s$RdUPǑS:r1RVp`~O?ȿKKH-}ڣ٬?VV)_8vٯQ>}yC?)k#u'_웏>Uk2W h #nFq(~t<&9<(7s]li<^g:.n. %s,sӘf_o3M$mܔl5ƻ0GEvhi:V:sw'_ QB=88<#Նbĸ?sg8_5uz _{%6{9~YKzWg;#I`g.p?D_;]ADž~:V;I4cgŸW?S={O66N OfvuJpcS07G$Fۆ<3*Rb|c([nҷ8OL::jIojGc1O=Ϲ5ž[˾:i_b3oCd3#qPF5<))U^X9@|/m4I[/PKfM|'t&z+f52 &BΔ9՛ €tw{v`nIfzRVC?jPHZ߱UCt\S *TFI+ ynmqVF~db`KWp+.S.JP e֦/hRTR%1NR` ;@NJ+;@!O-7M1K Ll c[̋J 8^ʡNfoWZqr o85xƱy^ESOqs]k{Ppe|H46g'_ȶh+Ue*$+2d5CƜ*e͡.;q \=1;\'Ĩe*1.VYDte)5FsI%ID4 FDG"P uxnP  XRȓSTaU1vn6i;խ,I qsd(ida#t$̀4-!("<5^ 71ghdx{Q!y0ami0؞UIYB:zmrDwGUƍlI!F|:UbcF]YBQďIYO=I*p_9x; hfj\o_y?<>VH*/}qc.$v/$!řzm|Wr+R$f% \dV F\g.?oJL8XWdmS\F\Ac̋#Y "Z>(9Yy  a1%?7 g>@t # t8m2D?k7LVP`.y=j#F[ O-ɂ(]&v/!@*Ҝ*$0g"gq!nB`G‚{w_̄IνԓIţA"h)X+[9afc]oJ]j%BP;L5)TP[D }ngFR$ VD0F؃X۔J{d4Wid4KcޡΜo ;x;6KBV"KTԫŋodb':9e)Q\bh/s ~Uo[s}gAٿ!?H5~J]3]Bݲ^Tt紽c?J12ΰ Xj^ʶ'"%6{2]~7P NW$~L-:"]2/Q($x]x$tNjbSW }> |h AbMzR " 4S;ulF Fܝ!;<8tOf˯ࠏR} uH@سhdF^RV|˔%u4{Nr A2ɤ4Ӂt]#]}̈$ 'B~%՗‒%RRr3/9V)iGkI°ht% CqSER0ZgZ6*RD 6 e@ʒHe w=; h7:N. ~cI)S$U 5sBM݉"mgʇѓ&P^3 x~i?Ml.:Ug ^T,4di2>$5,Kv+-$kG %;FU~fB(2ͦ~e^5ҧ:'3 Ċuv ulcd`/q_om}7=kVפ055IqMN j}&B˪ qɂ[6jT*Z'X;'ݏPaV? +aD\Tco<љ==z^ͭ+JNW$:nn)_aGP*JTn@cV~=~4Ž韱3 bpR}d?B a= @4*kz w0cKw8YkKBArx&Ľl|:'`FIq'F/Cڐ+3[V!!LʼsKzqIqwLҹM ?K3pk?SRVgz+V5439Np]u*e&OE6轪*..%eɴ$ ,l j6i(b7&hA}6?{ MHKVޕC`4D|i9=iJ>9|ޫ}o'n:(b#a)42TlHCkJVv* R zVXHBlunL̦ :P0IIV/ecz1,h^d G\hęf(Brf*01y)7%KR./ii߭b?̘Yf Y\zf&C2b}5`7OV~JnbL?)gge# ȿu5L$q0TDK8B٧qS=2?c,6ϝjdj%s0zsdl3L&j^ ,ɞEK&NjԍݍdYL"Ur_{bx32f^\AbH f0CJ1& t?ZMyGq>?/5VVpϏ?gJյF%5;Q+ɰK 0k s+?hq׾>=Jcx~]"ߔt",y%;O28LNèx#mC/W4A;D)]R|% U|nKc>VY/[Y6־[0NYk"рD IK>9!E%!0+Ӆz8;,2I"[لw{׃2B@a0Ȅ~JÛS8db?skusy8&FQ1ƒU*piA몼 i! |x <>V ?x::)§(b11~coTb޺sN0Ů|* t0Uk'aZ=/a_g<ҫʣ}֗_$=%| Ao#D_f!/T~Or"gD Ew\ӷǃߚ<|Omd>ɉfQL7=5\|6D*BK! @>98j_G"4\~+AeP~$AB\`:ޅ?[Xn0@>,/cccgb3NyrB2ê )-5u'{ܙڞLpי;_ F6@ 1<~$@ :se`ű_A(IBD?} oSuw \{=e\MO_fb F嘆+^+ǫnpݍ9STn#I_[IYTH9U>m!>_S702Ovj^+Y_h\g8O,q< =ßd~:H-Nw0`ӏ Rmr?Y7JQ^ir/(zh.N@:'~jj}v :կdhds=F8D9[0ԗKBкؗ'YgK\Oltsglb"k{ ڷOZc_;al鹎M#2mW$q(dFTgǵIcy<uVx2aVi}ɵ5'fˁ 3ϖ/Hٟ0"? u:ů!k*L{sȩ_5uIGvYwڟ[=1@~?kE/|xs/୙)2b@㫓R&)gw׳VDddJ AewۅsĊ5>x7/2!DrZ x>vb1?Gs޺csxZ]imh!< qʎKJY~O&ܰU; tc_[Gج]kWa8:nWg=F~N5mw/.j׮qZ7OmyiM\.E@:>t68N8ⷨTmr:~cJ|N$Sl8PU^8rI2jK/t~i(`Q}]PGQ: vc붟ƔZ?%>^ֱEx3D~E͹Vmr'G.=?]öJB5JG~^-\?j  >NvJzaJ-@l:QSplx=z`odTMrKvp91pEf%ĞT CMZaK@ F}\'1WP!Z#9QSKfIf '=I$D4c$9+n}/I+8sDTԲT &]t1|LŰw5?督}:P)ϘQ_kd?Pb4u.f+&t:5D p*26BK 0 4H|dWӝՉmL9_oϫGI՝/jN2h+o9W ZHzH1}lB0WNNSmXaxM&9*8<;/[srx[q|M a*p !e$Bh3K$GmO|3TR[9ضqtnGi Dr"VQ μ/1`X0c.(HFwTպA5#Ҹ5,y!6q]ɠ#Ŷ;^?OviڽĜZkeuXv7vL\6%ЃIt! ow=/OG|YH J $a3 9L~ƌQی)xHEoq MG~jG$)#`*ţI!&DdfM씪1uᓝTO9|\7oIk+.wiKoq҅uCFuneS ә/.~53sa*;'['e_0/ʭ堔r DdA5G"ksiqTק@8җ^%2a8 b1uZg`xa'Ho{~<26&>Uxjww3kLϙճmω nw@):p:R3zuĠ8797(|ߑƸ8<?"DC-E1VYI8B"Dt4zm RM54>:(0w';0ē5qG@z% i_ Rl2JGB݋$m_?b݀^O.\`q'E,^,^ufͳ8sMW-:6a+UAhJ Bfy^cY[Wi$mTqlgݘXӮ ^y>_MSs~7 /y/RM1%>r- wN/:g?f7;D]>@mJ4}[b7DܰA b_rfD>> QOaiXdcbP8͌Z{(P) DIX.8;{0}, (/qb]/`92,`XcH /NLL<ΊdḴmQ78wG1."V')yv9urt`^7Sq@йϽ,fe*;;AvK,t̐PVaŝV!Kxaӌ60\=>R$z]/~a1Cm0gvc3yաꯃ^vl4XL^]֊CC?LMm{ #:b@?%VcTGO7KSnil5[F+a>dE1eWA͡ bY>)͎-_Q^lC:eW\K.O`0Pyš 0]Ypb,"EaO5ZOzH1{ȏe6F|Pz26#l