RE: updating keywords table and e_core types list

From: Yuri Tsoglin <yurit@cadence.com>
Date: Wed Jun 10 2015 - 05:29:16 PDT
As a matter of fact, there are keywords with dual usages even without being appended to another keyword. For example, "all of" denotes parallel time-consuming actions, but it also denotes multiple constraints inside a compound constraint. Or, "start" denotes a TCM starting action, but now it also denotes one of the new temporal operators in the context of an event/expect declaration.

IMO, the whole notion of "keywords" is mainly relevant to languages where they are reserved, and where it is not allowed to define identifiers with those names. In e this is not the case. That's why last year I proposed to completely remove the keywords table (see the attached thread), but since it had been a deliberate decision made in the past after some discussions, it was decided to leave it in place.

So, I think any solution here (on what exactly leave in the table or remove from it) is as good as any other solution. It does not really matter.

Thanks,
Yuri.


From: darren.galpin@infineon.com [mailto:darren.galpin@infineon.com]
Sent: 10 June 2015 15:08
To: Yuri Tsoglin; ieee1647@eda.org
Subject: RE: updating keywords table and e_core types list

I can see the sense in this, but I'm also a little wary. We still have "is only", "is first" etc in the keyword table as they are terms in themselves which mean something. In the case below, "is empty" means something different to "is" and "empty". Is there any other keyword which has a dual usage function depending on what keyword precedes it?

Cheers,

Darren

From: owner-ieee1647@eda.org<mailto:owner-ieee1647@eda.org> [mailto:owner-ieee1647@eda.org] On Behalf Of Yuri Tsoglin
Sent: Wednesday, June 10, 2015 1:02 PM
To: ieee1647@eda.org<mailto:ieee1647@eda.org>
Subject: RE: updating keywords table and e_core types list

Hi,

In addition to the below updates, I think we should avoid mentioning multi-word keywords where relevant.
For example: currently the keywords table contains "is empty" as a keyword on itself, although "is" is also mentioned separately.
But now we'll be also adding "empty" (as a separate keyword, which has a new usage without "is"), so we can remove "is empty".

Any additional comments or suggestions on this?
If none in a few days, I will then summarize and send these changes for editing.

Thanks,
Yuri.


From: Yuri Tsoglin
Sent: 04 June 2015 15:22
To: 'ieee1647@eda.org'
Subject: updating keywords table and e_core types list

Hi all,

As per mantis items 4112, 4992, 4995, we need to update keywords table and e_core types list, which are out of date.

Here is what I propose. Some of the changes are due to new features we're adding for this standard versions, others are corrections for what was already missing or incorrect.
Please reply with any comments, corrections or suggestions.

Keywords table (section 4.1.5.3 in the current LRM):


-        Keywords to remove from the table:

bit

bool

byte

consume

global

int

is inline

is not empty

nand

nor

real

string

sys

time

uint

Note that some of these are e_core type names, that's why they shouldn't be listed here.



-        Keywords to correct:

c export => C export

is c routine => is C routine

check that => check      (because check may be used without that, and that is already listed in the table)



-        Keywords to add (order is arbitrary without any logic, simply in the order I figured them out):
as           (part of a define ... as macro declaration)
bytes     (e.g. int(bytes:...) )
it
package
private
protected
const
final
template
of         (currently it is shown as part of list of keyword, but it has also other usages without list)
simple_port
buffer_port
interface_port
method_port
out
inout
method_type
set          (note - it's an e_core type name and wouldn't be listed here as such; however, it is also a keyword as part of the for each in set construct)
export   (this and following several keywords are related to the new interface_port and similar type definitions)
prefix
suffix
external
tlm_initator_socket
tlm_target_socket
empty   (this and following several keywords are related to the new temporal operator definitions)
undefined
abort
exclusive_start
stop
none
empty


The e_core types list (Annex D.3.3) currently mentions:
int, uint, byte, bit, bool, string, sys, global, base_struct, any_struct, any_unit, and event_port.
The following would be added to the list:
untyped
external_pointer
file
set
real
time


Thanks,
Yuri.





[cid:image002.jpg@01D0A390.40F1F040]

Yuri Tsoglin | e Language team, Specman RnD

P: 972.3.9004305 M: 972.54.6468177 F: 972.3.9004001 www.cadence.com<http://www.cadence.com>







--
This message has been scanned for viruses and
dangerous content by MailScanner<http://www.mailscanner.info/>, and is
believed to be clean.

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.




attached mail follows:



On Aug 11, 2014, at 1:55 PM, Yuri Tsoglin <yurit@cadence.com> wrote:

> Not sure if I am following ...
> By "the syntax specification" you mean all the specific language constructs specifications, which appear throughout the whole document in all its chapters - right?
> (If not, can you please clarify what you meant?)
> But then - doesn't that alone completely specify the syntax, even without having the list of keywords?

Yes, one could make the case that the syntax table can be assembled by collecting the syntax clauses for each statement and action.

At the same time people expect to have a list of keywords as in any language LRM.

>
> More importantly, it seems to me that all this controversy is not only about Specman's parser implementation.
> It's also about the fact that e has define-as and define-as-computed macros (which are also part of the standard, regardless of implementation), which means that the syntax is actually extensible, and new keywords can be introduced by such macros. Isn't it?

That is true. Define-as-computed requires a definition of the evaluation machinery used by the preprocessor (which is much of Specman, as we know). Hence this was swept under the rug. It is not mentioned in the standard as far as I recall.

It is ok to have capabilities in Specman that go beyond the standard. Do you really want to tackle DAC and revise the way syntax is defined? This is a major project, the value is questionable and it reverses some earlier decisions as mentioned.

Cheers,
-- yaron

>
>
>
> -----Original Message-----
> From: Yaron Kashai
> Sent: Monday, August 11, 2014 23:31
> To: Yuri Tsoglin
> Subject: Re: pre-defined type names are not keywords
>
> Hello again,
>
> First of, I was wrong about the date. The first ballot was held in 2003 - so 11 years ago...
>
> There were formal comments during the ballot that were captured in an IEEE on-line system. All I have left is a spreadsheet form of the output. Many of these are off-the-wall comments, but the committee needed to make a serious attempt to accommodate (that's according to IEEE bylaws).
>
> At the time there was strong opposition to the move to standardize e from competing vendors. There were quite a few back-channel concerns and demands, including a rather contentious hearing in front of NesCom. Non of this is documented, unfortunately, so all we have is the diminishing memory of some aging individuals :))
>
> Specifically, the issue of syntax was a major contention. We were asked to publish a BNF and a reference implementation of the parser. Knowing how e is actually being parsed in Specman, you probably realize this was a serious roadblock. Turns out the BNF would not be part of the normative standard (rather, it could be an appendix). We got away without publishing a reference implementation because IEEE has no desire to maintain code - only documents. At the same time providing a syntax and a list of keywords was how we gave in to some of the demands.
>
> Anyway, there is a standard in place, and the current goal is revising it. I don't think it is wise to open up the syntax pandora block - although the opposition may have lost interest, it only takes a few vocal individuals to re-ignite the controversy. If we remove the syntax specification we need to be ready to provide some alternative.
>
>
> Cheers,
> -- yaron
>
>
> On Aug 11, 2014, at 12:06 PM, Yuri Tsoglin <yurit@cadence.com> wrote:
>
>> Hi Yaron,
>>
>> I'm apparently unaware of some important details.
>> Are those comments from 2006 available somewhere, so I can take a look at them? (The e-mail archive visible at the current WG web site seems to start only in 2009 ...)
>>
>> BTW, I see some good reasons to NOT use the keywords concept for e, not just because of Specman implementation. But I really want to understand what was discussed in the past, before I'll continue (or discontinue) this discussion.
>>
>> Thanks,
>> Yuri.
>>
>>
>>
>> -----Original Message-----
>> From: Yaron Kashai
>> Sent: Monday, August 11, 2014 21:08
>> To: darren.galpin@infineon.com; Yuri Tsoglin
>> Cc: ieee1647@eda.org
>> Subject: Re: pre-defined type names are not keywords
>>
>> Yuri, Darren and all,
>>
>> The reason for having a keyword table in the standard is  that one is expected in any language definition. There were comments in the initial ballot (in 2006) regarding this where some commenters speculated the omission was intended as an obstacle for would be compliant implementations.
>>
>> While the Specman implementation uses context sensitive parsing that allows the wizardry mentioned earlier in this thread, that is not allowed by the current standard. Removing keywords actually extends the standard syntax.
>>
>> I would suggest leaving in the keyword table, because removing it weakens the standard and is going back on decisions made in view of public comments. We could remove certain type names, even though some languages do include built-in type names as reserved keywords.
>>
>> Cheers,
>> -- yaron
>>
>> On Aug 11, 2014, at 2:33 AM, darren.galpin@infineon.com wrote:
>>
>>> Hi Yuri,
>>>
>>> Then you know my next question ;) Please could you raise a mantis issue for changing the title of 4.1.5.5....
>>>
>>> I think that we raise the issue of 4.1.5.3 in tonights' call, and have a vote or removing it, and if not removing it, removing the table at least with modified wording.
>>>
>>> Cheers,
>>>
>>> Darren
>>>
>>> -----Original Message-----
>>> From: Yuri Tsoglin [mailto:yurit@cadence.com]
>>> Sent: Monday, August 11, 2014 10:06 AM
>>> To: Galpin Darren (IFGB ATV MCD SIP CV); ieee1647@eda.org
>>> Subject: RE: pre-defined type names are not keywords
>>>
>>> My whole point here is that keywords are NOT one of the basic concepts of this language.
>>> As far as I know, in the far past (when I wasn't involved yet in this) there were attempts to introduce this concept, and to actually disallow using keywords in other contexts, but those attempts failed and it was given up, mainly due to backward compatibility reasons.
>>> Maybe this section 4.1.5.3 was introduced because of that?
>>> I think we can consider removing this section at all.
>>> Or, instead of removing it, we can just mention that there are keywords (being introduced by each one of the specific constructs), without listing them. Further, we can mention that the actual set of keywords is extensible, because when a user-defined macro is defined, it may introduce another keyword(s).
>>>
>>> BTW, while we are at it, the next section 4.1.5.4 uses the term "macros" and it should be changed to "preprocessor names". We should avoid all the confusion between #define (which are preprocessor names) and define-as/define-as-computed (which are macros).
>>>
>>> Thanks,
>>> Yuri.
>>>
>>>
>>>
>>> -----Original Message-----
>>> From: darren.galpin@infineon.com [mailto:darren.galpin@infineon.com]
>>> Sent: Monday, August 11, 2014 11:55
>>> To: Yuri Tsoglin; ieee1647@eda.org
>>> Subject: RE: pre-defined type names are not keywords
>>>
>>> If we go with (1), what would you do with 4.1.5.3, what would you change it to? Section 4.1 is going through what makes up the language, and keywords obviously do. Obviously (2) is more work......
>>>
>>> Cheers,
>>>
>>> Darren
>>>
>>> -----Original Message-----
>>> From: owner-ieee1647@eda.org [mailto:owner-ieee1647@eda.org] On Behalf Of Yuri Tsoglin
>>> Sent: Sunday, August 10, 2014 4:15 PM
>>> To: ieee1647@eda.org
>>> Subject: RE: pre-defined type names are not keywords
>>>
>>> To summarize, it seems that we have two alternatives, between which we need to decide:
>>> 1. Remove the keywords table altogether.
>>> 2. Or, leave the table but make sure that it is up to date (and also remove e_core type names from it).
>>>
>>> Personally, I'm in favor of (1).
>>>
>>> Yuri.
>>>
>>>
>>>
>>> -----Original Message-----
>>> From: Yuri Tsoglin
>>> Sent: Wednesday, August 06, 2014 14:14
>>> To: 'Cristian Amitroaie'
>>> Cc: Uwe Simm; Silas McDermott; ieee1647@eda.org
>>> Subject: RE: pre-defined type names are not keywords
>>>
>>> Well, "sys" has two meanings.
>>> It is a name of a unit type. And it is also a name of an instance field under global, which happens to be of that same type.
>>> For the sake of this discussion, we're of course looking at the first one.
>>>
>>> Now, you're right that "sys" is not a "base type" in the sense that it is no more than a subclass of "any_unit".
>>> But on the other hand, just like "any_unit" (which itself is no more than a subclass of "any_struct", which in turn is a subclass of "base_struct") has some special properties, "sys" also has some special properties.
>>> For example, the instance under global must be the only instance of "sys", and it cannot be instantiated anywhere in user code (BTW, if this is not mentioned in LRM, we should add it, too).
>>>
>>> So, in my opinion, being a "base type" (as opposed to being derived from another type), is orthogonal to the question whether its name is a keyword or not.
>>>
>>> Assignment rules are also irrelevant here: they equally apply to types (e.g. scalar types) in general, both pre-defined and user-defined ones.
>>>
>>> Yuri.
>>>
>>>
>>>
>>> -----Original Message-----
>>> From: Cristian Amitroaie [mailto:cristian@amiq.com]
>>> Sent: Wednesday, August 06, 2014 13:40
>>> To: Yuri Tsoglin
>>> Cc: Uwe Simm; Silas McDermott; ieee1647@eda.org
>>> Subject: Re: pre-defined type names are not keywords
>>>
>>> I look at "sys" as a predefined unit, it exists like any other unit, instantiated under the "global" unit. Leaving aside that these two may not be units under the hood... I mean "sys" is the name of a unit type, it is not a "base type". I mean if we look into assignment rules for example, there will be no section for "sys" in particular. All the notes for structs/units are applicable to "sys".
>>>
>>> But maybe I'm confused :)
>>>
>>> So maybe we should move the keywords to an appendix, annex?
>>>
>>> On Wednesday 06 August 2014 01:27:30 pm Yuri Tsoglin wrote:
>>>> Hi Cristian,
>>>>
>>>> What difference do you see between "sys" and "int" in this respect?
>>>> Both are pre-defined types, and both should not be used as user type names.
>>>>
>>>> The current LRM already uses the term "keywords" (without "reserved")
>>>> as the title to the keywords table, so that's OK. But I start thinking
>>>> that maybe that table should be removed altogether. (Or else, we would
>>>> need to update it according to all the other LRM updates we're working
>>>> on right now
>>>> - all the newly introduced constructs etc.). That table is purely
>>>> informative, and it seems to not have any "effect" on the language
>>>> definition per se. Wherever those keywords are specifically used, they
>>>> anyway are mentioned in the description of the relevant construct.
>>>> ("struct" is mentioned in section 6.2 that describes struct
>>>> definitions, and so on).
>>>>
>>>> One more thing. It appears that Specman does treat the following three
>>>> keywords as reserved, at least partially: TRUE, FALSE, NULL. An
>>>> attempt to give any of these names to a variable or a type causes a compilation error.
>>>> Funny is that those three are NOT listed in the table.
>>>>
>>>> Yuri.
>>>>
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: Cristian Amitroaie [mailto:cristian@amiq.com]
>>>> Sent: Wednesday, August 06, 2014 13:13
>>>> To: Yuri Tsoglin
>>>> Cc: Uwe Simm; Silas McDermott; ieee1647@eda.org
>>>> Subject: Re: pre-defined type names are not keywords
>>>>
>>>> Hi Yuri,
>>>>
>>>> To your list, "sys" is in a different context vs. "int". So "sys" for
>>>> sure shouldn't be a keyword.
>>>>
>>>> As e Language works with "context keywords", whatever context means -
>>>> see "var x : var", I think there should be some awareness of name
>>>> collisions, in order to minimize confusion, especially in a
>>>> verification context - btw do we know of any dramatic stories or
>>>> instinctively all programmers respect
>>>> "keywords"?:
>>>>
>>>> - in the standard as a list, not sure if it should be called "reserved
>>>> keywords", maybe just "keywords", or if we are to be rigorous a
>>>> "context-keyword map", for example to clarify "var x : var"
>>>>
>>>> - in tools some flagging: for example in DVT Eclipse IDE, a macro that
>>>> uses "keywords" like 'define "my int" as {}' is  flagged with a
>>>> warning because "int" is a reserved keyword. And the same is done for "keyphrases"
>>>> for example "is also"
>>>>
>>>> Thanks,
>>>> Cristian
>>>>
>>>> On Wednesday 06 August 2014 11:28:26 am Yuri Tsoglin wrote:
>>>>> Also, IMO, there is a certain disadvantage in the concept of
>>>>> "reserved keywords" as in some other languages. For example, there
>>>>> are two languages such as C and C++, and the former is "considered"
>>>>> to be a sub-set of the latter. Any legal C program is also a legal C++ program.
>>>>> But, it's not really the case, because some names used in C became
>>>>> keywords in C++, making a C program using such names illegal in C++.
>>>>> In contrast, when we introduce a new construct in e (and we do it
>>>>> from time to time), it doesn't make existing e programs illegal.
>>>>>
>>>>>
>>>>> From: owner-ieee1647@eda.org [mailto:owner-ieee1647@eda.org] On
>>>>> Behalf Of Yuri Tsoglin Sent: Wednesday, August 06, 2014 11:21
>>>>> To: Uwe Simm; Silas McDermott; Cristian Amitroaie
>>>>> Cc: ieee1647@eda.org
>>>>> Subject: RE: pre-defined type names are not keywords
>>>>>
>>>>> That's right - not good and not desired. But - allowed. And even
>>>>> further
>>>>> - because of the extensible nature of e, with the define-as and
>>>>> define-as-computed macros that allow to "introduce" any new syntax,
>>>>> there can appear new (user-defined) keywords which are not part of
>>>>> the original definition. We certainly wouldn't like such a newly
>>>>> introduced keyword to become disallowed in other contexts.
>>>>>
>>>>> Yuri.
>>>>>
>>>>>
>>>>> From: Uwe Simm
>>>>> Sent: Wednesday, August 06, 2014 10:26
>>>>> To: Yuri Tsoglin; Silas McDermott; Cristian Amitroaie
>>>>> Cc: ieee1647@eda.org
>>>>> Subject: RE: pre-defined type names are not keywords
>>>>>
>>>>> hi,
>>>>>
>>>>> not sure if I would label these code fragments "good" or "desired".
>>>>> context sensitive parsing isn't making life easier for tool
>>>>> developers and the value of using something like "struct" as field
>>>>> name or type name is  at best zero.
>>>>>
>>>>> /uwe
>>>>>
>>>>> From: owner-ieee1647@eda.org [mailto:owner-ieee1647@eda.org] On
>>>>> Behalf Of Yuri Tsoglin Sent: Wednesday, August 06, 2014 12:27 AM
>>>>> To: Silas McDermott; Cristian Amitroaie
>>>>> Cc: ieee1647@eda.org
>>>>> Subject: RE: pre-defined type names are not keywords
>>>>>
>>>>> Or
>>>>>
>>>>> unit unit {
>>>>>   unit;
>>>>> };
>>>>>
>>>>> Or even
>>>>>
>>>>> type type: [ type ];
>>>>>
>>>>>
>>>>> From: Silas McDermott
>>>>> Sent: Wednesday, August 06, 2014 00:50
>>>>> To: Yuri Tsoglin; Cristian Amitroaie
>>>>> Cc: ieee1647@eda.org<mailto:ieee1647@eda.org>
>>>>> Subject: Re: pre-defined type names are not keywords
>>>>>
>>>>> Which reminds me of my favorite e code example ever:
>>>>>
>>>>> struct struct {
>>>>> struct;
>>>>> };
>>>>>
>>>>> Try THAT in a different language!
>>>>>
>>>>> - Silas.
>>>>>
>>>>>
>>>>>
>>>>> [cid:image002.png@01CFB169.89C909D0]
>>>>>
>>>>>
>>>>>
>>>>> Silas McDermott   |   AE Director   |   Systems and Advanced Verification
>>>>>
>>>>> P: 503.970.2916        www.cadence.com<http://www.cadence.com/>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> From: Yuri Tsoglin <yurit@cadence.com<mailto:yurit@cadence.com>>
>>>>> Date: Tuesday, August 5, 2014 at 1:53 PM
>>>>> To: Cristian Amitroaie <cristian@amiq.com<mailto:cristian@amiq.com>>
>>>>> Cc: "ieee1647@eda.org<mailto:ieee1647@eda.org>"
>>>>> <ieee1647@eda.org<mailto:ieee1647@eda.org>> Subject: RE: pre-defined
>>>>> type names are not keywords
>>>>>
>>>>> Apparently yes, e_core is mentioned in Annex D.
>>>>> Here it is, I am quoting:
>>>>>
>>>>>
>>>>> D.2.5 Reserved type names
>>>>> One set of types in e is considered essential or core, e.g., int,
>>>>> string, and sys. No reasonable e program would assign the name of
>>>>> any of those types to a user-defined type. Core types are declared
>>>>> under a special package called e_core. Within the name space model,
>>>>> e_core type names are reserved. Unlike other type names, they cannot
>>>>> be used in another package. For more information, see D.3.3.
>>>>>
>>>>>
>>>>> D.3.3 e_core types
>>>>> The set of types declared in the built-in package e_core is privileged.
>>>>> Unlike all other types, the names of the e_core types remain unique,
>>>>> even if they have been added by user extension. When a user tries to
>>>>> define a type using the name of an e_core type, an error is
>>>>> reported. However, these names are not reserved keywords; they can
>>>>> be used as identifiers in any other context (variable names, method
>>>>> names, and so on). The e_core types are: int, uint, byte, bit, bool,
>>>>> string, sys, global, base_struct, any_struct, any_unit, and event_port.
>>>>>
>>>>>
>>>>> BTW, it seems that the above list of e_core types is incomplete. For
>>>>> example, "real" is missing.
>>>>>
>>>>> Also, there are no "reserved keywords" in e in general.
>>>>> Even keywords which are not e_core type names, are such only in the
>>>>> sense that each one of them has a special meaning in a certain
>>>>> context. But no one of them is reserved, and they may also be used
>>>>> in other contexts. For example, the word "struct" can be used to
>>>>> define a struct (and in this sense it is a keyword), but it is also
>>>>> allowed to be a name of a type, field, variable, method, and anything else.
>>>>>
>>>>> Thanks,
>>>>> Yuri.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> -----Original Message-----
>>>>> From: Cristian Amitroaie [mailto:cristian@amiq.com]
>>>>> Sent: Tuesday, August 05, 2014 23:07
>>>>> To: Yuri Tsoglin
>>>>> Cc: ieee1647@eda.org<mailto:ieee1647@eda.org>
>>>>> Subject: Re: pre-defined type names are not keywords
>>>>>
>>>>>
>>>>>
>>>>> Hi Yuri,
>>>>>
>>>>>
>>>>>
>>>>> I think it makes sense.
>>>>>
>>>>>
>>>>>
>>>>> The question is weather we want users to be able to redefine "int"
>>>>> for
>>>>>
>>>>> example... BTW, is "e_core" in the standard?
>>>>>
>>>>>
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Cristian
>>>>>
>>>>> On Sunday 03 August 2014 07:29:56 pm Yuri Tsoglin wrote:
>>>>>> Hi,
>>>>>>
>>>>>>
>>>>>>
>>>>>> I think we should remove type names such as "int", "string", or
>>>>>> "sys", from
>>>>>>
>>>>>> the keywords table (section 4.1.5.3 in the current LRM).
>>>>>>
>>>>>>
>>>>>>
>>>>>> These words are just type names, which happen to belong to the "e_core"
>>>>>>
>>>>>> package. In this sense, they are not different from any other
>>>>>> pre-defined
>>>>>>
>>>>>> types, which may belong to other packages (e.g. rf_manager or
>>>>>>
>>>>>> any_sequence_driver).
>>>>>>
>>>>>>
>>>>>>
>>>>>> Does this make sense?
>>>>>>
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Yuri.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> [cid:image002.jpg@01CFAF50.EA6C8A20<mailto:image002.jpg@01CFAF50.EA
>>>>>> 6C8A
>>>>>> 20
>>>>>>
>>>>>>> ]
>>>>>>
>>>>>> Yuri Tsoglin | e Language team, Specman RnD
>>>>>>
>>>>>>
>>>>>>
>>>>>> P: 972.3.9004305 M: 972.54.6468177 F: 972.3.9004001
>>>>>>
>>>>>> www.cadence.com<http://www.cadence.com>
>>>>>
>>>>> --
>>>>> This message has been scanned for viruses and dangerous content by
>>>>> MailScanner<http://www.mailscanner.info/>, and is believed to be
>>>>> clean.
>>>>>
>>>>> --
>>>>> This message has been scanned for viruses and dangerous content by
>>>>> MailScanner<http://www.mailscanner.info/>, and is believed to be
>>>>> clean.
>>>>>
>>>>> --
>>>>> This message has been scanned for viruses and dangerous content by
>>>>> MailScanner<http://www.mailscanner.info/>, and is believed to be
>>>>> clean.
>>>
>>>
>>>
>>> --
>>> This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.
>>>
>>>
>>>
>>>
>>> --
>>> This message has been scanned for viruses and
>>> dangerous content by MailScanner, and is
>>> believed to be clean.
>>>
>>>
>>>
>>
>


image001.png
image002.jpg
Received on Wed Jun 10 05:29:56 2015

This archive was generated by hypermail 2.1.8 : Wed Jun 10 2015 - 05:29:59 PDT