From a2b106285608a79cf76d1f6febba46b139808dff Mon Sep 17 00:00:00 2001 From: Cleboost Date: Wed, 29 Jul 2026 14:48:14 +0200 Subject: [PATCH] feat(ssh-launcher): add /ssh launcher for SSH config hosts (#138) * feat(ssh-launcher): add /ssh launcher for SSH config hosts Provide a launcher provider that reads ~/.ssh/config, lists host aliases with fuzzy search, and opens an SSH session in the terminal on activate. * docs(ssh-launcher): update store thumbnail Replace the plugin card image with the final SSH Launcher artwork, blur server IP addresses, and fix the displayed category tags. * fix(ssh-launcher): parse SSH config directives case-insensitively Match Host, Hostname, and User keywords regardless of casing so lowercase blocks are included, consistent with OpenSSH behavior. --- ssh-launcher/README.md | 40 ++++++ ssh-launcher/launcher.luau | 201 ++++++++++++++++++++++++++++++ ssh-launcher/plugin.toml | 49 ++++++++ ssh-launcher/thumbnail.webp | Bin 0 -> 51036 bytes ssh-launcher/translations/en.json | 29 +++++ ssh-launcher/translations/fr.json | 29 +++++ 6 files changed, 348 insertions(+) create mode 100644 ssh-launcher/README.md create mode 100644 ssh-launcher/launcher.luau create mode 100644 ssh-launcher/plugin.toml create mode 100644 ssh-launcher/thumbnail.webp create mode 100644 ssh-launcher/translations/en.json create mode 100644 ssh-launcher/translations/fr.json diff --git a/ssh-launcher/README.md b/ssh-launcher/README.md new file mode 100644 index 0000000..2483091 --- /dev/null +++ b/ssh-launcher/README.md @@ -0,0 +1,40 @@ +# SSH Launcher + +![SSH Launcher thumbnail](thumbnail.webp) + +SSH Launcher lists hosts from your OpenSSH config and opens an SSH session in a +terminal from the Noctalia launcher. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `cleboost/ssh-launcher` | +| Entry | Launcher provider: `launcher` | +| Launcher Prefix | `/ssh` | + +## Requirements + +Install [OpenSSH](https://www.openssh.com/) and ensure `ssh` is available on +`PATH`. + +## Usage + +Open the Noctalia launcher and type `/ssh` to list hosts from your SSH config. +Continue typing to filter by host alias, hostname, or user, then select one to +open a terminal running `ssh `. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `config_path` | `file` | `~/.ssh/config` | Path to your SSH config file. | +| `max_results` | `int` | `30` | Maximum number of hosts shown. | +| `extra_args` | `string` | `""` | Extra arguments appended to every `ssh` command. | +| `terminal` | `string` | `""` | Custom terminal command. Empty uses Noctalia's terminal discovery. | + +## Notes + +Hosts are read from simple `Host` entries in your SSH config. Wildcard patterns +such as `Host *` or `Host *.example.com` are ignored. `Include` directives are +not expanded in this version. The host list is cached for the launcher session. diff --git a/ssh-launcher/launcher.luau b/ssh-launcher/launcher.luau new file mode 100644 index 0000000..96350cb --- /dev/null +++ b/ssh-launcher/launcher.luau @@ -0,0 +1,201 @@ +--!nonstrict + +local cachedHosts = nil + +local function trim(s) + return noctalia.string.trim(s or "") +end + +local function shellQuote(s) + return "'" .. s:gsub("'", "'\\''") .. "'" +end + +local function getConfigPath() + local configured = noctalia.getConfig("config_path") + if type(configured) == "string" and configured ~= "" then + return noctalia.expandPath(configured) + end + return noctalia.expandPath("~/.ssh/config") +end + +local function getMaxResults() + local n = noctalia.getConfig("max_results") + return (type(n) == "number" and n > 0) and math.floor(n) or 30 +end + +local function statusRow(title, subtitle, glyph) + return { id = "", title = title, subtitle = subtitle, glyph = glyph } +end + +local function isValidHostAlias(alias) + return alias ~= "*" and not alias:match("[*?]") +end + +local function hostSubtitle(host) + if host.user and host.hostname then + return host.user .. "@" .. host.hostname + end + return host.hostname or host.user or "" +end + +local function parseSshConfig(content) + local entries = {} + local current = nil + + local function flushBlock() + if not current or #current.aliases == 0 then + return + end + local subtitle = hostSubtitle(current) + for _, alias in current.aliases do + table.insert(entries, { alias = alias, subtitle = subtitle }) + end + end + + for line in content:gmatch("[^\r\n]+") do + local trimmed = trim(line) + if trimmed ~= "" and not trimmed:match("^#") then + local key, value = trimmed:match("^(%S+)%s+(.+)$") + if key and value then + key = key:lower() + if key == "host" then + flushBlock() + current = { aliases = {}, hostname = nil, user = nil } + for alias in value:gmatch("%S+") do + if isValidHostAlias(alias) then + table.insert(current.aliases, alias) + end + end + elseif current then + if key == "hostname" then + current.hostname = trim(value) + elseif key == "user" then + current.user = trim(value) + end + end + end + end + end + + flushBlock() + return entries +end + +local function loadHosts() + local content = noctalia.readFile(getConfigPath()) + if type(content) ~= "string" or content == "" then + return nil + end + return parseSshConfig(content) +end + +local function launchTerminal(cmd) + local term = trim(noctalia.getConfig("terminal") or "") + if term == "" then + return noctalia.runInTerminal(cmd) + end + + local first = term:match("^%S+") or term + local bin = first:match("([^/]+)$") or first + local separator = (bin == "gnome-terminal" or bin == "kgx" or bin == "ptyxis") and "--" or "-e" + return noctalia.runAsync(term .. " " .. separator .. " sh -lc " .. shellQuote(cmd)) +end + +local function fuzzyScoreForHost(filter, host) + for _, text in { host.alias, host.subtitle } do + if text ~= "" then + local score = noctalia.fuzzyScore(filter, text) + if score then + return score + end + end + end +end + +local function makeRows(hosts, filter) + local rows = {} + local limit = getMaxResults() + + for _, host in hosts do + local score = filter == "" and nil or fuzzyScoreForHost(filter, host) + if filter == "" or score ~= nil then + table.insert(rows, { + id = host.alias, + title = host.alias, + subtitle = host.subtitle ~= "" and host.subtitle or nil, + glyph = "terminal", + score = score, + }) + end + end + + if filter == "" then + table.sort(rows, function(a, b) + return a.title:lower() < b.title:lower() + end) + while #rows > limit do + table.remove(rows) + end + end + + return rows +end + +local function showResults(query, hosts, filter) + local rows = makeRows(hosts, filter) + if #rows == 0 then + launcher.setResults(query, { + statusRow( + noctalia.tr("no-hosts-found"), + filter ~= "" and noctalia.tr("filter-empty", { filter = filter }) or noctalia.tr("config-empty"), + "terminal" + ), + }) + else + launcher.setResults(query, rows) + end +end + +function onQuery(query) + local filter = trim(query) + + if not noctalia.commandExists("ssh") then + launcher.setResults(query, { + statusRow(noctalia.tr("err-no-ssh"), noctalia.tr("err-no-ssh-subtitle"), "triangle-alert"), + }) + return + end + + if cachedHosts then + showResults(query, cachedHosts, filter) + return + end + + launcher.setResults(query, { + statusRow(noctalia.tr("loading"), noctalia.tr("loading-subtitle"), "loader"), + }) + + local hosts = loadHosts() + if not hosts then + launcher.setResults(query, { + statusRow(noctalia.tr("config-missing"), getConfigPath(), "file-x"), + }) + return + end + + cachedHosts = hosts + showResults(query, hosts, filter) +end + +function onActivate(id) + if id == "" then + return + end + + local extra = trim(noctalia.getConfig("extra_args") or "") + local cmd = "ssh " .. shellQuote(id) .. (extra ~= "" and (" " .. extra) or "") + + if not launchTerminal(cmd) then + noctalia.notifyError("SSH Launcher", noctalia.tr("err-terminal")) + end +end diff --git a/ssh-launcher/plugin.toml b/ssh-launcher/plugin.toml new file mode 100644 index 0000000..75849f4 --- /dev/null +++ b/ssh-launcher/plugin.toml @@ -0,0 +1,49 @@ +id = "cleboost/ssh-launcher" +name = "SSH Launcher" +version = "1.0.0" +plugin_api = 3 +author = "Cleboost" +license = "MIT" +icon = "terminal" +description = "Connect to SSH hosts from ~/.ssh/config via /ssh." +tags = ["launcher", "network", "utility", "development"] +dependencies = ["ssh"] + +[[launcher_provider]] +id = "launcher" +entry = "launcher.luau" +prefix = "ssh" +glyph = "terminal" +include_in_global_search = false +debounce_ms = 0 + +[[setting]] +key = "config_path" +type = "file" +label_key = "settings.config_path.label" +description_key = "settings.config_path.description" +default = "~/.ssh/config" + +[[setting]] +key = "max_results" +type = "int" +label_key = "settings.max_results.label" +description_key = "settings.max_results.description" +default = 30 +min = 1 +max = 100 + +[[setting]] +key = "extra_args" +type = "string" +label_key = "settings.extra_args.label" +description_key = "settings.extra_args.description" +default = "" + +[[setting]] +key = "terminal" +type = "string" +label_key = "settings.terminal.label" +description_key = "settings.terminal.description" +default = "" +advanced = true diff --git a/ssh-launcher/thumbnail.webp b/ssh-launcher/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..93b982d30e54ad521f27cb2f5940e2e7ad43aeac GIT binary patch literal 51036 zcmWIYbaM+i&cG1v>J$(bU=hK^z`&ruz`(GdnL(O~!PD6}-~=NB0|Nu&2@uI*z`&53 zS5g$@?xYYA8KuDffPs+#EYHA@m|R={QiB6CGBA9*22p!i7l#^r!kj6o#mNi|3?CR6 z7*vWPBBK}>7)2Nu7(~(`Yz+`Q3BtAkvCB&eN*EXz13>JekRWFU2F4Ty1_q6EBz6)K zJGr0;q`rrNfx#v>rxaut$UPw6@ucR31~V`)a4;}1$S@Q$1TnZXIDz~RQoz8Fzleds z;wu9K^8|!g(o6=1?X3(961NayDhn7G_*)nlww*_aA;P2}u_zI29t#5l15;WW1H-4~ z3=F)H3=F~-7#O&s!Ey`?3^?2diZmGpcZPh1e1>#}9EMZ|1qM%sJceWjJq85^BL)Ko zLk6?301Jh*qYMlaJelS)Y8_yfVY1_7YIJC{V_*=NR(8j0@uc)@QTvt8`S!^?`|$te zme})C4lZSyHf^ckpNC$~Q|ugnNR)BM-sL&R`qc8v##5iUU$6Tk|9!vK9)+j%J@xUQ zZvT=0oB#d3itkEBh1s7yf(yPx@>7@9)3Pf4JB3Z{jcg@BUZkzqNn6|5Tl5 zW%9G*@AiHF%k@w5oAj&wkN!v2Z~edjzxxm4KlLB)_uap>|5p9Z@8+NUpVr^1FaNvb z-^owhKiWU)zp%e;A6dV({>*>x?{mNXfBirD&(*c^f9*f~J1Dp5PxbHeZ~wo@-?!gh z|Kh*>kLVBkum4xG{r#W&m;R6VTfA#;Y|AK!X|H}WjzSjQRKHvI`|MkC} zKQR9({(1j<{QLTs`!D}*`2X|YyJ*sk*Ss(4WNyXI zy2IjX87+BGJnsAFzhbVkCwK(?Q(PxrSGr<$B=LZHyr!4dmESYt^tYDTPMQ6tmpLRL zj_32|jheAbHfDPM^|IT3zG0tWF++X2%I0ea#Mxzyj$P4zVbD46?8O&%Zm<2`A#V6; zYlfW7^80I|Bk~Hna(1vy`{_6Dweze+61U@WHrvc!?ZWi#ZdXy>)SxZ4r#WZoo;5pK zuxRatn&Sbc_J!=(Kd!jf#hmi3ED>S<^<;Npdw+gg zELAsSedzYH#B&c6KI?b(SWV-*y0iTI zx94`#4E&Ofl%A&la?g#}eo4$_gUjh&t~}RwoY6%&FFR)VpZULJSNz&dUCIvs)Dt!u z^;cINyP-1cjZ%!^QLhud_cMQ*wh8IQF+RS>9J#XL@>!0uq$CTbcfZ%Wa`L=f_hH_3 zy+=vW8up5-zW&g@{&p_Y!*>7at(DU~YQ$PrOkhN z$d%9jf9cG<$MqXUe?&Yp&iwAfSt-85O0;~5?b%%m_8G}IAKBoyqxpH*>jioWxlN0v zNNJYu@UPjwUvBBbqrF*0Kh#uH_?k6-s>Q6h>%@4N@n z@ocj9Osk43Lu))EPJ}2P*y6TEtz_ck_rCIap38Umd%oA@+NS=0fp>g=>hq#UYyL3_ z>{gaK#FWNw%W>}Hoc&7Cc16FRRo3TrC$yd9GTwRm)@d%GGzT^BUkc74)!j?EzVES_ zQ{fwaBC$8|Y}e-&k?mK@p7%69i2v@LZrCj5H$`~eJ+n1k1*=!BGj@0uBH+&-fAXHv z@BT+&no=F>3*W{)zP0!GmV-_!1q$tt_qE*jTDkDQ-W#_)CCZ&AoZ9tk-2#kwkI#8= z$3oxX$@a1Zv*HAE{mNTUeV=Xbt-eU7SSaF|%EmLE$ulNh?pwqEVbKiR`mO(K8E?8@ zd6%#yY@UY2{9j96c^F!WbeQqKIBDIsB5wV@pS+qI=M@KVZjRO~w?5JDnm2zkzj^Ya zz$fO>Qx{ZS`RdAQc`2Rq#^h_uA4ETlpR=IPa-vtuv1c}62ic0NZNBvj*3NKz@~k4c z!?>7Pk89!HIV(Oz<^AdZ=(fJx=49|3tBc1@XSOOlW;w1WBR~&brCPWL&~p)lV625{|()}_~p`h zy$6;~ewtKhv9xSO2H(b`>gkO|ijDdIIyyCEzSvCIu`%$(f8oVNXI7Xp1!(P$Rn&Vm zW5?e)fxj&le=Bryw=~ZRo|vUj6JfUELfOUTiXY{+{rZ=#UT0PH?ww|d z(*y0lJ51!yZ*U1Kbbs@x|Heb+7){}~hu*VG7G=6_dRh8EbXla|%O;hwb*6jetWOy* zEi7>~7r7rE+V$$%tNP~r!;_iS??3%{og=D&e}3guu>&hBQ))`S?(X_EwSJy-;`US? zu03xKwS2f0$$I4PQ!$<+Dl1-`*SjRq^MvQaE%Q}HxmnwG*!lS#N;drGl(AqD>*v6& zE^P-_m+BsV9rb>0W+LOh9TL zY*Kj6zVSlOq@%aH*M%MWw@K^pg*?9s`RR3Tr>c|M;|=oNK9pYkqoJ!cJMH3`A19SW z?dHh6*Wmk5ooC4V_5UxvN3sHc)DGSLYd!DUyqddan__>||EZL!T-cC%%F#KV<=Gd_a`y?_Nw!ezCo+uP@2$3-RQ+ReVohrZL?2z##ZdoSBYJZkVo9cF*^nD+9 zl6Re*qW7wVRjVUjH(urKeKaY?GQ1^?>C4drzzUzDY1d~T zJv4iAd3M-k-Q`yQSJqwI^TLArsOkh&?`wr=|NcKddZyvm!quk)q>hxzSd<_9n3{Y2 z^0_@7{1qCr-{0GnuJ~T}#C9*+6Wp`gPKMsfVOip}%Om#YEBi}MK1*39bBkw0p1q+Z zzK^qbUdF|9$4isiWuLs?zI>`g*LS(A?`-Ei+`Gp?C$r$LaL1XPkj;+IzUpoEGi`{^ zoL^R;%jC3u7l%gIz09C}XK$@@Xby{iY_~RSFVm(nW?h4|jd!jKX*O}b{x2~xP2Fc_ zR_`uz6-kE-ll(tVV)ut64DTc0bFtDyX=Q0cRM{=4Uo z%`!|G&MIzVYL$7;tQWfOhK2Itd54T^=TD74-?{(VH>o( z?hWrh9h3cUW8Ab}#)HBAb>)3`*W2Pd!+l@A;@8U;k5;%8)Aw4m((XfX?OXXLTcW}F zbVd0kJ4TV!IV*N*Jie)5`Si_R#l_p|i^bw}el6QBFzrp(VU2BfIy#n~VV-5}T&h-^ z|7xaYFcjy;GN&Z!>!_uS!JnteZ#W zH+R{mi`1Rd_&X=?m*JG?y1C5f*#*z;xw!Fa@tdoW6Jx{DA6gw2Dipk>TzjN_-5>8Y zFL+-RS}*>6jpc2E^oFyBr!P#Dzw>>wk@c;UhZCk)b?skqJ}viff|{+FpV!KiHzqM! z`%j+D>vK<;)pvfAaK^&CzlXbumFI-*j=SeOOIuDZ^{8mPXtK_Q6(^?aKNC6Vz;kWK z4~e4PJ08Y9;JMQf^AJ*N9NauDk@I}swlfF1Sc0>c_JwJSuZelJW=p|Q1EV6{&`zVk zofm@Vx9?kb=kwmbyc=Fi9pK^OyC1>o7Px-R({$@TmD#U!_FVcIXYuR)ymdF$S^37; z{*Zoq{*HD}rqg?O|AJq?%I$h3g_qj$o|qrFy7C>1%r1MkvXj3Am-7_HEqNqz&`R9J z&Q|!Q?SbkJd!FObcKo2A>tJR&sMXeOpgq5C&4US#^=C5wlZ`j}X4+#C^4>7B>gevg zrx)d)9uxcH_3LoSBB32?XU8aJSO$vC|Gh9z@`U37UuDiI(J||LRAvZ-J-A?h>g#ha=|Cv3> zFr4aHw_zr}&_Hy?rt7Vrk&b+U)wDsu+^ZcvdbQWrL zbQ-U3%XWU)liA*FZ`uTECTy*Y5tR`C^0M>E$#X`=aSgIQlkfIF{_|ktLaA+EMDAIx0ih*csbHX&{l3dZpsc&XQ zhLjZ4mOMNi=TUM*-{G~;xKp&jlRNBRRkg=dcd=V+mQ&7!bszEgW$?>9Hmdr#!36zn zoR5Bn=)FnU5y-rA#{5M4^ta1?X7lB9|C|`Q{ODx99}%nKC6_rkEq&_9#9^>(?T=Hx z^7g+tcFpzoV>Oqk32V=@>j&Mx5>c64EuP5}cP>2lKL5-V8_9ESw;Z|;2hKA&5qo>N z@y`}xqct*d3^&dHikw~jZi3Odu$?De`Z6{Kbbk1{(&MtSPF~==bCRA9zH~iQd$VBK zY}ehjFV6tmB#_iQ5<0cf8XiG*xz#8p}FA4YL_YPl2zOpOTyZD&IPn- zuUXX6o&4meest)S39=@yj?Mlhn^XOBO4jDx-oZc0-PHI>Iquf}>X;NBwe0bR%pJQe z419l|ivAQ_oRIkWO4^}${x9w_c5n56k@l)Ur8r=g-1971&tvL)mlf=+=wE5~Z0FPC z2JhXqr5XE;)Y)b-^F{sHb#}JO#tZS2w;tzi4~b!8)7$<@>$tnO-=@|su8_YOo6h8y z7Zv1xo&Ul2dU0_f-zr`8!yE74l$lt(=E$a~4hQac9ues`&g*IP9<%CmYJbA?k*QF9 z+eM@2f0u`A6{+OeD&4E&jCs6}?V3ksm)G5_#*`&>x4GS%F0T==(Fo?(oOS=kb*@Es z4_0KH{^yYCTR;0`q$fk(oK-v@-psq0Bfe0f`p5K)9K{)byWDf`C@0+0KD73O&fl** zOEc?kiVJ)WDip61(+?MHJ1SXw-!nPJnyG# zAAfateA|2=n>p3@g9YQPt!sWPD>e(iS;4?`z;shY-&!-H)GZZ;Vz+Oui2V6QY}%2i z^?mPdKk!mKQ~r{H;otx7Tgq$>PWZy~&A71Em@(GPKfmk#+NjcGALCn_`W zbv!D{|;%hz8cG3>NwUL#CL01$Pu|0?h95`XM3Fc^o#NG#jN5b4Ob1X1*CRP2z|4P zF)Gwyp5hDNnwgSCpWD`#dWrFAAJ==|;{Lj1Yl-)jq%Y@gX)IBi&Sz(`+|ew4U6?># zqB!^7l`7_QjB}JP35WUZKk((7?(`K4Megh~lHVe}>-4QtGm8TER<`r_1+V#$Be1RW z?CCpN?To)N=W0*>k>kjsXnk@KXPlJrktxp=?X|gPtg{Q)6uRv6eXgL{lD3)>FIf}{ zRxLDF*!=hZghR_S{bt>~(Q{lsotgWFz{5x8mPbS6<+MbK~aHowMQ zUJ;xvhJJ<;`>thvo~da1U1#IW1d*Pkw#%Z|I*cCQ)wwspK4j{~P&HL|!NB#|>T(_T zG~a)*E}6rlxaiQSceDS_uDo+wOx~4q=U&0$$&cC<45ppbWiaBpv7mWg!SfkTw)H(f zJl0*zzO+v7Q&##)E9XqM*)~D_m2r2hJXb&6eD{6%I=O6jkNz_`SC_N&h}5LJAG}t7 zG2H5zlH^o($%+RrI*Rqh`6Z(Ty)x&iJ^Oi0E_gzdNsE*1;^`M2Z{@Iib@y;+Ldt82 zB!%2RUM(53Z>`V2oBa3MYT0)pPWnbp_nh2PTIFZ_WId$uhHLGl=#@YI`ntQ~=VeKk6w9OT7w_&V65Xa~U6>~v>SHtKt&+XagGa|dpV3>_ z!ez`6s^50KjrrN8la>?0O5zKnTDQ+V+F8$Brk~=nV#4>XnrIi@IiK_L9xQovvu)YQ zgbT-$7JP{_P(Gi1v-;hVgh-C_Fg9OCG*MFa zPg(zu&sXEr+aiKlj?eCyG+!t6$hLE#YvY~s<=+IyOlM}TTGOu`A2oIDJoBHDmcTMgu6MvE_Ut&JL@=nl)3AqPseq39)JZ97KTOAqtSK6}s zF8irw@|Vndx3YNiq;=A)?TbW ztv471U6)_# z-yvezam4ryKYOQ+k5q}FZq~`#S?%`yf9Ct%yQZf;c}LoWrP?OH10#2aI+O|)tm$8O z{Qa7y3|pb1^w9pQeU8mhDVvh!8{X~;y}_t(^T53&MfnljxdPk?`_^}uPII>IvX9MV z`B?34HH+`=4ukcI%dGjHv_G1lepqAI#J3Y`Igl03H8#pP>JNu?y0@2zxm@z_M}9Y15uYu-(GKIx|}8dZiy}PB&VzM3ioBM zUeG3ZF3u|~>Xg=BwTH#!=I;-w-Mh8k`dT4JE6=jVuM4u~1vdWJc-IBe-Frkgbz0-C5=A@vm04RaGQ@xWbm!H?^qht>w{|q~pPH;TJ^A{ps2=kd<;f`) zs`(cBH4aP5Pwie7lDgkK=>4L7E14$qp3&nM-TU-IerwLJeD)8wSlbpk?MhY1{+_&W zr%G|uYG&u7HU+H*FGyATU+}tV$R1(qlD+relAXQZ17>f$7pd8wur}0rLl(E9hun4N z@0a9le_WS7|E#h5#Hzrr|HRw0<|&}uBuu-_%2 zaxVwNkrmjY^^a+n7C-4n4~Eb3U^v%-VSH!dDNmH360RJ7eDU9bURbEasuM#Ouwk z8dh7k&06*P=DTwR!dwzx=SxbwJ$9t*)TBzwl7De}4Fw@Po7+wc?8;lRgDpScl`CWG zs*TH-`2T+HsNjEkZefMs8duo~#}z7H_=)k|Vl^vH-8bjVCxhlYx7gVn?Tlotw0Cd$ zRxhDG??g59Yk6zY!88UJ8)Yxxx^{lk9{whUiwt{0cHb4tiawL- z@I#{co{`Yi`md^U#H`CYV&cxEGPv5a-TZQ6Ge@mH6p>`C-l zto$pO^H%=za#fxD+0Q~OFRWQGHC-CPS+*suK%(#pc1%YHBO`1emN@*h$Q zz8Syx(8v7Jdgs^s=OW8)CoepcSNGzx>oM_6+mFSqO)V_pzx>YKmHE~FLRP;kY0kEV zFWgQYciqb?aeU?UmT2c$>&|jud8!+3s=9* zmL-~9Ctn>k+7Wi+3Bz%QJKYb~M^4fymbP)(o~j(T)%ll<#scYQoyUwAl$un#2zC1P0)9vv^|I>+o#Qmhb z|NW2K_e*2xKi2-42uJ0SS&Y2;KJw?kFKc~v>RQ;syH9tl zP+#0$*D$kOx4q5C=5X5j$1cW))alsnc>O|%(!+pz*%>`bRlJtZ{}cwv|BVh( z&pB7%)n2pYPVGrX(db3Ln7I1ywl?jRzEPUvXw=;_rxf9-wlyM@OzQq6yNM9$1kj&F77$|O<(_Zo;xucEjVIAM4ErUjWS``oKqLP@!8j@Ny_#s z)fW7W7u@k&zV%x5oqp~`?#^xxN|jqBqDnoavv2&9I$e8)Ywqi>b?dKu{1*6FU8d{j zn#@x>m$>-u+|%*)XqiwnR{+cAFQvkPUuyIgFJyiGsmC>GYJ#TdEzVmq@*(A!b#r#C z2oq1M5V{buFh5`RcXHnG=$Qs*{>~TieS9HEV4`tZ3d{TBIUc|1w=KKJ^;A#X!SdO~bej(r7KML`UhsL& zmtwxa_QpW%$tHz+kLO!OSbkFM*Ryu(Kf!f!%hl@i%e%H1>Mh=!=fC{*gp2DBb%Z5l z1o0pE@Q7ihmD7rj(;)P9yUcg!Y_N?1cPf&RlXkF;d}T0ykFM!H{Ca}p3<_a zO_ z+oQxv|I{Y^Z>-NGa^`2IpcmW2HRh z%<y=C8o6oW4>*aedeDYozSJ>v- zSL&?Uf8gJ2#tWg!dI=jh`MiF6d+9~@`!9Qs9)H>KwbhKt=)`ZWx%<}Kvf3Yc@6?ms z-8{DcC)d2VYj?~Hv^ViCv2$yB)bdtrwC=7y_kSC^C~KQ1_%rzWtY z(_T9|_{N$@UfDNyLWFC7J~uf3vN-%@Ji}%4zn7NQI24}Wu=&>n#rR3JKNb5o%Jtov zvbEdf{HJ{y_AZ&s)r+q$^EkXqMmaNei_2|b~{cvEt2r3JM!{u{X;io&;Q<0YPh_NBW2sBP!&zi zcR|~#oB#gjS+*#Y>zhk@v(W;zOU~xkZ?X6_M~W@^ASlbIBH{haM80Oz=3ZGR;h*on zuxBdCmV7yIW|l^d{QA=}lh!Idns;nh+~3}i1c%Tf73Bn-i15efJq2o3@U013t)exn zKVq-nv1((P({e|R(e^}~s~xXU&zQ_mF7 z317qMSai8~HTN~oD!CnJ^zRo2F?ck+wm++}vE%E~&?7f&&aJI1fBkCHp61f)yk@68 zmTp?Z5##baH8*yf;LM$k9d3oE{Aa{0VM_1T_P^r0-I;aSmQQQ`9MP-dxN>5`%*xKY zTv8E<8(4CFU;S2Ul)2<~{@mkSP02~WGxWS)-41t)+4bet9@ehLW$cC_XC~jhX(PAx zOYIG(TZQN5+#JBne|9~)pn90f#T~_U z`fjt0X6SW%xhnO*e5OZoj^E?B&TRfPW8;$PYF-IX@ee+56t_c5e4Ec+2@NT>Ht4ucGh5 zRVG%n*g1dq?^B9-#j@v+`K$jjlN4*jzeIKK>99EaexlNj?-Q>0Jp6t+hvmVV4{sV4 zO>XO7FWs?@-8|}@-Oe(-axD?Br&%VJ%XXD|H#kXG=Ij@e`Wjw)Wch(x*A87?&EBD}>+f|3y1GiOJg*EJ6+xTsI0Q+(m@t-^6Emin64o`U| zs+l@h__aQ#e`$}M*^AfOPTXcDqw|wbO*$?tdOME4Et%0_dUK0q<uY)Q?Jw0d#RzN zr~Lc#)ao}|E-m|@`s#yB^y$s+dv>nm{&jZ2u`Z67^IjK(PZ(spf2|&x&#HBNeWU2F z2rmBcUz4v`@hp}oRc*bOb8(%jtc;^8`wIKbr>cYgyo)L1Fe_eh_*%&$m7KSaLe5-V zaA-pMrB~&rM3aiO=INyANi)lxOx^ZK`L***y>4B*GkX-hw|IT$sX6%j!_}DHdfoqV z+Ut)r^}gVLBY&L1!s?0Y>#FYzx0hdT>DAzg&{qppGK(x$T$aD`kv#j^*nf|n{%8B@ zo>*kJ-EHmjlkFVKYd=4}RKtA0KIhZrt*rX_cF`X+F5PDD` z^rm)UgKh+OZ{FHSSAkhhH5+$q70AjsuA4N;$3L@TRZEcf`um!bT1zrqY_-{5{a-%K zNcZfH?besXe<(A3uzPa*lmEJRx+j0k&b;!wljGI4wz{QdizLi%Uz!~g@r7@~ROdV4 z%e=WZd!DeJqPOzf2Xh-sO~HQxH+5Dp1VDHQi0(ZN`{L#Cr{<{2EejVoxK?;i zlZm3>vErf}pC>pNs-d9eNvE3mhQ#!@Z zz~SS`H{BoVZM~;|oNvBZ(zviMx}7^J`gH>bw2lns0Ar)`?QS|0v{^@Z7DZ zop@(HW-`6rc{;O~?M1ur?p$WwCn17bp?=msGdJh3H?FM?Jasf$e3QmC=c|GzeunV> zbFC6Is*b6h9X|`8tPbnsFKlc)-(F$E)ywiiu{m+04eydw%pBT5efy{1 zeLw9oSJk5D2Fp&`&Rt~gZ_2me-|?wjtGbsZzwmslW*G2C^w){J_aeEUOMc92kn>oS z?x#N?|EKKIjem|Z>m;){l9Zo9K-(pl?x+`EVa{*qiv{x+S6=g5d*@$dWSekQrh(RbhEq<`K39`w zzt?T;D$r5peitm2)N+(3WY^~H?Z?*`CGwbe^LbqC-F4@kP<&`q+^%)(jF&hTZ=C$P zC+~UD(LKAhr&a#StG-+;Ep$`Y>$T^f`N?0y*R64hnB~ixzv#1#e3a2-t5oaA$5}QK zQTI4yryjdw%Q&f{J$0pxx#zDVyun)wdN^yRM;RWSEn0LS^--YYee2wsub%}L?3t## zQRYXr(n_C7nV5%BtU*`jEDh5Axc2o;Jzw3QY5(|JYaK3r6yw^yhfnd6b%aJk$FqOG znUmtL?d=ZvYs*kO>zaPyih4)k&q7&|eY-->J~Dj7?Oh-(*v56@<&hgpP8e!lahrG7 zVflBlsz3YkeT(1yIrfmT_DjH%cc(k{oJ#e%zbXHMgP*7W_nZSB=lgc5oO*dIaQ?M@ zi(EA4x!-Y&nbgX9^|++kufLrcC9NUdl9w00b3JRf?(X8tJv&~?PkOj@=B&8Qv-Fq5 zG@kO14|v$gtMN8LF=V=`E0edE!aB|>vlW&T5AK$q&-A`Iy3ywB6{GT=FE`etM)D;6 z^X`>g!6~n=>)<3i}$H&*jBi*Ki5SeG)bM5ca0_{SQuyzIm~0`wdGkE?;P7 zt9&LkcR~FB^KS~SuUe`UO1Ho8mz8!m7m$#i8T#w#4QA^r zssaxqB7EX=e)_gtt@NsMQ8=+^%gsi6l_u_nsPaX7Jskh}e4X~_`0o9hZe9Va#YH0y zmP%Ka{BgKooPFqcF3>L5(mMcV>uXC{HzOwLbeU8zo zeNSyOe-zl+{7g)qz4m_kTdRZ_e`hD|J#|y??t?vt-7BIuJDr%hZ1eiy)e*-T&NrTS zGdO%Da#5o#;|qn?SFbr;?cIJnQu-s0&#K(yW64_Kz&-l3gV^8NT5$EkYGw1niH_=IJdKUgsll`Bs{mZ67 zJfY*%)LAj>|C|ho`7tvwu;A4OyG^}^D{Xw;YG&&d5F(sXe3rHm`!k=1aAozA5k7!gOEdUwm5OhK@_qUrqSz zpr$2Y(Jd5m{ z8QJiB4^KzJ-?q|g|MOSu**{&k%638clvQ8j6*JmzoY`Bf&^%+KRB|)(SplI#aRK%s zw;Z2rzw&68_=|on9!XY-^XvSNNSGZJHE`Wy=7X(-1AdsDnF^c zIl+9U){^pROBQ`^WHQcL^S5C2>=H|{LyZ>~J8R1v_l?-L-*|(a7T;`v&yO=E{Z+ot z-?Wxv@_OO*+XEwh@7HQvb?^J>s-F_2mjC4bEXfTlyCih$ZQr@GHb@Be*A?>rmd zeZH*!na`D(g=5yZiA<{S{ot8%Jd%A8qkLEM+=H%J21Wdy(`7zaSme6urSx13UbJTZ zoZvp6my5((n@pRhOi=sKZ9b*_q|MB9pJ^ACH`E+E{@_IS((05c8z*;me2kuVOm^$H znP0DOIaTv?{ljdz30wPPcW6~@@af!GHHow9o!0Y(i?5{@nE&~E>8Zs0eckgmD@8M( zYROA;nsZ~#>Qv9vAf==ly$9<+-VnY)j zh1@?fp*^?x_ci0*7>Aw9Y*SVQ#%@Uy|8w&4qtr9kt!@gbL`S`AIo!DS>I2Ob!)(F7 zrw*G6upPap;P!Lj7G0&Sw-+!O9C&~6!=Vjrw@!Y3G5O?F;mZ$i)|5Mi=(MxQT5VMh z{cE>)%T9qk+*WU2ACh_!e0kA5{({J`;zIMqTeI_;bOrS$$u?~KR&y)Htw)L@@TkC^ z&M8buTYjv&>U8Ssk44)W7BO9mJ;=j&c;maIR_Q{u^jC*H&+zH3s28e)`l6^Zm=hxG&VMoWE}d)AS7!nKw!)r-!(QE^T#)&;1uVQTF@V>7Til z*j>3D<5U~8vhl}^4lc!}V5{d>T8}MgRDUh3kaY9Wl{dMu)+$x+Wz26%99_G*xI*;Q z0?~<#$3yf(ZDpgqdMw)v_uZK~^%%2gNrdLH2^WqCJzQgX%+hnW%I#UN6<>(79P5y` z@K7wDH(Q=d@5DcWjUBQjPi1n81RGkqO@8n{IC;h7#$R?>{`JADBkP4@ZC=Dzl`>2? zTfnHm#ijFA)XR_IRMFQcRok~ux4p4^q-PkuXNeupjM8?_X)!Uf2Qn_P3QfN2Q1ScX z|Czs7H@zy6TK-UU&4RcM6TcLkzrNyJlKu2|=6^RmnW>b!{>!9gU*~YiKU+F$PK&ea zD{rHs{>Ax?z8d?^`WF1J=KP(MwpFLWHsDTCi{i~i(`IbUDz#{+X!dxB=`Hv z{AKsn9$ocpn?SH2-!>z0<>KVI+MTBo-agRTd@0y7-&W-(4FMGtNujiJ~ zlf|J=*Y^oL*UVh9TBL%%*b6H}hCBFEcaqrZUj*`PidMb`?;#zROf0}w) zV&6Y~j|%tdgU0n?ZnFcL=S^IZkP+Hr=aZX%O4Vi3)TP(eMXyTLzfI&0Tk&|#B0oQ- zPlqS|5;}8Q;gUP!UAO6*Utd}49I(yo%7T;M6y3Iceym+wU>s2MWU|vYZ?-+pT(@kH zw7rlNrhDFZSyQ>&F}b*u+_R+zP9{85wf%3uhBsa=H_g#0>`98K>~*g>&)41dUE0OK zY~3f7&av>eiRGqz#};e~DHfZPbEcv{ zK{#ssqVP)pYTSD88@T}fGcxb$zz+c3E!AGQ>3mX3bGH}QuhW99rV_0pdz z!d>+hM{cFhm_{H3Z^7r5;|H}BcoKF+sZ&(>Pr2@ZOB|G%%?Yh$LYTgxBs z&&x{gQqA7lc*;8L($%fj-_{`0Z3 zx}Fu*i~6qnbU7zV^ZUO=S$elVhj@mZnYPGtU+a-wQV!`hTb5_H3K?y4yAyfnMa5*s z%HX%sQ@<_B5Ej_B?t_@)%~h2v4m9~n>Bq2FowJnutHt@ebL-FOzQj7?D>s+VUKbT< z6m(#Jv}mw&{NMc3N(DNlN;fT5Z}QFU7Jd+-wc`FVzrZiKAEc|VA4}N5wCJ3#ZF5#E z%O$b3`dT}De^nIKUVZoVa-CvIs?r3%H)8c|7oBBum%sliYCUgKu+N6If7Es+Kf3;~ zH;Ci>6yfvBDz|JB$-KH^i>!9j9s_PpfA@c1vd+Z^^xe4T?R965gL7#EY@-~6X02U! z{y~FnMrmM6;ogfD@uz1@o43%G?bo~%Ii0j$)l(b`Zsb_ccmE>r#=>vmLT?Q`ca1^Jmf4OP9BvbCmP)=x>7<0y|U2)$9} z-opIunFQy-)VD6hIx`u97PCZ{$TL{JG&`vMBKf4noCc|aZ#RqXz1`y2#KAw^AWY)x za@#3u655x4$~xD-ly~dYCvO^!!tHu%4y}o1S--H~)l#_Ow*MljeHoq4Pi>lZ@3Gnp zop~>JD82r9vD;FH>21Lzsqa%e*D-jd+a(uQT~PL8OQ|jUIPcr#domA{(j;Y8>ozNU zrm23YalRK;DQ{N$@Y7xe*FBehPp&#!yTeY#oIf$c`c>APO0j2!le_vRw0ry(K5(dt zXVtN_2NE;o9+<}dek3(T?CiCW4|gtpT2+_Y-gUWWx85F&^=JBbl$*5Om_Nh%=k^vc zopmh^E++#|h;~Yr>6A{gdU16xBOCt$4JFk#4>sSC?yu0jJ>_MPy zDhpetZwZc;+T?wV-}7o`5DDE?0#e=>o4k?{{F+pgNCB} zO9G^&r!u5pbDlfp?ktAx)}=>M`zt2=oVv-*^{m>qRj!jIxPSO&gxu&pcro#%-?xu< zv^QP(7waftb*>~S#ObYJ!Hx7Me)}fNc3(A+b1IsD|I&eiq@&$`OG7q0G*?(<&zUNI zaIV&Yc(p5^{FhJu(&zNYb6)2AkT>&h_H;(HUC5jw`c`vB?9RnE+*#}=Z?@d@_H@d= zkh!56PQT|x2%alhs_y&M`QL4!C+nmkDVl+S!61G2^ZuO)NB=*ZSm%CY)4L;~2jZ`7 z*z0DI-11hhIzaJD91ny1yMSd&c5^@SiN7{u8sjUOL*`%RevuG4WL<5`oac4j+a&8l zM|$kptZ=tei`gt#E32;9H9aZkIo9;uv9&M$ZUkqNzWJNg?u7?KoVq@!7QOm=KHl7C z!a2XFKRo)n=_gY@>b(D9aJ2Qy1bu@P%YcveS|@_)d73&hTtD@1v+K-d=lzi4TNWqq zaeXVVr|QAw>R#sMe!mo!u(3LIoUr$cUFUrHT*K^wh#1}52lxfwXdbXS#V%;*T628{ zf4RJi&q>~%$McPzeB+K@`_4~d*`K1i2`l>MR4wzk*7I+#qa8n08lX{+7u%jfZJ z7M@~S^#29JmZ>6pUSE42YS<~dVN00Rob!MAj6@GVzo>R&`=W2c&OelF-ah*zG3yWO z`G>#xFAHC5EmpslzhUEU7w$~%smvbRls@J~T|fTlL6R0v`lCY6Wx8J&T2ANmO?@t` z@%HlJFD5E>0jXsh{amjDj7>xb9_m6_)gcDRF(0n-n|yicQ7x`r}?n zn#{e2>Uo{J8LSuiJ#bB)Ustr)*MCl1M4(w>z?=e?N*nXums8yX#|p@-okF8|S~-9RFS1yZ>Oc zBZIT$`Ki6vuPB$1`C*Y+6!zft zew_*q`x0%w7`auM95;U6i_!~LIQ){O^mF0Wo%XNHqe9=DdvVo$iTkFv5|;$KzJBD6 z{Nlj5M|t*44QU&@O<6Tf{O^CS?k!qW6UOZJEo)NDyGfgU*DwDeKU4j)(khAf`7frc zuh{gT@rA@U^PR7j#3#55T@?MZOn&C=>~qf6*$#^yDn%Y|IcGbw{&vODblH#54bFY` zi^PNa9^TNZRI7%nTFj)L!4w(#K_{SsE*xmetWqRZ*AU z&U@?R)(OcOEBE>}^(VOta<6@tTwwj@!*5TSpdDh5QWl9Q|ivH zun;<4aR2uH*Is*PhBSrkivMT8TJUfB%uh1n$AfOEi7Y(6<&eMJOv2R5f#|E|K92eghdf$Jn*C=*$O2sT=4axTXxpqfH-oFcPoDsN3U>g4i+qIhx z_?>-~HqCQlefL*~>}audFH)IXXKb2ndu#ThNIr+&@6vByvi<+FaVfXmvk%q^zvpLK zE>>5qIJ?;S<>n~f1ExQulWx2XHWt~nVgc)2tILU7S4uAq3-evCS$W}b%9dHp(Jl5u zZ?Alqdu*w$)R{>a&X`oohBZI4W(-T39yEu2i@^y#=T0X1$%{%y8e?L>(k<%N2cpLn&_t7IuY@jyYOO&<$=ZVjC}I@A19`L zt7cI!|GoKoe@i%9-tjj%mxONKtNz^g>*M={3|AT?BpxTf*%BwmbiIqSCquws+NL+w zug*VKv(uSmQ$EY^lYN>Nci+N8_pWaEwsXxj{;=ht)4n=Fbbx|7VGuzVa>oQW2LSgIBC4tM0=0M*gBNCO6q^ z*)(@)%4xBOH@0Pl7EQI`J9Yo|tml_jaxFaUA-!R3(`A|Yd2X*o6+RY+Gxn<5Za87hly3H zV$L0Nm{-)EU3^?ceX-}_Gu@I2Y$E?ohfN7Q*l^ZoMwN3-DNoF$$*k>PE-+*+Opm?H zq{Hs8^Ceq`<4+dGyi0jfd<{V|E2@w7sIt%GyPjlha94Zxm;bD*KFjm!$WFMzcO*aL z>@n4KitZB_cW%_OJN9hqs&jkKmgTTnUaaL<8707`Db1f-aFp47;il7$FH>CCNm>P( zs$QxVnwxLQJdzLY>Dz5}d$UOe6&2O&CVeqbM^^6&zUn}}rY-RBmqd+WS3w06qvf75a-9a+`VSTl>3G|hCj-oyIj(5*CYHGZiX$2#g( z$3MOQ`+4a8tcc@c3uB~24tpLs8KwSVQkCF=zrU^@{3pYf^jKqZ4$m5n*7VZD8E2RD zmf1QSwtA$#f=z0=$f{{mD^#cZaZ5bEaLlPd_V}W%rKS&U9PD$F(KMXtoQe?O;_b|yM*~BomKcVP2?h5Y@^`Xm`3g@JKI9UDEN9ftt*^f?|w+9HEmuYoj z&MjQS*nZ{MsdLLL!Y3?9-1R@@o2mPgXw{sk32FLymObVCch=}I=j=bRSozb(auu@` ze;2dx7H(DkQ6M9K{mJJ@{i>q1n>QzQ_*hz2?mDse>OHsgd2Y@)H#D2_8YIAMg`BMHQ-xIl@eBU28x#hPg#+8ZW1#*2+QD)E;+jOJgOZeS% z1A+H!-haNnek_`?;d{Y_BHrrwbC0I_CT2M(*;r24%+3_svE`rPl-D`^t6#jXp7y|% zCG93BQ@_W4@gts@Gd9S3{5k5(+CSyeYd>Dm0|6Z7b>c7NU+Xd?=FfJXZ}ci{5r@D| zmZaOgHyVC#kDtak+g6x?yDrJf>Y&w(C%W8>VZoWPJiV2aIVwU0 z*m_?6khIQUz3W2XwYOX=HKG5PpmWNUwO4TTsMNd`Q<$EZN&ME2ctsEMu6()l@)A8qfl?#cxF4x% z$y2m6&feShS-I`D?54xwr&=U*SRGL~Jv?K) zH~iX-w^P@rJ4tiZ_~$r%oy{9yd|hbvG}hX0celKG;hY%8*mF(vhhB|wQ{P0#cgDTi zM}(F?722%u%y8DB{j7(-{+-Qflf)3k|4pWH*NJ#h6}o%>es#9Px0=I8^rK(zQs%#0QJehs z9C@YN8(5m;lY4BB;gy5a^iSUrb`|E)}{<^sBXS*P}EtvD`M9J#Jw@ui(N zel@I07Z3Qm!Ha$MgvmFB_`b9p2`btwd;ZejUk0YSvW-FEo_f{nZ#hJL4y^5CztEA~ zar;!{Q+E(-=2zx)0? zNy|uEvN3AIw94;y9gjaeer`Jt_a*jK+B-h3WHM*eUN~p!l9Td6`GC?$UVFCXY)j1AWIw%#XA(KppVtbx zT!?3##O)cybgpem%xV>B-$OCl$L6M9K6HeQaaPI~r)Ot;|WxXsJ) z!8$Co-RsBk&2vSPEhnCS^UF!}zPaU;-^xAiYsBUBqSx{myJ-FkV4db1|Jzfl;_=iY z`)=DO&v0@4w%aCu=7OrY$16WaZpqkj$9rA4WXKWg^*yuvuXg+j34c*L*F9U=Na7FE zl~pyfS7}bmvvp5tlo0dYuj%ki!MUx~;g(GO z2%6Y_{ELvr(~a@F#YGt>n58c`^7N3!2KRs>Q&BO$+aBHL>ut-DIZZC!=v=+J<}asx zRkx`pBYocw|GE1&`J~$K;|sF#eT=rOZPB|Fns)>|7SErS;-}K3 zdCH`COKwah$JF`@|Gm$CZGXh`AhY+Pj?t{QpXYAdo4PKKU;X2b_B9K3-%(OrzeT+9 zTFaH42`quu7gC-a z_1$KU+V)b;;GbuzKmE@5b7%L%YqJy=OFn9wQnxh6z`%LO=3~dhDxPsRT)na_bniO3 zMGKN7CU~#iak;AdB4^Tc`RdlJNsrojUOReoKY}(V6a#gu)*^i!! zOnpgjoPS(Pu2~}^e~;nIk$diqoGSLwnQ#B*-u__y>g~B1^DljU@3i{)jf_hFWd(^( zg5|#H|M=KyRloP>?AgXKyE)2cSGN0InR>^x{ia&OZFN7^7`NTa%m|6B;7^N1z<14*W{4o60 z4>?1v3pc&fdGj-My2A3$ zkG5@$;xTD@^vACF$n}B*nYSm4gKtY4OkVQhyKR))!hbcxxjHh1%(^7R5ghUNbr&i%Y6Q}gC7 zgPcmg3ua;R*Q=`3EoUxU`{S$cv%1F_9+Hb+tAFc!zWwbq#rgIgs?S$X-ud>J^TrS{ zc{R^(CC?fn(jRz!y7b4Oq_@6rMdrKY#!shzPitCKx2J9TCpoj7oS6@dOKko>doGt$ zyQ}uIowrswW8$j?U(JQ@`sKgmd9SyP`^>3{73C**7G3T-lQ%2v(j~R;+1=0Tm_9NqZ=Sc2e~V?`$8$BScFp#VyQA-&w2A%9?@~KC zrdVGQ&)Qgy^F9xMysnYy+SqNQwD^VmcgxuD4^hnbcTPSK`H+2uGLOyM2LX##RWG&T z-M7BS@m~7wxYt27v(@h`w^o^3^Jm+O9}c=^eP09)IIiA*(QVDo+lD_?W~3im;!tZN z)eyB`?9G{#sV1iR3QkK}X1s5DGF?w(+d6UYg$K0W_|Li_7JW@6qsD5LqvHm~jE`UY zo$McWER;QGW^l|f<)-P|PQ3$Nk7s=UWIoR;VeQk|;ks)=qu#ywWNiOf>*o`Dao@<8 zy9ap{PQ||{_WH+pf7@;I4J)6jObGdO;@~!O(K|u=pXdG&T>X_L`f6~c!z$_8FWIYp zx>OxznY;J>8HI{FYwsKWi1y6k&eh8VnB`jQnMD%5&K3N8;MwLy zxgWou4}biiSVfd2bm0Vft0ukksn5@pux*H&x^;c0Nr@;TYoZm-BPtv_uYj_$pY;_}^khdw7C-*kHJ zs@Cv1nYY<)?H2LSc3W$-YK>&knv{;d#s|>{qNG$7q5Eaew(j(c~I=j z`Q7o$P+89Iz|XT4&7bsAID6b2eofe~w*5q2`|k}MALVD4Fp8Qk zDdWnLnYX1!!&uFKQJqwp+f|OmOsj&vwq@LJ-70^e_o4i~^zSR*tSZ@T=bw7GNJHtr z@S2nF{~u+Tc(!j!+7y}3%7r0?j*3pDg0rM=@*AvtTE2g;aIw@CQ;s<`+fqHf!p=Re zvOS)9=JiC6{G$slRD4rjaE(9t&SO2!<*(lriLOo9RVmTEa*x`@tLt5Q_N~b7o_OWc zsa&lKzMPfWg}K7X^$)MHG`cXHd?#CQEX6T8&6muO5gQ+ifZX7k|6i4gWywMl*4 zukWnb6)W~G*|vVqncY3!GFLf|RZP7a=-mD9&LuIuET=i?(a#zJ|FgSv3UrhO@g8*l zvHXl#{5NHJ-8Svh`?&Z_2QHaQ!u7!`Rp}4{pVWZS@mduq2>#u3GhbUf!vdr!3MMI^$P!*oqZM*&DrazP5t5 ze&S*-r^Lf@`jbN@^iN!Ox`FYpyU5!O)8%&8=FGgEl49hV5o-Bbd*(#%-nAwEvG-PO ztghOBdFAHdjn^EfvNLmkwyF4HyX^NYpL3c%bH49c%oVK>RrQ;xqxW%k+IPS1ou@Vj zPW22BJZ2@4s(Bzd*2-M*_)`W`bKkl9oF9sO*8ciL(r>Zkgo_C-2Nu>$_;K$M+g$zE z!58}+rS7P_@>{lXPXC8}A9$NSP2BqVg2%qdpoyog1E;;|yM3{B^2r$ye+?z4oRgXL zBWs`YrkC%gvJ~u{#ohVyz%qj~N?HqK)i%u!IzPoQ=EB;@o%`pV)#$1c3+i)@e9dK1 z#I5=CX{OKOm~D^U6$Kxy6iZxm?pyZlhvo-j+fVJ&{jB$Bk@pgg#Ugn>!qd}u`MC}p z_2Xz0juXt2ez}vR`gZ<5juq(ovy2zdp4#h{pHdeaN`&|FM)F?*$J`FP-c! zGN{+PrV!FE%KMH|G00)eR$?{o%!<&LpLh3Nmsjk zJ?-!8-F=VOukehK!J)mE-msr9sxMqA`mJ45d-(}Vs|K^pMQqO5yJpzfSGPSB+%t(; zWOJre}wWrUb%I9zUOsLuR4!Y_f%6^`0Lh`yLVq%`{(Paw2Qxd zx)f?_)>$3iknG=o@HRsYcmLz1VY9=<=iL18VO~eQ*7+CNA}bc!`)Qn-A)a5ybM5&K z`^zsomwPZ2Jw3H+{$8fazBz)SAF^1E|1eY7n(n6IJtOvv6SKXW@#e?84b0Vgu5H(C z`OQ@o!(0Q||4Dc*FP!?u#35{UQk}Nf?)eri--LEBD6wvl-+jp7kM3Ke^YSyc7Z$e6 z%4^bFXVmy&`+lZ6M$Il4v(5Z56W1Phe_j7@a>Vh(-9AgW7Hj-V^(;PdZi4Ie3CHG5 zdQ!?gt)#Yv|5;J~5w+fF>-rBiiZpXf{it7jNx(KfWKPzPs-^W8jcRq$Bu=lDZMgVk zYHg9z(;};=<$`CAb?!G>XnBvHXBp#$`9*TR6W+y6ShCwH+CN^vu4!ZCRK8u|UaMm6 zCUnRKo4FReOLpP_cjKOy$i^DytM&4m-R2@}J6kN9lxXQLmS7jDN?S z@~0P92*`a+^q+oGGpFvMJ<~>I<sdYc*ff+k8=m#gnm z3JS{S=Do4_dIV2M#xCjgp{myy_ebBXkDU2A$SvvMBJWpUZA+IN$)D;rCta3F%4AZ_ z&ZDn|@9h{{ZG6 zNug&y21tqif7tluL3-_~|0k2Zxiwovjvo{4G_5*YQSyKFukA+@I9w}uFZV7|_0f8K zkL}r3hBsetvL{Skp?XPYJ^!>Fw(Y?sz8-uc$C zihbLmM%Q@jd2cU$cZrMhm&G#0jUR)QW6pp6 zKVfb4|J!26_Mg^$+Z~=}ZW;FUMuf=aN!PzJZtz^6cffpW?c3OGyZjG`O}_MFzoCQv zep7~1{2%u(s=eUAxY9;`2J4~u`!i=AHejx?O=cuIuQhQv2>t6Kzww<7ySl?XInU9DQD+d*|~fC-*#v zY7D(tx!N&r&d%REdVdHevi$tI+q>~^@wy+&3-pi3Gp1bo?z16te>3BQpWKiOco3%JzI(3eJN?(jD<5$EZFo@qe)%zFiR}^cR&Ley#`ZmvDo>q!VYENH&_7z^ z(c(P~4-`*$=)4vUJ#|YmL!;WdSI+anQ!gF=saA2Ko7u7&g@Ql7ikb3WPiM*soy(tH zR8tav3w>hXbUN~K3zu7v+UM+56FaZ=+5DAReE0^}s~Oob6Kht8Cplf%A|X*8c{Vco z^aW{4V}X@w?pqc=Nvq$bAJ(Y4{DJKLE$&6@#6*6U=qlAt@Ay2&Solb)$^pUcz8w>u zIc@WB?A8`v-XH#6mw$P_s=>#FrA|D?w~bb3EDl*3xr#@LCwghJtPA(@PeoQ+WMVF7 zZfdYg;_}+~Cs z8~f9uutU2xDsJAu_3K&}`|P^7ief{Bg)Uk$EEBiuh?ksbp5pvme@dj4^Y(Q-%8Cz} z8dxjNI$rGAy!Fin^PMq^Wj@7%^^{``_o#p$Jty4|hW5c9>T)z8$^R-7UD-s(2|MES&bk>i6 z`5U6e-_GJZefLewc{w(|IXXH`JC6{%phs3kxcE0oF@68$C4Ai__P77ubiXUTCj9p8rtrRre5?C@&7Qtd zm2=|hcl|em_7q0>uRL(uv%4zh%j>*ntBxCb`#)Xk|K>ohv9R0p;*Iuhuk`<}JnS;9 z%{^9idg{gF4W`d;&tr*Od^Yi2^qmQ@eT$r@r#-xx{q@Vc?WWN>+nLVm2ma|S^FK3h zMpD1Y-xp!|( z&a>6Yukcw>`DJ!|X z!58;Vvg=Lxx!B$+T}y;#@x;tW745arYhEwwFR6E{D>)b9`d&-Uvzm8x_A?njgZpCq zt6ulKc)vT6|F)CDq$}qpNLnm-%VW}--WKb?^`da|guw9b#;mMs+qARw&0j|d8|Ugt z9Bk^{92~ae_VSdL8k47|DvgaYza7nt77km_Bo)zpN@m5B&iKdaGgX~_mhQOdwrxZH zf{n8$wj40O78mB4%d_*gmFVZ?R_Ff5aqawirD@k{p^{5mo}JjhqsbPUZ+z9`?Q`Eo z4~hShZmf)r+PlI(axO7f&6E13+7~kW(-fgS)2<(2_0|h~@!z0uRmWYUI=N$t=Np<7 zoRg}&{uG}q&1r6#b?w0Ap6aeyio2siJGX2tX8*64&a;0`|6Sk6HCH*j-o4}cG}*v* z`a6eTsdHnF9a@w1)^)9mZuTo{jkqGo4Iaiv56In#imBf-<&jUD`_ZFCNB$VLR6o05 zap~j_9qF{EXMe8zc)}?){gC0C8^OM&hHlG#UQlLqy0zo1^R?p_`JOmei70)4t(H=g ztu=@9q{syWUHd()^QU^A|CVsCc3xhA;evYSQ%iZT%9kennwGe8yON*mrTUs@DWY06 zMW^MQp6ya_7PEUIvnXV9a>&s@snZYCUUf|TcklMTcdzs`4p?>HmVR=I^RP>2$=-zD zPTv;3W(v$J>e#ox=a0b!rc=MB+gi|@)9}bLek14MWvOf@4nO>M{=}uy#d!f~`?ntY(9tZ{kzH~z^7Nh=shc-! z%GT1`<$Kv8f8)s=1()5X|D2#59(?|r{Oq=WGt^_O8@zwXZrz%a8P{Ie^K9)oQNfmJ zG0P^!r?iTz+-?)t7@TwL#PZsuQ&bZ2YxL`{^FCdg>s5Auu~KHs7ah(*>8*!z*F15o zUTfSpd+DE$dCQcm=U;u{_`Eh=Jt=64`0MNEq8~NeiwZpYlNNnoo?x(DOv1M7xjOlG z6z=-|mA@UfVIGs=*QS#$3Kg>q-M`C(DotKF-_LJK(A0@rxOFZoEjf2^j>n@}r;6p> zCjRM?&v1D);o6@A+j%)U!{`3sx%2z*J4v&u=ge|DjvSu1_fgD_sG1w1>$&y!eLr!} zLHK`I!>b@WzxLU)zK1I>ihFis1@AAjcl`S;)zx$)MIOnnu5f$MDZjpOZ*D->eU&AA z(-tkiaH=dmUaydqQ-5t-hW@R{zZ^ad2^t^bRnS&zg2%TLb@Qv8k&`r5wHn9%{UZHn()xwG_BN&L-+M3KQon!i zO>x+d>I0n7ZrAkt%e{6~2N&mbM$8fJiMXcVU2U*!_Oueq8qbU+yH{F=Z(P_ho8$0i zW$`780^8rb+^(~5{if@Rwkk7L?e@R!6If8%R6X;|tG%DugM+3WUTrJ$`}WD?C)w|2 z%=Yr!%c3j&csJ|nWyzf4g}{beQ z|9Uy^tYBR7?<4c7h`o{_>9$VuU-nBLR(s)D9F@3c)=nY8MJa+p)d{J*3yj&Py-JYF z&i&!Wc+|zDXz9^9o-gKcfq}=nn)|+{{`|ACeNU)Fr|h*-W9xNl55B7MJ&wD&aN6H1 zo;yPFw*0)+{URrPv-(^ggD}MHM z;R)W~e|82}YFT8}`TyCnWb5xLw)uX`&l{d~3U(=P-XV~%?DzCVGZxsa`y~6gYW)-| zfufIpRf75zqwl4zc%dpb<&)M^^`r@p9tQY5<9w}Je(gTXvgPKJ``)H}Sz2VSxc}#- zJn5Ut)&&V?ed}t4<=(t}_-x~w|GwK7tF_8Bop_dN?-3NoA)opB8<&#s^hi(l#}`d4 z#SZeZwLbCL^+`tPyI$YT7uw0!LRK|>+&g*ZD|Pj&FK+jx-#fZLWy-O48fB?PpWSAL zxh{KW$jF$U^v!MQY?nIQ*t%Ks=S$c8j-2!)P*wQQ#!Hf{FCMQ*NcsCJ-u$I%P}6ON zV&TW4htI}uk2IREw8JZXgYg^P$O9U?7*1E-%aq(7D!O83U1Iq@flHF!DMn)FzV3Rn ze0S#$^MW9GX|Gjxqub7Kv`a5Dei}QWm)g5zZHr;5+f86r3f-kv&|MOXw zvSmM|>-{F`-+07ltLyurKXJ*8D?9!?t%wo3e6Byu`A*f@`pFB+S8PAeC;w>a`}$`V zb@M#`wzoV8?~%W2DHb(1P+4S}(5aaTf_s;5T*1@1j;Y~;YFWkgIqPpMwcT*^WXE3h zRkKXLce6|=nX*yhf%tPzhNM{vFN1$MBux8qY|00(4R;J*=(26y^)XIJ{Fr`N@uNWV z^JkyRC7euO?)d%Kk_zi9*ABD24JiG4_lf27_N8y1?%&B{X86wN*RBWa_6oQMea=w+ zRr1V(CHJ1+=FH=|ADmXP^!#x9ptt>wfn4EH^^Ghk`c|KIbaHXYgcZKv+$0^Q<>)C| zx0g-J`1I3xf4$zvY%%)1ZgOM%rW+SUr7d3_sho27o=I8jG^^b&_Dt`-Ah9ZMg~8QX zlJUw4M*8wWda{nUW!jF1@;!gV6aVF_?6DZL*X)|!zc$0MK~}snh%x?DUy9=0 zyL#(_1Xfl*-tViRa92d|Q`NCw<)#wid4~Lx%D&w4Yb%n*xoZdp71uloSCFz7Hm~FW8#`x)m$FcXn ztGwvA`(=Ia`ZG0)lV_QDa6aeiyKv=I@zf*N{zb2@D$x;7Y1W(FC&93K>f|k_8l|o* zJ9A?CbnE>-zvFVg?&Z}Nw7FTyW*8`}>Je!A$#G4OC-cq?!JBv-5|3Y!UE*-BIrC^$ z+<)P%rx>JU%9n(N_+N~&-(uJA`Dvp5Q`55o_oR#*1k1hM_BlAbclp3B_;KBRA@0x> z(VNvYHyxFKJ#Dr2%{nRLRW%c3_i8>)RXwjzSb?p0&3y(2#@ zX^GMWMKhJGsGZa76~#Gjd_G(zwnM78O3F{!zhufHGpU+;9POzR)5L#W5K7LmW%B3U zR_GG5>|fWVkb7G@=Qc-J{E?j@{kDIRkx_h5=;kha-WweI@)jE&ZOSsLn!2iLT8Q>f z6}{V1*EnA2c?-Q4Ua@C$Sy8{-?O8Jvn+@&}5&3&LNCbP}F zZ{?i(e)Sb<|C*K?q`fnB_`B$H{|5H0zb8K6Zf6OZ(|_>#pIvXi>^^-@ch=M`Zi`ZW zJ&U}j#MdKUe!TC?-G_XWeuu^ycC0kDNDJ-G{H`T&c4sHc)z2!eS9yzS3Ew`ii@0&c>uPP(1?Z3xj*}J?~J9oXf@G4cs zXR@~Mo#3@qhrTFV*?-pjBeZcQZh zg(tjn&-Dtg&=mjDRLy%s@lWH&9JMPEMqiC~OiL?an(w?SWp#2H*C{!%{{M|c+l{}({ub}E-M{L#^YK*oJccW4vKa3zklT7KI6SXQ(^%_u zah$^0lx*1){Z-ZW`$QiL|I?n3be!+o>j&LCMT3mPOEX_6>`?yxBl*zh@|X=lU+q+i zH#RR=$F6hlJ)7uCBNOh5XDQWcr>D&STkD;}_}a#H*2$K*Yma1hbcHCd+vdIGmP)zW zS5|qs;L@~f6Ww;z*zrx=9qTB@E5UP2WWma*dP(>EE>$kD`dz#%-ssQw)Gspouhmam z{Ook9tzW0`!}U$IF86d(Z)Gq2o%Fq3D&zZNqX|r3#8VnKvV1ey0&cVTolKNdNmM>D zU&p|7XZEv4cLR3XPWV>3Ew&(&rOl6xyQX)}4DIDzGipOErB^nX|G}B4a!B9-iAY-`2*Rf0e#-Sj|)8f5oc}S66wgD4eI`S)VoS zr&^b^*n2OXZlUd&S-*X+=&VfhzjoELfSL8i#P#>?P5Z($VQ2qYt3A(tojs+#_YebP z;NufU6T{dqIz9To_wtLUnnvC*)_gN@E6TI)ZJbBGOAX7^E(;aha&bu7uK}h zH#R)5-z4TY*F?s@qWyV|igHo6dRm)nse%Rc_-ubAuQbUO2}!y2bNl$@aOBs5aHn~K_Pz68@l1Z4FB_|8=&O~W*yU=rw79cu|BkzY zr_&ED3{?8E(!IkcV}1O@d5iC^v=`m-UP5@A?D?922*)b7tx>c8WN3a|v0PyL2Tv1O zwZhQN&wVENIT%G%?<#Z+dKq%K?Q^2Osm_*nYY$ygxs;V8bLjY5)9=z7PIRd3=-;^0 zeCIso#cN6$I}=o6Yua_Ywm0p6`5^rJ-}k&b-WRUQU!2KepdZ?9e*C!%$05i4`%Y!M z9FO$-_pHS%r}yWUBQIKSG&U%e;O4>QAdS zUVC;b=-;)wuT(qtGp~B__0QwYss^twx9vH9V98YW!V-^ptKOfVw!N|AlJtI)s$*IQ zzn8E?w)*e|iQ3P4;Wp_c)1hlGbtcI?FmUObk^6xuMcmfC!R^Dl+noR1o) zG)E|JO=4?))FRtL$KP?4H`+q}-4pTK&bary*Z0H9W!-0gbiO!fq-%XAtSZyY;hX=S z6QL;&bgUQ7{FnA!E@Q!@9>T35p3XXNuzMl*W)-mQ#9`*icR6v=9o zcCK9@bu#D7-)-S9Votq2D|u>e%&QYx&%Q1*|CRIWY zo&AtwO}gQ3>qC~$_T0KVu~8{sQA?*S^=_2Nr`+6E2JQ>y$2{Q6F7Dc4w)aT4>kXU# z7lYRP`x^N8kk`r`n!yaU3mxukXqwfvJbzzsh(*NSQ1>OLHh#HL7-(~~Xo`i{>*nj> zKejFQ+ovG@Ht5^w|I9bP-#xZ&g6*o?y4mwrTZHyq{^qYy{apUR8s|=)qx^iI4b!TH z>}D?NzxU|j0VRRS6-L)=wT|S?dcKI=)LH(R#3B8aE`l>`zc1In`EXtK%f#y^KK3{` z3q857_sH|ioHvIbscsNkG%w6W`uqHw_f9iZ&Y$_O>&DV(4*rT|Kk^-In6CeNvEr@uwe^q;HN~xYn5CjaWzU$G$tWH&rY=7Jh4Tv5Crzc`SU>r>Y7>u~aB?yne+v zmp|QRyGYMeX3ykhn_aKnx+?3ZHf1xfWIKc4<_*z@)xOP7b#~^}xxyQ3sXY7B#iK5t z>KEPnIRE9`rl0G|KK`3=YUTZZCQJp!eQYf5+qP)7svc84`E;vWhV$gRF&oWd(+zey ze6EvAer{PC7IO0AR!R3W>-_c|={RP%K_)0;5C2-rg<+egh5L9q7DjW{F zqp11Z-BYDzxhHS$c2B3(kMBf?S(mS=eeyv+T){NeY=dxk`|tTa3$7el*1L2G)TPc z+4yxh_kb~ z=5VMaI(G*K7=~6>hWh(8SA70gqq3M|nNgYX^gU1Gw_LdQ*;84>-*O?(C$~ipU(bE9 zWu3sBjU4THI$XNjj;K6rmhY^0aQzrjqPuIiMPSwkwK(?%U6a7DwLThc0unO0X;!K+ zx*s0iw%WJh&7J1NOQHWS@cEx_<9Ktz<~#rNgD!h>Rd#lB{}fNt%nla3_=JN~GNoC~ zPveS&=jr7#e%pJBJXtQhI%^qnTkP_7ogTU4l5g|3NY315q9XKr%BGnm(@VJLo?-91 z)nN8m`a%TH~xEY4o1G zp`KyogDY7PO0CwK%S|uqFE9<}iFDui>-H)Sm3oIGZdc(P{j}6e zW1-Cc-BrI{+dAysfBU5R{F8Z0m(G4BbEs-j^ESoaS8_sM3_DW$7*3UJ?CMmU)pBsb zjx76+3miS-lRnIvR^_^O-P3>7w~puwy{w4pic(J9H}Pe}`6V4`yS#7QcJWVpm=Llt zx7ABga{A`k&K9epIm0J~J#Swo&XB0Qak|mQ%0i`y)%mp{yLx$3-Ccls4GuTSTSCkH0!*Hj3mMO7vSy!SD=ufE<> zIBnAJxs3MON7qk()1^GS?(Cy)wV{`z=IM77>|0Sh@u~GQzo6>frL(WPtrIcWK09@m zy+pl|^PD5o-yWY}(@_NY9qOCLSbAJ_u`nW9kVAr5^l*{^#8wH z$>sE;ZBOsyPt{1i^ZoE2DNkmP zY4fzRShqFZsg1XOR#Ln{d!KEgq}qc=Q_>BEwfx%N>i<}=TiAQn72SY`i}Wi_PP{Hy z)ubNI@xf`!c1bR$ch@a@St`F*ihQlOd#-XBAFKY+AnwUh%f3dPo11Mk(WK;t`80{T z>oP|kM28Dxc|3UkTwZpgHao~woU!PG`ze-B#HFnk{>iz`)7a~fe)N>l^X#lCkM7>pa=&{c$H73SkAc(h$~q^Ps0THj zMG;FcRTuWWFx*%9G0Qdk^0rmm7ESzceRf;nq4O%+kN%tX&%H)__mMpu-n~qWEeq4D zcV^GAjej1&CeVH|DO@`5lFbR08n@%UvD(IKYF!ggSgsa7aN&0upPakY7ko9?n7B_@QLc5>p+iD-q{zRAh_tg zPu>Z|6?0BcI=f~Mcg0=hGmn*oFGraMC@x~i6j|(cFGRh4#_UNM*LB|WZ<#EjZV}^t z!DzL2Gjp@@ES(KUyPvM?v&`srdhXRN*Rg-j^;J_Wqt+ zjW#O&i*A8JwhoaEZ(0U@a*y|o@;wV;?lp&e_qV;P3sTOe8G5gZ=m;L z_N#LqIOQj%MC^C#pRPV*k4a8^cx%sNhKUm*yoJ^-;^KF|{U_t^<6M;~QHH-a)QfXy zB*bmwVv$NUzw{@RWk;{xmrWlW3<6FCzhBatw6n=;huNANIw$%Llvr2`&X4Tcv_~Xn zZtnAs<=G5-&s&vo=lU?$6B;{r!U7 z+qm|7s&48E6?b-fUe9%V`3d)bdpzeSO}WRE^)u$tmKLE)(IyK*lcVgX`TD%rI$1Vk z*{wPEQ=C{>ucYN98s-b_t$lNI>1si-L{Xn~*+mvF4D*ey=fA&k_oveR-4hpZHgEW7 zp!k)^)jaV?i2uDy3#QFYIb|AfFW`82a!+Nzr&p1;4hoj?m9fve znKfPJ_wwgkT3dH_r!h0@KDRc^VAybeu2VR_u;HJAF)WrbDdn^W>BNMOwbx+G!JGk-ojtz44)wmgj=I=MJsC-6ojeSiN=gPV;TI zy8bhX?-6PEQIMNM}xN3Y-HK~v;PyGG!PM+H_O|he8x*GDI78$1+=k~1+{>AMkw=*|v_jSG; zHgn;-FZ|r}OniT?b2VV>Inuc+Y;fM5zY6W-aUCW&ocT|>mT2uJ6+o+6|Y#- zvu@LMw&f-U;?Ar^$(L1o-LCFP@>bNV5njJ4ODyio_OcM6+W~*m_vPFPk>V&h!902U zw!Gq(llhmaDweeLEEcq9_!8=@XSVVR!>Kz*xhytqyVs^=ykrGS`PI2>u>rMA8TpT{hpWi;*oPnGgLKXc)sxTTMOJi(`OLx?%mzIcg^yMtw)ZY zf8BXWt*PD4a=retbty9Lg|np8g#Qb#uM)ba`G)t%BgT_T_K#<+d@#$hn1LfVbi=QJ z#d1djmESI}eJg*}y7JWN!-^mKmNTp`*<)9_Ng!`WvP$3Vekm(vlAe$84Iq7eCRnQDUC^hj;(&ps>)nx#wQ3 z+>=no6B@kEDXd>i%Xdoia^X#%wGQ`MzHHQ6b3^3GvkT#O6L8_WA7;fI%n*1hs#w*GHACKE~$?xu*y=3AGZ-xz>^1Em9hF#?<@2Nh# zIdIjKMXCjVzAz~3Up})(V#}XYuHbdbVnPc46vIO^erbIc&i}#qPo%82i1Xx(XPW;+ zdrCL`+no@ucw*}5I)~VMm6eD0teM`OuzkA4w93`z6#c}b3g)d}^?Jq3Ni{vm`3xp@ zqO2?IgLZH%%v_e^@nv$Ie*&{$)fPTZRz{_32O_2xeA?QalHGpq@SQUuw^L4>Elt>d zC(2RE`0CofNvCGqOH4KBSa?8vQP8u)~V+YuA9d%@A7(;N9O-#t=elk(;L z-StJfx~9$z5-hsTRcN4ul1 zth+U#Y5lU>*Pbo=u9-9SdBeiE#@Sz--MXr-D6HDvH+f@7_}^JUDsvxA>iLx}6{}Rb z`)l~3zM9lfS0&D{6oeaMEnRQ6H>V?kb?1+j zC(gd9)DeG^WbLl~r{JDA)4TkeCBc4)H(p+u|E=nCvd5b{B7GO)P5r*zS|)zshx?n9 z4&|ks*A6XgHG849c)`EP$_Zm;z{=9N=<41wllw06Rh73UUCj9gh7}oKzg3--dnS(8qZ!* zIh6SP!QwoRn$tV0PRvSqyZCkJjPFWkK1s5B{1ok-Vi@b~vFhZCnaw6!RMcjD5Rd(N z`=Q`gon00d=|5s;pX%`u%nP{~wSQIUdYu^WhOcT?lOH_ZV7ynSBzLt*ccTf@88++U z+*QJ5%zm{CAFcW~^Unu;V}(=e9DnWle#kQZjR~vk@?AF{gq5&WWa-NW-;>Un=w21s zHQ{<#TSVB|Gd{c3(tFkxMNKyLtD2lPeMWxJf%A;B`&&*n2JiKGYVCAkV^qY$KdpXd zuMYp6EdNdLaZuIEvoDuCnR4#;Gj4|K|82y--q7tkw`s$|v%a$&hc`W{NPRyfLYftyCRgTWB$%>vmz}MqKY$hcmLiOZ=IatV}0V)rytBS)rA&HXv}05+Sj2yCB8p1%Uix?BOU|Bf=>?+aFTUt- zShG-g4ug5TL1y35t#7Av#_?1&Ur(8Up{l!!;lwI!D{^j*bSu1KQ%r(xh zixv`)UBFc6_~G0+1+TT`at7ZQ@=eZbS5kajw!mp||EYwtLirm{9O>^~`Z(L*QQqT2 zQPZ}*t*g~gT-W^RPo3-Lbsu&amtT+bp0k7Lb5-xe*gH?`TrbR@eQ=N9+LD=9<=gYV zg&T8bZu;zA*2K3&x?Hb0_xAqW(<==8wX?nlO{yyXzGC+>yB6P%`bUzJRaun&Sl?}& z{p^qBug~QIMfI_2ilQxQ#h23seAfj(nUeiIhsUDDF4fQF>9Nvex2GyPHo8li7|!~g z5p0aNtr6$`BQr(WbMpI`__@qcNkXM1-@gQH`Wl}X>?D~eQ)#MTuM^Vkx}5>U4QaL+nS=Mlr>eWF4{#ow@N2^cxnD)^^)Hn7Kh5mhK4~$( zn_I}*!&hD%EB3zF7&&Rmladz7_hUI6df#X2{c_}VTO z8mxO}JG-jyz()fEGoNV765A&)b*?*~>}e=W4lc}BxhF1pXvP}3)2q0cCoeeb{`JoK zr0c3_n`?IHJNKT`*}$#9^JD$C>k{HBU4D)^T{BHKXD_bVXnf_*>zK};ImhOdJUg6q z^wNu(6P(*NEHpa*R_e>T->R++H6M3a#UC{5n0!-L=Be4UDKpi0?k$PDXqs~H%#2+& z+{;QQEJ#eK`*L;Z;~JGatE~%pgZc%3gtzLPT0ZBKR+V?5k44qh!2dF=ZeA_D0lW!2 zPN$13*zU;3ej%&+8@G?uRZ93|V|CrON_VzD!H>++FR|HAj#QesPw~X8VoM9VxTm_0ZuS1V@pqrA z34{5Ww}uggjLg|fU;X;L+~DELojy~dCjPu}dBX1hVhW#=*Ty$YyX3EbFFI$o^P;mV zZ&`Bv5P@0W;4$-kACle1mP+rP@}Skd*T`46lM9qwA0{3>tyA1JfT-l*L6 zJd4=gm9}%XGzq`+?r2Eym*Lv8c)^tt)8=!T*6BmW1-OlxV8Lr!=Co0sV_Fu@E z=i>Zn%;KEAZ|6k5x##-v?fRTEuj5(Q9&Na} z!}QnY_3NiUker$)lb-sx?Wgm(UA#^0-z7H6J#4lYp84S`PssM0qICi0Wx-jKPVC&| zC}|xYu=d)y1#DGYoVnev-?Cw^P6$>Iejs|hclA$(lQBXnob2r%P1rB##P_^AzT(8A zicb?lZk>NL^Zvsp5eyt1M=RMKME-o%VbE5V(DSL!i|R7Yd_Ucr|IHn1?z65FK~=u? z`hDNlKbV>t{otATqqLhG(f{TLFlv@)e0;swS>jOpxp}t^e_PVz?(*YDz>hDBUzhxy zbnnlD8@Z2yPt_dOpMKCbd#Tr(`47&NEtL4a`1BQqi7(l=sjgwJdbVeBnyk{hp!L1= zZ861O;>N*$D=#M}%oBb2DOK{z*4Sw1H_%_EUa_01XZAn`Wz5n*UYtEuM z*8R83RA22?-Ym>KVOE>SE{iEYBNs~Vme60(&aU5h#i(I_Qe^bvuh#wI2X##kxgMUi zEdFyQs|10szE*4eFc+vFd%2>E*H2?X4Dz0t?vUVm?_?IJ7FKkBw${k#8oc}#ya z=|#@G9qek4-pTwD`Wx`TJBc|#Ir5b3w%Y%u?^1u7eb*DMv@6^2i%ZS>RlxamZjbIg zIeZ}Ibf>*s-^#ncvVFg&&fA_Qns(!D5yP|TMb2*9+Pqh+VP>oG6Yz`N+um1Xc0fhp z(X?*)=EOTYH7_aViM-r0VauK6J;#2BGM;#3H*3Yb8a3T4%V!s2ET-=$w&Scnl^5!G|9sj<=S2>+ z4L;m9_x0L-&Rv*$asSqp=cn20@xPL?%lcq+v(Bpdvw(^o}M3X=At(t;$q5*Jkst9Is70fWLw%1 zF+)o?(`6QO*ZV54L z__g{kkETx2CfgX1P`9OaMQ^uV46?g<uQ@-oKgl86Vu%6zy|iV zb2)!rt&e%n^v_p|ZKDu_0#E%}xlLX>ZH&Hg+$iyX^*iw|TOybF)#FV1pR+D(x%Fek zTHE6b@>PWL1$FGSrWTxc{w3BPw~33<@O4MhO3kxRefdAMp53IEFB!CYhmCLJQbyL- zi|j=6BedT?sM%a@I{^mG!@< zX$z7Y8SXfU-&s&*oxh%a#?#m>^hK`-CmC=XE^&gV%PE69DvnI#q zwg z?m4^mJuUvZ{^7b%$)^qSKOx4Irr;%oC|IKMK9b*9XcC5PL$JyFaG`=fRL9sj%+B3CXq zIb?N6n|S%Yo&W!j&HBGPs(S_g)N2_ETmE?d-)Nh6WKwtGD#zE+a^6+R-C0Ktns_|q zGdAe;nAxx)wcz7}Kgv1}uW2OKNd4mvVczEbMNH4_ujhDD_lcg{4ek9>P7 zO5A9|R?TNW-kHvO<7839P!pK{w)e>@&)u@Y#y{Bqbj{znllyR(b(;T;d;Mpe%+85_ z&i^nu_jZ1k6FY;CWO;kgcj-Rv;1Ju?@7fPqC3tM(Yi1v|;t%+LvenO>L*2|g;NYd_ z+-DRYFIwZYqwVCrCrcI|=iU9)#LF(q_I{Yj(^mo6_maO}T9|r9rtP`6#RmiqTN%ZV+E(!?fap8wysvmc6witYi{tLow=E>?yAdvXWXao)YPuwnJ;g$9nM@Gz_4rP{%9X-adWq#e>*dF0YHRK*dUtfqAI)iYB`0bOPKhd*TFOQ=W>|DSIHJPyL}A+5id~cLuJvCR z_v6HCafzQ>g=VTJ=T7FAvT6RXRkxWzU+T%#fMaEEq9!YtUX--{UG%|K^V}|7s9t_G+G9cgeM)VF8Cf z?&nPwU9By;qNm|#@l}7j@T<8ka*yUEOg;Z{!ZW#zeseu1UHKz(Nr+#J$?jywS*bfo z<$0dU`nKW!HcF>t-p;u_`}ujrpZ^~|o~UTE@EVhl-==*Aii)=~-R6ZVzkj<+LNnP< znngsa-QuyXM$X5jpHGC}{>?15=<|f$jlQ4uEN?r&{%>LI!%ZEw#!Dr6Oiqa~TiyI* zRy^^>3v~w<_opll2i8WViyY=rzZV=_s<&iCY|)k5Uj4__*yE0|m#1x+u**Td;oaS3 zQW<6O7k`#7|Gku{FKX#62JdZeITTj;9P07?&8)c6V`CTJ%wL=}NfR?ngxP)De!OPm z|1d-7enrvyxkuVtRo>_N@t6G1my~n3H`)`~rUB(p^6X`D!uv;g*ob3tg_j}>4+BWGQE%ePi zuDG0YU8Byn#jLFppIUKly=86xMwOLOEAuwl zyk7P)usLk;)?7Zeo3sA+sAMZzZr4=sCLDHj*?dn?e_#? z`YMZz}ue4M6#9vmn!{Ps_(g8Azy zJq88_CJRBIr5nNm&7;51Vd-gKM7LOC0{zxZ6az`>$H(@Hy3HR;cmjlH@mYa;B>?+MoWB zTyjo@E4Wd_c79Br+n?1%Un3<~yxafPp3Cli|Kd~USKat=e>dBQdFs1&g?e?|*}El3 z{`LhY!J?{nAy4B{FaEO6JrlZ(<5=+f;QFthv}Vjn`j~0HBK$Z11kcplKi@t%s`Kvs z`jfZfZl1`@wqz16+L3kV`I%iS*Ij)3S4G2C zrFeQ>vW6R5s@vC;i$un0Yuz|mc-qo7j``ZHd29JiCoc`X^s?Yve&dz}YX0W=>s9-H zUVU?D{!g!$F{YF5yzyRnuv&G_th)=-mR+Acv(<4yE$5yqOJ=9e`L{|{?oQTXrELw* zrycxfW2ydu(Llc3p?yQ`s!hx{c$yFHNzUm~u`x7RQSjw5=MGEz#(BM^>mOQ2^FLf7 z7?^#&od^jvE7<;c}2*DU|Bn>|DBDG-iEM+?OAo>?~XnR zHk)~`wrtwxbuneS0>pKEx3J~u!L)YigIpu zLZ8F!<*QlKbJ`YrRu!!YFj#JRtcJHzddc)-JgKi^ZJb+p5`%Y%tU2$oEVZNJT#?s* z4@Cc^J^oX21SiN|XC)-Dpk79Ob zwyNE~dDCOHV#hTuDdnt`$Naq$m!|TjFT6X0QE6G3+19|W(CV$Oo9{lq|3dWWvEcNI z%z3$Htmub9i;JhS{peHnu|CTc z^LXx!pu9g%RJkr!b)|1zl%UvV;h5Fw5O&S%df3dm8DG3VT$whYr6Ykitw)V0;Q zT+Y(jCG!HB62uA;7P~slzNIV{_f9aCEB1!pK8p{pK0k4PZBX#tbLldt^?L)>ule!g zvG9qbj#EXi?c-y+#=K+dqFRSAr(GHj24|0o^Y6`1w45a*BQ7AK{#wY)Pfj517mM5e z@7a&Kn?n5zg8F|fKgpYulb1MS|I}Z(`!uwJSw2rzezNan5JQQ}n%uK1j!3Tk#F*{y z_|XpMgFAOFJmz0gwmI~OtG2*btCQV2d~1_c|6euc*w)>yQtnh`(V_Zb>$7K>@AhAj zWP0Wqx?-nr<^^Qaw-G6eEt75dWR^Yus3>Z{$~gsJ%P&<;|(FddH?Mmc7z1 zz;UbVwc~n=j8D!2J1UnP-Wgx^OL=?x%<2BcCpy07w3&UeiK%1Os9wFRXQk48)5HgF zY=rB6n%viA`B~i7UiJy*B@gh@8z2RrR9H#KtPA|B@4l6pSSwTPMdS6 z^ofe6`oHjE89=$6?b{aaT~Vw}STvM|bm=`dFTy-EVBqeW_Z%?BK6! zH}_{OJ!bO$;Y9wMf4{~|HMp|wx&6|GDQh049T%UwF5<-8B|QC&j&7g0Go}W!cg}n) zc~eD1*~HU+ZF!Nt>$S%sD39Uu)Ax3)oZgq zaV_oJWB4E;RcQasJ%x2|-%QMn;tMF;^``bts^WLcYs)WmENd*J7cbWbs z`o_xG=V!0)b)H_GAC`D3LR?EG?ZC~JO%{uT)^l=mz2>^0_j|GT(<+*)`>H z^^+eaLvU%)7Z9FoG*;|usDNd#lC%E2D3gNmg!w{(mCS;L!Ob}?*gr> zue~}u-k;8&c82jy#_WXekAJ8B{~>=!;#^Wp#{BMO`~@pi&pR!6GoO`TKqa_l--g^A z_J6BoUY$!kV$hoMc2C;|{R5ikSr6Xy>3G?~_MA_?&9{%XH^2&_HVEWF*#iCw3+#u zu#|m<+lT0olkRGlTSM+z1ymL9c(7qzpU$!ReJMOOCJh}D99H*###(7JhedjLU zJtdjVY4wGSFZ&LuS#Epl|3o2feTGuSYomj##vh#j-FK-M^#53RJ@Nab*2@;Pj*FJ+ zE?VVmVa~~Q?$)Ho$8xT@Y|~hnym8rFK*0GT2o~q*X^}J+5GP#tG%)ZJCi!pj5UkgdLQRR|9u}h z@!I}QN$WjoiWfc_pRi%wc)R@d=k_HnN1l8=u2H|L*lHAEzrVdbT_1b#d)}{@zPvA7+1_w*Ksh1xdET!$BtK)97~8Gv4Q2&JuX_HS&X~(QAz*ecZ)BL!EGOCXyWWL6oUJmu z&sP0sox1hAFONP+@~%@TDG*V(>*pEKB~`&*!{fZ5LOS*FvAMjrW(9QQIWRe0TD zAxG@>u8UjOm@a3(Y_L8?a%xOJ3^r*;5*cr%zYJZENt>_ib6-x{TTK>mIEoj$!UOj}B=}kXLh5sJ}VE z-TwRQ)YGy{KRG)*aQnT{C0H&aF)>r7Wy#_5HQ(&SJp}@GcONn5;hHN~_sTB$)il|v zoqr#9$*uc zJIch_A6rh{Zz08Vo7tnl?wOprR?EWA4Hx>%_RN{FBLB#qt@dv(>=%0XzT?%t$G?sp zR&hVE|3pW|uCzTh?Bb95d!%S`S(pT0)mmB6=d3e=%4ugTI(6Eo1%NpOzl9k=AYYqI;JJ(3@tcwuWX6v50*d0qx(Cot)ZFiB7c?T z{lCYrvThaC+PY@>3V+om-`cY)eNryGQW31_T(UL1bCz{vZ9Pr#zs=*91z$UIDAAJa2d5ecW(- z;Q(ls!?roheJY~XfAYl(dVc>4OMW*^)9Jap zth~1VkMPy{Z)y{6%(gOfZ4Nm(LBMrKSiV`2Wl!_Xxo3N(-*WMAUhv`0fvu}Py_9;e z=>EA)Wf?lx#G}@|Yu&-!#WpJ~zlm?np5Wk_Gf%emr}W)5%y$Ynu3~s9XoivSvxld5 zrv$#&Kly+2;aIJXR3&bm6-+N1A8z!0dgV@0Q!?XWrTrqc1i-1eK(l%LG$oL;-|j=9F> z7x#9utKZn)zD&C8g^DVheyYt9zm;}(r?FoSn3S~o(v%OJ5mJtq_WHfMoV;$|+Wuqq z(OpekL2vdw=#AWYXOF5r=MR?CavxKVoRB+zptW&BDZ>=m2VAM$oG%mq6{}=F2zcBv zwaNMDmky~n%dWC;f3Vlz`g{7z-TME%DfpgY~b4pGCrDyB2h=pW|TO z_hDtA{k~1S_wRFA@8{K!grt9dB`BLg5o<1|I%$$mZGG5;qPz z)1^KiV%Oi@%$}RR?bC)+?yP_8Uho`p4`3<~mAaIi{OYpQ{aDFp_p`b;9JAhY9OuhB zCl~9SHbvLr{nL=`OYS!b{CS=!8f=wXsiv{z-ZDeQM?1L}Ib_~;+O)RsUFHJ@&F5z< zI~Bglc=KsIo$GYNu4H#y*ee(LuLlpbH@z_rpB4O(li^v=v00`J$qz%>v@Hd_1XP5b zYbMWL^QHCtbV=Q9k>&PxG+u4i%>FO8o8{e)V@0}^&A}&PpMHM6Oek1u%BAN{KkY3w zceGhnw{`4_wg_4;vtJ_o=7h8}jz$Z13cqFGswsTh^=Z}p)XIj*;XD82Z*1e!On<5% z)-wB{!_7ZW6KISx2${qsd#Ewe%Q^rY#=*3@ax*v7i}9;b;WvfufDX)b<$Bc+;>C0Q}1Z8vv0!_N$_}?H$Jbw5Gp$WT zTPpWcYgYATbFZ9_9mn1;RqeN%n_prY-n~ortE29lHD7OuFE35C)t4;U+jD5;GtPTo z{$IAv+k7C-HbsQ{ee&_W`|VF8Z(p=RZiTu-yB*t=({FB9*2fihHO>6H%O;EG)bfZSsBscU!a2%oewdx*z z?1#^pe6pNUbV=jDi(m3Gj|3+l-goBNpTCD2HABQrWE~do*|Txx{FqPMA4Yv$Ez={W zuO;J`(X}B~Y5t1~fp$}yr%aK}EM4|kvH@A`?)dWveYQKM z{9_fK=4@|?3Jd_XW5!W?-Xs&Ej#L2@4a8S$J((Zgki^#%MH`^dpevJ zDYw1;!B|Lk4bzhqUu(Vi2Jt!~Rr zIj!H$Ip6QAK+e)`r+uu`*iWeRI9$!O6YQQFlk!h!SH?k)r%P?wAUlOY;|L6lEc=2C zb&hT`pK!oV;S2kcrUlWy9<27!N50>!n)#~r)eHSh-Du%37w&!P*UY2XPDB(d&D$OR zWWC`_RnxZQ*8US_k*JHKY<$;I#9Iq&+qp}A~M`vUU` z_h%^lTJhfFww2$f)@yT)O8pN zo6G5wW!;`MHi!>QttZp!#_jg<1UEz$0i;bVA1^!~}KDFl4+RjtF*N<)#)IZ*TjJ4*= zj@zC#IZqn8vfbRzPA*rPqj;8a>M71EmqWVG+b_QMX?qwr-#yLd)2VMnqfWkFC@;@4 zi-~(%$n-x&$`dxSZJU_+*3WFu=U3+C4c11^W%GY#_VF(}@?&26754b&GNF~`k&$Pf z`o%r3h<@%Km&xiSbn-;x`JEp#POrNCk5#QbeT&Inrkh(OyA2Pu>K`guFIchX|Nb-K z{gK)Q>E=duACq#P&#`-=wdn)*InF&cw@leLc)IkQSk9w6HO;T$uV#dw`Kbma4s(e= zZdWRv|4x{6W7?VJUio*AZkCAFoXh_ILKs6XSGZ97HGT(Xo8w(C|NhPlw-H;R%ePpL zm3iOGr9!i3#_SJbZ<_Uc_pD9fEDt06mQ`sB`UStPzc)uvZ{bw43$G@M*RPy^Xz7k* z{!2}jMP2M}ydT$JoZB%qt%FbOo1^Z(m(#dv4Q7P+eQVpe@Xlt7cku-#GsEKaJ;Lu@ zbMeTGPHW72y-lHZNt%A$*@>$gL#D~Ot<%eUULoskaNzS-B}*yQ+C)Z40jPIs? zy%)8<=~8l{r>=$0In&-r8}Ib*d-GxHe!hx^J3Dhk_21l&-*U^R=gXx$HF(R>l2h8Kn8o&G-97c~ zN$JT;iViE6usPlcwrz~BOgWgex@&FT`9jk$ty7Zf#q#Ice+WG>`S(4qL+|=mp`fO^ zBBq8T;dMKci$uaSj|msv*zt4D$@3dG+VlMSe&}h}3t#@38Ojx2PyYxxwO!(uPLscy zb#s$s%907Y6ShovI_b|Lk?f>b20b?a%z`&0o)b8?SNV3SMDm{S7C*zNh$ZLKOg|_D z#>qNdKe}Dci+Lg?~@GVmk6~UUNNQiNl~(Ote2TX?nParRbs9lJ%2*yeBAC3 zYWMe#^uglKhDkv}S$1~?8GoPjU85(^?IX&)T&w%rv0Gnldy+Y4O)^LeQ2MX**_q?W zp^afLpTw~4y>7)>Al#H*aPQ#raOo-Y59-%OOq|Qw8O&OG;mg*@b8A*S`7C1V*|TU* z2(SKH3lH8Wm(~@`R++J$QE~U=ZQS=FFI8+i760~1j$Lh=k0Jk*PLUZR@3K^6I~sS2 zO^?sG%jtDnM)qB)ef86&#{z2B2YV%ndtUSMOX&T5IPiAD^jRJO(x=y4d3LBgv!(Uq zpOSt5V}Jb9S97qF%Hu!j{QT6fsf{HGr&b)OIdi@D-CEUoo(tp^CN!lu3A%F0U%pZG z;9cYUMUQS;@@j=t!|{JvV~gjvOT1HMJ{UMW5Y`OeDkO2gtKr1QowIpK=3anjP_8%@}{2;r+>)>|de!jWa3fvAf z8@}Bp^K)D3VL!%{x-8lI6^*NnU*^Q?^d&=PSwHbp5Vtbc^xvX+#R+nHZ7asw94vA(AR$b z#NEq$^$gDmP3GU3?9B1*=!<*@&boPJ&&8aXDnBV$y}h2z`Cd}Vu#5TIK~c4xQOE3U zv#uYGGYF0Qw0Y0%y{kG`^`5vbYQ8%qefQZ}KTaE+oXKvu%py43d}9i#=ZW=?`%cQQs@5#%KJ+lQBW=<* z(_(>D|5MlvZ~I1{QWTuUA8wfc<$n2*C0WyrgzSv^8c&LIvu^O+%vtxaU;g5>Y4P>g8iqC?~2+i-BHHlmf}|> zH90r$m{Kl&afAN(qq651HYhCSirkUvuzIDqwf5xMtanN?Tz{#|gh zh=H;3i-Uv4$I~^>OiO1y`K4r(|9;8Egp{kzN7R0q{8Ex=+Ijp(FvGMQu?r1)GwOGq z`k(8iwbQ#_H0G>ojy7 z3^y^q@tb@t^IM$2!%pma~bzUNgyc{uTzO%P%H7Zg44IU)KCldtc!`b_d;$ zMTr4F4{b1x1lkz#>EmgDP-X|UDM(>65 z`k9mVzh&F>@_OjQ3%d<$9nxkUmnb-Fq_~>>56`{|lcv(wiwt($aeJX!!1hedb7j%{ z4J`ADbhJcmnl4@|*cj4$PpbDgt5o&b1*JQm2L3mHu{pcw(cVAXANS}j4PME5XGV$r z4Q=5=(R&_#dVBKK^gGkE7pLq#*Cf#EHOG|qFSA(Qll(_(eKSx-2#M*VfN&MlHM2XD~$9PS{;LVIqrHfL47VlqGUh)an*Y$jmv# za{QvwB)dtD$KROPHhH|rY>jY8sCpT@>ISoysHxwN#MAXPH~ar*JMX)gBJX?q+9a-! zgr8Z>d&*xbZ<&-k~wO`*1q)8Z|6zjuiu>7)-uD= z`a z*@C$LmVuIuiR-R^b}4#!wel_d6H~sQf4)vion_HuWwbm+VbiyY`OVr3ZeKZ&cjxl; ztXW_BXL7&ab7ZPe^; zoc(;wimi$H{E|7QyCh}=tIlgNC{(m+z?t^;zhgoVY)!Saw=RT-4w0NCuySchetO1&P;aCK#7}xX#{~x#a84 zzD?Iu!nc1(NwvLU#qze}_F?m;ZS|K+(ysgUPvGBvyZ_uL(Fyx^tbJv5KCHF-u+@{T z8lfc(UA4j!O;n7?;Qipi1}XJURlIlanaX=Gud)>XwtJ9$3*R45US zyS3p-ijMHgd$zajw(NTxHNChnZ`BA zMJpejZ%&Q6`HN3L;9bX@iajUCWYweuAKaC-xxpuSBQn|fx z%NLz9m$|lKPe>m3Z>vcB^CTHlfS)O9sS8m+e>7_2-Rq&Hd*c23%C2f&dAw5k z$Tyu38Jn+0S2usJton5G{M6^m-}6^(6#BXOOi-BY6OV3Q@#OAnUhn=abg|CQ+V|GB z`TeT1_VX&(EaRMimo|vV9FHoG+L*S$EvMzxdmiHtM>&{U3(XHo>!+2pwJZ!ak((=a z^a)42@Crc(0YTy06MNWW4*m(}bN$A*p**JJ(-kkrN@2(DOC~Mv>UP9)_ut%mY|4Y$ zoFj8yZDfvOIV7;$T8b;=uji3h=AZic;_N%8{NMF}x$)Xz=&Lx1Z+SPR?8B6-J!k%%(-}<#UcOyW$su^m{=VoIu5(2J|Mh+Utu$HW zJEL~W=ZGDJLD`0^hd;IJKY6Melganw$#ecS2Xszv6a0Eqed6=ik$HD!H#W-M*|~K` ztLQvl#nZb#&i22;w}IXA;*GyN>sD_IY7>6t)x4Oaw|w84r*_|izQ%st6}c?tNI~YN z+mGwkq-ro$olIQB5*u=^xm|qM^rvgZE@W_LvztXYIh)Bned$^Bek=2_$;+87_%6N* zwyRo^fAvL!)5Kuj){VDraw^+i`?r(# z(b}t5Zt!XCddRaOb((jh#i=QwE_I5HVMo@MhxAR{C3cYK>$T@v7q7fqd;gF6ou#g4 z)%+L5K3nuVF6n)LwyNrrr=0r&?!OUu2!%&WHV=5 zy<%IqZ)*7NNsrz4nN9lbyM1$bYrJqkm|o5Go4?NM?yTrP9l?06wZvqi?8J1A2TqD@ zmrkC()?6`v7ys2SDvzgLdcPvOmGhAIhY7zpZ$4d`SDfRlzrO$5?(K_oHt3Gf~0f(ZcJ<{1Pcc|Te!LU zWN+4zR}=N-`u^dlTkuguCoI=oGPSotM%5|wXlU7t-8*Mx6g^MZw0Ix(UEfS#c~JXp zu{Q@+)*pmY=UvpYrENnui;gG8a8qV3q!Q zq2(@T-l5kOV;gaGdG*C%P8g5_cKZJr_Ry*b>Uy`2AvWd}y%DG1K z)Hk{=<@=&+)^(=(?%OY|#~d9Q-_LXS_)}ncLi5sjt?#dWyR05RRX+B%%MKN3y?-tW z_W#yp^IIOd>!Nf`;&z|qhT_QA2lp3yE-75+wP#P|#mO2o=jv|jh>_a)xzzF18}}4> z&%56f=1zb6S$zBCSBH`Iv2mEgwVjuWG>%#> zfAykF@FI=`5NhCHJ1tUYOFbIbS84du#2^_g21Z7C5fX zRK8pAAoJi*76O%a88=*%|Q!`fP z%08Vi|2o5Sqx~~^Li4}5Jj|7e;$d2-yu_nm!7--D5F@|1|wTPw&aQC690Vcc{xQ*NW@!o^P`+mwCUEo|v-o@2TAPAvfK6{`|Q({}GFS z@8iIpl7Ii+-#ewzrMk(DNp{ODC-8T*+kM>gX*)uy9-sCU#FFpQ2II}%fyKK$VK5yw$zZE0=bJu(!!$I@ien>{Z| z>cguSW+_KclAKrBEUcd=8NZ`z>zU<#XI|airu_bSdBR`sbB;^bJ*nRR&9h3dbzkvC z^Ty5752}6AIcfJPM(Eq$tC^X1&!>w%_At;k$&d>d-?YTMM6Bpq{O0hA*2V>CvG+OB zSnAg%%WB?zee}fckGB68Jn%fH9d%k@@#&UBr5f)HJNY&h>ZzG}{D#|= zyyEtaJ2~c|KC_efg&CjNH?hV1*Ie7s#x(bell_ZhO#B@hGevjs`f~o=#^v>?_06QX zfaw7qt8=!``n2+r&V8r$+SShON*8%wOci?I zQLE*`Bi$_2v-)LRs%hMOZ`-xY{^Ty)K8<1j-$%0BZA?SfpS|#wk$du$6LNg^XK(4+ zOSdzA6xu2MWgVl=I@x7vk2cTmV7|HU(WgzjWONrzXXV{{`e0`J>$N>Qf;o(qYVV4V zI^b?rTKqdt?E?1{-UMw4;n<+4zy6lTOZI=)wR&>y>8$y_W=)4)s%D6We|4+8%k>|#|aXBd*y(eGGaIn;!_`2lnh1j|~{FYN9Hm}WAh%eC37wU-HxPrU# z@{T7LlGr+S3d~%#^UZWmFGatZ^$nTnDL2j7w#-h}QF^-i!DN%deLA{+>s7?%n?%IQK;|nVjdpa?&kms_*}@=Cdy+OwZ)ZxHe;h z&HG~mSoqi`G|TEJ zv+e7d!~Dr(?dfOk%}XyG*#EoD{7c0Y=fGXgZv&q_(2TKj60BSHT6Lf5-sJE_JU(&` zI^Bkqb|L4?k6-DScc*7!p6zO*k0)md{g%B{Z2rMsK;NVx-h1U9v8?q;_Ya?Zxn%i; zfZeV^Isa~{@M|B=ecsh^FVvnlxK^S$)Lka{$X&o1gE!SyE-M!K5u0 zeIjnH`n7&}q@#An(()#;|NC9rXFQJZmc71f%>>J4Gf;=~|>+(w%!Xu=#W0@m>2p4H(wFu2}rA#{KH99h0IGHu9fU-6%2j)k44R zzb4kS=`x*fl)wG$((VPF#>ow;Ypv%gUd=wa#Um_@HOWVv^XiGktp*SO-qK=o{Zt{N zXKhwr8P>Mar;BzkFF+8_Dowd&9TZ1CQpm>_|UTU1i{RBCpoziPZ9Mf4VY% zv(1+@vAVh5Ve>^kHRVoYb3x@B2H{W-n#FJy+oFe)D%> zs#C6W&(*jSzvRfWKL?Bwcx$pRC@KEm;IcK7x&G-j34Pv~Ss(cq%;z<9&M{%D*7dYK z)%QAfgYe$pJ7V4cH5@hj7kOA+E@jdIwYo=+J(-1D40c*C^+`U#ru(>Yt>-rRuiscV zN&V53OZ2Xh_m#0(UU7C_a$#F>{TEIN;rl_==3WyfPvTTr`zrgy6%AXzrq)NIN@=nk zVrnNNTR1A`D)$vwDY^AhFlG7pZJ?$;D6ubs5*2}}O(uqn|hUm13)`RJc`$ToGVMY)aqjL+p;7sb8z z-r>1u$_vr5Sw-ts_$kk66gv0Fuk`s6#~ri&|GV`@PdfEwa@i}6yT5+;{$)CL@%KWJ zKT!vd@BIH)|8CHoe#MK|POYAPLuOfj-fX#bw%;c38FuAeTBUSA*?bPuE|coLr?&-~ zd{=bb<^JV&+?@C^v2ee_wqw5E)<0_uGg-bc%pmzpMVMLUWMkluo}2~l*sf;@_*c@ z;1gradD&VqV}41IxVx{?tL_b=d)y8FD$PE4Ghg0AuHr#sJKsi57W3J;3pY7T_+!xa z=u-~EG(Oq34WVuxSJk=Ad>vD!{#cV~{$8LpT=IbOm7Tl3{0k4gp?c}qoW(qX!Q0wS z_J&{fVtuVyx#|6x6D~J3A4=8h7WUQtcCC zvu#?Zso1WBn8VLB!+zaR%vZbeYwl^;ha=V8pd@j2)FS!$;OEKX3f= zDO2XsQqOqBBN~}S_l@q9r$k>bkK(dgXX_~Vsqo&>vi6x3liZftnf}iyJX3LA+`xIi zNSSGPvf}24Mqjq3mdiW{E|m73HtE1;=b4kINWAXpG%oQh-~_QyJcEDp+^-@w2C0H9*a`2YX_ literal 0 HcmV?d00001 diff --git a/ssh-launcher/translations/en.json b/ssh-launcher/translations/en.json new file mode 100644 index 0000000..b733229 --- /dev/null +++ b/ssh-launcher/translations/en.json @@ -0,0 +1,29 @@ +{ + "config-empty": "No SSH hosts found in config", + "config-missing": "SSH config file not found", + "err-no-ssh": "ssh command not found", + "err-no-ssh-subtitle": "Install OpenSSH client and ensure ssh is on PATH", + "err-terminal": "Could not open a terminal", + "filter-empty": "Filter: \"{filter}\"", + "loading": "Loading…", + "loading-subtitle": "Reading SSH config", + "no-hosts-found": "No SSH hosts found", + "settings": { + "config_path": { + "description": "Path to your SSH config file.", + "label": "SSH config path" + }, + "extra_args": { + "description": "Extra arguments appended to every ssh command (for example -A).", + "label": "Extra SSH arguments" + }, + "max_results": { + "description": "Maximum number of hosts shown in the launcher.", + "label": "Maximum results" + }, + "terminal": { + "description": "Custom terminal command. Leave empty to use Noctalia's terminal discovery.", + "label": "Terminal command" + } + } +} diff --git a/ssh-launcher/translations/fr.json b/ssh-launcher/translations/fr.json new file mode 100644 index 0000000..d46bf67 --- /dev/null +++ b/ssh-launcher/translations/fr.json @@ -0,0 +1,29 @@ +{ + "config-empty": "Aucun hôte SSH trouvé dans la config", + "config-missing": "Fichier de config SSH introuvable", + "err-no-ssh": "Commande ssh introuvable", + "err-no-ssh-subtitle": "Installez le client OpenSSH et vérifiez que ssh est dans le PATH", + "err-terminal": "Impossible d'ouvrir un terminal", + "filter-empty": "Filtre : « {filter} »", + "loading": "Chargement…", + "loading-subtitle": "Lecture de la config SSH", + "no-hosts-found": "Aucun hôte SSH trouvé", + "settings": { + "config_path": { + "description": "Chemin vers votre fichier de config SSH.", + "label": "Chemin de la config SSH" + }, + "extra_args": { + "description": "Arguments ajoutés à chaque commande ssh (par exemple -A).", + "label": "Arguments SSH supplémentaires" + }, + "max_results": { + "description": "Nombre maximum d'hôtes affichés dans le launcher.", + "label": "Nombre maximum de résultats" + }, + "terminal": { + "description": "Commande terminal personnalisée. Laissez vide pour la détection automatique de Noctalia.", + "label": "Commande terminal" + } + } +}