From d519fd999b16bda2c331c96e53d6eb693bcd4215 Mon Sep 17 00:00:00 2001
From: Hunter Kehoe <hunter.kehoe@gmail.com>
Date: Sat, 16 Jul 2022 13:31:03 -0600
Subject: [PATCH] notification icons

---
 client/client.go                            |   8 ++
 client/options.go                           |   5 ++
 cmd/publish.go                              |   6 ++
 cmd/publish_test.go                         |   1 +
 docs/publish.md                             |  79 ++++++++++++++++++++
 docs/releases.md                            |   3 +-
 docs/static/img/android-screenshot-icon.png | Bin 0 -> 39513 bytes
 server/errors.go                            |   1 +
 server/message_cache.go                     |  67 ++++++++++++++---
 server/server.go                            |  12 +++
 server/server_firebase.go                   |   5 ++
 server/server_firebase_test.go              |  11 +++
 server/server_test.go                       |   4 +-
 server/types.go                             |   8 ++
 14 files changed, 197 insertions(+), 13 deletions(-)
 create mode 100644 docs/static/img/android-screenshot-icon.png

diff --git a/client/client.go b/client/client.go
index 8b05a393..1f0862fc 100644
--- a/client/client.go
+++ b/client/client.go
@@ -47,6 +47,7 @@ type Message struct { // TODO combine with server.message
 	Priority   int
 	Tags       []string
 	Click      string
+	Icon       *Icon
 	Attachment *Attachment
 
 	// Additional fields
@@ -65,6 +66,13 @@ type Attachment struct {
 	Owner   string `json:"-"` // IP address of uploader, used for rate limiting
 }
 
+// Icon represents a message icon
+type Icon struct {
+	Url  string `json:"url"`
+	Type string `json:"type,omitempty"`
+	Size int64  `json:"size,omitempty"`
+}
+
 type subscription struct {
 	ID       string
 	topicURL string
diff --git a/client/options.go b/client/options.go
index 7d599699..fdcbe1d2 100644
--- a/client/options.go
+++ b/client/options.go
@@ -56,6 +56,11 @@ func WithClick(url string) PublishOption {
 	return WithHeader("X-Click", url)
 }
 
+// WithIcon makes the notification use the given URL as its icon
+func WithIcon(icon string) PublishOption {
+	return WithHeader("X-Icon", icon)
+}
+
 // WithActions adds custom user actions to the notification. The value can be either a JSON array or the
 // simple format definition. See https://ntfy.sh/docs/publish/#action-buttons for details.
 func WithActions(value string) PublishOption {
diff --git a/cmd/publish.go b/cmd/publish.go
index 4d6ec781..c6b4a059 100644
--- a/cmd/publish.go
+++ b/cmd/publish.go
@@ -28,6 +28,7 @@ var flagsPublish = append(
 	&cli.StringFlag{Name: "tags", Aliases: []string{"tag", "T"}, EnvVars: []string{"NTFY_TAGS"}, Usage: "comma separated list of tags and emojis"},
 	&cli.StringFlag{Name: "delay", Aliases: []string{"at", "in", "D"}, EnvVars: []string{"NTFY_DELAY"}, Usage: "delay/schedule message"},
 	&cli.StringFlag{Name: "click", Aliases: []string{"U"}, EnvVars: []string{"NTFY_CLICK"}, Usage: "URL to open when notification is clicked"},
+	&cli.StringFlag{Name: "icon", Aliases: []string{"i"}, EnvVars: []string{"NTFY_ICON"}, Usage: "URL to use as notification icon"},
 	&cli.StringFlag{Name: "actions", Aliases: []string{"A"}, EnvVars: []string{"NTFY_ACTIONS"}, Usage: "actions JSON array or simple definition"},
 	&cli.StringFlag{Name: "attach", Aliases: []string{"a"}, EnvVars: []string{"NTFY_ATTACH"}, Usage: "URL to send as an external attachment"},
 	&cli.StringFlag{Name: "filename", Aliases: []string{"name", "n"}, EnvVars: []string{"NTFY_FILENAME"}, Usage: "filename for the attachment"},
@@ -64,6 +65,7 @@ Examples:
   ntfy pub --at=8:30am delayed_topic Laterzz              # Send message at 8:30am
   ntfy pub -e phil@example.com alerts 'App is down!'      # Also send email to phil@example.com
   ntfy pub --click="https://reddit.com" redd 'New msg'    # Opens Reddit when notification is clicked
+  ntfy pub --icon="http://some.tld/icon.png" 'Icon!'      # Send notification with custom icon
   ntfy pub --attach="http://some.tld/file.zip" files      # Send ZIP archive from URL as attachment
   ntfy pub --file=flower.jpg flowers 'Nice!'              # Send image.jpg as attachment
   ntfy pub -u phil:mypass secret Psst                     # Publish with username/password
@@ -90,6 +92,7 @@ func execPublish(c *cli.Context) error {
 	tags := c.String("tags")
 	delay := c.String("delay")
 	click := c.String("click")
+	icon := c.String("icon")
 	actions := c.String("actions")
 	attach := c.String("attach")
 	filename := c.String("filename")
@@ -120,6 +123,9 @@ func execPublish(c *cli.Context) error {
 	if click != "" {
 		options = append(options, client.WithClick(click))
 	}
+	if icon != "" {
+		options = append(options, client.WithIcon(icon))
+	}
 	if actions != "" {
 		options = append(options, client.WithActions(strings.ReplaceAll(actions, "\n", " ")))
 	}
diff --git a/cmd/publish_test.go b/cmd/publish_test.go
index 2b9ad3fc..ee8b116c 100644
--- a/cmd/publish_test.go
+++ b/cmd/publish_test.go
@@ -52,6 +52,7 @@ func TestCLI_Publish_All_The_Things(t *testing.T) {
 		"--tags", "tag1,tag2",
 		// No --delay, --email
 		"--click", "https://ntfy.sh",
+		"--icon", "https://ntfy.sh/static/img/ntfy.png",
 		"--attach", "https://f-droid.org/F-Droid.apk",
 		"--filename", "fdroid.apk",
 		"--no-cache",
diff --git a/docs/publish.md b/docs/publish.md
index b1bb09f8..390a376d 100644
--- a/docs/publish.md
+++ b/docs/publish.md
@@ -2349,6 +2349,84 @@ Here's an example showing how to attach an APK file:
   <figcaption>File attachment sent from an external URL</figcaption>
 </figure>
 
+## Icons
+_Supported on:_ :material-android:
+
+You can include an icon that will appear next to the text of the notification. Simply pass the `X-Icon` header or query
+parameter (or its alias `Icon`) to specify the URL that the icon is located at. The client will automatically download
+the icon (up to 300KB) and show it in the notification. Only jpeg and png images are supported at this time.
+
+Here's an example showing how to include an icon:
+
+=== "Command line (curl)"
+    ```
+    curl \
+        -X POST \
+        -H "Icon: https://ntfy.sh/docs/static/img/ntfy.png" \
+        ntfy.sh/customIcons
+    ```
+
+=== "ntfy CLI"
+    ```
+    ntfy publish \
+        --icon="https://ntfy.sh/docs/static/img/ntfy.png" \
+        customIcons
+    ```
+
+=== "HTTP"
+    ``` http
+    POST /customIcons HTTP/1.1
+    Host: ntfy.sh
+    Icon: https://ntfy.sh/docs/static/img/ntfy.png
+    ```
+
+=== "JavaScript"
+    ``` javascript
+    fetch('https://ntfy.sh/customIcons', {
+        method: 'POST',
+        headers: { 'Icon': 'https://ntfy.sh/docs/static/img/ntfy.png' }
+    })
+    ```
+
+=== "Go"
+    ``` go
+    req, _ := http.NewRequest("POST", "https://ntfy.sh/customIcons", file)
+    req.Header.Set("Icon", "https://ntfy.sh/docs/static/img/ntfy.png")
+    http.DefaultClient.Do(req)
+    ```
+
+=== "PowerShell"
+    ``` powershell
+    $uri = "https://ntfy.sh/customIcons"
+    $headers = @{ Icon="https://ntfy.sh/docs/static/img/ntfy.png" }
+    Invoke-RestMethod -Method 'Post' -Uri $uri -Headers $headers -UseBasicParsing
+    ```
+
+=== "Python"
+    ``` python
+    requests.put("https://ntfy.sh/customIcons",
+        headers={ "Icon": "https://ntfy.sh/docs/static/img/ntfy.png" })
+    ```
+
+=== "PHP"
+    ``` php-inline
+    file_get_contents('https://ntfy.sh/customIcons', false, stream_context_create([
+        'http' => [
+        'method' => 'PUT',
+        'header' =>
+            "Content-Type: text/plain\r\n" . // Does not matter
+            "Icon: https://ntfy.sh/docs/static/img/ntfy.png",
+        ]
+    ]));
+    ```
+
+Here's an example of how it will look on Android:
+
+<figure markdown>
+  ![file attachment](static/img/android-screenshot-icon.png){ width=500 }
+  <figcaption>Custom icon from an external URL</figcaption>
+</figure>
+
 ## E-mail notifications
 _Supported on:_ :material-android: :material-apple: :material-firefox:
 
@@ -2804,6 +2882,7 @@ and can be passed as **HTTP headers** or **query parameters in the URL**. They a
 | `X-Actions`     | `Actions`, `Action`                        | JSON array or short format of [user actions](#action-buttons)                                 |
 | `X-Click`       | `Click`                                    | URL to open when [notification is clicked](#click-action)                                     |
 | `X-Attach`      | `Attach`, `a`                              | URL to send as an [attachment](#attachments), as an alternative to PUT/POST-ing an attachment |
+| `X-Icon`        | `Icon`                                     | URL to use as notification [icon](#icons)                                                     |
 | `X-Filename`    | `Filename`, `file`, `f`                    | Optional [attachment](#attachments) filename, as it appears in the client                     |
 | `X-Email`       | `X-E-Mail`, `Email`, `E-Mail`, `mail`, `e` | E-mail address for [e-mail notifications](#e-mail-notifications)                              |
 | `X-Cache`       | `Cache`                                    | Allows disabling [message caching](#message-caching)                                          |
diff --git a/docs/releases.md b/docs/releases.md
index 3ae44d05..b615b034 100644
--- a/docs/releases.md
+++ b/docs/releases.md
@@ -13,6 +13,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release
 * Polling is now done with `since=<id>` API, which makes deduping easier ([#165](https://github.com/binwiederhier/ntfy/issues/165))
 * Turned JSON stream deprecation banner into "Use WebSockets" banner (no ticket)
 * Move action buttons in notification cards ([#236](https://github.com/binwiederhier/ntfy/issues/236), thanks to [@wunter8](https://github.com/wunter8))
+* Icons can be set for each individual notification ([#126](https://github.com/binwiederhier/ntfy/issues/126), thanks to [@wunter8](https://github.com/wunter8))
 
 **Bugs:**
 
@@ -41,12 +42,12 @@ Thank you to [@wunter8](https://github.com/wunter8) for proactively picking up s
 * `ntfy user` commands don't work with `auth_file` but works with `auth-file` ([#344](https://github.com/binwiederhier/ntfy/issues/344), thanks to [@Histalek](https://github.com/Histalek) for reporting)
 * Ignore new draft HTTP `Priority` header  ([#351](https://github.com/binwiederhier/ntfy/issues/351), thanks to [@ksurl](https://github.com/ksurl) for reporting)
 * Delete expired attachments based on mod time instead of DB entry to avoid races (no ticket) 
+* Icons can be set for each individual notification ([#126](https://github.com/binwiederhier/ntfy/issues/126), thanks to [@wunter8](https://github.com/wunter8))
 
 **Documentation:**
 
 * Fix some PowerShell publish docs ([#345](https://github.com/binwiederhier/ntfy/pull/345), thanks to [@noahpeltier](https://github.com/noahpeltier))
 
--->
 
 ## ntfy server v1.27.2
 Released June 23, 2022
diff --git a/docs/static/img/android-screenshot-icon.png b/docs/static/img/android-screenshot-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d9ffb2ad15d4ba3ff07d3ea52c51766a92563cc
GIT binary patch
literal 39513
zcmYIQ1z1#D*B(GZx}-x?O1e7)0Rcfmy1N;=yQPutk_PE+De3Oc0fz48KYsUme|Uyx
z=FHi1&faV7cfIRfYxpK7D}jbggbV_K&?G;7Q~-hC)_~_{NC?2+;qh`C5C|sFOjJ}(
zQdIP{jUCw7%+d%1qKWa05%|<4OwyyHk@tpy^x*YIbT+adygZie#CzOqk-}H%j?9f0
zC@JjkXc;5@EIK=*dW!wSs(+&Y^m}~+v$4DNWA_c^6BBJs$mv=G`SFp!(F)9ycwmw7
zEJ2oeLX0d`fTgt(Qrnvlq+dy$A>E%nWpNcxNOZ1GPA?fps#``Md45T)82Ws9onh3Z
zhXuy`Vx`Ut@!X)HlSDq{IW7Ev|ITZx>EMhQlGEjtLCC?n=ej{tDR-dT=&#l<_l^3S
zL1?jjn-H|>mupzHdQs(!z%7cXtCdkQlpQgq`%S`Y5ub3Pfx-@vH020f9J7TlE;ooI
z?VlKvHI10<=(CVtecwcU_Fr923H)ZuMH>fd(y_cZKtei#9d5GnCSP<qe}Tjgr=q^7
zV+ESb{4u+zet;BW35P#xC9?v@=<M@Et;PCI0(tBLAGzb6&{Gk8w;A4Tc4<ZZp4$_|
zI;FIaz|H+4C@ik^==3OKWaUX<a{m~yb=s~6&)4k@U>5{^X^D@Z=Rdz$tp%~bk(V}~
z)a*eZ#<zbSFfMsQPQXD#2T2(*#2rLTZ2TAJEk_i<AwmZ+RR>Y9m6egT14z`)NYBB@
z@U^p<gXwDtNf|j6UvzvB=ru_4<A<*<3kS>29=JwN9jBv1Bh~}?*8wj+?Y44ZMeB>o
zjVo3@jA$QQI$t@tT{+dA)0@Ech>F2~una+(_-MXMiv2x0dZljU;VG#?5-H%t#BG}n
zlLIv$Tl4);b@h2V#I-HT541KD^|YCYNk&Lcj*Ul3N`i-lML<GmUXK`fgQ#DBtMOPi
z^SVT=E2mgNHK!66Mw=FaA^>wEP62^CkKm)l_O#=YHU@fqbK%tX2_DaY6pFO8{rN!X
zxm_sAnKglX9b?{CNuFuJ6D4pv?l@g`mydPjH#put%8Mgh(oFqo(|%#t*W<OAB1pie
zim<2A>oQf$ZeJcO$Hz7rm?-z&Ss_kx3Aj8_qQC4|Oe$G*%{yP)Vl+T-+~v>LQ5c{}
z6@${O!u%Nve1NGknQrPJRIOFe>iYZiz0;G^y;^LY6li4t)%Af9n)K6CJZgX8-fxok
zl3$2^Y~{m#-M<&EahZoV%0o#!T;K=yUq!68JM>&OV*At!Ka#g<5iZwW@0nbYoIq>^
z?sP1xP1hBi1OFMAGkw<7l3|2WUz&P3xl^0j`sB?;9tUbkPJbSVt&F`#Yc<nfrI_u0
z5uEpl^wmF;4B_mH)zUnfd_XHP9@2WgF9jcY)l5?{TE@fNl#xH0jETX0Y2FOC_GE&4
z_#ue=&)m9cvvtSo&?ei}s}JJqe>Pf`zgUadZA&K4;B@@Gi+KNz>dSXG>VK92vw$9K
zewQ)Nro!O06Ie9+GX~V+3wK-+6y;tl;W43FWb)6AAW@(%eowwyrl!LaeEc<KkthZ7
z!nS@q5jrgAdmJjbt3P&lRj`(}{rBvB<K-tU6v3Org7$XDLo4EUpz`2z9aq+q9Tv#b
zW~nyZ@yA{llz(keNPHZXI^%INQobs1H@qBG*D$n~kZ={Wa-+A>jnCBhv?$AR3V}(P
zBL8;)rsEH%&~M}p^U>p6-Qh$VzYhpbC1y5OBNEPb)IX!#TpqWQ*+K$PRt~T-*_HOg
z|Fv95Y%L|5RgVSA&eFpZnsZHv^&UeG{6jm6chbr4AA{{t=;#76#UX#s4#FfQN#QP9
z9V1?d;v4>+fLr&YQKKuB1Jr)8Iyx`twV9qcawM=T^ZILX@PA_>-S2_5=nauw?%Q^j
zxpAC)fWIBS6i+Ebxx>-%TsX=;&-X(AR8s$UK)&3?P(54ubDx;Xka+?h%<ySWCgY>y
z1A|H0HO`n;Wc%L}sW!NZEsmw#()bwlRYb-{)xx}I7ac%t4$uVX=sw4Zw{QiC```7E
z`MeiDrl<ORMf>)eI&gToRrg!&F#MXzBSdUF_1c7g<!#$zyQ%MF=F5Laa68tZL`jh?
zmL2y5E9iSIog98?w4wsFZ*DqUmTP+r7OY=owg1+```5nX*a0tIh<`rdb1;{T>Rwg$
z5@2ebMqG>XIJI44!`C{G7gJ)2>!SPD$8snu3(eQ&TM@LZFQ6@Mr}#R@=Cv?4u{xuu
zUWOCft8km!761BffN6HAi38NV$Vx7%tlfjt!oCEhBQyEjb?p(Nea6779+~%dLGVWG
z+!D3%;ZgT$4<X4qmgXG)d}PD(lJpLY!8XBvA4xeClkTo<N<3xo$doy}FtY)7BGGoE
z>JD662hOCw66f!%22^E_C!lX~bs$P;0#q#@;7<4iy(C<Bax9)uG~f4q{vYrlQGBG!
zOCK*g77JX)_R_w+Y=J|oRm`JU)iW!C(x&DM(DzCGJ<$Sk=2B&yakUWg#k$!UEP7Dh
zsorsIZ1k+tAh7$2=i}e)vH%-ajDRM2<TlewvlzaNlEAI;@qecE71&txMpNC!{A(yv
zIuTgd+~(d|Xe)2rC_1B>5xWKGX>USj6L10>EKG`E@xK?>m}KNHwrCJgeLnM#^0KM}
zJ)ANLDS>%5TgrXB>^}W#9FZEOR&3tzO4Qvt^KppI5&yVn+E;AOdPQ$om(S?`VwXsW
zqVP!kvuE}(#M|>V^dqO>I^GFKvr|L_+RJCAtO1sPje=y0T;Uucvs?XUj&F1AyOIo!
z&$ILTHHFDF*~42*#%-p5FS_v+ix_)lKHtpMzQD7ps%<et4&MQ|Bu0aFsP@12-%VS1
zkPx-Hdk<{YqvBEVOKX_b3g=ax@y=`}+wYrw|J|DM055-@dnWwM_r1%#Q0?;5MeqYN
zQx*VUsn{NWF@`%{3_dur6*@#aJ7tpU20vk4@Wg%+jr%v8Abq&%0SitarnU<x%O%D`
zmtfl%7+Mi+qT<T`&J9L*XxJp}-c(EFr#&bGJN5)yH}>pbphlwjY;sBDa9>8=GGEpS
zdvc}#QPs`CE&DrGKH{=T-b6qx@l{kRd}~&g+~qaO4R%PP-GAeY!%!l2_YS7lQ}c92
z`irevH|u=v=V6~-phmy>@1#hnM)U5Q%{sr?1z2r4xx$-8SV4IGJpTXIA~y^j{c!(a
zT5n~731UcQk*==M@mTtl2=dIM`R}9!El$Is)>;7_3(!xqnfpAX|K8bzrp7%KXb8Df
zE4IR&R4Mckb_mmo{6&=<S$cdlGFSIjIGYmVW{m;ae=QYI*v!^+*?RZj{m51^0^=fS
zYsShf8T$WkCsy=725YNBKuhMA&5^vH<*EKUU&uby6{(wjI_$~A1F#1QRitD7dOGGM
zJ`M@z!<8A>S-=`(U454h_fGQv-=*FGqDTSRE!XyMA?`te%)(-~Jlw>;>usyANj9q7
zygZY;zgk@D^X%E{{#0Bnn~;P3cgxA9$xJr=Io=vY=mUg$i012$p?^1S05?x=(^ay=
z5Xi%@fDHc=)_*re4F(QCNI5{y=Ne3OdRJN1KSKVSOf0@J2GJ>`UOTc7%Lha9h!-;?
z@y&l%BnmM4WH&1xj9=4*f#7uDkslZF&+V3}G%jWhS*=|VHMC^uXPF`Uriet#h$-fU
z2bh|}@i~#f4;A70Tz}bTmkRx7cZbZ-6$}k#crX!)kyS~d!j@w06nw}2IWD07wp-_o
z4MmFjw5kSt!~QV-*VKHp#2l>u%{u4uJq_1fGQ`*_A$awQ@7Ah3EPjvCX~&hume|D+
zt}EIOJBN0j-D*t<+=jV^(&1hQ9m5HU{{PYEyCm;9e$!6#s2&*UWCzReSUW-7X=r9`
z-99AhW9Jl^2`oD9qP@}@Ywn{&i(~!ws%8WTE)H<PeIVQij<K(DxZ6LjpyQo;95l9j
zxZDn!yoJa=@LhRS_bK`1C`2lC$8mX(MA);BY$f4*l!$~O4Ni|g{sk*jk0u!H<=6F^
zCe9g%%RaI(L@d7Vi(#p8h=S+7E(8|-z%N#%M{ep1@30?qtlMdLIfe_HqxA3&gr6hn
z7-=y}{$9O<Ppt1c@y)-tMhj~L7lrO>#G6{R+|YvHg?Cb~`m)AOq0=^6hC*;oMAZjB
zOkY<Q;oj9qyN>h>`{<a0c1onMJv3lVggsq${8Y;mrUCFH$(Vn(!Z<DrH#a{5j}h;p
zy?|ljE-oKhm6YRMueup|v2BjP_@Ni_w@xA~7&3Mxn4xfsKv{oMS2BG+`U`uakFIF!
z@btw2>muy%srilwW7dyrt53o$xZnP9l8Dg~e`zino81Gtiz>ERnGDf_-$t0POeq+V
z=!@mCglE4*D|I3%zdTnN!?k~?w-&Bc>|1Bq#Wbf_%~m|(M5^kKGX$3PhlbEieP#+K
zS^Q@)PKSSX_Qy?yS7W$rr|K0lJ;lXaiLUb+Yex2wVOGIQxZGbXe=?_vQOp%%ZWLe>
z=~9dp>lcM=Dh(xEA7C@xZu6o?ZHeON(6-;bT$h(r*Zic4Nc%75?(hA6Sqq&5YswFW
zL!45j46{O)^P`WMKQUcYJVpmH3t@cV3@r4ytB+A*KvoVD3CR=*Xcs9`gu(p^56k}Q
zRiJ*shwQG`OFHP;m@>4C@934o&|ikd=lruCIT`$nHawj<zCEzT2*qwo!b=L{cguob
z4Lm~0Pdo8ANgZO2nQ3eY4hGJnNvv5Uz{F`|E+<YDL~j@F$8$CNEQGU^D5i8M7=MfO
zF-Ppae&t;f{*0GHD;6BkV;<w%Ij(^F4^)r@>-or!TP=b}jA$aUQA@~4o(k?row@L)
zKYJw*=u<F$qU6zhE9{S^W^Fgvdcfc#QV?mKv^@Rgqh<8Km=h=Hfg><PIQ}<?Z8xDp
zBV-4QkbopNaKZmg9?d_%!L7Vj=0Et&P8ZSeK*ToAry6x&utP2K``F7|EtBvNZlov<
zjc%xL(QgqltSn~c74c{pJ<kN<a`fVyEaIKCHR=givW<cX#%>TU{reZD$SGnhV3JQS
z7(Z4c)glI(Qar&p(f-SYBJn(kjmP%wat<WL)LKEvRr1L89fzQLoZL~uou-smZ`q0H
z9T#h1RdGX5YcR=lDF%Li2cliY*S;LTpTva;IAIC?mdH-2PA+(?9o*|h!vUCRZ@Yy$
zbgCC0tQ2r_$`;!^iJ>!P5Z$W}nv7gAG3%)0oPI~k&Gq}EN}8IV)zwqLJd~91-roI%
zZ-Cje6XfYLS}DO#>od9w7^5`I!f7*cOK0z5a!b)Q7tTT`nc3njkZ;s*EsOo~VEl}F
zt~1Rsh)#9_(3{Y$6K_YMBDT%U53m%>b0qlX>`R8y2y3T)lLm5YQ?yR|ALo^F;20FX
zh?VHp-`-n1ai(VC2AY<j8ycRBdOyXIdp%_L+D8f8nU-L5)LSnPP$p{aYiKvDnJ6eI
zY<2u`Vl<)vl^3hU@a(CC$W7_-YGYd4a&Z<2YiV;Adcn=P8VtJCNm^qX{91_1Eil<}
z@xrbw+){GC^oMLuLo<0oT73n>^n3;_<ThsJb#^Ipe~XqAl)PBWnLeqXf8Zz)izT94
z_z^yY%9zR<e{oThD@aa)OCRXq$6C$mx;?D|vpd!%;N5u0q(HM#i1*kOa=YpY(P(>K
zx&Ia(9_@!EQX^O#iiL%8$eSCtBf4`m00BHytdSrRdkl*2LyQpDgk~qzYB_pY!M7@1
zG}*DvA~%f}%{)BTxyjkrgb(>3=}Tyun3xs!Dz)rc7Lj{!I2D_WS{woc7^2uuX4_C>
zRe%?l#{rpym+xHQVE8&({)gi3)agC~jB=oyP&~7@Qqz1G-mv+2ONy9M-n);f7Z2x5
zUs2kE(Mbp3V@Ih4Dah&<Wu&TVa5D?Zy&rr>g`P=#616=fkw215`d+}bHNo1<raMbz
zBT=YRhas$25*#+?8XgusrA=DGs0>K6>@UJ=`RXT*)QMWp7&py({q~2AYj&iULiwGT
z4>dl~`i_C<lx27ju!I_y2Df9v$p6AkOvMA08P!3_e@l>{PMFz}`jLXa=|h{Si9|+l
zkGodsXJ>_d_7egGP8o^`YYNIC0OGqjaso5OzfPA)vV<fIZQGsBEP`(n`ohUXpPwG1
znzhu`iR{~wH#OQ!2gLZFm+V!`lxe48w=Uh1Z<7h-;9tC8wmwj$jf*WU2LMAIMyUts
zoA5WYC@j1PY+Wvmpk+o}6+&@aF?@%|8<++aF8=}kU|Bcc#N}HuPV%z~p;iA`pIzZs
z-ZBE~sJqlXW1WWx60}lYcw0s}xLd*>IJb<Fz3E1Rzk9@mCfGRS-px7JZwB=Kx?k~w
z;g#E&=zo9uU3<$&B_olvk*p5l#{D&a^CIb92nf*<KT`oSMIubVGOF`N^?pPDik0)S
zVcA+o#l)w(yPFrDotVq2w9W&{Q2*&<S$L*Ytt){+1JrP{5%w)4`ly>)Lnjb3N3g28
z`rEf}Jp1-V#9ZG~nqmY!-6jj1kKMpb=Gle17=3c|G}-cN<fxI~2ae_ggP8}Q2>~)(
zfV*+a?Hct9QWIA#0WoXiVz&lmIs|0~sfJULxd^&umxa5Nb)e~AWk5=@6lS*za#?=$
z+_EzVUe<`AY}4y{nY%$HmOZI!P#4TW$jAw4n2$Z~++*qUB@W`ryvt@yCk<|S7raLh
z^l>exXEG07vt~Xlwu@aRS2P%1fd<WRrT*MAiaL`E@HQlhlrcYe6xZ!qu7>-O#bjnZ
z&4{&oUqtdU)w^&=hG&&HruO31h6_xCK9ycIys#>&xCr%cNeSDyln>lV{d1bzYn7>5
zGf_wgT4Zp+_*GIZ2LtxilzoFi^jz-9{J1=5eve;y1I#Z%sxYy}y3JCS7-^U|HJUMw
z#QNs~zt^F$I_KgVi`sq=BP?74Ben~pmI&S4`VW(rdg)fC7)`bDi3^X(4`wljrXw_;
zEm`ty>2-bJT10OgW?4mN8&mNSPL+yQqTtcY{ZcA!84a%#zot>+0ho2+$Jv?P>SjZO
zizR2WRXGJN9^TouiVkS3(cT0Bjp$t<0J1WMy#<-4d(XzOCj%DX=<nY@OG#B7-=Yz7
zDrtCk1<6dqo-8+C|9S7Gj){S8+wYuOx-&x<(>kC}<UWJO8gc7KGD9aLspdA#2rFvT
zWSSo|q;piZ{DXCJ;_$q+*ZiiwbY$v-UAkSAZw^hsU5P_j)fn}R)JI*MC=(|hxigHM
zgT?TwQ?9w@BG&$tKC3!A4SL<nKBRAc6$D7%x{)IMvY3&O*$T+dF?@F4A)&$#OL-#t
z5DWW?nz*LKZkt)NhPINtKi|0c8bn_V`$0MI1{1~8fP=~b`Ssiv7On&W%^E+DCKAQI
z;W`rvEiEnl+F6m}I6F@ukf|%Gw&~|F-5~ridkOsNpi1dGj@rAElBubPQq}pG^{yZo
zU`2+OomY-feyu(pBmVgDj=Z|0i5p>Bzs|?`z)ak42E;a2bNfL71NB*0uDD*?-2tGC
z$&|cBY5*uT&SyX=ny137g_AO+n&nUga?2dPO@*M<VVYXye4039XG<|D$Ua#1sWN%{
z!-}oXO`~*;JRFMzp>rJ*(@zh>H~N!34>Rst8eCYv*RSX3;Y!HGg+u1wc)6@xxQVY7
z>#u>8D%FOn=o|@O`PTal!*+7UlZ_L#8dzO~RAL*{XBAD{Yu03dG}SwLB<JhFOx2LD
zRQ&f)ou|+q{p^a0Xm}we-SHf;gQeQACDF$2o<260vDYI!_m)AZgno8$Y}-T0&zrhp
z_;&S+iieGvUh2YbZcX6ZUnq=OqQQ|MkGs8sEs_Bk-OK&yHpkGgFqgy2+2TXULq8-o
zEp4dD5qjfzTHe<Fh2Qy&R+9tIk;#+kLNMTlFqn9Fz0=-pO)J~R1PCQ6<vWRDVXD=}
zXl8qR4QaCan;W~+CHP%I=z70y*j}Qe7hku1sX2%;nJH!Rj2ab$9`ITzs;duxr4!E<
zCsya`tcVE-34KHq^xya+Vi+&YRiY9wuO%&l7wh7Wy$jR&9-A!6g{+f@o~;G>oDM**
zIjMq*6q&#^2DUkum#W8`Q9@6;{owXWr$hA#j31j$&61XhpQ6YF2sri~#4|Xtg@oGG
zg+?Pu`I4T2An(g(-3})vKL;$R5QA#RMBd;h=`Xo0rQwmJv4mgcncS`p)E-lY4%e@h
z=x(2a$^YEn{q-R=4R?qvZ94a14OW`-%DbF5Z;7{C?5ZyFD+lVbN1bIntuf0KB_(Og
zm0t`8`yY2L_c<T0bTvOe`b<R-TUaJG*}erZcA~%;Y~6IqtDx}RbCDGNSEkz?&&u;L
z-wXKpyeue*4;{h!DUGssc!g<rH=`~FygPS**ax`)!e~14c+gUsxutVPs+fD4<%n&p
zhV|Msz}Ta4^I57|Bc4t<zjx6G%;D0@Os6lXMFN;Ruo6K-oRD>}XerBP?1M!B8*@q^
zxlECbBksV56b7Fv6f{iEj)psINhm~OS%Oy$z5VuLH7WJQ0swc#B%xK`74z-0erw2I
zAart~RCeMa)K;@_&PUNShfcrgtTz?Ftyg@;Y!D9>Nh?$;QMT<jO1w+p0xxwJ3q7rk
z_mLSqKY8{oS?^B`x*o(xAfcj`UR?|6cyfd#(*K;a@IIY~pc1ma@S*$J^4(}KaoVgo
z`T3r_D;SNMfgwWPKwPCcsSR@MUGBK(KaWVr>CphbU2#7uy5^rtR!io8y1{uk*~F;*
ziH}d*7yIQYmW?`1t)NN=V0aS~lP(vP-f434v&Q#VR%wnSJfJlDE1s6e8I8W>o!Oo+
z*Rvw(c>qPrpfbE*?B|<4p^(VX;?pI+OnjTJ2rgx>omCZ5$JS!9$36p(htob#I2lLE
z-ef+<LM8Y3om)-E(Vj`hc3-AfsUx}P-NpKPFq!^M#d@En$?5l=hui&uRFPB#uCwu)
zD3`|wE*swTzNMpM?|b6<6+60={7UeuHks=MOTt6lRuVKgIQaZbnu*2wpt3J!B#Fg8
znB23wzQuA+0eb_7sC9*1d7ks)_Gje?T8<S!9Jy3a&P6~$7{mj)QT#|rWh>=vS3%__
z3RZr82mJRJv2Dud)R}GxujsrHb${L1E_u!#DvUX{=bAY6Uo~{f`zdILV_{m>fh=Zn
zBi%<Br{{In^u(INj-9!=RW~R*iZQXWzT*~;b4cZSr^U-+5$QddPu6%rwNKpStFE&x
zH3F+FNDm}AV*3L>im1|y8^V69?+Sq;v5*cO?NG??aNE?L_7)~K3}v}XM+U<;r<IP_
zY)lL%bp4c9cI#E;DQk`Be5q`S2VWwV10FZ$&wj(OmgDPrIjy4UIXqpf9qu=8ck_V4
z#0hnmk&@a7XEC`+Fd0o&%zbtKiB7q+uufCs#Fm{fnGiU=mV>ckk@DSGo9CsWtr}u=
z!)bo%joa0%<HGd;kA1^kiUm>L0mS<{{rEJFRxz^qss6lud*9;cPpprWR8&~_#43m2
z^S1Q9S1Q__od^ChZV$xgs#ARcOG<LPeZ>LW{rfl40_9f>Wkp5B#{K7~DDcim+4&Q>
z%L$CO$6lVgKiDVn`I5=lgV$fH*~zv)FL9d418xffv7a2~s&+bDK%ff?`pFfcRfp!<
zW<h%?UqeqxnOCaXhz)8Mh;BY^>O$SEs)mwykgtsTV+id_E4W>2IqTM^as?=tYN|mV
zk%rdPCx^NXKIjo(o$e5rE><>cLgHQLlQxYlB7^<xNWD>h1X!fatVBsJKk(Ft2?^+z
zencp|F_Xdl?AE$Q&sIRVSc%~DQ<Rpj7b&b~R}j{q+b}!^Uq76iJa<tpd@d4`ME;bJ
z*x940J%5a`Tcn;Qf-#1Oc3oNj5KrHa0adcb)*4@^NnGu;zF5_8A3Q$r8zeivM&>#+
z)WLhY^i9)!n8V?4A%1O57kzuDYBy2G<!;`DhMxX~?!rY>!~OtWvE#kh`6@UEYOIo5
zb;c^5=9F^WSdi%vDjEBp4UCAO?3C;dIjkS2+gW)y$&GTktW}|7T*A3^I%+XLuH1LR
z*LHyk^U`_&1TG?C&eC#@#<^dC?KfoC`_o}S<~dv9k>R#)RtH`+_JZMvpnf{##-Wyd
z$InmVv$27V_jJbg>~WU4wX>u2LJni1UB~--Y^=rdH5A<9rC{Vuj~?tl`hMprGBQ+u
zYOjEtE34)FXS2s(e}6x}&GTb8|Dl5pSKm<S=eC;-l&8x9I-hx~yA}82ZU1W_)2hmC
zG+TPvnl`co`&~?~6%QN$mOwYRx3<ro*DSUhA9Xs^zJBfApbT?8x`jx7`O>#}YSWkQ
zj7g5~JcM^yyfcz2@!0{@dD)dZw=bN6ikC=9iO1%3I^bm6wX-^Xn=D{{f$N9!?jD)9
zeAKCNakxjV5V9aNQgKyP0x>bMgXQK#v&n*cSfQxCF1qrzUl(SR#9QJYMQ2j;X%=Gz
zRyn2{vw0pX-Oz&V&|#RJ4hS9|9=PLD2hX<Y=4#!Udc?#60)ob>-MM6iJm0~<z&I`(
z0})cK)fg=~8IhKOf$|-D9Qq*+A*&1K%a;<zMlm|kqXVx>hV0co<N70@^Y1+2KQ<9a
zH2QaUJ6#+tLkpn<L7h=Tj2+CV?8CnTUTzY%JODcuHL@>?`1qc&<^1UW5<Nv)N-Ftu
z&*Tp-0U?i2$eMq3DBS|#mQGnp`N9o;{k>}8C#fChrD>EuY`JAC(fwOZN%sr&U7Uh(
zwqB_y8oF_(S29Yb6Yo|c72?v^<4OghGtol*uvQ7*0)ef-%b4oCg5Z2dL=lmu7!X=1
zdeN72Ia-1~$crIdXtNN}Vi7&1gwCHZl&$7m!mj}|n`jB{dbMwuYgxf+$l$XBd!n`*
zZKZ7`05BYF?MxbNH4E@&)3y;3+H&`ZH#kH@Zd0?U=;%K+N89(Kvh9YfIu3FUAP|TJ
z>4VXDjse12Pfw4>bJum-c3A%BqFL2_QocGB;?(;we+;|rconi!9>0dQ2NcuHsSH|t
zofkfnds|^@)eXlh?!>hRQAYD;Ms2Tmss{6C79x~q9Wz|7)O3Vr87UB~4*mZ20{HHc
z%e<wfEn09pwLM+3y(fJ~Nojk%`h?K2K`9Ny2Uvgtriqv5qB;K0Kd&CnM{j$-S)}y#
zP3E&X?2eg30|Ek=_gW-TNw}lw%9}z3+^;|<Yh4&D5a|5eVQtj%=g*%F?<6KaNlF%7
zU89ro+TH7bsVOLY+gI%|bVpuSn2eGEJL%S;H{85zL{Cre;&?UF>+uc?8+)K;kNh@r
z@#*p2yk=rX!eHu;HwN8}aP%~0Hx6Y!3($FU`LFo;BUCu-vF6KU`Ys;+tXl!x20#o#
z{);uwi-Y;ir2D~<k)2g=Th~5^MdaPX9}-nPDi{VWZ(W%E1-+NOyFH)bJKi{T`4%3c
zyC88)dP(9%!<C4y!wNogIGFS0T6MWBEO%V%fYE-w_8uDL%<|5Cv4(=jcp;EsxBgCt
zkmN{E`}py(1(<$Acv2EUz9x77?508IuRv@cF4){Rbk5(TsdLA|vS}_Nr+2aP#`$`s
zL_z{}Qwcq|90`izwsH@ak@gmcxrj3T#-Z%t=&i5miQdw*$a3Km#V+TMy_I@9W8Jwo
z-RaXUhvKXJD%tjPjq-$<D0>4yTp<amU;$%YUbiXJCdU#>4nbB63&pUI5Z$w_0W($O
z(PYmd>)nzkRi!fG<2kn88E9>t$~y$UgEad{Qd4vSW}iW(_Fwgy9BP`1iH`^K)c~g!
zD7ad48BXDtZekQV?Z)BoD=Y@46xgq%{;mDi*gBTvx>pd-(G6p<o&`EM(Cu`+V*e!q
zR9PHw^CH9b&TRE;B%Lo=$lHq)w)@`V#j28)%@aI_9|V!yr9wOryegKOW7D&pIIW&>
zIX!lnUj#7THhYF_!GyRt=Ho@M>+xgMjqwqGXlN+$gZuSS^YQu0J^8v*^S5u2`Oe4M
z-5(|HGe((c*1l0^QZNZUC&3&GTnp}^v~diJ9Iv!;TXiGxI___290!woZLLd?7c?~d
zShxZ(=>ocl;j`4jk50mEGc~LBC}H$wwAKAOCOO%4>XOrHVZ)u@a&AqWN9Ay(wa;0R
znu-d6xz8&zylb(qyZdIqdo-if4rUU`q2my~97Y%OsC<l03P`i#w`?K^ngc;4^JmM3
zlHI6XB+pvPsPkqtlwt(qhs?Z}U7z;CVy2c4l*uu_vP7t!SE}IxLcT+2#hAc=)U_#{
zysvSu{mTw93rdDHiI{{;QS)9eCu5T;Ca%=*9FH^UFj~8W&0?e>OXUd6cF?cG&UXO;
zlN78$BP^#ElBQo2TrOy}yk>RWWy(hBLVtDm!p+xN(ShdYd4``dMpL<C)T)hPqBAl^
z?k=GO{0%!jQ|0Z-2uPwqsAU|5Ja=I2%ktD&#e0|Y=jJmhfD5Y2TbozMd5Rkcl?NLB
zj;7#XH6q_@KBjX=0-|#SOYSK5kwu#K)9p~Y2|CV=(KwR}e}?#R(8^q24r5ypEBhO6
z?xew}*fLVx?h~vumL1g9if?<F9=|9PH5H(oeX07NCfS2f$qtD7NN^2JhIYqmt?dmt
zuOC_-V&DIvI5J9gXqV|0M|Vj&avfUE%U#(^nyagV&kuCko|ioc!w&5pJyO^>IE|a-
z^%Es3qwjqWjI~`(bw~z=^M3pY0OZ4OMM~e7VHz|UGhB}-?aqgeu5)F{`x)w&KB>lQ
zQ<<6VwOo{|0F)gc$p6+Nyq|-E$y&-6yn@h4cTv_96}i4AC8=(DGHPfGbUYed5>b8O
zE$?+BE?$z`TP@e|&n%FVk^({++-pw8d?`6EyH305LxWBI-y{7oENc<nn;bOG#Hvam
z7}FsaD!W()d7gzc4wK>2-0Qn*mp&yVQYb^Oo6kYv=mIQnHtF&)EC|QTU{x7j5w1sc
zDaJ^)nosQO6S%Z$qjq&LJ2-R+vvhQvJUY>a`uX`~Cn@&OhKA<QsM06kq&PypB6Yx@
zEdCsRXfnVVbOyhzW<G9!@-182Em_-1h0b}MfWDfwgkVJIew5<sb=d3KOLxn#Gcv0r
zX;%;Yy2q$3$0At86G0&8w_8YKhfZ4DkfihVEy%f1b0|~CRbFV@4`u(6x1Y2mYSQC=
z+1d4>(p$Hd>=E65G(#YY_=MAG{`o7V>vW!X(^doZL@{9}bvSv{wA;h=RQoeX+v6#4
z040G6se|}lbxLeHVGxC>B^vnQwQ}x+hur&hPfej28XIAg<9jO{Q_`2(h3i}&2}JUd
zCbqYG*JcwNZBsj+uKWiO!&>A3_-NOzEus#b-<}QfEO|^iqFwRY+E%ulEKLRkDGQOc
zx?OGs5&zt7gy_KP9yXzIz@8kpJ^KQi{LcFQ^7(bMc^dWi@7S&zrxJ~uk?k?5iG34B
zg8)mBsjXarySu&?&~CPdgJihNMr1iJ-(9}yoAsN88tqL01l~rAOSRcL{n(zAAzDby
z$S6<K_Vz32?y8I=*sJO#U5T~#_AABt3O&Uhv>Zzvx@J>?CK&7G4rBQc425sCCEf5E
zNEoI;vV}n~1Zy;+v?FY><*&9$+n|Vy)KYqkL4#(pB|G@Kk&fVAkd*xUpoKxz<NUJv
zCj6+`uvzHk@=c*~d?fY{Vgg;C<X3$U<%?EiAH#b5j4QJ^^>-d-@O(0>7}m^gc|2OJ
zDbKl{KFCVS`yX;uGe?!rFhWXd2fv{s>**hNe%=#0hyxRrdx<C&dzf7sdkZ~1J!yKJ
zX1d&`*TW<U+*=$qo&Pld&;fvjCk$`LE{g%+0zgPNd}ug*XgM+INXwz+aD1!sxiws`
zD`+xX6!EK)6^qd^pmD3kcnpt@MxAb2kgq0XW*(<{FQRVkCuA}5zTa<Ph(IfAj1tq+
zqbMpWitjWOP#<->F3!L-pZ%#tP3ogkhVN)4U#2b?jPp7p1V90XM$4%Gp+JMl==dK-
zQ{DVQ2NDD=FT?V<A82#lMhk@7BjoT~E^mM8t@n6zR3Sg7(o!|0QPFbcDQ`Wc0@?3)
zXfS}lvp-2+zC1NFG^{c{<ZaPr!VAljl50bc>I=)E(exO{6@1pm1H|o|tcnVC3wIzh
z2n^h*?Fw1%BHnHQq;H$;SBV_^jTK*xSNaYq-^#w(fk(xKWe-$smip)uS~j0zgJ!=_
z`HN((ozQ4inTFSJ1g`A}f36;0B=>c`fWtu`R{9I&RGzXF(|gD1u~V0pU2TjeJ@&20
zQ#XDW0kW@RA8JiaQ}R09aO%Vhwy0N=)B88ipZWs9LW4E0P>9)Y1Qlc@u_l%2w|>=U
zZlAh78<;rddvs|OR*#gXeYqAEM}W>KWvcJh=Sh1;^<}UmbUPi&?utCjn`ExnV8tg_
zaapR4!eIz>&z)`(c=i%Jo!)GETt7Ou4fPM39WK;b&g)0ow){`W4=Hqf{QiC4K)kD~
zOa0)~`p7{3>sQar(^E%`Gktyi5(Y@R;q~#(46r3R60GcJB~lM}84fv1%0B2&^B>Ih
zadH<{6$ne3T~;odnVGc_XOZ&O6i6qI)V7Tj%D?q&MVtYvMs=+hUOiNVdVsdKw+|MS
z9;v!QU$x)EPTG(1RBzmk>kg;vx4%r~w7L=?<F06b2njXtsQ)03irTRaUx1&c4Oc%a
z3@)as=+YXIMwUZA3VhU%bNVSExri**NCQ7l<Ib65sU2Bm1V3;!9o>dT$plBj%AQ>|
z=}20?7}&Mmv1!X?dE&WcL5M&WMI77(5Jujj)ax<<kdTpjhjbdc_JbK`V(ar8dqowF
zTj;2aR*%tf`|mKJ;r#BsXs`#$WVuee`TRF;wVJ|({=LQ9)w=|0QX_iZbf%MBgPYwh
z4A;|Jd~-ul*)LyA7B0+|+!n1+Nd?2b1#jQoUmaT2u_p7CpRr}?P|7b?#w8}IXw)Gt
zXk4&>M+|ITG$DGvFusl}SHI0tq@+VNE}hG>p)wW>i#w%JN*bBavup9j*F|{}JsGX>
znYCYz1s!=KgZ&+%`lQ|5E)6aG5tI;yiiqj@Y@0P1m7lB;*4|2>zonuI0@#=m$`FP|
zyPiSMFbZ+2dH({Vtkrv6rB`PIjx$D0YMFaf)pOF7gB^=sD}!fI7!jp<8RLY!K5AXU
z4b-j5vpVI(ZTaV-l2Fq0G}0hmXCKIj&DWqB4NAp5_}gJF(sVJ~G-`6EqpzaAlj+|)
zU31_CUUQsfr6EHC6@NX*l-y1>kFuOc^$b608$VSh3ANsnoO6{WfW1-lD^(kAa>6_Y
z?RSQ*WMZp5@12~EmiFAOFLqg|FV#6yBcvG{18&cE&U;KU?IEPjthyaO=1}f*S;3nV
zxRGS;7^b$Hoc_UFK)_~dXVu}NqzvrzkIY<G;d`TDZl5-$F<4nKUtCX5#zU!S6{$J9
z1DP#ucSq9#tJ}|Ws(A8Wr&aS<eY~`u0<zGpUno@dA-oD-zs@T%@HSaXuIrbC8!__d
zsC*nH6Yz9J2kKrrlmx3ET^n8fA5M6{7lkpP(mR9Na!RdP$5rmr4{(SiTqb_pf#nQe
z*<$M_Euyuz^i(oZt%CUv2Ct(vj`EhQz8Zc4#~}?qs3-?~ZzVTcrHUIiMya>crN-Uz
z8GKo6?!=~|WD}peWs-Za3hU09qBVu~Sh(pU2Hie&vEd<gX&v@X-?>aV&g0Nz<D7FG
zEjppdeA2_yDN~!tSy2SABFc-+zjn{v<>o-BKRGKfiP;NwRN$H4rh)j57m)IQRc*&#
znw<TR{3s#D@f)gEMg%ZHJ%Hx{S+v&H_I3;)EekQ+d`o6C0a79wCML+r{qb9R{%}AO
zoi{Y9JV^{}D{V;plCECx!}Ka^pCM7KN33jTj_b0LyQ&l!8D-zgek(*b=jY2_^<n_X
zt+Fjsn*`O%l*znyy(T6m0GdR>`sO=2=|X+dK`moqv-<qho^ep-Vc{a&&Fwq^yA5bC
zp<H(}KZ2VC{o(QP_VHQ>^hx&UlV%zZiQe28g~!RdgC-+Bu>u#X!*AWI!^Pv&4a?ta
zzGs`Xk&;TdmU#ZcB|wLWlyzgG&NVlW+?J89-yiW&-WSi$GU7yw&0)+jZb*P8H6dkr
zsQOyewQ`<Pt6Ic|^eyuXzh6VImkwd;CqGXmq<)iEe?f+!N}u%!wydt>&}s9uL1W5&
z0u652sxE+>?$$JwmuW1hIjdkBVl#X(tFC#XHLYTiU<*9|G&mZ=CW7*(xE6#_VhPW?
zg!b5c?0xchxMV+SRWlm}<Yxf$<-Z)IPCmc1^eZv^;`JEe&1Ht4u2%gXA}0trsD@rW
zb-jIA#z{H$6zfGk{0hW=RT&Z<@{YC2?(<`$+fZ(+$!Lc8;34)x?f$Wr=xl18YMqRu
z^(QGQ{jm;TAaTtWlOZ+0C?ye>Q&!e4u#zesf*~_3=PA`YdCg{X<<ergTt})ks|M6!
zKm}1G>l#cfEaP0%j{~d2>lUe;;4=XsT_2#)r51iIs|Xn=rZwoIWL3~E4u?A6Ls^%B
z(j!&LoM^Ua-!=!)RnF33zyxgEkk-!JkpOWvH^xQi+9H`bmAb_&e69gFJno60-}7}F
z&JCj95kk};>VU?HsumkuJ<qCJ@?utZk>b`EtrJlkH`>4wf-HuM!)9ED`#keS=+Vv*
z-aVNB8JBE9uGl+M>jO}WjCx{SDzT7j>=fL+`h&ZSKt<G_SB_@QSi|6fK>Rzh(PXyN
z<!0w<^LU;srq{21VhSSovmX=U<11bI^;g>u(iXr?7l7smlx|w9GJaSWvdG98%me)>
z(uv8EkP+T<`tRQtX3h9Ylnkc!ay<qms2F$?4$>@*hmzLsRXFs%{~@T37+>5SS=E14
zj<J_5XwI&BK8vRN7g9=loeQ9&q2<{_M#}E^W`S5)8*gR7%f+5pxI3UNaerMfeP}Ed
zZ@Z}k{!KE|F16O8*Cp<BFemBdo9qDojWsD3NoGXVr%`9g)AY02tCi5ld3Q`Z{}9^|
zsNpfcUXiM&q4P=+QI1J8GGp|bTi=2R$SRvO{AL^{X6H#&i1x2?7x-Zn>}Pq>)VUgo
zMdXha9}=^Kn7c~2D>~9iz&!H6bwP4LVPbGW7%`sB_2PwZ$<R_=-~^g|+hrOnQ}Y?W
z<;ZCT<6zGnJ$|a)(!s!GwAw*-NA~9Um*KrkhjRSH$@%x+GxnOS+f>TyWf0e_ev<uM
zYEEA?ZksHeA0}1@5U76GBRJl@ez5%OG<lS<sV^a)b?Nb`Z#b&9+pW>+*;apSN$u2h
z@Z#alsEW?v{k28>J8+-fmcwURiOF}zsn5&KZGHG!?0MRYk>o-n*Dgmbu0QffpY>gP
zLgV=#cHjPawA?L}O!q1(4~L`LFw>RHcoGJEFcvqiCJDQnnXMk-tyagZ)!z=?%%npn
z-KZWFI%m*1E08u1ceRcnYFequud<SX1no@JO3j>eSj=wNHJWQZcle^Rz8`_p%g&Y<
z4j?DSk?D&heSg&$xvG-vs-~Zl3kX<(O!pPpq9B_0?~NyShD%o~+BS|wQ(Nerfa+X^
zfcqD7@}i<t)e7BgO+)r<X7Bh6d7|Z9`j3kY+>ZW02|S^oQMGBbXCIZT8HIl<0UD<i
zjv};<a?xebj$y(zy5O&%4a?~r{@W#F4^&CYvZ26?-7IoXMnLMO4^YXN35-8#!ajoh
zsqUqyEuV%VN`sz{3Kxwdv0<Xyyvmy1<Oh6W^d{BVbv>*6Fvny@PNU}cz02<X@2`O7
zEX5608+Ws&&lkhLOWbXn(jropTh_tF1l(G(EpCgbzZNx7ZklSAmmYiWxixIALk(=*
zmj1k$z}D`G!Ecuht{&H6qv8$fkEK$2DGs?O%k-R4qi$Ip8yhn(gXnlZa#+_xxbfAS
zJ)#~T9wPbBRQ;z!3u6B#iid|6&akTC<Me(hoLRV7ATHl5+h#PjwSD>QdE5@Dn@mrN
zwZfb{jdy`3fb3}Q`Pg{AQ@I9#AGV|4*U;&UAeE4k3I*TZ;%jF$G&Iblq5zeu_qVt4
ziUwLvdwEtH&3_U_4q&J8aIqJRjmZH5!wX@ce%k(^a4!?eV-Hc9DSNpY<!XOm18Ozs
zL&u|MhUk*>oYfFP3x52#QEw7@+VXDueD9y)a##7M$ziQ4>h8=wEnG$0UDWS{3RhPt
zq)KBK&&<fODnjp@S2u#14HV%XrS&0ZeWRHa-D_!27igl<51uFT(vK-ZC*#81$~u^T
zL3vBC&O)GtpdX$T&SIKIs0$@yqg^aM9)3QS6q|1*yaJ2Ox4){o5>bocNmQ3cZA0_7
z!zdlJJHPF<GX^`Jbjeb;A2^*ZdQnSXHLBLk_Fwa*d9>!GjdCWiS!ofjTGN?$CWOKD
zkfp8Ek@}Kb-&&U~m`l5)n!|h<99{RFpVTlq(c(bz*1d8d#L@mRSz`_}#}wwpa|C?v
zkNddgJkkwD)zRZ7rtM*0x;K)%uUirVfaG}fp^o!%ZCl@<3OyvIk8E35TznWO|7Z2?
ztXRv%S-XdKD(m(eSU5Q1$7&|6y11dzp-_<FdnfnD`~YNh^qnX7<7<Y|6reb(?bX=J
z-vYY7KHg;VenbIszc$u3pp;{Aa9qkp2li;W&E!fxA5J6cRFjv-I&OU?b6#?lNMA8A
z__L8!QipqSqJ)k#wCk-&otHhY<yR%l%xFgiuSwX9hk$4b)Il{O_KMX@0HRS=W~tEy
z=)ziO1!101tIswIEbfv(f$aP3c{}0|1$`_PDId5m%Qv2I2g7-joU>*p93wR6rYf5}
z<CzbL5<ms0c3`d99J3A3mm23xVF8$R@sTR{6cI!EK#*dZCt3)fS{$vi12nv*Qo5(p
zFC7|MM5c-wX%8$>a~scZvJ{Zg4f&QXuh|KI#TK9SC4lQQxZovyTZxjDb)X$pb%Y;R
zMknv|6R<ms(J@tAO&N`vyZnF@^ViyK_;qA%0R%DGbTl=_9V;f2b!$ZFD?YWDBST;#
zPZKhFeQ~ZdY>&-!;z_D63!m4JQfnCO&$r}K>(M4Tsw4IRI-S~`Eg(+K3rk5Sobm9F
z<Bgeh#nzC%?}`fDx%NWaxk9V7?W!F~<0d!QZy#%PVemgU`e1cQ$Q{uDEgG>FXrW)G
zeox9$b8|PShs_7#f95e}PDzjLdc@#gOBGo^YF{1>HKMaHgpzVOk*GZ1ngen>LWfD_
z@K*JxF)L8MbAZmoM@Q?TlMMl_4(-*(!$hl2F)>&VmvxINKUyF|$(!!{r!R0uv>e98
z=(Xy?c~+C|-Jpl{Nqk^NNQOP*;X=>msmpwg8Jj(1_%c2@->l_fLi!yQ6&VNj?P&oy
z-A_9HCD&Q4mg^@(R6>3NnaSTnLu-j*?NiWSHI<QKo=|Avq=fBi>-E{MFeccO^Iw^_
zR(s$yu2cRdr$fJC<F^b9>8|HH-|cs!!Ohj9ys5<ChDsUFS>k`f0U8hvW=d2r@-<yx
zbVf5o&CCd$pC1JoTetKP&`5;k<S-i>T_5Tkcz_ZUg!tSWI?Of0Yav!|tyQrI=gF|}
z;lqcE-SNjlC^|83fSQiip#~YRp-sARuqn-;%EL-lr?Zi6dm>g>aDR_D&dZwj0D|li
zTTsd=&VAq1JEy=P6w^*4ORo{ZXg^e>ao9(dzQ~oR0g6*&`;#Wq^5NeT;YV1Jkb~#0
z2n2!*-Z^zu1p6+2!=6V+&w~r%nXNwx3}4Pt?|`xv(4a&z7f@9rBzc2B@N4_G*rh*;
zX|skpB9kDX*ULjK&9vbLmgNpOX&i)$h!^aNnGy%5i<{EP!?am+8Z$G!Q;|CsyUQ{Q
zypyKiWB;61+V}P3f9#@9&OvQB3oRM~P;oV|Z)Z4lzGdFhm%zQ3Fybtwv-5){`?h|*
z%=7Q-`s$Gsn}gM+vnum*{GFX0K)E-6u@;(haw3YMSE~-l`_~@cna|4)=32`oQnIo;
ztL5#sQ=r^zBST|mNGcdaz-{vyQ1W;yal-OXm#RmB9Pwr!S`Pa3<xBaDQA2UV9JjX1
zx~q5;k>?a77=w7E3y?P^NBI?RNhOzs&G&<dpxQ2-f!%$5=Rkkv^c@*7R5k6BXX|Bx
zM&%+L(5_K%>cS6XkUEW|!+D9?131qvE#iJn%Fq5&9sdg=(n4G{xU*XKCM2@dtDe^a
z+uP`Xw|Ca;u|+l=$#7}+0rkj84G0ipx^r}fvl$A~IUkZfI9?wuBVnLiQ<@Vmbx%g6
z^XSog-d~xYJoZXqH&Shv)81GhQ*hE9iZaxo)MgbUYm-i(0ByI9QfZ85B)sFkcniVi
zFVu%W?>h=+#^EJ*)-J+R!~iWeWA2&g>$b+ybtNQkS<xxECs0eJ&*YHlcJ4X9e9AH>
z@bV=HMXm!?)RY!wqrNU*()Dgj6wTwMl!Xg3ce+%GR6VvqEhaX`JUSu3ZFU$~;$7h+
z@@-x|QjW1H8~M=i6X<YS9KtoS%7OQI%AaO%E3U-3oK7)9{q)&bzx+eNMU+w^qgL|O
zIy>1jM9AWWW`wK3@eo_zJ?sf!2m}lwk0Hm{?+f<RN-C%Q)R~}@j>l{AYU#pZ<IR|0
za^qhCr$ay=3c2^)USV=8pYzeswqk+Z9%Z6(s$C(=<Hh8cw!TCyyFE$DP81}hwe3Xh
zjfZpU^Sy%1GlO_fay%T;u2(9Woxnr(v%?|2FV~9ATY%d`gq~f)w&@aPUA#JcU^JZ%
z9n;)Lcs@V7xTUWc0I>t7s5~^s<}$Nf4`A@goSwWuZ-%tBwRVIs&_(uA({VaJP4Mi3
z^WGD@>o%D(P)C_btd6XtbPKiOVzb<RZS2JvR;E#}<i4U`$!sI+{j){?y;jo{ga6~&
zdzhPbLyJDQ!^tl~5sl|<@LAr^UNU#{2KxHu!wnhf>BD}R7Lj`y%wB1R=3rl-&t6>#
zux$7d(o2f>8dVGjBiGT28<h2*O(cFM(lm#SU@0%CLC0Ya-%HRA1b66$ABi$AIKs3G
z+sm@!vL&G-^@d3KTnTh+f9xOjnfMhND-RNPp?~KP6pb`i6KbU)2hzs+l-S_#3-;?>
zx7s&AY{r<VQ0vI2ZD?IPBj9dDKrjCg)Af2a8waNl8>bM{P_dH6s@&R@KLbx-dhVMy
zBUfk+yV+=NZ%#w{U8-=&VY~8%!%2a2rUj1HXcQGMO@JDgfN*rCPysK{8}L($uYaV!
z)3_Fkm{?Rn!JR&#cMp%le&^X`Ejt)g{p#@P{)lfR%C{3>`=!beb4hc&?Xp0~2E?!2
zh6aMf#Xx~ESxpZTpw=vt0>1*iWZiq{x16tn7ZMUmc&dvl{QVnY(c8;QFgZCH7w=UL
z4RQ<?);sEgw6SmOZ`u6e_7H8jNngzSdu%&a5uK@~efD(ZO+Q#|j{?3F#;=W$O_2>m
zj0_uur<qa;Ks%#bOt7;y9ly+do$0SO9~Ym9LxTI!!-E6>>jFcyxVSjGWi+narb)QD
zLtl@RmF7Q<b5%8R;$n5@;n?X)d$LczZO$c{VgV5KvgJgeQYD;U5pQp38vUJhpz2@c
z$`jD1Ujx-gn52l=Sz1+^9bB>+!Du_gn5&&Z{RMNdZY+K=^2l-*+4*U2absY3-8X&@
zea6U*=9&PA_MV%i7h%=drb-nWN&^B2+t&Uf!Lr$k)VaS0S74c7h`Qm`b_srtb11x}
z7q$|;?C;oisQLC2B9Z$ZnN#R_=85>`V@Z49$;`$v^p%Hmgq1{n(u)nzuGB*TuuxKG
z-2o~q%6Vk7HIR^j8J;rSM_W$fo?|B1BdnL3Cd)Lgsa#v<?b}X=xtTBj_5uh1Ui)zB
zeS#YZsK|is@6?<QBsHAww?DO-flj76kg-BR5NaFDudc3_7~rI1EfEjcm!~h$v=Pu;
z>1FfV?rv|#^Q2W8S*_OGCKm?k^3sUa9UhTTsQKwNkztXLtL!JyX3vk@kAa5Gpk=b(
zGF+NWoz5uE+>uC?v<^`d6@|L;y5Kg%au|SFU)WExB~6qXL!IRa0>o47T}wFpKfk3R
z;l1ibLj555sgs70xjFlOk%AZNZJj@1OMSOp*XucBir%9h>uSu6a%>Zom)9zl#k#dg
zoheH2LNb)VcX*a`^0W%!Wqe<!O1b!iw%1xM4>>e1TXEhX*z-3m9$H^cme=jGtnpQ|
zCExaK@Rsq_S&%<*uES!BXpDSiD7ik|%FBdQJg)hw&!*n?>E~Y%i$juJK2FX7wRiB!
z8qnP^0Vu?r&&hy>ehbLKFuO}d)n8$O{~};S^_k#L;P|xM5VIB8kL^*P@R|haR1qn%
z4jZd5M=9KBCFPK+tV6W2I>W$~gIHV`b54}S?`<d3+Ab76*Z`1PfbaNJy}?a{Yatse
zCAhLds_>s+)d*ICKi~{ZdX3V*PDI+per_D3ccU)x_<u}&RY084&MnU14DRkui@R%a
zin~+Xp$zWsQrszRad!#@io3hJ%i!GUf6jmJec@$Z*!lKOR#sM$KrzWHT-UpnS%YfU
zu#L8=ox88gFW~-@yMhy<AIo2T*&2@VE>--EHOuelz@)=F2TBeu7Xhjf;~l>J4y(6E
z0rAA40oTt|Wclu`FAChyeH`8pu;w?Cq0;$FDVCQ%PdQg$szQUl0!jifHGFrprjJ~h
zhOq7VQ{n)?9A2n;KF{b*aOYIo_!uNSO9J-msA~IxoQ3uh!ujhB(lzo0Iy)f5O2q4H
z;b>)w(IJE+%}~!kXLzu~+_i2pkX`vK@%s5x3tsf>Az%0N=&n0n=`iLUwTRPP|FKGA
zr>Ri6#HHa~{f{pv4)9Km|5NxHRWkHgy=xn2vP=36HvRnu-2u94{PZ@V(OAXH>w&wF
zkRzt<-S8s8U6dmk;eF8w2F*~w!!Na7N*ulYYc`G?ux|cQ63Psxhg+v8T!MQHXLE;w
zhxU_P0iv?LHq5}Yk3o3DtB=yDh(smwj;-vgOflZ4<sKOW3+7tj`9cHkwB=E26R{i%
ztz#jQ05m1F1mZyE=-?l!K#-y`YTx9~v4NR+A0aX>B}p|sYi94C4)f1n*M<cuz4{Z6
zXJ%6QNMGuN@7|XLZyxxnJ{XD~XnxjiZkt=S9J%h=`s0EpNSR&#jT8%j#9@kJfdB}F
z>id8)+QZR@$^qVoX~oRs;IIhlAx*BKVL?JoTwDV8Q%0T9tT$A5dTGz`gA=|q(p0;$
z41IYN>dt5R{ImTjN5j&i^UiPMS?T-R*B?5~&ip5M@iIgQbKI`$!`v@dkLBnB2MPIJ
zU61Zr7Uuz*{*EnMGHq?`iyb~Ud<$DD0mmAnxgQr;l7E|U5TJ(l(Ovo}^iwU}VoJXH
zS$t%KnV<*2ghEl$CPj`UMt|VajA2iH$fE$9s=6yvoN0ZBdNIpX7MbG9#w;%KMZUGS
zrrVrCPmmQ9_AG@#Krz+x8=u(~8WU5l6|Bt6zRXNXZ1}^f_k~7@8&6&vGa)qCSIXWF
ztrV&*Zvf?1Ex_o}-&u2f$>oQ3p!S~b^GP{*Ucn-1zWQ@T_Ir%1r@e4*ad!xN-n%lJ
z&d23*i@h8lMBL48|0h%Gp7Ov?bPzpIyOZzAiuXi2J2#32<U9x=rmj*U2Wo%Ij@BDP
z@blI_8CxTUf$%1n!|?Z$09W3uM!&v^c)^SJNxUR0VYXmjJZ(R#G6foEE&EquOTo5l
zKod7-csDgm87r$@_PJQbOy+Cblf$&@Cq@GFu#=_lcm|smJBpS}T{@*_n=sA4hTHaj
z|62B)fe1QYAbNUYaI96~Iau2g4m8tbO?L|FDnD9I!r!257Ji)MgYI(Na@~xF?JDC<
zF@yZB(>>a<txV^;uH^XT%kFT3e=4}+S)F8%=f7v!;^+^KxQ{`-cds!&!Si$oNIG8=
zBp@T8V8BHRhKdW6i>>NV5-B|Vfh1<_vwyVK(tiCX#bcK4M4pEy`MX_Dll^X&ln-Nq
z++8uX8iNHiP@tF`dgez?`H**3mAjbrGW~_^7ZUMY<|rLZo4>wUpn{?2XmyH97^UA4
zpVaD^OEa-ExEAEFswl{k09-~;D+qp`<uF;>$>w@F#o$%--@iOXHZD3EWh$T;D}NCC
zewOLESgw2g{;J}+kUl08sPe%&--D;SeMdPwJY0?ji$%9C)Mob9koVt*`pv<ASP-iH
zX=>q$N<|ce(cbJ-uJd=t*N9f3GOR=g3zd>^RxLbL3TIlV_6+!89dEyh-D3PjnnkY_
znO85wd8rwSeV=j;BZ+`2LqeZN2an?wMo2^5y$rUkKI<)~cVW`Nd<rvVwmrG1`fwZ`
zb&p$8LG6~iuV1y{LitguomLHHyUN6IwWvads#MHwG3}a=jUnDvq%DNjACqLxEkUya
zs#@UOcdJ!?McaW(rY%vF>A;cUoxa9F>z9rxUhlv6gV2|%%7U75v@&1<<_UjlA1c*g
zz}?*0<VT8DP7c<P<(ZaZT9z5Nm4YW~UQ{t{$=EW$&||!AWofk!56WXpMpK&Q<w^PO
zM4?M=1wy8j(BN)n=`vo9&8!CqJLx_=aHTLY7!jd{xf*KLF);C$^_Ou|%JX3v+l608
z2X&P35>IAp+*-nh$51zJK{vrWswJ|1X>-Gp*Qq*3G|}Jw&TEPiZw5^U2d!y(EjcIM
z<Ar{&{3B?2c;2&$@A(e&e7-TBd3y^x#V^z|{@Z9L-0^?j&~H`R)VdH<PZ7x<VEE`(
zE^$nXDI0njHlB>aEO^ve7E0V)#i{s^d77BqKQWz){^%RbA7&RMzt|+^#pl}l(Luh_
zNM^GQ5=wd{m70D;;s>0~Bm#k@(8CKc_m04Og~?g6CfaPPaO5m}L|h-0ne;@GmE#&y
z+tk)ZEJXkpk@0V5qp2jMMV`$Yi;Tf^|NK0A0w6eqW32^;0Rb6Ve9`k4zvC29GkT}e
z3X6oD-=fDGd&ebJg3uF(Q^3kfxyR}I>&*LpYKrktGHncoHT0zU*KX|;sA{IX<3-M+
zXCePLv#Qoz*E|S&VIAPI1N4x~KO`c6{@>G+dY7`aZYjGSIfA+)=LJ5MHjzXtlj=67
zxx1t5HWP-?9GA=EJlisy((RW66@cHVg0y>?cZV$10cic8Jc&Xvp6sH++OW1VJOe?A
zk_yuBHsEVJWm4$dnhhg`mLO}Av#~7<F43<}j>8?D;Loh+gG~aX)%7;faVinjZnTY#
z1i004a{KfSZ6Be9b)|ol$l-JOsHkaDO#QJR+7^g0KajFf`dfV8A+UM~h6r}OH!Ls8
ztE({>S=qV{i);zOtj+7gqJCHTwvLYbvb^hmd&5vL?9lAn+h`o-kS;5Qb5pt|3@W60
z<LbVggB-iJ$sfn|Wn1^Fj3;y`yBf=}wX!ijhWsZ${J>N&3NkB8Q1^twJya-XrzMH@
z3=YmMv6#aIAS&WUJuwm?x7&_84BpKwN)!M>aut|iCd><(vu7tM{5lO!SMP;J;tl(v
z=jfAT7fdE}LmN-{|DsZS^(qo<qGTanBl<=MO_ufZ&JxCm<XU%Wx5lcfZ<sFoK}1is
zHNBu!M*RdCk9)BsCOXev%$mt$rNHbtQN@eLgrVA*<+}&1-M)<X9w;JgsJI!yfL!Jl
zqC8ydc<#I?g_t97B47&zN`tM}sr7Dt*!S-4?&=)em65;dj(v7^Hq(V5s~)I5_q`bm
z{`4eLY>DDqZf|jwWv;x5_H)7YY+&PhCxUmph3Kk62lhY4K<KkzrXklv3dUI`hs%X0
zg&rPIv!rEfOgOQw`5cv{F6!~PMst(<r^B@58c5ZkO5AFrt+$1Lor>%Ovq7CrB%_C?
z0N*hBP4*;*=SywW!k9Qy*y1C}a+H`Pv(!!mP0>wPFEgSZHc-4bO|JIBbL&SAa4ije
zQRK9qne_g-Dn?=1uJ3O%E4Odga<YkhkR3`g8<z|%TJ7X(hX@`=wbpb#id+U)6V4y%
znzlJBmk^~7uD3Ehjaux_jrp&u2Ta?(Qh(oe4n##usb2Q=9V;R)fKN|P52ptrgJ=uJ
zqGxu_H1OV^r;><rW?zNt%$eUkE-rjFY>A<Q>{b>nc{{=RZ(r8EmJzDD-!VX5Gr9Gi
zX#YI<KToI;$Rv^2iyU4fZ=NJ;q7BzF37yWg^~4B=tcYtn+$H7b&wHgVnoe}K$2$BT
z>c0;|D`s=4C@oa|C!Td;dSUK&a4GX&7GwGLc_}<nMT-LLt7)r9DbuSj?nRvLoPq$O
zf}@Er+s!^{=>qN%V$!0fo@5inS`}!cYwi^U(D|~F8AZ8Gy!`SP+B-G*(Ig%0$&vI>
z3n{EdcnJ3Rsn@Fqd2=NIyPln@g83w!>%&TD(VTm8<Hzd^pAE~5TFAX|NeFmDG46?z
z;(Ld186LlyH~a;SAIbxkPp<CoJ-e>=*vXT)`I2Eee#i)CDyck)RIhm>@(R22UI^@+
zx=5_DE?{@O-)g&EEr0ZRztf(GY`FdZZq9B|2-mI`RfuDe7SY0eB3107Z4a`-A4NYo
z(t?r@Qk>!Kb_{)=NZ}%1YIQd$Q4|VQXgx_DVJRNrSWFmPIPW1oCSc)|#;jF%?KEtn
zlH>>c=&O(hCuA;Ed~U%AKhIJeNqA`$nc9N!A|9$JSva8LrcSV!ZA18$1j9V}*{ye5
zyOjB;nQn34ONq1)RV_WiuXHMsJaeS&cn<n$f6S*nlvc<wtKNTO++%I&*}a|D=fh`m
z0sWuPns2=FUr&vWwyDj%TaON??Ns9+Mv%iTry~_I{Hq=MFgWgmjbAMc%MNg6L0M>0
zTedVZ+=<29)M!Nb@9hYe|3fUXmnWOvq=7wz>EXwsSd0X_5}#j8*_<M<6o&^>h?_)_
zP^#b?b<r6rs~d>|rxyqVQ%QJyQkXcFZ0krhH$9vzk+&y-g#!AEDptk#3sy7|3Jj~%
z_Wf{-kq7K;PkQOop`l8i)<Da;jFoJmnd}VLHJyrcN~Cp4aJ`g^e)tKoVQ%@CW226`
z)0W=8d*&^%Pz0guT0THqK`9GB4%|?vkjLLhsYQ@g_~#WA^F&LZRq(GtkMY^97ySn<
z$J--J35W`$+;;yH_#wBR50uI)mFNe3bk^%p_s1Yo28KkxFb!^R>nj;Meau&TE|Aou
zB3CIW-b^Gy3%XRyJcgyQt7J&K<r|JCTU<OXFy42PcT#LBA}H8Qo2fuCJlr;yP}<HQ
z*_{?idz(29-^Q~PB%qFr#)p+<N25q=uZM*tn{{J44gWw>Vod%iR4@rp?R#ctJl}QE
zax>0|yOGj}AS)3_JTR%X@K<)ihuTS}vk40tF|oI#`+p!8<UdCjCwX8DK8;a5?rFT9
zZ9$L9l%+dJWMBR+R_7#GFNwdC4zTNk<w9oIt-E~^afBn$R%fu;xBNJ}TMzKNy#Ji6
zYClMw+V8eluWx%e92&pd1h+!OZOjapl~eu=yE!wzLDzuYR$gaThNWb7KQyzDL@qSo
z>0^G-&nf{6pg*Mh<@#s>WTnvW)u`?Pyo@y0xb0xXU*|ZEKK~hr|I~JvN$D^|72oP)
z_8%z1;g;5n_#>3<e&;~&_sL+o^p~PZReg%=X2!?lo{U4+l1FFD2RVhW{EVa<%<4?I
zM{W)zxZ)*se1^GPG(?fyV|^|=a*SZRzgGIePnji^^JYFNlItOwYDuh&*CMF9uv~=?
zWiRWT`j}ocC?_oO`Pinm#ghLZ@u%T9gg&xCgGl)ps0)=)MDd<-(Hp{?pWVO1Z+J+O
zAJ*$t9yKGK)WXE4e`vVM^U7S%AYU%q#Cqj{@G|o6zJj=oyz%|=KXFd*zTYxC`d<Gg
z{D1F(P$3b%8sqE^D^(qHx3)w@h|Z>BB8ge2#1*~2D2|MC8Y_ibEextcGR7Sm=QVKM
z0Jt;<YZMfGHoe>yDfJ7Few(V&58qmr<@ai+^lbQ3W`FG%&k6!;)19xWz*hu?Ac-UA
zRdq49RWtEvvo)azjRRR56+O!<hfFN!_{>?NL)fTGm6tpE)+b_P(eHrwKJs@ChizXA
zv>$4L+MnS%D2)`I=(ug4^_P~%pH%`rw-C5$dfQdD>{o3#&q#WW{pJ48=P}_J)r8KI
z!1ct$X`3=aC{)x*SD`|1BXYAq;W31DscWsHT%j3`RG{f#=~aXF-%L{SxlNl+v=M9U
zlq$w8tf~mpQ4)%!ItR)((9#%+3z=zLFzqiWWNnL}aoP~3o_=CP&MP7a#351yq;oB@
zIM(QV<n8@|mrW#V_N@n;TG+qK-1-{jyaC2w>V3Z)6upe<e%oz`x)>(XEQH{_eOhAg
zE?;oT`3wq-!3w1+vN60tz&m-%QDM70{{00HBq6&-%D<WbyOTH@vs?e)X!cQ)APqtF
z+kxuin$1}l%$z!n87;{OeRlH_8FSLG)Fo_;SVU6C&}bPh3=69qKstqC>r0Sv-QoGF
z(nTMblRnLAFDs?ypvhb?=~bq;G%%AoNus6=9*>4q-61Qs{I5@zguJ=#=3frWPD&=*
zSVglYDP+Sm#@@MLoM02=dtVOVTdrM|>Fd+oj#0hs44uf;LjE7{t1b4%f4wi&W=xiz
z>B#Q+$74RIm-D5;$79mwPjV~);5F?}hdyfby|MwWtO=)!0<HhoUu6az>lZ78z%4m^
zH>3ZKC1GP<Q9~*{I>$wa!ZnLWINV}!4YN^CSBVFLLy5ytl@)7e*tY#0Xq`etLXqN|
zE|k3dgpeZ_DrHDLl|>|WN}CD4nd<9GZ;*XIWt)7%^(eLzsTwGl-cx%IYBc?UDbbrM
z2Qk#;zvf=2fD?UOU>D>hRV~-Uw)h*xcB+1mAfmIr%yaa-+Hf{uaMzws?wWA1eE8e0
z_G7=q=U+kpgDVh1wrb{h0i;djBlfcRU&S&K)ib&!WDmVZ&5abpC5Ftb6KM8y)AWvq
ze!w?RNvUzgV8t+S(AXn5Gr&cIC?P#}j&CoAlDqYU>EvEm%76On=-JRh10&JWasJl9
zwqvIFp!{~eH0Nlv>l6i^`;d`$ytuyIEZaf1Y!5SE-CrJNu{FDyQf+EXWci@bdj$M5
zX~oo$unUXtK=uFri>6qrv<*xJozO2J#9?BwP0G>%EM&&sk#q0a@=8X<Dw~gq@ySE7
z60$CE>TWs}hgfl8W$A$eLi?&_RSZBI@xTHC8wGzPr-BUi!a()t<#4)H9W?GMI7jzw
ztL}Il-&-)xwy!`fOAMn8dZP-Z-_i4iimdEl%ZA_O^$7Se3sN9e(*Mah@<Sw}`$tS5
zyNyj@Wz|(;@m$K77w;P9)`7Csb6r!L3?5fQW;fq|WAaDTGc++%UZ#bh>pGh~(-A1e
zA1=#W$4{fSqe;vH?)S8E2UIwUrpA{wjk6>8TbwvZpk>B7xn0|VK8YPl2D2?-6WL6c
zibzIbxjFuX$QvNcKArZb*35@y(ol}ZmCs`RLMkc_LXDlBxx`iNj@5DxL2%CvkUr+=
zn}%bmO{j8qKlo-5&kZ1HUnB7apPAc#XaR^v5fj%uj=0UATFPZ$PnZ?a(hZE^%vi0$
z#;nC{m55J&5~{Ed4N9fBP^9VcKmH9*G5MDh|B^aEH+1R(K`4u%R&H09(N&HMo`#<#
zS_e*os(}swg4wVxs3zV313(EDlGKeu2qX*rY`!#vRy^sJz*99};m=ec<D)~_Pauul
zDJLl1xDXNR{^R0%(WNONum9#k-##TSOWO_#!}(1VqrjJ_rvV=Ff&?hJqI9BY9r{>u
zc|Uz1%W7og3YzzY=cXkhmJSY-5jwt-+n)Ip#S_hf&##PQtBh$Ik8g{oN}(Wz7egwb
zkm1RgPTPqC^YcY|GerqwW~DXTA;3S&VM0XutM??yDAVse8Q@onAmO!b-?jshik&iK
z>dli3Qbk27{)*S0@@(x<!T?v14Y$krFRW2CkYDWHrvDr4M;Y8R5pvFH4!v>qJVIEg
zSi)#=(`TPMcB`VESaMQim=8%~IWyz8pOeMnoaE^M#a297G$ME2524&^+;Fp)lhLw2
z8PpPFNlm4=pwySGBI2hcL)H23=>RJ+&~RM|2R^8`?xuo3xL_#<(nb$7xe*BkTl5Q5
z83hzZI0co2k`-;57r96$MmTk?YN%?3b??=of9{vg()a|AEqlIp;-}rN<cYE1d2M{*
zZ=|uM{~{}nK7c}j;&-!fiWG5Q_|V&=CW!%Dm_`-f4<qV-4D!P*k{&Awqr0RpOwf)D
z;7UC*jo9FVYbte6`(e~f7+a%lvqO4iu<0q{duiSE$Op<)1nub+c!BDR55BQxQlWM|
z%y<OnXJype)03;Q*e(@zU+9v4eH`>Ei*X*2d0cPk+|U7{e`<dq`{vfD-bfvA5>?)1
z4{byo=W-ssqtot8cu;BZvCz{@L%vLBv#FdcXEF!ve;<`nApYbV$B#t1zXz(NRO-RF
zXo*1*3~2M~SgXlIBX<?mtkdhsg@?Mk$UNUVuoXPf@Cql=;aeE?)hrtSo;Fq|J(M%a
z4j{TLD#zwZ9sMq?k=?5xxLL!(^p*}s_^PI-u`&CJODlxfMefgzsk?DT@k3hv2>ZPG
zk2%@id-d>yC{APQ6~tn!A<`QW^9@*G|9tZeFhhS6>x(VUrn&UP-w9c>@i~?r4{mgj
zxFibxFaEHVysw9eM&LCs!{2SvBi6G9RZp)I^7z+?pmBIRWzO@1|2<pMsxrY>tX%&f
z3P7Tsxm_3wLZm6~e((a+eOER}mRiIuyADnvafm-vD8}G-p=O<AT#O8IT!_s1!StG>
zy3~h2$!^cXKc(0ilxL^7k7V?J;N?iWVyd}ICE~}=R%+5zdM7k8&ia_FYLNLE_AyJT
z;K&|mRgpEJnqbq>wBT|80(cQRFlO?R3x#%HD78?U(6*r%&zJ&x5Ub&gpto@Q^8MIf
zNCO*sJSVx4ob7r%`@o{nKnb%Io;R+{+B3%9gi$m^V#*)QT)kEMDQCjfLf}9c&|Xfb
zO7u6Hu8;jN+OKa1tM|Jh*jYdS8+=Un3*7{#I>Eq_CLo-MdJrwlFZDpV3e`QCVN?4>
z#nASoK>j#>dqvK~=;UFUOIZ0Xsvb#fo(K+BLryj_R574DQH)`WJ+(6VxOhMKuWBz;
zT@Mw`rm&!~ly$gGvv7wQx!HGo!L^9LsN$Z0=*P<uFlJYTr#WVn1Pl5U-)ys(Av0G~
zVfFzf(aK~x+Mk}f0oiI<t3nTkt{5LFO4wGM-D%ao5``~DOk%P{m~oWHdXs3Zm{X>I
zUKtW1_2+L<E~)t!zLb5T-h>*_UuoIht$!Tq^SZbJH=h4d9}(0DaYt1$HokJ_oS<H5
zc3IKDAmh45a~>M9uJ33Z1GN$UC%+#R(=^RA*`(EUgwlk7F?}YM(jJXO{7onY3HMmc
zjgareHQ!lrt?VuWlbwKYSfYtIiKs}~_)&%KI@oN`7(o#fF-izA&?E@Xe{Fvnpowsj
z6v|_&DvHJ2+cNKFHg|>!X7(^y0>fBRkt5Y9afZeDnMmOP-2fkASH^}j3U$BD^S~?`
zs&p}WBFw0--<_lvnnO2;^~4yZzCfwJa;(PuMHg>kY3rnVp#8H5Xqg9$pi^(w^7Y0^
zI>6EpO)5DQZmMvJIlKl@pVebB(xzKt!`17D>Zcpt4Fq~Nl7}YbyncN<SQ-Q$MfzVC
z`DOpKjD{y$uT2vbe&@n)+E6&S?1{}aR-_t|9ry2iw8*AvvR@jW$>yC|SxGqXon4r7
z8y>RLZFLRP&5@@_8LF{c_}=%v-5(PvQ~X&l-(BEi71*+IV(_1TOQGqx33-rYFLDhj
zglfiVQkAR3><WjWkXYd&X`T4$9GH1hZ{wJy!)3yEGA&9%tMAP4l-!ZX0LOkrgy7;F
z+AE$igU3%pXkVv;+ukf0SHo{}9Hv4nt(9yk-X&*0cphCr{JipWeurw@Y_yv?Atn+f
ziO78gOUIjqMGu~Y82NPEp~elxY{6}^9VLk@(Coed8?*3Oigz@uj7P^4>+2FyWK-#(
zH`cG>iOw|_k_P0mF`(bF(+5D%N0g@-Z4WpSiY=MPhj5gK7xn=6o&yL`q|eaeWxw}$
zzV`WJcY;$(V5lA2C4KhzxN_HhoYVE_$AI<0gGhmG7@>Uj&9<Z;-F@KIn~9sSfG2g!
z=PW1x-2NDR?K4oG-??tr!^As}-M%@*P~m-_*9)Ip@!&x}Lz_S>ij-k8k(`~~erWKx
z(GrT{pW;>I$$@DS=JL{1T4uH@957?|RW!M;E)B^zX%wt9UCuR)=o$k_-T;MAm{(Qy
zQ$q-V$qJJdgkNTu{uIRk-84@jrikLO6lnuf#BGvh*Hwy|R->M_?68$lpc$x677W#Z
zeA2=l*%g236JmHd{V`Am6)gS(Bm66H$@CI=>x8c14LONaCV_7N!?Sn=uWyx>!<zH!
zI8|f|#aS^Gt05rBQjnpVi}}EM3Ed2jMAnywB$l_zXwbafXm=jcunzVfyrdw1nrim3
z7@Yr+vmk9Zu^IPs;d8%Eb^BYy>0&J`K*L1jX$oUT)i^-z`LC7ROMbOqab2hXE1^B#
z#i~5Howhb_{>!J$vbq1&0^DvSD_h_DY0v{j%}%~I?%Nr6XNkUCv0+8=y<fI=?>unZ
zjl#zletBF6R~Hu-!v+qN$y9Z0_gSeyY8j{E8Da+j223eX4NQrujs)dYu`3^xCO-_D
z#lzaNAQl@ScM4lAq4Xv^a!>(B0q?a>O@S;mH7q?D22bKpp}{BC>49>m$OcFj^S9o>
z;+w`f9vi_@x0E~zX%yvgR?;17;iE1Mo=ich)PqsxhrEdb6hb*P3QedsfVghXPbh?#
z$U;X<EYq|Lk=V%FTICaLQK&@4h@-0zLyG)B{uoTRjDiIHgep5!r4=eXXZP8#m8Q7)
zugiv0<^D$KO%4<Bt*U##OW@m<hm*M?*fDRpv-5gUYIMws$!;0{3ZvRre=Zgb>9O0X
zD9^95m!$%}-8+eR$UR^BB_NWKaL?(txgVv*-svyA4Dwxdn*4_0$?@WW^f>*#5lUw<
za{n`b6^3uLi4o9&0;xWZ#EHIezCUloLGfy`Lwa>Uv@;gJgW;{jA(pgP-#An!$MGt7
zAxj0+m|2#)VqAh-hUY_*E^}apsX(Gh&Wzk@yalyQJ$3h{p_r%V@{_`<A@eXQC^RsP
zMqR%erdk-X7;6)SP^5xrpke-+CP^nx^VmA<044d*MvdLEDiyWE8294!Z4t{x&i4xK
ze1OQh?jnd`s8snuTOtI<gxoGSid#>b=R%Q}15!$?ZMI~yJmF=INj5qc!e(uy9t@{`
z?6GzDu8G9q_Q*+!;v#Vb=hDn!&IT5Y2}Ui*otwCrN}-NNvf>UcJA4ed1*uuMH%aQ_
z(X%(TFrfL%Qk3<6!~pLxk(1v)qtd04*$pqNe&qETdO7X>svqCIohd8x@~P0=MqF6a
zSrU1@)mCOu@3327BlCT^8oqC9w0nFJeS3|4R5@!qZ#i28o~w!Ko;YTbcI51cHpTYV
zvD8OGin(}4PH}9W#nUQ<ioy&PwZ*2|EX+TF-&D;Lu(w1o4>>G}31$4jK%@)_>{{4l
zq%nvwzt{=E&>pJDUin2`*xAdRR2nO5RfQDc<>M)^(5VPYvv83GbMdSR^m?96%clw<
z{gNXtXEl=DVV)4z!<%LrybAq3s-}^bjlPl+HA?aIJ7Vn(|DPC@VlOB0RM)~lvIs!&
zQ53>$GIxy$d|MOJwnw2e8RMWP@)>U5?R{a_<Y}cfVv(I-o0IloUY-)A>(Qimr#bU3
zk60a&a57IoDnSY4-YN8(%`Jo|QbtNq)gLd8W&!v@JAZe7-6}P>O0i?qvRw|d69nD$
zDq2fVT-a5$rtfG~mo@P~N>}%O`Nr#>zLvi09j(|{!2xeK^*c=)UPtX#v!soWHwQPr
zF$@NByPwI4h>0F25!tiV25<MO+D$z#UE{ljW!&{;3n}A&n`HJs5yvsz0WI=m)7pZd
z2&Wd)*-mVsr3*@yMh5Nklbm}+wy2Xe108I!I5A3ZSZs-97!QvVW<F|$Xu%kxuoNck
zR8G)Ip+)-?$q7nhK`_sxVkq<(<c|@_Q$t^(GsA-ku236d#L@8y_0po$hdiMNG-N@n
zvY!~>FkU2?KPD{b+;>}nH{UqER0VUSb!JL3!+VTPejq=S>dU&h7E#-i^Q|MyRg`oS
z95sga%jKAaekI-0yMf|dgk^U?;6+fJFTf`wzNgQa|5c5IFR{%Bj4n0%JkjSu^?B{a
zHvk5t<+2@I3VJ;Y=%){Odi{aDRdsfG*Zhu4&!!{59N)h=N%8Knb_d!vC(ng+OP`Pv
z+(gKa{!Lv(*|@f11C3;lrNx<QnNV#)Zs9yKiCD(d)yzauOlP3PvPr+@_luIySmgfu
zyl*|wstmF*u!QsS3&R|^ez9z+64)*<$2-#L<HS@zW=c3ztD=Xz9u%6tH5x4>YG>Fa
zzBz%9I5zn3W^fj@i-pDZ^fJxy9HFF5d>Wg~<n;N4)o#3k&BB8cwb2%SJHK&EY!>mN
z!eJJf!zA=!YnLa1hKvM<QWglkUE4;K_VVfS;xt48ITw;3+sZ<t&&vfzJ+dWFlYO0$
zqM}d}s}Tf;;hN;zrPjTE>CvXyb#h!>34+KHThn!sEo`M`9?_SPCscc<?Vg#RA&yho
z5JJ@$yYdIT-w^+xBkiP3+Wm=dBw+Uk4Deci^qtT5f%GlsaZwLwFvPw=E6{A$vz7Ln
zWZK5!uFahvJ3)fB<s+gvv?kf-WBR`y#UWhjs4EHb6+j>mS%_Bh%5ZWs4!BKiWS)n>
zNry!iSwpwVhVK=l8oH8BMTpT4o_^tgT7%_w$CwSogHtGi|LZFA5L8mCQT1AdErQnD
zCo%Jr`WDL+QLW8A6o&_%r2#<wswckbgL)61tlgm{(mPPLuh7(`!AD6X0-UtslM>4`
z9aIA}dLy1p3b4O=hT85dnMy6799Bt3F3Y$V0nzas5F5_KlpGjt*9cBQ=$=9`kh}xd
zaLaSY0D_mko^Nwt`E!BL6;XJ%w|z=~$jf4^#7SF~K9B)7>yxqZS@uLXZq!5qR+M&P
zm#nD%1sRB6<Yt~8r~GA(4nw|yp)UtI(cjq0a`Fqw%F6n7RcOmW5DNuiI>Iyj7z@Ss
zdQPYr?ssqzl8OQ?;dRs_#BH)&$&c$!T2;++CI^u<3%>UOTG)HA6H^Px$aiY!O6l;B
zYAUHl4lt%NS*~}R=+t#HimcU;Wvbn1NNPT(gitYpj<3Gcicv0#r;-ZDU;x8i2$l@J
zF~lfBW#FOvUj5`otfq#|>6)~HF#17@Ml5rPR|2=3<wf|_;XWf%Neo4al3tyW-uIM$
z?yU>F=ubgpYNCjwanyLE*!OoLhwwJ2B>0`DQnxQ@kx$P_>P22o((c`G?akp8qd^H(
zPRKKx3CY3Ewz^U!iWQn!R|EFy3RFo;8J=C`Q2C9~7Lc5C!SD&`?JPbU{6&pNqs8Wo
z@bjLh2=Ms$*n7>+xc^^Ng%a-UTy@@20zF(~kj(o#b?sT-W@!8s-XI6J$7P?F78n1l
zdmZ5IXi7GEo5^-EH8BAMjzOg4KFWovyUQ2;0jvH-;AQQ4?<=Z2&@tnAyVI=n`&_j^
zhUG{)se7zw+tGW{P$>GzkOk{S$1Z6EmuxA{`(r1$W|In}<$J!;&^PeFjx1ms>AV#z
zlIM5N|MdKP<(F?!7hkG~=e8YX#|O@Fg9ut?y3P^Jy!raqh<RN%{4l1cro`#83#+Q)
z&9y4GAw8p3Ys)F<6%#utD#HEw=gWU)RGh3#3i7`b7gw|<L45jt?2L-}-LZMuZO%rQ
zA7a4E%$m^C;?C{eT~TULX=&Kb!Y|W4A8VDv)o;W6q~kuWErS84Yj%oRIPMVr4DoGq
zusXRwGrZxcBs^I<>81`c<DAYOkxV^z!AQ6r{5>fW`0lWYp}e#`)MHB`5LMb+3U0Pv
zk*~>2ex4FQ19@t<sPmW)Sfv)FqhAA(objb$$vAO*XnY)|N)5k8CbE_1CeW@Xh}lYW
z=2LU?iSckt@#IorxwzbOB(5n2X1JOTdl@pfl?ulOHdl)+G=~Q-fq_lf^M38z0D71s
zf2j>NZ%(|dTJDA*OVY*P26|iCMd)9WYfNwj020`|Qkie-uUNC()XV7wrMUBjg0iwa
zC74(XaoaxYu?}ihE91Xh1w|8~^6y^yPSywHZ!#_e-kn!s<>j5^Y5pZ3KguS+g|1i9
zPL?}m&)!F+8Bi@}_r@;sPakzUpB6JZC)#<}`<fh9?jPI7vhz)E_N@ny7J!tO<?TG5
z2RQL2ZUzVypnn<q!o=XS7u6P;u3iXj91Js~vlM;(`nBa~P_)9n`>wZ{<eDUef&kow
zhUW2%yScWuW^mW|lbJPdAbA4+@cewg>zRDB?IhrjY;{Y{&A70&-hy9%{i-|0#@l#f
ziTY9J!0O!G82P(9etEtpQ~uj5ePq8GqT!8`fghTR(BrPrGZ6`q#mT(G%L{(@?yoy*
z*F9NLkPa`^y<Z28Xv?{bW9yx@sqiwv^bzVmnTzOqKYQyXtJ6L^d%L>?_hgE2d7rQf
zI`|=h+vp>mJtSUf0SIx#Yhx%nzZEQo%u@{8Zl|vnCp5ASC)wjht160@vGfl5+kfZm
z6`C~F6k?S8ePqMre*i<}8Ayw(xQ{lYs&8@=qqK{Hw<Hm2AWlJ03BgyVw7t|2;-U&b
zFpCZwT4vX`xJPI4JlRCOAX$pl4@w`s<fsTT`a+zA&eGF~MU^4m&du?T%i(3p&_%o-
z-vsBDqZ%uVt-1h{1lTSen`}l&nh0n8qwterJD8Q;JruJ*AHVP<3-gLb2i<J2K62b)
zvKGx#1VsyO?VOAo1_U?gf+>Odunzh784@OAMIsxBxffHeb)7DE0*-H!8*UKBg8Zu1
z!1a1*^`)>ozj51lR}^d<@KU@}l&KwXLlphl42Cn{4Fu6{sV%KH*kZqtO?3<V92UwB
zI8=+?+%ggyLz1b0o96r#MNL{Pm*k;kVJWS=pKlYqEw9?$0^27~CmZWS+V8JFI{$$4
zR=wU~K{xsv{F`n~4!%JupzDvmNOQ}}e~cPmiFw!hx?fJT>0V!+#~a^=#+p~#G9K1b
z^53^J3~qAmFrGSw@@78qsSK3mDq=%Jf<Zl0C2X)eqWA*#_fPnG%q5dL)OQ<Z9e97J
zVnY`Ik&2Nhk<p!~3zO!5yp$sl9Bpym45nju!xSrO9i$CA{;UqLC@zQVHrgaUR@xrh
z#Yh>FhoQIUrgabaKLOCNl++a4oR4PN8102<zL3KhaA3hN*x+vZl6|}72=Nofsrv@Y
zo_^iuzc$6!z%Dys7^}<`Isl=pb|u1BhGcGY!VXIZBN&gPWB>}0nxbYk%%_jSTkSMd
zpE#@S&@|Sxe@U}@L!dAvXamF(J35gpvJ?^Rup+g}knXVyUu_v?&ad}}ck~+PR#?78
z?QNeM|9T!<c`pLvEegUs+URY(2XmKS=4t1RT+cTZn{{gc(ivZ2>x#@@2cbZ<dwDs}
zB)n&jtiP{kG<LJUpWq_}U(S@PGF)bmKREAsU9{h>b(}X=SJ*>_D-KV*zooH%Hu9QD
z2+#u(L`el-ybU%FbPg^qbUuAPsIwfwqlmQ<xx1aoao>(Y#EdIuJgH=5{bkVVIy`@W
zq8*U(78G=C9lJRV?uuFH*q`H?U4Ts-vS>M}iUYkPE@;Co2N*p2#q0Z#KwL&vy2l27
z_tTsc6yJHvT*uBCem!XE!xua3TMX11+ZkblfWCyw4i47is&?LgUTVqu>Aq)^!uaJN
zpc3#XN7Gw+;fGH=E|}5Q)^`2al&$Z7k8<9!<0VE=`5N%<hmz3+Hcas(ky&2O^_%~?
ze!YM5O|&}~GI7=T9STGEmV$TH8+*y#`?vETY4=VEw#p{NcbvN!YjBni@%{4$*?<-Z
z(zm=OE`+^RMf@E<IHinEI3>r`gc|nHRo&8WW7v#l;lWT9W3E0i=nv*92{MC1BFt))
zuDC_P4|HI((5(N?s-)o;RM~#)!Xka4iYCo2Qy|go%-BPOEv_9HQ4p$B9{)jy$3U<k
zkCggPn)<FfBf{7Aib}yq>^9^cc5x*b(&~sdI%jlD&T9Ga%3gc?Y01bu(nP}WaePc=
zxZLl84Slq5ZMCdi)*8@MA2FL`>T`;<KnZM0i^lql?Wb$ID$hz#BXtQ10R+!BLR;z0
zO;`Ol8$-sqk6--nA7Edejv~rgxc}kQxWU{}eH9^(`OIIW$dI6Zw(7g_db-|89H{U3
zN_a9M<Y3_L)61(mP_lfkOO6%O&qTE+RvjZlZT?Po0p^CX&hrs?cR2$ysg3xacLsFB
z2<47nK47b8Hu2i?VK9~tESf`Hw9xDA{_s6*z?J9v)qV3B_W^I`5hNX-96xy5%I}?U
zuYBA)>)zkd_P5ZR_X~gwD$@6Pe_j`K^wZ1A_Bjc2Dr{~2R{i$;Ic*R!LblKk`O>cX
zl?*l{B#qN=Z{scO^G_qrbAE_84fHb14E3ATYgJd|-El9@2}C-kq?F<*Byzol;ry1p
z&UIePU&)&DUdHRvdqsb_kpD!C90mim@&4wK<G)<-+%Y1!<d*g8X4g64y@kkmCVbQc
z(yw~2bvR8?G#RJhv5j#j5jQYR#0*)sa@LKK$q;h@*u&Fd!kJSKlGT9~N$wPxr!)kH
z|MFNWVNKkcYiCWApf05&WKW7ryA(nqGE*a8(XwzwZw(I7N)|ieAT^X!lM8nSV4|9)
z^e<cQ`m#f_4NFdCfkYI)I4AZ>6-_GyT?Ac9MqI=8zu6;xA)c&6G1>azObj6%Wblow
zP8MyHY$kb}2n9X@hGiFKBh-A%(W6tb7^xSV;w})s_vF{jx--H}*VQ`MX=VQ+btmPE
zb|}Q>YPh_*89!(yf2Pvz-hnl6pFV0JJyl+Zvw;+ric*vhj=eyE8~&#;pqGxD1cfWK
zLh7eQkxf0juB(9R3Mqc;4`_F2IUSA-pG<ZJeD8g|E+I3ki8G9Z(vA*RnmRcgpCO>p
zse3|r>tTm~=XQo^1+q?L5okCwqav8r-Elhox}L*#6Z>%hY3Lw-qiw<MA1z$wE2D(V
z?)&Zw#`<CIvmm&k2K4VDcU~~`QdtHWy+19S({>HM#_4k8L)6~M!=6sY<O!lzyA7kZ
zWjXZe4hEBG5dH|bDMHnZ!hOjnFcW4BD8Ss@^<!br%*=0sBZ20|BBGhq-*dn9<14f6
zZMf+OH-(o(MhNDh_50-H5;TyUH9sIU$a;3rQu<0#?;Y4W#!r<5RYC^^A}uRDXpl~b
zpOg)i;6DRVnTc^c`5V=W(Fw<DGm-8}Q{l8Onf^Ivoor@49rRP3$_bPnEXc^kj6N83
zwkf)I1;VV&#*5se-VSS+oSVtbMmS8O?$IXm#fK2bZMCtbJE*i&zx<wGuX8Y1=#Lv1
z=021K-v#oY$iU6ind^45Z~<2M7e_Qm1s9iRhVI|U1k^)Nt!7H1eH4rsdZ^-+rsJkC
zt1XS{f~1uyS)3fq$2!7fD;L+ve`=HWWwY~jo3Y(bE3ULYrtAA0&<1es3_{jO@C)5u
z_K9UyJ@0C$)ZdqM7H?t*T~6{%HCha9S9HJ-G<(#f7RIo*C1R`a`O5$b6yLVb5WCot
zg439_C%ueCp<qKKeT5Ie?>B?P6SX?A3*G09h^y9a8rasAq9LMdjle+P3*W#P_OB-;
zqX$Y(-ml{MH(A=<(c}hR=CpCo|IpvAhh4d;^2Z$^LStA*IEdH%ZkC!bd@cbNjvDqX
z1jT6}*H{L!q@6UJ`OSJ>RG3NYh9(H9WX#MchE83YU}U&=8@!W3iG)tM0nht@0OA@r
zmj!CFJF!3qW)l4^9q5oFh9mpXWa}+NJZV+}HpM_FAi@&H9+OlA>k!NYO6~~81Eq;L
zP4r*uULKQDnAzs=d{yqoXZ)U~xcCLi?IUOBFwo(5f4<q-qBRDb8`aUUeY<q?@e@CP
zPkpHpcxCU75DGE7xOrqqEfp!K3NAksF!tWSK>Usrg$XlKhhFhB4!9}Hi9)0&0qk7<
z)o<Z)<h#)i8Sx{g;=~Rm`ZlD(|JtCT+u?l`O9p0E;s0jCr6*6>1(`u~kG0uv76l<!
zaW|`%ozG|U@_k!AZ9r1HmoaOR){Q2#pIV*Ufm5@#uOa5-Lh!A0BFpR|?HFzuh=ac%
z#Zn=7u-N%e%Xt2MT-;j7G6EjZMm|n`LR2at4Hi<oaeeq8SpZ2OWb~iE-aePccuH;2
zN=X4RYWNo!X7b#1rAaWHco_;;q?oC%h!z=SE;h6oHYN!*<B?kLy`CDHF0M?wtX^7N
zXM!H54RgRmTHI<86{wqt$#3wBT`!O2P!`rr*2mM+s=fYk8rVKHNUoin3<oGdH>Mum
z`Bw9ZiMU+1DUNUPpnw!9tjSpF^efqP2xc`bZovUt*y|lw3t4ScTm(1TsT)q**&9(c
zQuR`Hr?9v!(S(@M{n8R!Hcfol9m&}t{Wr(lA2Uvo`&#CQ7yLIuz>0(6>zI?<-22mT
zY!^d<OmU9K{8xW)`v&YkTmjm>#)yBGyuIBoXNDo&9Q~-AKh0UG*BGtcVP+})cg^j>
z&%S*de*N-k!R5NGk;R~;;0JY_`Al*u(fa{o%8;hxHWU{ZR}Ey?P00C7t*qU<-v(rj
zYd*i*{->23NXMWaaFe~Wfwa_Jx<h3y$7<N;Lld|;DiC5<rt}Q}X~DJM11x(H3Za;}
zZ5S!s-y(<{fU+mKxXcbQI<(K`&ng{GsCrm;N^IG;gxOGL2}QU38UjH~Q^OW4(|i~G
z5L#zea$Y=D>?@n^teCa1p_6}#$^0ZmmO!BrLsWoYt`nE4u`!$i9{J3wUGx;d#UwzI
z&Dd|lhBE*}QBTRjV9`f(iJvF+P&!H4Sp`qUrng)uo;$yF@u6?B9d>E~`teiiAlTGD
z8~|Ok%1na&$U~wFk@kN=u~QL9TIjl;TlKMKu*whcN9pc3yU&<o_Z8p==cqyF4O#eX
z50&dQ-<J$ukb|5XUKfYcm@|2u)>GqU6@G8LuUS7F1U$NycKbjw1xR9s;P1SK2Dyjx
zdG1sYTI?@lc@F3=o$beOg@sp)N21S<><>#50WN=^30>&&*&thn1`T>_qWdLE2Ol-Z
z{yBR(_%%pa?!HHlscmE{MCK13#azCT#O5lj4VCdGstX;~wTT4El+$Brkwt|M0-g=p
z1!6-FxNzJFuI7E$FbEu!_Kzk%3p4ew%Jv)9gi;;%td_Ar1f2nHsd>MN+7Pzg?+4{A
z4UwgZMZd#MB<-<nn<YHM5vl4$C{n`J>YxohAy7G<QYiF6e-m5ap*Yqzts%bZ#hz@(
zu6-qR*AV0yB~+3HD@Kk|px#on8HIubKI!JSx7h!+;uuATcBI-2x812`^Cia+egK3>
z7Ovdf@xDZA=ed4>AefJyql4ADlID_<{e@3?z8BR1=TaQ-s+;j%D+Kad>kZ5<PxmfV
zJ$d=xtZcZBu!>g4vUbQPZk@+vxA^Wr_D4cG!<SzA1=-e_X<LcD{SsL(4f!_k>BE#T
zo9cC#8nj57TNcv6&>||ntvV!PN^(<iEl(77Qo@MFUF=Okf}p09cd3joO|a4uXp}Pc
zl<ZTaVz1Fw6N79WcjR@KQ15r};<EGb1^(eBSR#bJx4KTht$}-bepVXhxJWv=7R%!b
zD=IVM1nw4XP|lKiH-;yV{R%cp9jjCVNu*1<Rff8TB*KP8*+CLJuF|c7aE8%*gB-^5
z;qyYQqkcTY9x!*sq=tB{op_25F>9r;tcs;4CURDcVb<3xIQ6j2>bnE-*dl7UE>#a&
zxGi;(obz5<#!YF!D-%@Sfy*6l_n3C~ODUnC6(cP%PtG7Dg(O10^gZ9A&Io`SbXlyk
zwA-_S={YjbDJdsfh;!c3UmtyR`brJq6KF6*9smg<_XMP*xy9s}dN+fjYySwUtBef8
z;V>tkn_mL?TGb-y>HCsSj9U8Hne#5^wt-gU6qZhP2ks>kDOcQ^bTE)sm>-yD)Gz*;
zTePXlTe37w0A~g0^u@l=QRW3#J79Q=*<R#r(Dc+`l%E8U4AvgSY>&a)D6Da-l=Ey@
zX3piWoK%NSe5BxBlXViu2eLFWC3&UUJ6nfQ&Qupdf_R8tVmd$iLyn950SPj#;3wV%
z-!HZ?Qg!hI{BGZxoq;#_?8Rj~{I%TnSrH=Vw>9g+*%GK=s%yqWrh<sCKxLXwzqO%L
zqa)486!^b8NYQ6cvEEG8hVtX1)yo7z5+74N{<B#Pe#k(!mXq^Iu`dwr=V8q0+~oD?
zqt$69Wd96g^v#4tozUZ~#xMQ$^awICB~eib%A;@Wz72iHUg0^Jud-ZQp49bqwn-ez
zejgo(13OQ2f<Lb^zu)+ZQhfVVx7FeH^L{mIa4_JZ>k6&<VAX9r>uN{YdU~hH?u*%s
zNIA7fUgkfdPWA3d|MAd_m#I505QpgtrDb4<#JLaQ8TPy*Y(ej`ePN$m%V)f8MC?ti
z$5!-0@8-`s+H9X&d2*&2Ze1LY_P}gu<dLcHEzG|W>9I^?ak#n3#<+v`TO<RNlG?I}
zzN`jj{*08S)K6tND~c>|5nGg7q1=|SwaJrI)E9KyhfrG{=b@xk9uC+ndT9MZW-W+o
zrqtojg^AL;;UfrkmUE(J>HG5qC;9~yXhbVLaoH(T9Ci>C!*K?>3<(%2P7sz6AZ;^v
zU-00qG3&o36kLbUsC70|5|Et>&^?eT-aU|V-r${M9-~A}VOP+db>8o%j}x2Utlvhh
z-?vcG0H+uMx7g!?;G7>0NNU>J5tv2O_hy6fxt}@DYj^A&zYtk(dzI{S86FJjufNb4
zHBz#S5u7;xD<^yoxmFERei_9}B@4_H6M$Kn`-@fh@i8xUHWZQRrBx<ed2gI@F)ksq
zR(ho3s0sj1W0&oh)yt0qI1fa+sNwA>1eO<2Os0$JV$s3}(W>cfB1DJVAT>+REaRwZ
zs!p@zLBx5XP1%^r*i%xlwcfB-7Nk)Y!gphpTh@Q1MCo(th@W~tGYm?f`jdHzU<eCh
zzUCIL_+W;5;gp2xV6AnLbXuUb`AIYUp;mKaBeH_jf`QI`K+LGSf7JC=cl8qyRG37N
zli%|)q454f$5+^m=Qoc+sO|$YHt!kYMaVR3%=uQx{t8A7k#La61jN=xOGd4(@T_BF
z&wg*UgJgZuPMwMGZ%1QL?p|Iqq8!drRCg)jEO?fW*L(jaFhIa*dp@}9Aot@_c(8i(
zy*=;}3W@+qUP@e3mYh`B%D3q$E1G|-<ff#m%2A6Dng}(#7%gs|HdumJ+=^L%KuSt-
z!C61#FIHR9&(~S&pLGP<v2EV^5t+&7sl{84kDc~tkft5#DuTF3i0*cSFX&#DyH%n<
zilNI-zlaoNFlknXHCYXx$|aJgFqa=knz$<`qV9mI*x^sIThu(yRvRbP`3Pq3o}Tks
z8{qgLmZ-Wv#Z<pWQ`EcPc{81qsG3y}y3-x4felqZgAlb|4uUddLm^{jW8#Q;UEX0a
zU}_vznvlBh<p5P5CxnWrdOm(*dB0k_`0Vcm!8S8g9~4TljNgXef7l0H!e)>*7<u(a
zTkbT)gk?BAabt&`AC-63QE7RduMSCKi1tFT>0?3lh{cCLX0`GTzL0pNkG?$emLyAV
zY2)2e*Lh!pT?SIt@W|7&+Yg0Ez&Z@B;_k(9Rr^I=PT5o$St@Es;u`w=7XbwYz29&1
zOe+gW;>V9Uh{&*2sb$a>&`Uqars}81wUiD5idXxuwHaTkfHtgvREkNgQp*R@Ac-QF
zC@rken1}bXHNQlXJHLY~@WsN~%tyicgz58Nc`T5j$24LlreXxwa0BqW-qZaCd#9VB
z&eq6?gZL39gFM!5{E^t%AIi3wGRXV(l1V~$B}@nJw{%Pf0kJ;up$>#WjS?!%l_h?e
zN9P+CZ-;Br7%?Sj_dcT4KUl4-e68BL*JAhUyUV|S()o_X#X7*nN^7GR&OT1hW7$y=
z$SOH0hM5+%Jw25{DoA8U8GYrpzgM3%VI04)5puMGXp5FJ60k7|U?rWLj%RN^R8J-B
zFT!*FCPn_xGuBrxo*;um+JVy_bmE+l5r6MFE^_i~>lrfYb^7v5k?mXN`N7!O7>nVP
z)#mfK7rCH)aJ3{Ft2j4K!Sb?R!t*PA@p;5o@LmRR@appQ`Qn|by{$drA*ZWLM8xHw
zy!EDgLt15GopU9FJ>br+uaiPX{pZ}n@&Y+Q7kN0P-TW^?usKoni3L+m05B<PWCK0_
zPP{GRS5wNbCerCwxWYa>p)%-C{bI#KAs!a%_Gx4vW?|MZ3I=~0Ww5hr-8}AuNaiOT
ztvsk^+%AgsOVo$q#W>YH)b-=Cveo&ZG$YA<l3R<I1qDHqYkagk7XN6=hloEG;tgzS
z2>pJgiClT0cKYxcd2WQ!qbo+?K+yJARZ;D$1<?xL<m94+W~2&;8-;jxZ7O@^%1IC{
zU^(nzE@NljAWra|*9HF#aW(7b)z6JM<10^)hy1z%+lM}wmcJ$61g+6|H*VXD{f!91
z8%QR%UyAAT1-|qUpir}Z#FGXdRQf-M&e=nDwvl3H@%*2fjyxW!?`w+?V=FWvvXnhp
zzQUj=Wl5Bs!3Z%~l6@I_lqE}&vL#!xWtU+jhAbnyFf+D6mYK+&ncvg&JAb}=&vMT>
z_n!B;@4R!iG>PO>)(svSaJ8j#z?}j;d4ni)Hf$|&3+HWvAZ4yK3!Rn4A?Aah5{W>+
zI5o(Dx3WjbgRko<@QLoHkUwbn^d1Z5&w?ccfjffL%OR1W(_v_Iz~dv+4p`&UwVxY=
z3W_(VvbA|X&qrklzBun~Fz=mx4zo}E`Ew4a)@TU{Tq*`-)f($K{bV9t9jTw&q3}Rg
zy9)WcoOB{CR7K_Pa~jtVI^~ZN8g6F6WuSU$o?=Ar!FBtFs8CtZe9~Q&_&}7k{uxHm
z&NwU8qP8X-XrT_Yv|EeE6a@R!7=1~_(VExTBH&Et=~t#!+n;$b<Vqe)W4!C6Rpigk
z%&x`El9dUxZ*ok&_k#9G@5@j(>4eR~DdS41*RK^BZNz5^Uy&Jc&|L<g7~OP9PJ`R1
z<)77EAt83rHpCWi4;*-vp57O`T>)Kc87)JHK;;_o0@1rqnPQTZc<r<T=_Fnqywu0`
zq}{1-nVG+HDmHKX&vMT;fX65yV|%;F#@T#V)-Gt}K|OrsY?$3SG*e8=yb`~!=E!}Z
z!IV_xp9FO4ZY2$Ta;WnuW!cY2W1DB-zoRGL7P&tA?~*p#JpXfbz3#3rrGg6?&RoB#
z?{ftxZN4{BOi2JzJF3^-r(HDv1`md*VcJM^mKkiGpMfAeW{2pH78nk&l_=1l?1s)h
zSEqborBUDg!x}R04lODzy(<(VqOiT?Z-xfJ+t(2>AM3f7HXoqh$#<|bk=lPvM#My7
zTqN)Gj1vfW@5un*MoY%Y%S5Ty%L=3#&`;vrbRjoj|M0R$p<gg&)Y{+bcp;tSwM}Er
zD$JZOXdfk_J*_p^7?=0xg!bWNw7}B!Qf}Cn7Vwdif;cn>e(Gslyumh&tU~EWr4Z5>
z$g8)!;cl70;ogFKWmA?!80q?uB1m=0e+^$v4Alg6x(^7w3N61UX;Vx1GAlMhBipp_
zj+yNLjg&tH(c_ElaA4b%{l(<>TvPF4*jhnDjeUD0cNnFo<WNs(uLBhNqQ2ftFl2dl
z7Jcl}v25U*Ap_4&OZcF3L!y&*b}mmP2XC}KPe#m{!g1A66&2-7<>jGyNlEMw-z9YN
z#G(Di<cBR4Y2R}w>uU8NoKb2tGB}tArRx;rrDTICb5hGiZxc~`Rb$+Y<bE26sQkX@
zLo6Zf{dVB8Pap^81|N8%`xWb!tPt8(o{18DZX|UB*{&M3729X|Hh8OT!1`^?UKKM-
zf2IkO!(c?>)oKSd?fl4UU4v?VYqyS!t9gTwm)pPA`#smo3H_6QB(5v2?c(A)QeM;h
zN^XAO4*Alk+jbQ$ap^(muTD?K4U^KZs%2(|0m!*V6ylKdC}fjcXnw6`AgH&e+RECh
zX;!1Hlb7<7^=;U}L)a!Z?fz~D#S0clNhHp1?UKcK+qT|Cbr}Okgy#Vg+;oW9I6F+T
zElsy<^b&?P672xjnu*K*WOB)8UCG>s5}FHS48p!7KUDv#q1B3}puL?eR=IO&nso7T
z32Mai>k>1EXM2)(e;ui9y?vzNfUhD9(imaS+6k^b!@B0VZjJp)aaIR%ldww;7<>QU
z8d0`GhZ>^$e>|}fy_=+L=ZqjOV|@|EpO@*kxsJA3=pSD2#p$@IdH>>quTJW0$>mr5
zmYf^L>CcYfgdyvpJVwnKUf4=|Ya{TQn_!*?R)qV{_c^3W9r?GP`}&OJQv-9$jB4Po
zBfqt2T^`*hwGB1Ej`=8%D|;Vw)X@>LScap)Z}!T~gFKKAhTI3o$I<SU$br_Q!_x89
z^j@|nW@Y!vM!nxO1-)AhQ``>99)}{bH8eC%of>g<y?D8@#>d9p%T>cJ)c4Bg-L-br
zo9_Co&w1MtujR`>NO~w;nfCoH#dc=q)bHIZp4gC&qpvhLU(ealtw3xrm}SJi`v^3Y
zfp<(kCi=0@wd=4f^jHdHAhtOR)NcU6=My&TzPOY73wziV6`QQ=N%`$DJ9)W%7H<V?
z+NKydGJv|}ke?_W0fxfB%tmf-gZ4<QOf4r5f#a*sdAAM*-GuuSXI^s&$qmdnxE=Kf
zS%aqw9><+~W9@-V?0*BL$5-4zJT|dH>FVe>y>&Xuj3{?fgTCLD0LhcKJUP?Z96C+i
zeA2BxsrL%%=alb<#D6*x++j<i2$t$!-QV+A+LB!?t$weq#})nFLF>#3<CCNq4r_R)
zVlAhc8HbsXuq!00YQ+FP5iO%A>H6GYg(fHTV&B^iE5o4kkEM^p&VL~)Dk|QDZ!aaE
z#l>|Sr2d}sYfG4F6&!D4BeE%b>l`K7<M7Q6y7an?F25jO++(!h?Rz1q_3atnP>h77
z&`-M@wnXBNGHAAIt~$UP6?@vC^u*MrawI`_P(C?tI{s2$=NW?iyreSx3xl`d+RHZG
zqK|z|WR65yURCjdK=MHZMI(grNgoj<KcXHhA|i4n9&_LoOwNWMrZr+81u$vPoxD|j
z$|!3LF8qmO@4_9YGp8!p1i>XQ{BIF`2U%sKq?JTv&-X~j*EnJ4knP~8PWz}A=Uv66
zWzM^)<>obK<vrxD|Kud^4w9WO9Fb8lgxH55mg`tvci&wH;%{3R-gB>~21CaYOKWcT
z%j5J7z!XJ2T+?Kap`7x)gRoPA?&tEoEmS6+Au-xFuv~T`pvegS+0V)-{3!yvf~VIQ
zo(2CcR$8G^5!H0^x&fc!wd+jU*Co=+7#7(h9r>-{!26xJt4;K!+6ZQzCfy<!xr=x*
zyEh%Bd!ve6S{%46L{0(9@(qvHZRZV$0H42pz_LcIbaZrzCV3a6g;&?bS0|rUs(s{t
zdo;}+3)sA_^{}QzOucG<$l*f2UsC&F%k#igD=yDla4oZ{y+J&T{#M+!E}dyt27z-x
zBdzL@So`$-iK0b5SbJuOh!VE}xp_w9@$}o?`k2=~Mui-zHc%)oZdEL|AxKH3#ig7@
zR76CfAl3gF=76-~p)hsF%8PFa=zCdlxV{y#{`6X7gdJ!=TNpGfTie(@C%>P3rLnzY
z@pVlAkmHq@X(FYq$i!Xi@TJLOSjQd)&p%<EbH~^+ytEIkv&d}Ob6rRL24NbU-}}h`
zU_G5r!FPK1`HtIlun{fGs&U62ARi8H01^GtVtj}AzVvZA?>FO^LZ!T-gj+DzHTNPr
z(Xk)fQ!}JXne~uj{ftp6%0y*BWrye43~c%*-xvv(yfv_}j7U_IXW#=bmQO3ACP>}$
zy}C{Zi$v)uerH+zd#ouPwzY(75CjogRqP_S7|WO;YkTb+S~B5y6ZGLKl7uE=D}7VG
zvsQ~$B~_hNKA}L*AF%Wbl3O?ZAhr)2;^ysp-Hf&S;1nbYD8vlSybk=y%|ozfDW51|
zvvw7WE1QT7Wau=4PscM$S(RBk5vHb<i<OwOdv}6}qe$Ha4hOzZ@JWT!*8pcT6D6I6
zOeU52&W6hAFj_|r^1&-3AW`V3-dC*pwh*7dR7)Gjo~i&=>{$a-&f%fk69Ed^Q@10#
z(wM=oV62Zas}e4skQeR(;vPX}fdwaW<?uq+q4{}ewpVagp^n4*4{-o=OCR~cQ5Feo
z^5UT30V@+Q9;S!voNQTY(%+09Rq*syM%{b>&yT$1Z-4e`wc&aufjzS51cTx8>cahr
zId%BG_RQs~_z@nYu5+uRz6v{&S7qP?;G{ZE%2#NWT~RR)sscOi{glB*B}$8v-gmuF
zC0Rmtv+4rvK~m)m{n-rbOI-Ib9m=v_Gt`77VQ^aRuY6#(q!Z)P1d*B)e-C;s*MxoD
zEHR$J2{Ry7k@I!o{?r*#4EseH;SbWC+n)3dPo-BoCu!i(a^|E?mM#_UCh^D;TJX!0
zXMa?^G>gnQ&G4vLTb;?&wMW84jihnUImJ?{Ked?lOHxu&j;)$MkYrd=eXNN-qx!gb
zUatS{jI^9c6->qErtSDfTyiwvH?`B@X-ljM;nH3ajhwTIoSP2W**qUzLd%_gS(`!G
z*ihF=Ps1>c_dGGuD60_MvMZ1kXLzgvXEE;ZhbW#842Du$hlPa`KiFI1FW2iBul2de
zdRpiiTgA!L+P^zv=qxRAa{-C)7?@VAo26k_Pjl`OyK7<W`&W%SEZ-PjUa2lDjP_w9
zRj^y293w?0=q5yzFGjGPZq;2V8Is<g9bC_+X@wY?0&hc9)hkC{1IH?#zOK_H9$viS
z|I`Cy*s)h2T3V(6Y@}m=WwxcgZ{5hFu`4%2q&WA87cX`n^8=tO+GpdY521ct<6=1I
zz$i=X!;5460KUSfSF@1I-h!~Fp}Y!07O})rpC?2FA$LgDj3m)=;x4xAHkE^j1S*(f
z;BMWExp@jd>Q;vdrs!$hm1?BobjO!S)KPqvVLLAl5ydpJRGi1xhJs8EyS~%yUASd}
z%W5)M<T^GwC#Nd=>)zJMv9TY%Uymg=#jnO&wI8n)fF%9YkyeGFdB13MtD-U3nEU@M
zmXTMD!2t`IbOCi%GYd95Rb7!l7r$djFw!WUnZiO;G>T{-%NX}M+WSUSVha=N<)e(P
z2WD;OE{B_!jTWcYk}a~tC3C5W-Iw)-7s&Oh<-s>kqnJV+^RSgHK!iMobG8^QBt<T%
zwjI!fTirnvpcL14W?s|<q+GZ?wBS=-E;EBZMyxd>jwdYtQ<Uc;mvStnso>F*zl+N)
z8+V7^PHp~ni8`(jSy3T_`0?Y%r`>3}y}V?$kputI_y2I82Ckqn>PL&PNm2=Ii&eRw
z#KWV4y5<ZqZYp2Za0EdD==bb94t*oo+eNTY{!#zvO||l#pT6l-;fG49>?diU@s5YV
z=;mM5Pqd4z%7d0Zy*Xq$2)YlYQsKnz5gG)K3cjniCpgaomp(H;EFLz=v0Qk09FPET
zF1MZeJmxpxj&N1PR2PIKA2PXxQp^j_{KZePTw5(*!xgXtelUtyQp2^bFlmOg=x_gj
z*mYQ|oCr!<if?z#CE=q$J2E!4BwU7^H5pq}M9`|^{YOUR*6_lI$FPnfW@bFi>R9>V
zVvm#&w&q}c$u|FhYTIsUZ)=-pf)K2PkU#5AK{BM73?zG6Ham7+Dtp3CmDVXX`24eV
z0f|kz9i5y%^Da5$qv9Mp3gwC5zj4OkW;3D2eI4jRbeC79b;Cga8{B>}kXF?Cp{}s*
zgU>(ZU+K#bEr*&_q&G__g@a;AKO$pTTLT9^_>A4SJM!M=0(IJzuh@tPvc6Ozo2I~X
z-Yc*=^Ur=8SDUJbJ`L~<m-+xv^%#bywX%xL)4#<K6GvIIs;571Y|NCM?d`|WTRo}x
zCsx+&@YQz{5QPjmH}qyFa50m+zCN|PiZaTUquS|ptO7n1CeZ4TV2yeTbe`O;eO$U}
zYu`GMO|`Q@0Vx#5GsV<3-`O9q?u*Gm7AvMp;^;D#&r!X&o5!5VBhK-V6o8E2#~^Vv
zE}kw;_W~ILJ`WWBBXRdIVzpo*ELa`)HEHR2L#-n6`&0vQJRI?TpNDFuORiF+vU!14
zv_?36ZLKnKYJAG4aF;BYZT?TnYj&GhC`acGn){ctvq<vC;H4b!S@4_IQ;N&#|Ewq)
z^tEYC6J1#1@(w#_wD7&I|Iz*ww554P9j}}1{*MlWV57vXRr5PedpRT;_Nuw`MLEsw
z-v|CQ(4oM8F2h_a&?xe3Jy$XPxyL))v;iSSLTPsj6{=NMK~JT^e>0hunCLjAWT|E^
zv9(+<L9T?7H@Anw5kqz7skWK7r`glX5`Sgrycc`RgI3en#HWougwb_;TbMclhQEdH
zx>ye``Z6$4YVz`8J(T$4M;+as`iqsTR4ys=wY+;BqK2|rlC$6<W7fTh)GRg7o<82u
zR)tDKfhC!yL8m%2^uv1Q>u>k<-8M|{HK^Cku~g$PoE)PUig*0%@nIt```hSq$HSR%
zyQvUaQW(CtIp^OT4oxNx;DCxOJ=f~+tRY-zxvt+jGBA6K%<aYG)m(A;uPiB+>%6F$
zhZ$jYBgT3~9qeybEEeAru*}o!HmbJC+Eh|Wy;o2!!;1S;CaO7R+yQr1Nm(P)r6>e#
z7+3}>{#RlJ(+4O``rRAVN8~3Oas1zdTHKd%u9?DyU!oFGi&`I7P5+W|`VlO!2VR<i
zc6NGgJ<-hM9}oQud7%V`RnU#G$NoyKu%t@$5XMT%+a(jzYRR69w|g+@^l!e;7rP%l
z?6C^w^jg7Vnq2#+Cwuq3xgNAHVpw(8HB0PHhLo5JH|U93%=ZH=Go>yY8k>_JX$NQ}
zo3YgRAa1~-4pN^*BGmg+(co{Lk7{O7F23$w2<QxhvV~)UCG%U_w{+5ie=JY({HDbI
z_44jty0V)}%__8-TiCYDrnSIV59Bhy`gM~Q9KPr<*3d(ykJa@vXNMV!M)`)F6E4yB
zGr`SrW`&WwC97^6$LmRHz_;vbV1rRaKkRPclAnD*LB7p&@#eWT3cY)}VpBg2w<iq%
Nw{(qkDz4c_{ttR=b!z|s

literal 0
HcmV?d00001

diff --git a/server/errors.go b/server/errors.go
index 28dbca3a..460138a7 100644
--- a/server/errors.go
+++ b/server/errors.go
@@ -52,6 +52,7 @@ var (
 	errHTTPBadRequestActionsInvalid                  = &errHTTP{40018, http.StatusBadRequest, "invalid request: actions invalid", "https://ntfy.sh/docs/publish/#action-buttons"}
 	errHTTPBadRequestMatrixMessageInvalid            = &errHTTP{40019, http.StatusBadRequest, "invalid request: Matrix JSON invalid", "https://ntfy.sh/docs/publish/#matrix-gateway"}
 	errHTTPBadRequestMatrixPushkeyBaseURLMismatch    = &errHTTP{40020, http.StatusBadRequest, "invalid request: push key must be prefixed with base URL", "https://ntfy.sh/docs/publish/#matrix-gateway"}
+	errHTTPBadRequestIconURLInvalid                  = &errHTTP{40021, http.StatusBadRequest, "invalid request: icon URL is invalid", "https://ntfy.sh/docs/publish/#icons"}
 	errHTTPNotFound                                  = &errHTTP{40401, http.StatusNotFound, "page not found", ""}
 	errHTTPUnauthorized                              = &errHTTP{40101, http.StatusUnauthorized, "unauthorized", "https://ntfy.sh/docs/publish/#authentication"}
 	errHTTPForbidden                                 = &errHTTP{40301, http.StatusForbidden, "forbidden", "https://ntfy.sh/docs/publish/#authentication"}
diff --git a/server/message_cache.go b/server/message_cache.go
index 2e9c577e..0905e009 100644
--- a/server/message_cache.go
+++ b/server/message_cache.go
@@ -38,44 +38,47 @@ const (
 			attachment_url TEXT NOT NULL,
 			sender TEXT NOT NULL,
 			encoding TEXT NOT NULL,
-			published INT NOT NULL
+			published INT NOT NULL,
+			icon_url TEXT NOT NULL,
+			icon_type TEXT NOT NULL,
+			icon_size INT NOT NULL
 		);
 		CREATE INDEX IF NOT EXISTS idx_mid ON messages (mid);
 		CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
 		COMMIT;
 	`
 	insertMessageQuery = `
-		INSERT INTO messages (mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, published) 
-		VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+		INSERT INTO messages (mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, published, icon_url, icon_type, icon_size)
+		VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 	`
 	pruneMessagesQuery           = `DELETE FROM messages WHERE time < ? AND published = 1`
 	selectRowIDFromMessageID     = `SELECT id FROM messages WHERE mid = ?` // Do not include topic, see #336 and TestServer_PollSinceID_MultipleTopics
 	selectMessagesSinceTimeQuery = `
-		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding
+		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, icon_url, icon_type, icon_size
 		FROM messages 
 		WHERE topic = ? AND time >= ? AND published = 1
 		ORDER BY time, id
 	`
 	selectMessagesSinceTimeIncludeScheduledQuery = `
-		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding
+		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, icon_url, icon_type, icon_size
 		FROM messages 
 		WHERE topic = ? AND time >= ?
 		ORDER BY time, id
 	`
 	selectMessagesSinceIDQuery = `
-		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding
+		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, icon_url, icon_type, icon_size
 		FROM messages 
 		WHERE topic = ? AND id > ? AND published = 1 
 		ORDER BY time, id
 	`
 	selectMessagesSinceIDIncludeScheduledQuery = `
-		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding
+		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, icon_url, icon_type, icon_size
 		FROM messages 
 		WHERE topic = ? AND (id > ? OR published = 0)
 		ORDER BY time, id
 	`
 	selectMessagesDueQuery = `
-		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding
+		SELECT mid, time, topic, message, title, priority, tags, click, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding, icon_url, icon_type, icon_size
 		FROM messages 
 		WHERE time <= ? AND published = 0
 		ORDER BY time, id
@@ -89,7 +92,7 @@ const (
 
 // Schema management queries
 const (
-	currentSchemaVersion          = 7
+	currentSchemaVersion          = 8
 	createSchemaVersionTableQuery = `
 		CREATE TABLE IF NOT EXISTS schemaVersion (
 			id INT PRIMARY KEY,
@@ -177,6 +180,13 @@ const (
 	migrate6To7AlterMessagesTableQuery = `
 		ALTER TABLE messages RENAME COLUMN attachment_owner TO sender;
 	`
+
+	// 7 -> 8
+	migrate7To8AlterMessagesTableQuery = `
+		ALTER TABLE messages ADD COLUMN icon_url TEXT NOT NULL DEFAULT('');
+		ALTER TABLE messages ADD COLUMN icon_type TEXT NOT NULL DEFAULT('');
+		ALTER TABLE messages ADD COLUMN icon_size INT NOT NULL DEFAULT('0');
+	`
 )
 
 type messageCache struct {
@@ -248,6 +258,13 @@ func (c *messageCache) addMessages(ms []*message) error {
 			attachmentExpires = m.Attachment.Expires
 			attachmentURL = m.Attachment.URL
 		}
+		var iconURL, iconType string
+		var iconSize int64
+		if m.Icon != nil {
+			iconURL = m.Icon.URL
+			iconType = m.Icon.Type
+			iconSize = m.Icon.Size
+		}
 		var actionsStr string
 		if len(m.Actions) > 0 {
 			actionsBytes, err := json.Marshal(m.Actions)
@@ -275,6 +292,9 @@ func (c *messageCache) addMessages(ms []*message) error {
 			m.Sender,
 			m.Encoding,
 			published,
+			iconURL,
+			iconType,
+			iconSize,
 		)
 		if err != nil {
 			return err
@@ -412,9 +432,9 @@ func readMessages(rows *sql.Rows) ([]*message, error) {
 	defer rows.Close()
 	messages := make([]*message, 0)
 	for rows.Next() {
-		var timestamp, attachmentSize, attachmentExpires int64
+		var timestamp, attachmentSize, attachmentExpires, iconSize int64
 		var priority int
-		var id, topic, msg, title, tagsStr, click, actionsStr, attachmentName, attachmentType, attachmentURL, sender, encoding string
+		var id, topic, msg, title, tagsStr, click, actionsStr, attachmentName, attachmentType, attachmentURL, sender, encoding, iconURL, iconType string
 		err := rows.Scan(
 			&id,
 			&timestamp,
@@ -432,6 +452,9 @@ func readMessages(rows *sql.Rows) ([]*message, error) {
 			&attachmentURL,
 			&sender,
 			&encoding,
+			&iconURL,
+			&iconType,
+			&iconSize,
 		)
 		if err != nil {
 			return nil, err
@@ -456,6 +479,14 @@ func readMessages(rows *sql.Rows) ([]*message, error) {
 				URL:     attachmentURL,
 			}
 		}
+		var ico *icon
+		if iconURL != "" {
+			ico = &icon{
+				URL:  iconURL,
+				Type: iconType,
+				Size: iconSize,
+			}
+		}
 		messages = append(messages, &message{
 			ID:         id,
 			Time:       timestamp,
@@ -466,6 +497,7 @@ func readMessages(rows *sql.Rows) ([]*message, error) {
 			Priority:   priority,
 			Tags:       tags,
 			Click:      click,
+			Icon:       ico,
 			Actions:    actions,
 			Attachment: att,
 			Sender:     sender,
@@ -524,6 +556,8 @@ func setupCacheDB(db *sql.DB, startupQueries string) error {
 		return migrateFrom5(db)
 	} else if schemaVersion == 6 {
 		return migrateFrom6(db)
+	} else if schemaVersion == 7 {
+		return migrateFrom7(db)
 	}
 	return fmt.Errorf("unexpected schema version found: %d", schemaVersion)
 }
@@ -618,5 +652,16 @@ func migrateFrom6(db *sql.DB) error {
 	if _, err := db.Exec(updateSchemaVersion, 7); err != nil {
 		return err
 	}
+	return migrateFrom7(db)
+}
+
+func migrateFrom7(db *sql.DB) error {
+	log.Info("Migrating cache database schema: from 7 to 8")
+	if _, err := db.Exec(migrate7To8AlterMessagesTableQuery); err != nil {
+		return err
+	}
+	if _, err := db.Exec(updateSchemaVersion, 8); err != nil {
+		return err
+	}
 	return nil // Update this when a new version is added
 }
diff --git a/server/server.go b/server/server.go
index 94f35801..6d25e2d5 100644
--- a/server/server.go
+++ b/server/server.go
@@ -75,6 +75,7 @@ var (
 	fileRegex        = regexp.MustCompile(`^/file/([-_A-Za-z0-9]{1,64})(?:\.[A-Za-z0-9]{1,16})?$`)
 	disallowedTopics = []string{"docs", "static", "file", "app", "settings"} // If updated, also update in Android app
 	attachURLRegex   = regexp.MustCompile(`^https?://`)
+	iconURLRegex     = regexp.MustCompile(`^https?://`)
 
 	//go:embed site
 	webFs        embed.FS
@@ -568,6 +569,7 @@ func (s *Server) parsePublishParams(r *http.Request, v *visitor, m *message) (ca
 	firebase = readBoolParam(r, true, "x-firebase", "firebase")
 	m.Title = readParam(r, "x-title", "title", "t")
 	m.Click = readParam(r, "x-click", "click")
+	ico := readParam(r, "x-icon", "icon")
 	filename := readParam(r, "x-filename", "filename", "file", "f")
 	attach := readParam(r, "x-attach", "attach", "a")
 	if attach != "" || filename != "" {
@@ -594,6 +596,13 @@ func (s *Server) parsePublishParams(r *http.Request, v *visitor, m *message) (ca
 			m.Attachment.Name = "attachment"
 		}
 	}
+	if ico != "" {
+		m.Icon = &icon{}
+		if !iconURLRegex.MatchString(ico) {
+			return false, false, "", false, errHTTPBadRequestIconURLInvalid
+		}
+		m.Icon.URL = ico
+	}
 	email = readParam(r, "x-email", "x-e-mail", "email", "e-mail", "mail", "e")
 	if email != "" {
 		if err := v.EmailAllowed(); err != nil {
@@ -1336,6 +1345,9 @@ func (s *Server) transformBodyJSON(next handleFunc) handleFunc {
 		if m.Click != "" {
 			r.Header.Set("X-Click", m.Click)
 		}
+		if m.Icon != "" {
+			r.Header.Set("X-Icon", m.Icon)
+		}
 		if len(m.Actions) > 0 {
 			actionsStr, err := json.Marshal(m.Actions)
 			if err != nil {
diff --git a/server/server_firebase.go b/server/server_firebase.go
index 99f0ba13..016f54be 100644
--- a/server/server_firebase.go
+++ b/server/server_firebase.go
@@ -166,6 +166,11 @@ func toFirebaseMessage(m *message, auther auth.Auther) (*messaging.Message, erro
 				data["attachment_expires"] = fmt.Sprintf("%d", m.Attachment.Expires)
 				data["attachment_url"] = m.Attachment.URL
 			}
+			if m.Icon != nil {
+				data["icon_url"] = m.Icon.URL
+				data["icon_type"] = m.Icon.Type
+				data["icon_size"] = fmt.Sprintf("%d", m.Icon.Size)
+			}
 			apnsConfig = createAPNSAlertConfig(m, data)
 		} else {
 			// If anonymous read for a topic is not allowed, we cannot send the message along
diff --git a/server/server_firebase_test.go b/server/server_firebase_test.go
index b004b0fa..7301057f 100644
--- a/server/server_firebase_test.go
+++ b/server/server_firebase_test.go
@@ -123,6 +123,11 @@ func TestToFirebaseMessage_Message_Normal_Allowed(t *testing.T) {
 	m.Priority = 4
 	m.Tags = []string{"tag 1", "tag2"}
 	m.Click = "https://google.com"
+	m.Icon = &icon{
+		URL:  "https://ntfy.sh/static/img/ntfy.png",
+		Type: "image/jpeg",
+		Size: 4567,
+	}
 	m.Title = "some title"
 	m.Actions = []*action{
 		{
@@ -173,6 +178,9 @@ func TestToFirebaseMessage_Message_Normal_Allowed(t *testing.T) {
 				"priority":           "4",
 				"tags":               strings.Join(m.Tags, ","),
 				"click":              "https://google.com",
+				"icon_url":           "https://ntfy.sh/static/img/ntfy.png",
+				"icon_type":          "image/jpeg",
+				"icon_size":          "4567",
 				"title":              "some title",
 				"message":            "this is a message",
 				"actions":            `[{"id":"123","action":"view","label":"Open page","clear":true,"url":"https://ntfy.sh"},{"id":"456","action":"http","label":"Close door","clear":false,"url":"https://door.com/close","method":"PUT","headers":{"really":"yes"}}]`,
@@ -193,6 +201,9 @@ func TestToFirebaseMessage_Message_Normal_Allowed(t *testing.T) {
 		"priority":           "4",
 		"tags":               strings.Join(m.Tags, ","),
 		"click":              "https://google.com",
+		"icon_url":           "https://ntfy.sh/static/img/ntfy.png",
+		"icon_type":          "image/jpeg",
+		"icon_size":          "4567",
 		"title":              "some title",
 		"message":            "this is a message",
 		"actions":            `[{"id":"123","action":"view","label":"Open page","clear":true,"url":"https://ntfy.sh"},{"id":"456","action":"http","label":"Close door","clear":false,"url":"https://door.com/close","method":"PUT","headers":{"really":"yes"}}]`,
diff --git a/server/server_test.go b/server/server_test.go
index d68cfa11..13e51377 100644
--- a/server/server_test.go
+++ b/server/server_test.go
@@ -1046,7 +1046,7 @@ func TestServer_PublishAsJSON(t *testing.T) {
 	s := newTestServer(t, newTestConfig(t))
 	body := `{"topic":"mytopic","message":"A message","title":"a title\nwith lines","tags":["tag1","tag 2"],` +
 		`"not-a-thing":"ok", "attach":"http://google.com","filename":"google.pdf", "click":"http://ntfy.sh","priority":4,` +
-		`"delay":"30min"}`
+		`"icon":"https://ntfy.sh/static/img/ntfy.png", "delay":"30min"}`
 	response := request(t, s, "PUT", "/", body, nil)
 	require.Equal(t, 200, response.Code)
 
@@ -1058,6 +1058,8 @@ func TestServer_PublishAsJSON(t *testing.T) {
 	require.Equal(t, "http://google.com", m.Attachment.URL)
 	require.Equal(t, "google.pdf", m.Attachment.Name)
 	require.Equal(t, "http://ntfy.sh", m.Click)
+	require.Equal(t, "https://ntfy.sh/static/img/ntfy.png", m.Icon.URL)
+
 	require.Equal(t, 4, m.Priority)
 	require.True(t, m.Time > time.Now().Unix()+29*60)
 	require.True(t, m.Time < time.Now().Unix()+31*60)
diff --git a/server/types.go b/server/types.go
index 44fe9e9e..3a5e9fa9 100644
--- a/server/types.go
+++ b/server/types.go
@@ -31,6 +31,7 @@ type message struct {
 	Click      string      `json:"click,omitempty"`
 	Actions    []*action   `json:"actions,omitempty"`
 	Attachment *attachment `json:"attachment,omitempty"`
+	Icon       *icon       `json:"icon,omitempty"`
 	PollID     string      `json:"poll_id,omitempty"`
 	Sender     string      `json:"-"`                  // IP address of uploader, used for rate limiting
 	Encoding   string      `json:"encoding,omitempty"` // empty for raw UTF-8, or "base64" for encoded bytes
@@ -44,6 +45,12 @@ type attachment struct {
 	URL     string `json:"url"`
 }
 
+type icon struct {
+	URL  string `json:"url"`
+	Type string `json:"type,omitempty"`
+	Size int64  `json:"size,omitempty"`
+}
+
 type action struct {
 	ID      string            `json:"id"`
 	Action  string            `json:"action"`            // "view", "broadcast", or "http"
@@ -74,6 +81,7 @@ type publishMessage struct {
 	Click    string   `json:"click"`
 	Actions  []action `json:"actions"`
 	Attach   string   `json:"attach"`
+	Icon     string   `json:"icon"`
 	Filename string   `json:"filename"`
 	Email    string   `json:"email"`
 	Delay    string   `json:"delay"`