On 17/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > Thanks, have created enhancement bug 46030 and attached source to it.
Thanks, I'll have a look later. > In relation to the ICLA/CCLA, does this qualify the individual/company to be > listed as a contributor to the project and should we send in both or can we > just send in a CCLA? > The ICLA/CCLA don't have any bearing on whether or not a contributor is listed. [The JMeter contributor list is on the Wiki, so people can add themselves.] The ASF requires the ICLA which is signed by the author of the code. The CCLA is optional, and depends on whether you think you need one. > > -----Original Message----- > From: sebb [mailto:[EMAIL PROTECTED] > > Sent: 15 October 2008 11:50 > To: JMeter Developers List > > Subject: Re: FW: TCP Sampler Extension to support length-prefixed binary > data > > > On 15/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > > Hello again, > > > > Have implemented the following: > > > > BinaryTCPClientImpl > > Concrete class which implements TCPClient Interface and converts > hex-encoded strings to byte array in > > write(OutputStream, String) and from byte array to hex-encoded string in > read(InputStream). > > write(OutputStream, InputStream) is unsupported. > > Contains utility method hexStringToByteArray(String s) which is a mirror > of the JOrphanUtils.baToHexString(byte[]) method. > > > > TCPClientDecorator > > Abstract class implementing TCPClient Interface. This is to allow > wrapping of TCPClientImpl/BinaryTCPClientImpl above with length prefixing > methods. > > Contains two utility methods intToByteArray(int value, int len) and > byteArrayToInt(byte[] b). Methods support 2 and 4 and byte lengths only and > throw an IllegalArgumentException in other cases. > > > > LengthPrefixedBinaryTCPClientImpl > > Extends TCPClientDecorator and instantiates decorator with > BinaryTCPClientImpl. > > The length to use in the prefix is taken from the properties file and > defaults to 2. > > For write(OutputStream os, String s) the length is calculated and written > to the output stream then the method delegates to the BinaryTCPClientImpl > write() method. > > read(InputStream is) is overridden. > > write(OutputStream os, InputStream is) is not supported. > > > > Have created JUnit tests for the three utility methods but not for the > read/write implementations themselves. These are in two test classes, > BinaryTCPClientImplTest and TCPClientDecoratorTest. > > > > Have left the utility methods bundled with the client implementations to > avoid modifying existing utility classes. > > > > Have not changed the Sampler GUI as we might end up with some broken test > cases when this is changed in the repository. We will change the properites > file as needed for now. > > > > Hopefully this will be useful and we are happy for the code structure to > be modified if it does not turn out to be a good fit with changes to the > TCPClient interface discussed earlier. > > All sounds good. > > > What should we do next in terms of submitting this code for inclusion in > a future release? > > Create a Bugzilla enhancement issue, and attach the files/patches to that. > Please make sure any new source files have the usual Apache Licence header. > > As the code contributions are quite substantial, it would be helpful > if the contributor(s) could sign ICLAs. You may also want to provide > a CCLA from the company. > > For details, please see: > > http://www.apache.org/licenses/#clas > > > Thanks, > > Thank you! > > > Oghie. > > > > > > -----Original Message----- > > From: Oghie Sheehy > > Sent: 13 October 2008 08:53 > > To: 'JMeter Developers List' > > Cc: Mike Cronin > > > > Subject: RE: TCP Sampler Extension to support length-prefixed binary > > data > > > > > > > Yes, I can do the updates to the TCPSampler. > > > > > I think you can still test your code using the current JMeter, so long > > > as you use the old TCPClient interface methods. Converting to the new > > > interface could be done later when the TCP Sampler is updated. Should > > > be fairly trivial - I'm happy to do that. > > > > Thanks, will use existing interface. > > > > -----Original Message----- > > From: sebb [mailto:[EMAIL PROTECTED] > > Sent: 10 October 2008 16:27 > > To: JMeter Developers List > > Cc: Mike Cronin > > Subject: Re: TCP Sampler Extension to support length-prefixed binary > > data > > > > > > On 10/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > > > > Yes, but the character set is largely irrelevant, as the hex > > > > characters are the same in most (all?) sets. > > > > > > > > > > I was assuming that the hex-encoded binary string would be converted > > > > to binary in the client. This does not really need a variable > encoding > > > > as hex characters are the same in all main character sets, but for > > > > portability the client could use a fixed set, e.g. 8859-1 or utf-8. > > > > > > > > Likewise for the binary->hex conversion. The client could convert > > > > binary nibbles to character string and then to bytes, but since we > > > > know the conversion for these they could be converted direct to > bytes. > > > > > > > > The character set used to display the response would not matter in > this case. > > > > > > > > > Thanks, needed to be sure we were talking about the same thing and > wondered whether hex representation was different according to character set. > > > > > > So guess I'm back to what we agreed a few days ago... > > > > > > Will create client(s) to support hex-binary encoding and length prefix > (length of prefix specified in properties for now). Will create a local > version of the TCPClient Interface which you outlined earlier and implement > this interface. > > > > > > > OK. > > > > > Locally the client will be selectable from the TCP Sampler GUI as you > originally suggested. We need this flexibility across TCP test plans where > the same user would wish to run the TCPClientImpl in some and the new client > in another without having to change the properties file in-between. > > > > Yes, I can do the updates to the TCPSampler. > > > > I think you can still test your code using the current JMeter, so long > > as you use the old TCPClient interface methods. Converting to the new > > interface could be done later when the TCP Sampler is updated. Should > > be fairly trivial - I'm happy to do that. > > > > > Can retrofit later if you think we should have a separate > TCPSampler/GUI. > > > > > > > > > > I suppose the question is: are there any protocols where it would be > > > > difficult/wasteful to return bytes rather than a String? > > > > > > > If so, then perhaps the SampleResult class needs to be enhanced to > > > > handle results returned as Strings as well as byte arrays. I'm not > > > > sure how easy that would be. > > > > > > > There would also need to be a way to tell the TCP sampler that the > > > > client returns a String rather than a byte array - assuming we change > > > > the read() method. > > > > > > > I need to think some more about this ! > > > > > > > > > Could not come up with a realistic example. > > > > > > > > > -----Original Message----- > > > From: sebb [mailto:[EMAIL PROTECTED] > > > > > > Sent: 10 October 2008 11:37 > > > To: JMeter Developers List > > > Subject: Re: TCP Sampler Extension to support length-prefixed binary > > > data > > > > > > > > > On 10/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > > > > > WDYT? > > > > > > > > Overall I think this is a good idea because, if my understanding is > correct, it allows the sampler->client->sampler->listener to use distinct > character encodings. Also it puts the encoding logic in the endpoints where > it is needed rather than cluttering up the sampler. > > > > > > > > I am a little confused in relation to the encoding/decoding of the > hex-encoded binary because there is a double-encoding here as the string > containing the hex-encoded binary is itself encoded in a character set. > > > > > > Yes, but the character set is largely irrelevant, as the hex > > > characters are the same in most (all?) sets. > > > > > > > byte array->hex-encoded binary string->byte array->character set > encoded string > > > > > > > > On receiving a response the byte array would need to be converted > to a hex-encoded binary string (in the default character set) then back to a > byte array (using String.getBytes()) then finally into the target character > set. > > > > > > > > I think that you meant the byte array->hex-encoded binary > string->byte array conversion to occur within the client and the character > set encoding to occur within the listener, is this correct? > > > > > > > > > > > > > > I was assuming that the hex-encoded binary string would be converted > > > to binary in the client. This does not really need a variable encoding > > > as hex characters are the same in all main character sets, but for > > > portability the client could use a fixed set, e.g. 8859-1 or utf-8. > > > > > > Likewise for the binary->hex conversion. The client could convert > > > binary nibbles to character string and then to bytes, but since we > > > know the conversion for these they could be converted direct to bytes. > > > > > > The character set used to display the response would not matter in > this case. > > > > > > I suppose the question is: are there any protocols where it would be > > > difficult/wasteful to return bytes rather than a String? > > > > > > If so, then perhaps the SampleResult class needs to be enhanced to > > > handle results returned as Strings as well as byte arrays. I'm not > > > sure how easy that would be. > > > > > > There would also need to be a way to tell the TCP sampler that the > > > client returns a String rather than a byte array - assuming we change > > > the read() method. > > > > > > I need to think some more about this ! > > > > > > > > > > > > > > > -----Original Message----- > > > > From: sebb [mailto:[EMAIL PROTECTED] > > > > > > > > Sent: 09 October 2008 13:34 > > > > To: JMeter Developers List > > > > Subject: Re: TCP Sampler Extension to support length-prefixed binary > > > > data > > > > > > > > > > > > On 09/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > > > > > > Yes. > > > > > > > > > > > I'm still considering how to fix up the read() method. > Probably I'll > > > > > > add a readBytes() method and maybe add an abstract class that > > > > > > implements it. > > > > > > > > > > > The problem is that the sampler has to convert the string to > bytes in > > > > > > order to store it in the sample result. Wire protocols work in > terms > > > > > > of bytes, so this means multiple conversions, with the > possibility of > > > > > > data loss if some bytes are not both-ways convertible. > > > > > > > > > > > > > > > Am with you now, had thought that strings were stored in the > sample result but of course they're not. > > > > > > > > > > Like the idea of adding the readBytes() method and allowing the > sampler to convert the bytes as appropriate because the responsibility of the > client should be to handle the byte exchange alone. > > > > > > > > > > Rather than adding the abstract class could the byte[] > implementation replace the string read() method in the sampler and drop the > byte [] straight into the sampler result? This would affect existing > testplans which are working because of the inherent data conversion and there > may not be too many of these? > > > > > > > > Yes, that's possible. In either case existing implementations would > > > > need to be amended and rebuilt, so I suppose it does not matter > which > > > > is done. > > > > > > > > It would be possible to extend the TCPClient interface to add a > > > > readBytes() method, and have TCPSampler use instanceof to choose > which > > > > method to use. This would allow old implementations to continue, but > > > > would be less efficient - and we want implementations to return > bytes. > > > > So I think it would be OK to break compatibility. > > > > > > > > > Also think that a writeBytes() method is needed. > > > > > > > > > > > > > I see what you mean - the client implementation currently has to > > > > convert the string into bytes, and the sampler has no control over > the > > > > encoding that is used. > > > > > > > > I think it's unlikely that there are many 3rd party implementations > > > > (if any) so perhaps the string method should be removed. > > > > > > > > We need the input/output encodings to be specified on the sampler > GUI > > > > (they can default to the current setting, for backward compat.) > > > > > > > > > > Sorry, should have explained in more detail: I was thinking > that setup > > > > > > parameters could be used to configure the protocol > implementation. > > > > > > This could be useful for minor variants on the protocol - e.g. > 4byte > > > > > > length prefix, and variable length strings. > > > > > > > > > > > > > > > Yes this would make sense. > > > > > > > > > > ****** > > > > > > > > > > Revisiting the length-prefixed binary extension based on the > multiple conversion point raised above, apologies for repetition and stating > the obvious here but just need to work through it... > > > > > > > > Good idea. > > > > > > > > > A client extension is required to handle length prefix > regardless of whether byte[] or string is returned. > > > > > > > > Yes. > > > > > > > > > The client needs to know how many bytes contain the length and > how to interpret these bytes. This would pollute the client/sampler > relationship because the client needs to know about the structure of the byte > stream. > > > > > > > > I was suggesting that the sampler deals only in the data without > prefixes. > > > > The client needs to know how to add/remove the length prefix. > > > > The prefix length is either fixed in the client, or the sampler can > > > > pass in a parameter which tells it what particular protocol > variation > > > > is to be used. > > > > > > > > The sampler is interested in the user data, the client looks after > the > > > > packaging. > > > > > > > > > It seems reasonable that a service could use a 2 or 4-byte > binary length while the message payload would contain character data so a > client and sampler would not necessarily interpret bytes in the same way. > > > > > > > > > > It also seems reasonable that a length prefix should always > specify the no. of bytes to read (as this is a wire-level field) rather than > characters. > > > > > > > > Yes. > > > > > > > > > So the client should not be concerned about the character set of > the data but only by the size and interpretation of the length prefix. > > > > > > > > This will only be true if the input is bytes or a stream. > > > > I now think the client show know the encoding (see below). > > > > > > > > > The sampler needs to know how to represent the data in a > human-readable form while not losing any information due to conversion. > Therefore it needs to know whether the data is binary/character set. > > > > > > > > I think that depends on how you look at the protocol. In your > original > > > > case, you would like JMeter to hande hex-encoded binary. You could > > > > regard the conversion between hex and binary as part of the > protocol, > > > > and therefore handled by the client. > > > > > > > > I'm not keen on putting too much processing in the sampler. The idea > > > > is that JMeter users can develop their own implementations in order > to > > > > handle any special processing, and this can be provided in an add-on > > > > jar. It's a lot harder for a user to make changes to the sampler. > > > > > > > > I'm hoping that we can come up with more generic sampler which > allows > > > > client implementations to do what they need to do. > > > > > > > > I'm now beginning to think that the client should still be passed > the > > > > string from the GUI, but that it also needs the encoding - which it > > > > may ignore. This makes it more flexible for clients that need to > > > > process the string before transmission. > > > > > > > > > Lastly I think it would be justifiable and from a > user-perspective preferable to hide the length prefix from sampler input and > results. > > > > > > > > Yes, see above. > > > > > > > > > To achieve this I now think that the following changes should be > made: > > > > > > > > > > Client: > > > > > Either a single new client TCPLengthPrefixedClientImpl which > takes length prefix length and length prefix format binary/character set as > constructor/setter arguments. For this to be flexible these need to provided > through the Sampler GUI. > > > > > OR multiple new clients BinaryTCPLengthPrefixedClientImpl, > DecimalTCPLengthPrefixedClientImpl etc. which take the length prefix length > as a constructor. > > > > > > > > > > Client(s) would implement/override writeBytes(byte[]) method and > generate the length prefix appropriately based on the size of the byte array. > > > > > > > > Yes, that's what I was thinking. > > > > > > > > > Client(s) would override readBytes() method and interpret the > length bytes from the stream, these would not be passed back to the sampler. > > > > > > > > Yes. > > > > > > > > > The reason for adding/stripping length bytes is so that the > sampler does not have to understand these. > > > > > > > > Agreed. > > > > > > > > > Sampler GUI: > > > > > From above GUI needs to specify > > > > > a) Length prefix length > > > > > b) Length prefix format OR ClientImpl as above > > > > > > > > No, I think these are part of the client implementation, see above. > > > > > > > > > In addition the GUI needs to specify > > > > > c) Data format > > > > > > > > Again, I think this is best dealt with by the client implementation. > > > > > > > > > Sampler: > > > > > The sampler needs to convert the input text string into a byte[] > for transmission and a > > > > byte[] into a text string (e.g. to hex string for binary/to local > > > > character set for character set). This then goes back into the > > > > sampler result using the getBytes() method as before. > > > > > > > > Not quite. > > > > > > > > Originally I thought the sampler should convert the GUI data to > bytes > > > > using the specified encoding. I now think the sampler should pass in > > > > the string and the encoding, as this is more flexible. > > > > > > > > On return, it copies the bytes to the sample result, and sets the > > > > appropriate encoding - there is no conversion at that point. The > > > > response is only converted to a string when it is extracted from the > > > > sample result, e.g. by the Tree View Listener. > > > > > > > > The only issue I can see here is: how does the sampler know what > > > > encoding to use for the response? This can be specified on the GUI > (or > > > > we can assume it is the same as the request encoding). If there is > > > > likely to be a possibility that the encoding is defined in the > > > > response message (for example, this is how HTTP responses work), > then > > > > I think it makes sense for the client to extract this information, > and > > > > pass it back to the sampler somehow. > > > > > > > > We could add a getEncoding() method to the interface, but it might > be > > > > better to use a generic Object getParameter(String name) to the > > > > interface, in case it is later found that there are other items that > > > > need to be retrieved. The sampler would need to be updated, but > > > > existing clients would not need to be updated. > > > > > > > > In summary, I think the TCPClient interface should probably be > amended > > > > as follows: > > > > > > > > void write(OutputStream os, String s, String encoding); > > > > > > > > The > > > > void write(OutputStream os, InputStream is); > > > > method probably does not need the encoding. > > > > > > > > void setParameter(String name, Object value); > > > > > > > > Object getParameter(String name); > > > > > > > > There would be an abstract class that provides a dummy > implementation > > > > for the get/set Parameter methods. > > > > > > > > WDYT? > > > > > > > > > ****** > > > > > > > > > > > > > > > -----Original Message----- > > > > > From: sebb [mailto:[EMAIL PROTECTED] > > > > > > > > > > Sent: 08 October 2008 16:57 > > > > > To: JMeter Developers List > > > > > Cc: Mike Cronin > > > > > Subject: Re: TCP Sampler Extension to support length-prefixed > binary > > > > > data > > > > > > > > > > > > > > > On 08/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > > > > > > Thanks, would be happy to adopt the suggested approach and > delegate the protocol-specific conversion to a new TCPClient implementation > with selection from the TCPSampler GUI to support test plans using more than > one. > > > > > > > > > > > > This would leave the TCPClient Interface read()/write() > method signatures unchanged as strings would be passed in and out. > > > > > > > > > > > > > > > > Yes. > > > > > > > > > > I'm still considering how to fix up the read() method. Probably > I'll > > > > > add a readBytes() method and maybe add an abstract class that > > > > > implements it. > > > > > > > > > > The problem is that the sampler has to convert the string to > bytes in > > > > > order to store it in the sample result. Wire protocols work in > terms > > > > > of bytes, so this means multiple conversions, with the > possibility of > > > > > data loss if some bytes are not both-ways convertible. > > > > > > > > > > > Not sure whether setup parameters would be necessary given > this approach as TCPClient Implementation would be specific to > protocol/character set in use? > > > > > > > > > > > > > > > > Sorry, should have explained in more detail: I was thinking that > setup > > > > > parameters could be used to configure the protocol > implementation. > > > > > This could be useful for minor variants on the protocol - e.g. > 4byte > > > > > length prefix, and variable length strings. > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > From: sebb [mailto:[EMAIL PROTECTED] > > > > > > Sent: 08 October 2008 13:04 > > > > > > To: JMeter Developers List > > > > > > Cc: Mike Cronin > > > > > > Subject: Re: TCP Sampler Extension to support length-prefixed > binary > > > > > > data > > > > > > > > > > > > > > > > > > On 08/10/2008, Oghie Sheehy <[EMAIL PROTECTED]> wrote: > > > > > > > Hello, > > > > > > > > > > > > > > We have a requirement to test a TCP service which expects > requests in length-prefixed binary form and responds with data structured in > the same way. > > > > > > > > > > > > Is this a proprietary service, or are there several such > services? > > > > > > > > > > > > > We have experimentally extended the TCP sampler code to > support this by adding a "Length Prefixed Binary Data" option to the GUI. > > > > > > > > > > > > > > With this option checked: > > > > > > > > > > > > > > a) The TCPSampler sample() method treats the input request > text as a hexadecimal string and converts it to a byte array. > > > > > > > Conversely it reads a byte array and converts it to a > hexadecimal string. > > > > > > > > > > > > > > b) The TCPClient has been extended to support the > following new methods: > > > > > > > void write(OutputStream os, byte[] b); > > > > > > > byte [] readLengthPrefixed(InputStream is); > > > > > > > The readLengthPrefixed method expects the first 2 bytes > from the stream to contain the length (binary) of data to follow and reads > this number of subsequent bytes returning a byte array containing both the > length and data bytes. > > > > > > > > > > > > > > e.g. > > > > > > > Request/Response String: > "002d482d2d2d3e454e414320544350495020484541525420424541543c2d2d2d5443504449414c2056312e30312020" > > > > > > > Input/Output Byte Array: [0x00,0x2d, 0x48, ......, 0x20] > > > > > > > > > > > > > > This is a simple but limited approach, it does not permit > the transmission of non-length prefixed binary data nor does it support > length prefixed character data. Finally as it is implemented the length > prefix must be input as two byte binary (input as hexadecimal string) rather > than being calculated or input as character decimal. > > > > > > > > > > > > > > There are options to make the solution more flexible but > before spending time on these we would like to know whether the minimal > approach taken above would be considered for inclusion in a future JMeter > release? > > > > > > > > > > > > > > > > > > > It sounds fairly straightforward, and would not affect > existing test plans. > > > > > > > > > > > > I'm just wondering if it might be cleaner to add the > functionality as > > > > > > a new TCPClient implementation? > > > > > > > > > > > > At present the TCPSampler only supports a single > implementation that > > > > > > is defined via a property, but it could be enhanced to fetch > the name > > > > > > from the GUI to support test plans which require more than one > > > > > > implementation. > > > > > > > > > > > > It might be necessary to extend the TCPClient interface to > support > > > > > > some kind of setup method to allow parameters to be passed > in; these > > > > > > would need to be added to the TCP Sample GUI. > > > > > > > > > > > > The advantage of this approach would be that there should be > no need > > > > > > to change the TCP Sampler further in order to accommodate new > > > > > > protocols. > > > > > > > > > > > > I have just realised that the TCPClient interface read() > method was > > > > > > badly designed; it should have returned a byte array. At > present both > > > > > > the client and the sampler have to do String<>byte > conversions - and > > > > > > there is no provision for specifying the character set to be > used. > > > > > > > > > > > > However, that does not affect your current requirements. > > > > > > > > > > > > > Thanks, > > > > > > > Oghie. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ********************************************************************** > > > > > > > > > > > > > > E-mail disclaimer > > > > > > > FEXCO Dynamic Currency Conversion Limited, registered in > Ireland, No. 246289. Registered Office: FEXCO Centre, Iveragh Road, > Killorglin, Co. Kerry. > > > > > > > > > > > > > > This message, including any attachments, is confidential. > If you are not the named recipient, please contact the sender and delete the > email from your system. > > > > > > > > > > > > > > > ********************************************************************** > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]