Re: RESTful Toggle

"Will Hartung [email protected] [rest-discuss]" <[email protected]> Wed, 9 Jul 2014 13:17:46 -0700
Newsgroups gmane.comp.web.services.rest
Message-ID <CAA2iDiBb_RF9XXqUxcZmbH9BwnLgmVDKiHUkUtOtigeiDjQHLA@mail.gmail.com>
--047d7b86dd00c5eb7d04fdc86697
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

A conditional PUT is focusing on the mechanic, not the result.

A PUT /light "ON" is idempotent. When it's done, the light is turned on,
whether it was on or not.

From a user perspective, they want the light "ON", how that is achieved
they simply don't care about.

The conditional PUT is "toggle the switch unless it's already toggled",
which is pretty silly. It's silly because that level of coordination simply
should not be exposed. It's also silly because it can be simply emulated by
fetching the state and PUTing to the the Other State (or an other state).

There are certainly scenarios for optimistic locking, I just don't really
think this is one of them.

As far as the latency issue, again, you're talking about primitives. If you
need to control a bank of lights, create a representation at the
appropriate granularity. Something like, I dunno, "room". PUT
/lights/room/living ON.

In the end, the system should control the light directly, and should have
access to the state of the lights. The "switches" (whether on the wall or
an iPhone) should be inputs to the system, which then interprets those
inputs and reacts with lights turning on and off. The switch does not turn
the light on, it asks the system to turn the light on, and the system will
do so if it deems it appropriate based on its internal rules.

Regards,

Will Hartung
([email protected])


On Wed, Jul 9, 2014 at 12:29 PM, Dong Liu <[email protected]> wrote:

> Right, a conditional PUT does not match an N-way switch well. To me, it i=
s
> even better than the real N-way switch because it reflects the true will =
of
> a user and avoids confusion (somehow magic) when his kids are pushing the
> other switches for the same light.
>
>
>
> On Wed, Jul 9, 2014 at 3:16 PM, Tim Bray <[email protected]> wrote:
>
>> How is that idempotent?  You absolutely can=E2=80=99t use PUT unless it=
=E2=80=99s
>> idempotent.
>>
>>
>>
>> On Wed, Jul 9, 2014 at 12:09 PM, Dong Liu [email protected]
>> [rest-discuss] <[email protected]> wrote:
>>
>>>
>>>
>>> For a three-way or N-way switch, I prefer a conditional PUT to a POST.
>>>
>>> Cheers,
>>>
>>> Dong
>>>
>>>
>>> On Wed, Jul 9, 2014 at 2:45 PM, Will Hartung [email protected]
>>> [rest-discuss] <[email protected]> wrote:
>>>
>>>>
>>>>
>>>> From home automation point of view, I can only think of one use case
>>>> where "toggle" actually has any validity, and that would be in the "3 =
way
>>>> switch" scenario.
>>>>
>>>> A 3 way switch is exemplified by walking up to a dark hallway, turning
>>>> the light on with a nearby swtich, walking to the end, and then turnin=
g the
>>>> light off with a switch at the other end.
>>>>
>>>> This use case is a true "toggle", since the "state" is the actual ligh=
t
>>>> (on or off), and the switch itself does not represent that state (unli=
ke a
>>>> normal, single switch). The switches can be "up" or "down" unrelated t=
o the
>>>> light being "on" or "off".
>>>>
>>>> Given that, again from a home automation point of view, I can't really
>>>> ever see "toggle" as a viable action. Maybe it's a primitive. But, in =
the
>>>> end, when you walk in to that dark hallway, what you want is the light=
 to
>>>> go on, the mechanics of the switches are secondary.
>>>>
>>>> I just mention this because at a high level, "toggle" doesn't make muc=
h
>>>> sense to me. The automation folks may well need it as a primitive to
>>>> control a switch. But at the "application" level, it doesn't make much
>>>> sense. At an application level, you either want the "Light" ON or OFF.
>>>>
>>>> So, with that consideration, a simple POST will do the trick.
>>>>
>>>> I don't think there's any "race condition", because "toggle" is not a
>>>> state, it's an action. If you care about the state, then set the state=
 you
>>>> want. You should hide the "toggle", and enforce the state behind the s=
cenes
>>>> (where you can manage race conditions on the server). Let the server d=
ecide
>>>> that when you change the state to ON, it can determine, internally, if=
 the
>>>> device is OFF and then send a TOGGLE command to make it ON. If it's al=
ready
>>>> ON, then nothing happens.
>>>>
>>>> But a "toggle" POST is just that, a simple command.
>>>>
>>>> Regards,
>>>>
>>>> Will Hartung
>>>> ([email protected])
>>>>
>>>>
>>>>
>>>>
>>>> On Wed, Jul 9, 2014 at 9:36 AM, Erik Wilde [email protected]
>>>> [rest-discuss] <[email protected]> wrote:
>>>>
>>>>>
>>>>>
>>>>> hello robby.
>>>>>
>>>>> On 2014-07-09, 17:47 , 'Simpson, Robby (GE Energy Management)'
>>>>> [email protected] [rest-discuss] wrote:
>>>>> >> it sounds like the scenario we were talking about, that all you
>>>>> want is
>>>>> >> to tell the resource to "reverse its state". in this case, i'd POS=
T
>>>>> a
>>>>> >> body that represents this request, in whatever serialization you
>>>>> happen
>>>>> >> to prefer. the resource toggles. everybody's happy.
>>>>> > OK. Still seems like a bit of a departure from typical RESTful
>>>>> interfaces
>>>>> > I've seen and has the potential to be a catch-all tunnel for
>>>>> RPC-style
>>>>> > requests.
>>>>> > E.g.:
>>>>> > /command, where one could POST all sorts of commands like "toggle."
>>>>>
>>>>> the problem is not that POST can mean anything (it can), but people
>>>>> POSTing things to a "do stuff" resource, which then isn't
>>>>> resource-oriented anymore. your RPC sensor shouldn't go off because o=
f
>>>>> people POSTing things to resources (that's fine), but because of
>>>>> people
>>>>> POSTing things to something other than resources (the "API end point"=
,
>>>>> for example).
>>>>>
>>>>>
>>>>> >> but i am confused because you wrote earlier that you were concerne=
d
>>>>> >> about race conditions. which seems to imply that instead of just
>>>>> >> toggling, you're also assuming that you're "toggling *from* some
>>>>> state".
>>>>> >> but that wouldn't be the "blind toggle" we discussed. could you
>>>>> clarify
>>>>> >> a bit how exactly the operation that you're trying to design is
>>>>> defined?
>>>>> > Apologies, a blind toggle is what is desired. As it currently works=
,
>>>>> in
>>>>> > the current binary protocol, a button press on a toggle switch simp=
ly
>>>>> > sends a "toggle" command.
>>>>>
>>>>> then how would a race condition enter the picture? just because of th=
e
>>>>> timestamp when you last observed the resource's state? or something
>>>>> else? to me, toggling always is kind of a game: if somebody toggled
>>>>> ahead of you, you'll do something other than you wanted to, but that'=
s
>>>>> how it is and you'll have to deal with it after toggling and finding
>>>>> out
>>>>> that you switched the damn thing back on again...
>>>>>
>>>>>
>>>>> cheers,
>>>>>
>>>>> dret.
>>>>>
>>>>> --
>>>>> erik wilde | mailto:[email protected] - tel:+1-510-2061079 |
>>>>> | UC Berkeley - School of Information (ISchool) |
>>>>> | http://dret.net/netdret http://twitter.com/dret |
>>>>>
>>>>>
>>>>
>>>> CONFIDENTIALITY NOTICE: The information contained in this electronic
>>>> transmission may be confidential. If you are not an intended recipient=
, be
>>>> aware that any disclosure, copying, distribution or use of the informa=
tion
>>>> contained in this transmission is prohibited and may be unlawful. If y=
ou
>>>> have received this transmission in error, please notify us by email re=
ply
>>>> and then erase it from your computer system.
>>>>
>>>>
>>>
>>>
>>>=20
>>>
>>
>>
>>
>> --
>> - Tim Bray (If you=E2=80=99d like to send me a private message, see
>> https://keybase.io/timbray)
>>
>
>

--=20
CONFIDENTIALITY NOTICE: The information contained in this electronic=20
transmission may be confidential. If you are not an intended recipient, be=
=20
aware that any disclosure, copying, distribution or use of the information=
=20
contained in this transmission is prohibited and may be unlawful. If you=20
have received this transmission in error, please notify us by email reply=20
and then erase it from your computer system.

--047d7b86dd00c5eb7d04fdc86697
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/htm=
l4/strict.dtd">
<html>
<head>
</head>






=20
<body style=3D"background-color: #fff;">
<span style=3D"display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id=3D"ygrp-mlmsg" style=3D"position:relative;">
  <div id=3D"ygrp-msg" style=3D"z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id=3D"ygrp-text" >
=20=20=20=20=20=20
=20=20=20=20=20=20
      <p><div dir=3D"ltr"><div><div><div><div><div><div>A conditional PUT i=
s focusing on the mechanic, not the result.<br><br></div>A PUT /light &quot=
;ON&quot; is idempotent. When it&#39;s done, the light is turned on, whethe=
r it was on or not.<br>
<br></div>From a user perspective, they want the light &quot;ON&quot;, how =
that is achieved they simply don&#39;t care about.<br><br>The conditional P=
UT is &quot;toggle the switch unless it&#39;s already toggled&quot;, which =
is pretty silly. It&#39;s silly because that level of coordination simply s=
hould not be exposed. It&#39;s also silly because it can be simply emulated=
 by fetching the state and PUTing to the the Other State (or an other state=
).<br>
<br></div>There are certainly scenarios for optimistic locking, I just don&=
#39;t really think this is one of them.<br><br>As far as the latency issue,=
 again, you&#39;re talking about primitives. If you need to control a bank =
of lights, create a representation at the appropriate granularity. Somethin=
g like, I dunno, &quot;room&quot;. PUT /lights/room/living ON.<br>
<br></div>In the end, the system should control the light directly, and sho=
uld have access to the state of the lights. The &quot;switches&quot; (wheth=
er on the wall or an iPhone) should be inputs to the system, which then int=
erprets those inputs and reacts with lights turning on and off. The switch =
does not turn the light on, it asks the system to turn the light on, and th=
e system will do so if it deems it appropriate based on its internal rules.=
<br>
<br></div>Regards,<br><br>Will Hartung<br></div>(<a href=3D"mailto:willh@mi=
rthcorp.com">[email protected]</a>)<br></div><div class=3D"gmail_extra"><=
br><br><div class=3D"gmail_quote">On Wed, Jul 9, 2014 at 12:29 PM, Dong Liu=
 <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=3D"_bla=
nk">[email protected]</a>&gt;</span> wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"border-left:1px #ccc solid;"><di=
v dir=3D"ltr">Right, a conditional PUT does not match an N-way switch well.=
 To me, it is even better than the real N-way switch because it reflects th=
e true will of a user and avoids confusion (somehow magic) when his kids ar=
e pushing the other switches for the same light. =C2=A0<div>
<div class=3D"h5"><br>
<div class=3D"gmail_extra"><br><br><div class=3D"gmail_quote">On Wed, Jul 9=
, 2014 at 3:16 PM, Tim Bray <span dir=3D"ltr">&lt;<a href=3D"mailto:tbray@t=
extuality.com" target=3D"_blank">[email protected]</a>&gt;</span> wrote:=
<br><blockquote class=3D"gmail_quote" style=3D"border-left:1px #ccc solid;"=
>

<div dir=3D"ltr"><div style=3D"font-size:small;">How is that idempotent? =
=C2=A0You absolutely can=E2=80=99t use PUT unless it=E2=80=99s idempotent.<=
/div><div style=3D"font-size:small;"><br></div></div><div class=3D"gmail_ex=
tra">

<br><br><div class=3D"gmail_quote"><div><div>On Wed, Jul 9, 2014 at 12:09 P=
M, Dong Liu <a href=3D"mailto:[email protected]" target=3D"_blank">edongli=
[email protected]</a> [rest-discuss] <span dir=3D"ltr">&lt;<a href=3D"mailto:rest=
[email protected]" target=3D"_blank">rest-discuss-noreply@ya=
hoogroups.com</a>&gt;</span> wrote:<br>



</div></div><blockquote class=3D"gmail_quote" style=3D"border-left:1px #ccc=
 solid;">






=20=20=20=20=20=20=20=20




<div><div><div>





<br><br>




<div dir=3D"ltr">For a three-way or N-way switch, I prefer a conditional PU=
T to a POST.=C2=A0<div><br></div><div>Cheers,</div><div><br></div><div>Dong=
</div></div><div class=3D"gmail_extra"><br><br><div class=3D"gmail_quote">O=
n Wed, Jul 9, 2014 at 2:45 PM, Will Hartung <a href=3D"mailto:willh@mirthco=
rp.com" target=3D"_blank">[email protected]</a> [rest-discuss] <span dir=
=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=
=3D"_blank">[email protected]</a>&gt;</span> wrote:<br>




<blockquote class=3D"gmail_quote" style=3D"border-left:1px #ccc solid;">


<u></u>









=20
<div style=3D"background-color:#fff;">
<span>=C2=A0</span>


<div>
  <div>


    <div>
=20=20=20=20=20=20
=20=20=20=20=20=20
      <p></p><div dir=3D"ltr"><div><div><div><div><div><div><div>From home =
automation point of view, I can only think of one use case where &quot;togg=
le&quot; actually has any validity, and that would be in the &quot;3 way sw=
itch&quot; scenario.<br>





<br></div>
A 3 way switch is exemplified by walking up to a dark hallway, turning the =
light on with a nearby swtich, walking to the end, and then turning the lig=
ht off with a switch at the other end.<br><br></div>This use case is a true=
 &quot;toggle&quot;, since the &quot;state&quot; is the actual light (on or=
 off), and the switch itself does not represent that state (unlike a normal=
, single switch). The switches can be &quot;up&quot; or &quot;down&quot; un=
related to the light being &quot;on&quot; or &quot;off&quot;.<br>






<br></div>Given that, again from a home automation point of view, I can&#39=
;t really ever see &quot;toggle&quot; as a viable action. Maybe it&#39;s a =
primitive. But, in the end, when you walk in to that dark hallway, what you=
 want is the light to go on, the mechanics of the switches are secondary.<b=
r>






<br></div>I just mention this because at a high level, &quot;toggle&quot; d=
oesn&#39;t make much sense to me. The automation folks may well need it as =
a primitive to control a switch. But at the &quot;application&quot; level, =
it doesn&#39;t make much sense. At an application level, you either want th=
e &quot;Light&quot; ON or OFF.<br>





<br></div>So, with that consideration, a simple POST will do the trick.<br>=
<br></div>I don&#39;t think there&#39;s any &quot;race condition&quot;, bec=
ause &quot;toggle&quot; is not a state, it&#39;s an action. If you care abo=
ut the state, then set the state you want. You should hide the &quot;toggle=
&quot;, and enforce the state behind the scenes (where you can manage race =
conditions on the server). Let the server decide that when you change the s=
tate to ON, it can determine, internally, if the device is OFF and then sen=
d a TOGGLE command to make it ON. If it&#39;s already ON, then nothing happ=
ens.<br>





<br></div>But a &quot;toggle&quot; POST is just that, a simple command.<br>=
<br><div><div><div><div><div><div>Regards,<br><br>Will Hartung<br>(<a href=
=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>)<=
br>




</div><div><br>
<div><br></div></div></div></div></div></div></div></div><div><div><div cla=
ss=3D"gmail_extra"><br><br><div class=3D"gmail_quote">On Wed, Jul 9, 2014 a=
t 9:36 AM, Erik Wilde <a href=3D"mailto:[email protected]" target=3D"_blank=
">[email protected]</a> [rest-discuss] <span dir=3D"ltr">&lt;<a href=3D"mai=
lto:[email protected]" target=3D"_blank">rest-discuss-no=
[email protected]</a>&gt;</span> wrote:<br>





<blockquote class=3D"gmail_quote" style=3D"border-left:1px #ccc solid;">


<u></u>









=20
<div style=3D"background-color:#fff;">
<span>=C2=A0</span>


<div>
  <div>


    <div>
=20=20=20=20=20=20
=20=20=20=20=20=20
      <p>hello robby.<br>
<br>
On 2014-07-09, 17:47 , &#39;Simpson, Robby (GE Energy Management)&#39; <br>=
</p><div>
<a href=3D"mailto:[email protected]" target=3D"_blank">robby.simpson@ge.=
com</a> [rest-discuss] wrote:<br>
&gt;&gt; it sounds like the scenario we were talking about, that all you wa=
nt is<br>
&gt;&gt; to tell the resource to &quot;reverse its state&quot;. in this cas=
e, i&#39;d POST a<br>
&gt;&gt; body that represents this request, in whatever serialization you h=
appen<br>
&gt;&gt; to prefer. the resource toggles. everybody&#39;s happy.<br>
&gt; OK.  Still seems like a bit of a departure from typical RESTful interf=
aces<br>
&gt; I&#39;ve seen and has the potential to be a catch-all tunnel for RPC-s=
tyle<br>
&gt; requests.<br>
&gt; E.g.:<br>
&gt; /command, where one could POST all sorts of commands like &quot;toggle=
.&quot;<br>
<br></div>
the problem is not that POST can mean anything (it can), but people <br>
POSTing things to a &quot;do stuff&quot; resource, which then isn&#39;t <br=
>
resource-oriented anymore. your RPC sensor shouldn&#39;t go off because of =
<br>
people POSTing things to resources (that&#39;s fine), but because of people=
 <br>
POSTing things to something other than resources (the &quot;API end point&q=
uot;, <br>
for example).<div><br>
<br>
&gt;&gt; but i am confused because you wrote earlier that you were concerne=
d<br>
&gt;&gt; about race conditions. which seems to imply that instead of just<b=
r>
&gt;&gt; toggling, you&#39;re also assuming that you&#39;re &quot;toggling =
*from* some state&quot;.<br>
&gt;&gt; but that wouldn&#39;t be the &quot;blind toggle&quot; we discussed=
. could you clarify<br>
&gt;&gt; a bit how exactly the operation that you&#39;re trying to design i=
s defined?<br>
&gt; Apologies, a blind toggle is what is desired.  As it currently works, =
in<br>
&gt; the current binary protocol, a button press on a toggle switch simply<=
br>
&gt; sends a &quot;toggle&quot; command.<br>
<br></div>
then how would a race condition enter the picture? just because of the <br>
timestamp when you last observed the resource&#39;s state? or something <br=
>
else? to me, toggling always is kind of a game: if somebody toggled <br>
ahead of you, you&#39;ll do something other than you wanted to, but that&#3=
9;s <br>
how it is and you&#39;ll have to deal with it after toggling and finding ou=
t <br>
that you switched the damn thing back on again...<div><br>
<br>
cheers,<br>
<br>
dret.<br>
<br>
-- <br>
erik wilde | mailto:<a href=3D"mailto:[email protected]" target=3D"_blank">=
[email protected]</a>  -  tel:<a href=3D"tel:%2B1-510-2061079" value=3D"+15=
102061079" target=3D"_blank">&#43;1-510-2061079</a> |<br>
            | UC Berkeley  -  School of Information (ISchool) |<br>
            | <a href=3D"http://dret.net/netdret" target=3D"_blank">http://=
dret.net/netdret</a> <a href=3D"http://twitter.com/dret" target=3D"_blank">=
http://twitter.com/dret</a> |<br>
</div><p></p>

    </div>
=20=20=20=20=20

=20=20=20=20
    <div style=3D"color:#fff;min-height:0;"></div>


</div>



=20=20






</div></div></blockquote></div><br></div>

<br>
</div></div><span><font face=3D"Arial" size=3D"1">CONFIDENTIALITY NOTICE: T=
he information contained in this electronic transmission may be confidentia=
l. If you are not an intended recipient, be aware that any disclosure, copy=
ing, distribution or use of the information contained in this transmission =
is prohibited and may be unlawful. If you have received this transmission i=
n error, please notify us by email reply and then erase it from your comput=
er system.</font></span><p>




</p>

    </div>
=20=20=20=20=20

=20=20=20=20
    <div style=3D"color:#fff;min-height:0;"></div>


</div>



=20=20






</div></div></blockquote></div><br></div>






<br>


<br>




<div width=3D"1" style=3D"color:white;"></div>



</div></div></div></blockquote></div><div><br><br clear=3D"all"><div><br></=
div>-- <br><div dir=3D"ltr"><div>- Tim Bray (If you=E2=80=99d like to send =
me a private message, see <a href=3D"https://keybase.io/timbray" target=3D"=
_blank">https://keybase.io/timbray</a>)</div>



</div>
</div></div>
</blockquote></div><br></div></div></div></div>
</blockquote></div><br></div>

<br>
<span><font face=3D"Arial" size=3D"1">CONFIDENTIALITY NOTICE: The informati=
on contained in this electronic transmission may be confidential. If you ar=
e not an intended recipient, be aware that any disclosure, copying, distrib=
ution or use of the information contained in this transmission is prohibite=
d and may be unlawful. If you have received this transmission in error, ple=
ase notify us by email reply and then erase it from your computer system.</=
font></span></p>

    </div>
=20=20=20=20=20

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style=3D"color: #fff; height: 0;">__._,_.___</div>

=20=20=20=20=20=20=20=20=20=20
=20=20
=20

=20=20=20=20
    <div style=3D"clear:both"> </div>

    <div id=3D"fromDMARC" style=3D"margin-top: 10px;">
        <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; background=
-color:#E3E3E3;">
        Posted by: Will Hartung &lt;[email protected]&gt;        <hr styl=
e=3D"height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;"=
>
     </div>
    <div style=3D"clear:both"> </div>

    <table cellspacing=3D4px style=3D"margin-top: 10px; margin-bottom: 10px=
; color: #2D50FD;">
      <tbody>
        <tr>
          <td style=3D"font-size: 12px; font-family: arial; font-weight: bo=
ld; padding: 7px 5px 5px;"  >
                          <a style=3D"text-decoration: none; color: #2D50FD=
" href=3D"https://groups.yahoo.com/neo/groups/rest-discuss/conversations/me=
ssages/19689;_ylc=3DX3oDMTJxbHA3Y2VjBF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3J=
wc3BJZAMxNzA1NzAxMDE0BG1zZ0lkAzE5Njg5BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTQwND=
kzNzA2Nw--?act=3Dreply&messageNum=3D19689">Reply via web post</a>
                      </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;" >
            <a href=3D"mailto:[email protected]?subject=3DRe%3A%20%5Brest=
-discuss%5D%20RESTful%20Toggle" style=3D"text-decoration: none; color: #2D5=
0FD;">
               Reply to sender            </a>
          </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;">
            <a href=3D"mailto:[email protected]?subject=3DRe%3A%=
20%5Brest-discuss%5D%20RESTful%20Toggle" style=3D"text-decoration: none; co=
lor: #2D50FD">
              Reply to group            </a>
          </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;" >
            <a href=3D"https://groups.yahoo.com/neo/groups/rest-discuss/con=
versations/newtopic;_ylc=3DX3oDMTJldm1vMW5yBF9TAzk3MzU5NzE0BGdycElkAzQzMTky=
NTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTQwNDkzNzA2Nw-=
-" style=3D"text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;color: #2D50FD;" >
                            <a href=3D"https://groups.yahoo.com/neo/groups/=
rest-discuss/conversations/topics/19657;_ylc=3DX3oDMTM2N3JnbGw3BF9TAzk3MzU5=
NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BG1zZ0lkAzE5Njg5BHNlYwNmdHI=
Ec2xrA3Z0cGMEc3RpbWUDMTQwNDkzNzA2NwR0cGNJZAMxOTY1Nw--" style=3D"text-decora=
tion: none; color: #2D50FD;">Messages in this topic</a>
                (32)
                      </td>
        </tr>
      </tbody>
    </table>

=20=20=20=20=20=20=20=20

<!------- Start Nav Bar ------>




=20

<!-- |**|begin egp html banner|**| -->
<div id=3D"ygrp-vital" style=3D"background-color: #f2f2f2; font-family: Ver=
dana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

    <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-transf=
orm: uppercase; "><a href=3D"https://groups.yahoo.com/neo/groups/rest-discu=
ss/info;_ylc=3DX3oDMTJlaTh0NGtrBF9TAzk3MzU5NzE0BGdycElkAzQzMTkyNTUEZ3Jwc3BJ=
ZAMxNzA1NzAxMDE0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTQwNDkzNzA2Nw--" style=3D"=
text-decoration: none;">Visit Your Group</a></span>

     <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: in=
line;">
            <li style=3D"border-right: 1px solid #000; font-weight: 700; di=
splay: inline; padding: 0 5px; margin-left: 0;">
      <span class=3D"cat"><a href=3D"https://groups.yahoo.com/neo/groups/re=
st-discuss/members/all;_ylc=3DX3oDMTJmM3NsYjdzBF9TAzk3MzU5NzE0BGdycElkAzQzM=
TkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzE0MDQ5Mzcw=
Njc-" style=3D"text-decoration: none;">New Members</a></span>
      <span class=3D"ct" style=3D"color: #ff7900;">3</span>
    </li>
                                              </ul>
  </div>


<div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p=
x; padding: 0 2px 0 0; clear: both;">
  <a href=3D"https://groups.yahoo.com/neo;_ylc=3DX3oDMTJkMDQyZXY0BF9TAzk3ND=
c2NTkwBGdycElkAzQzMTkyNTUEZ3Jwc3BJZAMxNzA1NzAxMDE0BHNlYwNmdHIEc2xrA2dmcARzd=
GltZQMxNDA0OTM3MDY3" style=3D"float: left;"><img src=3D"http://l.yimg.com/r=
u/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height=3D"15"=
 width=3D"137" alt=3D"Yahoo! Groups" style=3D"border: 0;"/></a>
  <div style=3D"color: #747575; float: right;"> &bull; <a href=3D"https://i=
nfo.yahoo.com/privacy/us/yahoo/groups/details.html" style=3D"text-decoratio=
n: none;">Privacy</a> &bull; <a href=3D"mailto:rest-discuss-unsubscribe@yah=
oogroups.com?subject=3DUnsubscribe" style=3D"text-decoration: none;">Unsubs=
cribe</a> &bull; <a href=3D"https://info.yahoo.com/legal/us/yahoo/utos/term=
s/" style=3D"text-decoration: none;">Terms of Use</a> </div>
</div>
<br>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

=20
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id=3D"ygrp-sponsor" style=3D"width:160px; float:right; clear:none; m=
argin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id=3D"ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style=3D"clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src=3D"http://geo.yahoo.com/serv?s=3D97359714/grpId=3D4319255/grpspI=
d=3D1705701014/msgId=3D19689/stime=3D1404937067" width=3D"1" height=3D"1"> =
<br>

<img src=3D"http://y.analytics.yahoo.com/fpc.pl?ywarid=3D515FB27823A7407E&a=
=3D10001310322279&js=3Dno&resp=3Dimg" width=3D"1" height=3D"1">=20

<div style=3D"color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type=3D"text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
=20=20
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.fi=
le-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div=
.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  }=20

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important;=20
  }=20
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--047d7b86dd00c5eb7d04fdc86697--