From owner-svn-src-all@freebsd.org Tue Oct 25 05:04:28 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1617EC20CB3; Tue, 25 Oct 2016 05:04:28 +0000 (UTC) (envelope-from hiren@FreeBSD.org) Received: from mail.strugglingcoder.info (strugglingcoder.info [104.236.146.68]) by mx1.freebsd.org (Postfix) with ESMTP id 08A32F8C; Tue, 25 Oct 2016 05:04:27 +0000 (UTC) (envelope-from hiren@FreeBSD.org) Received: from localhost (unknown [10.1.1.3]) (Authenticated sender: hiren@strugglingcoder.info) by mail.strugglingcoder.info (Postfix) with ESMTPA id 0A13E17B5E; Mon, 24 Oct 2016 22:04:27 -0700 (PDT) Date: Mon, 24 Oct 2016 22:04:26 -0700 From: Hiren Panchasara To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r307899 - in head/sys/netinet: . cc Message-ID: <20161025050426.GE18015@strugglingcoder.info> References: <201610250503.u9P53XjF096540@repo.freebsd.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="ILuaRSyQpoVaJ1HG" Content-Disposition: inline In-Reply-To: <201610250503.u9P53XjF096540@repo.freebsd.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Oct 2016 05:04:28 -0000 --ILuaRSyQpoVaJ1HG Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Sigh. I'll revert this and do it right. On 10/25/16 at 05:03P, Hiren Panchasara wrote: > Author: hiren > Date: Tue Oct 25 05:03:33 2016 > New Revision: 307899 > URL: https://svnweb.freebsd.org/changeset/base/307899 >=20 > Log: > In Collaboration with: Matt Macy > Reviewed by: jtl > Sponsored by: Limelight Networks > Differential Revision: https://reviews.freebsd.org/D8225 >=20 > Modified: > head/sys/netinet/cc/cc_cdg.c > head/sys/netinet/cc/cc_chd.c > head/sys/netinet/cc/cc_cubic.c > head/sys/netinet/cc/cc_dctcp.c > head/sys/netinet/cc/cc_htcp.c > head/sys/netinet/cc/cc_newreno.c > head/sys/netinet/tcp_input.c >=20 > Modified: head/sys/netinet/cc/cc_cdg.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/cc/cc_cdg.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/cc/cc_cdg.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -431,6 +431,11 @@ static void > cdg_cong_signal(struct cc_var *ccv, uint32_t signal_type) > { > struct cdg *cdg_data =3D ccv->cc_data; > + uint32_t cwin; > + u_int mss; > + > + cwin =3D CCV(ccv, snd_cwnd); > + mss =3D CCV(ccv, t_maxseg); > =20 > switch(signal_type) { > case CC_CDG_DELAY: > @@ -448,7 +453,7 @@ cdg_cong_signal(struct cc_var *ccv, uint > */ > if (IN_CONGRECOVERY(CCV(ccv, t_flags)) || > cdg_data->queue_state < CDG_Q_FULL) { > - CCV(ccv, snd_ssthresh) =3D CCV(ccv, snd_cwnd); > + CCV(ccv, snd_ssthresh) =3D cwin; > CCV(ccv, snd_recover) =3D CCV(ccv, snd_max); > } else { > /* > @@ -461,13 +466,17 @@ cdg_cong_signal(struct cc_var *ccv, uint > cdg_data->shadow_w, RENO_BETA); > =20 > CCV(ccv, snd_ssthresh) =3D max(cdg_data->shadow_w, > - cdg_window_decrease(ccv, CCV(ccv, snd_cwnd), > - V_cdg_beta_loss)); > + cdg_window_decrease(ccv, cwin, V_cdg_beta_loss)); > + CCV(ccv, snd_cwnd) =3D CCV(ccv, snd_ssthresh); > =20 > cdg_data->window_incr =3D cdg_data->rtt_count =3D 0; > } > ENTER_RECOVERY(CCV(ccv, t_flags)); > break; > + case CC_RTO: > + CCV(ccv, snd_ssthresh) =3D max(2*mss, cwin/2); > + CCV(ccv, snd_cwnd) =3D mss; > + break; > default: > newreno_cc_algo.cong_signal(ccv, signal_type); > break; >=20 > Modified: head/sys/netinet/cc/cc_chd.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/cc/cc_chd.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/cc/cc_chd.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -330,10 +330,14 @@ chd_cong_signal(struct cc_var *ccv, uint > struct ertt *e_t; > struct chd *chd_data; > int qdly; > + uint32_t cwin; > + u_int mss; > =20 > e_t =3D khelp_get_osd(CCV(ccv, osd), ertt_id); > chd_data =3D ccv->cc_data; > qdly =3D imax(e_t->rtt, chd_data->maxrtt_in_rtt) - e_t->minrtt; > + cwin =3D CCV(ccv, snd_cwnd); > + mss =3D CCV(ccv, t_maxseg); > =20 > switch(signal_type) { > case CC_CHD_DELAY: > @@ -373,6 +377,10 @@ chd_cong_signal(struct cc_var *ccv, uint > } > ENTER_FASTRECOVERY(CCV(ccv, t_flags)); > break; > + case CC_RTO: > + CCV(ccv, snd_ssthresh) =3D max(2*mss, cwin/2); > + CCV(ccv, snd_cwnd) =3D mss; > + break; > =20 > default: > newreno_cc_algo.cong_signal(ccv, signal_type); >=20 > Modified: head/sys/netinet/cc/cc_cubic.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/cc/cc_cubic.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/cc/cc_cubic.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -225,8 +225,12 @@ static void > cubic_cong_signal(struct cc_var *ccv, uint32_t type) > { > struct cubic *cubic_data; > + uint32_t cwin; > + u_int mss; > =20 > cubic_data =3D ccv->cc_data; > + cwin =3D CCV(ccv, snd_cwnd); > + mss =3D CCV(ccv, t_maxseg); > =20 > switch (type) { > case CC_NDUPACK: > @@ -235,7 +239,8 @@ cubic_cong_signal(struct cc_var *ccv, ui > cubic_ssthresh_update(ccv); > cubic_data->num_cong_events++; > cubic_data->prev_max_cwnd =3D cubic_data->max_cwnd; > - cubic_data->max_cwnd =3D CCV(ccv, snd_cwnd); > + cubic_data->max_cwnd =3D cwin; > + CCV(ccv, snd_cwnd) =3D CCV(ccv, snd_ssthresh); > } > ENTER_RECOVERY(CCV(ccv, t_flags)); > } > @@ -246,7 +251,7 @@ cubic_cong_signal(struct cc_var *ccv, ui > cubic_ssthresh_update(ccv); > cubic_data->num_cong_events++; > cubic_data->prev_max_cwnd =3D cubic_data->max_cwnd; > - cubic_data->max_cwnd =3D CCV(ccv, snd_cwnd); > + cubic_data->max_cwnd =3D cwin; > cubic_data->t_last_cong =3D ticks; > CCV(ccv, snd_cwnd) =3D CCV(ccv, snd_ssthresh); > ENTER_CONGRECOVERY(CCV(ccv, t_flags)); > @@ -261,9 +266,13 @@ cubic_cong_signal(struct cc_var *ccv, ui > * chance the first one is a false alarm and may not indicate > * congestion. > */ > - if (CCV(ccv, t_rxtshift) >=3D 2) > + if (CCV(ccv, t_rxtshift) >=3D 2) { > cubic_data->num_cong_events++; > cubic_data->t_last_cong =3D ticks; > + cubic_ssthresh_update(ccv); > + cubic_data->max_cwnd =3D cwin; > + CCV(ccv, snd_cwnd) =3D mss; > + } > break; > } > } >=20 > Modified: head/sys/netinet/cc/cc_dctcp.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/cc/cc_dctcp.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/cc/cc_dctcp.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -230,10 +230,11 @@ static void > dctcp_cong_signal(struct cc_var *ccv, uint32_t type) > { > struct dctcp *dctcp_data; > - u_int win, mss; > + uint32_t cwin; > + u_int mss; > =20 > dctcp_data =3D ccv->cc_data; > - win =3D CCV(ccv, snd_cwnd); > + cwin =3D CCV(ccv, snd_cwnd); > mss =3D CCV(ccv, t_maxseg); > =20 > switch (type) { > @@ -241,16 +242,16 @@ dctcp_cong_signal(struct cc_var *ccv, ui > if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) { > if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) { > CCV(ccv, snd_ssthresh) =3D mss * > - max(win / 2 / mss, 2); > + max(cwin / 2 / mss, 2); > dctcp_data->num_cong_events++; > } else { > /* cwnd has already updated as congestion > * recovery. Reverse cwnd value using > * snd_cwnd_prev and recalculate snd_ssthresh > */ > - win =3D CCV(ccv, snd_cwnd_prev); > + cwin =3D CCV(ccv, snd_cwnd_prev); > CCV(ccv, snd_ssthresh) =3D > - max(win / 2 / mss, 2) * mss; > + max(cwin / 2 / mss, 2) * mss; > } > ENTER_RECOVERY(CCV(ccv, t_flags)); > } > @@ -260,18 +261,18 @@ dctcp_cong_signal(struct cc_var *ccv, ui > * Save current snd_cwnd when the host encounters both > * congestion recovery and fast recovery. > */ > - CCV(ccv, snd_cwnd_prev) =3D win; > + CCV(ccv, snd_cwnd_prev) =3D cwin; > if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) { > if (V_dctcp_slowstart && > dctcp_data->num_cong_events++ =3D=3D 0) { > CCV(ccv, snd_ssthresh) =3D > - mss * max(win / 2 / mss, 2); > + mss * max(cwin / 2 / mss, 2); > dctcp_data->alpha =3D MAX_ALPHA_VALUE; > dctcp_data->bytes_ecn =3D 0; > dctcp_data->bytes_total =3D 0; > dctcp_data->save_sndnxt =3D CCV(ccv, snd_nxt); > } else > - CCV(ccv, snd_ssthresh) =3D max((win - ((win * > + CCV(ccv, snd_ssthresh) =3D max((cwin - ((cwin * > dctcp_data->alpha) >> 11)) / mss, 2) * mss; > CCV(ccv, snd_cwnd) =3D CCV(ccv, snd_ssthresh); > ENTER_CONGRECOVERY(CCV(ccv, t_flags)); > @@ -284,6 +285,8 @@ dctcp_cong_signal(struct cc_var *ccv, ui > dctcp_update_alpha(ccv); > dctcp_data->save_sndnxt +=3D CCV(ccv, t_maxseg); > dctcp_data->num_cong_events++; > + CCV(ccv, snd_ssthresh) =3D max(2 * mss, cwin / 2); > + CCV(ccv, snd_cwnd) =3D mss; > } > break; > } >=20 > Modified: head/sys/netinet/cc/cc_htcp.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/cc/cc_htcp.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/cc/cc_htcp.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -271,8 +271,12 @@ static void > htcp_cong_signal(struct cc_var *ccv, uint32_t type) > { > struct htcp *htcp_data; > + uint32_t cwin; > + u_int mss; > =20 > htcp_data =3D ccv->cc_data; > + cwin =3D CCV(ccv, snd_cwnd); > + mss =3D CCV(ccv, t_maxseg); > =20 > switch (type) { > case CC_NDUPACK: > @@ -287,8 +291,9 @@ htcp_cong_signal(struct cc_var *ccv, uin > (htcp_data->maxrtt - htcp_data->minrtt) * > 95) / 100; > htcp_ssthresh_update(ccv); > + CCV(ccv, snd_cwnd) =3D CCV(ccv, snd_ssthresh); > htcp_data->t_last_cong =3D ticks; > - htcp_data->prev_cwnd =3D CCV(ccv, snd_cwnd); > + htcp_data->prev_cwnd =3D cwin; > } > ENTER_RECOVERY(CCV(ccv, t_flags)); > } > @@ -305,7 +310,7 @@ htcp_cong_signal(struct cc_var *ccv, uin > htcp_ssthresh_update(ccv); > CCV(ccv, snd_cwnd) =3D CCV(ccv, snd_ssthresh); > htcp_data->t_last_cong =3D ticks; > - htcp_data->prev_cwnd =3D CCV(ccv, snd_cwnd); > + htcp_data->prev_cwnd =3D cwin; > ENTER_CONGRECOVERY(CCV(ccv, t_flags)); > } > break; > @@ -320,6 +325,8 @@ htcp_cong_signal(struct cc_var *ccv, uin > */ > if (CCV(ccv, t_rxtshift) >=3D 2) > htcp_data->t_last_cong =3D ticks; > + CCV(ccv, snd_ssthresh) =3D max(2 * mss, cwin / 2); > + CCV(ccv, snd_cwnd) =3D mss; > break; > } > } >=20 > Modified: head/sys/netinet/cc/cc_newreno.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/cc/cc_newreno.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/cc/cc_newreno.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -182,30 +182,39 @@ newreno_after_idle(struct cc_var *ccv) > static void > newreno_cong_signal(struct cc_var *ccv, uint32_t type) > { > - u_int win; > + uint32_t cwin; > + u_int mss; > + > + cwin =3D CCV(ccv, snd_cwnd); > + mss =3D CCV(ccv, t_maxseg); > =20 > /* Catch algos which mistakenly leak private signal types. */ > KASSERT((type & CC_SIGPRIVMASK) =3D=3D 0, > ("%s: congestion signal type 0x%08x is private\n", __func__, type)); > =20 > - win =3D max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) * > - CCV(ccv, t_maxseg); > + cwin =3D max(2*mss, cwin/2); > =20 > switch (type) { > case CC_NDUPACK: > if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) { > - if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) > - CCV(ccv, snd_ssthresh) =3D win; > + if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) { > + CCV(ccv, snd_ssthresh) =3D cwin; > + CCV(ccv, snd_cwnd) =3D cwin; > + } > ENTER_RECOVERY(CCV(ccv, t_flags)); > } > break; > case CC_ECN: > if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) { > - CCV(ccv, snd_ssthresh) =3D win; > - CCV(ccv, snd_cwnd) =3D win; > + CCV(ccv, snd_ssthresh) =3D cwin; > + CCV(ccv, snd_cwnd) =3D cwin; > ENTER_CONGRECOVERY(CCV(ccv, t_flags)); > } > break; > + case CC_RTO: > + CCV(ccv, snd_ssthresh) =3D cwin; > + CCV(ccv, snd_cwnd) =3D mss; > + break; > } > } > =20 >=20 > Modified: head/sys/netinet/tcp_input.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/tcp_input.c Tue Oct 25 04:14:03 2016 (r307898) > +++ head/sys/netinet/tcp_input.c Tue Oct 25 05:03:33 2016 (r307899) > @@ -438,9 +438,15 @@ cc_cong_signal(struct tcpcb *tp, struct=20 > tp->t_dupacks =3D 0; > tp->t_bytes_acked =3D 0; > EXIT_RECOVERY(tp->t_flags); > - tp->snd_ssthresh =3D max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 / > - maxseg) * maxseg; > - tp->snd_cwnd =3D maxseg; > + if (CC_ALGO(tp)->cong_signal =3D=3D NULL) { > + /* > + * RFC5681 Section 3.1=20 > + * ssthresh =3D max (FlightSize / 2, 2*SMSS) eq (4) > + */ > + tp->snd_ssthresh =3D > + max((tp->snd_max - tp->snd_una) / 2, 2 * maxseg); > + tp->snd_cwnd =3D maxseg; > + } > break; > case CC_RTO_ERR: > TCPSTAT_INC(tcps_sndrexmitbad); > @@ -2613,6 +2619,15 @@ tcp_do_segment(struct mbuf *m, struct tc > =20 > if (awnd < tp->snd_ssthresh) { > tp->snd_cwnd +=3D maxseg; > + /* > + * RFC5681 Section 3.2 talks about cwnd > + * inflation on additional dupacks and > + * deflation on recovering from loss. > + * > + * We keep cwnd into check so that > + * we don't have to 'deflate' it when we > + * get out of recovery. > + */ > if (tp->snd_cwnd > tp->snd_ssthresh) > tp->snd_cwnd =3D tp->snd_ssthresh; > } > @@ -2652,19 +2667,22 @@ tcp_do_segment(struct mbuf *m, struct tc > TCPSTAT_INC( > tcps_sack_recovery_episode); > tp->sack_newdata =3D tp->snd_nxt; > - tp->snd_cwnd =3D maxseg; > + if (CC_ALGO(tp)->cong_signal =3D=3D NULL) > + tp->snd_cwnd =3D maxseg; > (void) tp->t_fb->tfb_tcp_output(tp); > goto drop; > } > tp->snd_nxt =3D th->th_ack; > - tp->snd_cwnd =3D maxseg; > + if (CC_ALGO(tp)->cong_signal =3D=3D NULL) > + tp->snd_cwnd =3D maxseg; > (void) tp->t_fb->tfb_tcp_output(tp); > KASSERT(tp->snd_limited <=3D 2, > ("%s: tp->snd_limited too big", > __func__)); > - tp->snd_cwnd =3D tp->snd_ssthresh + > - maxseg * > - (tp->t_dupacks - tp->snd_limited); > + if (CC_ALGO(tp)->cong_signal =3D=3D NULL) > + tp->snd_cwnd =3D tp->snd_ssthresh + > + maxseg * > + (tp->t_dupacks - tp->snd_limited); > if (SEQ_GT(onxt, tp->snd_nxt)) > tp->snd_nxt =3D onxt; > goto drop; >=20 --ILuaRSyQpoVaJ1HG Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQF8BAABCgBmBQJYDufXXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXRBNEUyMEZBMUQ4Nzg4RjNGMTdFNjZGMDI4 QjkyNTBFMTU2M0VERkU1AAoJEIuSUOFWPt/lT5QH/1HNZsJL3YglDEKXtFulhE2A xOsHGLPpWr3+qudZP8h9H0euOk1SfxqAatKpagJOZBcEz3wwuYUr+cGzxAZ8l6cQ 81n549mEx1n180Sr2jA8Hpq3sKGalnLSPNMwcomGaFvEa098XUyIjp9VAKmrPj0B kPUBwnNZbwgHiRJ+fOxf4zUiLAQH7XlHsMl2YikgtJLWn0vqhVbffrWvYMh9LMOm 0GQHIZiKveBtLlOSlyPI5u6sp9omKeE3weB8BFtpCAWxoOGxG//AubEyVUw3zE4p 2MtvEjlkMnIK/mYmbj70NCXY8HFA9E26rnKH2ZcRVGc2p59ZMo7JQiB7ZjksxAM= =oYl+ -----END PGP SIGNATURE----- --ILuaRSyQpoVaJ1HG--