Yeah I know, sent to your hotmail. Mike
On Sun, Jun 28, 2015 at 3:10 PM, Frédéric THOMAS <webdoubl...@hotmail.com> wrote: > > What you can do is to send me your eclipse formatter property file. > > I will use it in IJ. > > I meant export your formatter profiles in xml > > Thanks, > Frédéric THOMAS > > > ---------------------------------------- > > From: webdoubl...@hotmail.com > > To: dev@flex.apache.org > > Subject: RE: [Externs] jasmine-2.0.js > > Date: Sun, 28 Jun 2015 20:06:19 +0100 > > > >> BTW, what should we do about code formatting, it seems my formatting is > >> different then yours. I am using Eclipse right now since I don't have IJ > >> setup for Falcon dev. > > > > I was wrong when I thought I had setup IJ correctly for Falcon, they are > still > > things it doesn't know how to do, for instance, share the generated > classes > > thru modules, therefore, it is not yet suitable for all parts of Falcon, > at the > > moment, I use tricks to be able to code with. > > > > What you can do is to send me your eclipse formatter property file. > > I will use it in IJ. > > > > Frédéric THOMAS > > > > > > ---------------------------------------- > >> Date: Sun, 28 Jun 2015 14:57:50 -0400 > >> Subject: Re: [Externs] jasmine-2.0.js > >> From: teotigraphix...@gmail.com > >> To: dev@flex.apache.org > >> > >> BTW, what should we do about code formatting, it seems my formatting is > >> different then yours. I am using Eclipse right now since I don't have IJ > >> setup for Falcon dev. > >> > >> Mike > >> > >> On Sun, Jun 28, 2015 at 2:55 PM, Michael Schmalle < > teotigraphix...@gmail.com > >>> wrote: > >> > >>> Yeah, I didn't want to go crazy with subclasses. Ideally class, > function > >>> and constant could share a "TopLevelReference" subclass of > BaseReference > >>> and you could put import logic there if you wanted to. > >>> > >>> Mike > >>> > >>> On Sun, Jun 28, 2015 at 2:51 PM, Frédéric THOMAS < > webdoubl...@hotmail.com> > >>> wrote: > >>> > >>>>> Once you find instances of imports that need to be saves, your > current > >>>>> context is already the ClassReference, so call classRef.addImport(). > :) > >>>> > >>>> Btw, I will probably need to have a addImport() FunctionReference too, > >>>> right ? > >>>> > >>>> Frédéric THOMAS > >>>> > >>>> > >>>> ---------------------------------------- > >>>>> Date: Sun, 28 Jun 2015 14:23:57 -0400 > >>>>> Subject: Re: [Externs] jasmine-2.0.js > >>>>> From: teotigraphix...@gmail.com > >>>>> To: dev@flex.apache.org > >>>>> > >>>>> Kewl. > >>>>> > >>>>> I am going to be busy most of the week remodeling my mother in laws > >>>>> bathroom starting tomorrow. So if you want to try a new custom pass > like > >>>>> ResolveImportPass, go for it, I will just stay out of the way. I > think > >>>> it > >>>>> would be good for you. :) If not, no worries, you gave me the idea. > haha > >>>>> > >>>>> If you did, look at it like this, since all imports and logic therin > are > >>>>> totally dependent on what the compiler actual saves into the model, > >>>> logic > >>>>> says this needs to be the last or one of the last passes, from my > >>>>> perspective, it needs to be the last. > >>>>> > >>>>> If you make it the last, then this pass is not coupled to us fixing > bugs > >>>>> ahead of it. Say we find out we need to add another structure of AST > >>>>> parsing for a node structure I havn't implemented yet, well we are > safe. > >>>>> > >>>>> Why safe? Because in this import pass, you are using the MODEL, so no > >>>> AST. > >>>>> Instead of worrying about resolving imports during AST traversal, you > >>>> are > >>>>> using what is already in the container after all that complex > parsing is > >>>>> finished. > >>>>> > >>>>> So this pass, you would use your skills at knowing "what" in each > >>>> subclass > >>>>> of BaseReference could contain a type. Then write your logic pass to > >>>>> traverse Classes, then into each classes members, then loop through > each > >>>>> member and analyze their types and do your import testing logic > there. > >>>>> > >>>>> Once you find instances of imports that need to be saves, your > current > >>>>> context is already the ClassReference, so call classRef.addImport(). > :) > >>>>> > >>>>> Mike > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> On Sun, Jun 28, 2015 at 2:13 PM, Frédéric THOMAS < > >>>> webdoubl...@hotmail.com> > >>>>> wrote: > >>>>> > >>>>>>> All I meant is that 75% of the time we would just want to save > things > >>>> in > >>>>>>> the model or a reference, such that you use addImport() during the > >>>>>>> resolution. Then it keeps the emit() phase straight burn rubber and > >>>> loop > >>>>>>> through all existing model structures, where imports would be just > a > >>>> list > >>>>>>> that emitImport() iterates through, no logic. > >>>>>> > >>>>>> Got it ! > >>>>>> > >>>>>>> I AM NOT saying what you did was wrong, I am just offering a look > into > >>>>>> how > >>>>>>> I set it up. You know how I got this pattern? From my massive > >>>> mistakes in > >>>>>>> code generators of past. :) I realized that an emit phase needs to > be > >>>>>>> stupid and not dependent on any type of intelligence, just needs to > >>>>>> create > >>>>>>> what already exists. > >>>>>> > >>>>>> I'm in a phase where I'm learning compiler things and indeed I will > do > >>>>>> some mistakes > >>>>>> or I won't be as precise as you who have experience on it. > >>>>>> Therefore I can accept critics and learn from your explanations :-) > >>>>>> > >>>>>>> This can also solve many problems at once. So I haven't got back > into > >>>> the > >>>>>>> code BUT my intuition says we need a universal solution for any > type > >>>> of > >>>>>>> TYPE that is attached to a member, identifier such as a param type, > >>>>>> return > >>>>>>> type, filed type, superclass and interface(already taken care of > using > >>>>>>> addImport()). > >>>>>>> > >>>>>>> See where I am coming from? We know that every type is eventually > >>>> going > >>>>>> to > >>>>>>> need to be scanned for imports and validated. > >>>>>> > >>>>>> Yes, actually, I was expecting to see a specific pass for that. > >>>>>> > >>>>>>> Dude, I just don't want to come off bossy or condescending, I love > you > >>>>>>> help. A lot can be added to this compiler that could be very > >>>> interesting. > >>>>>>> So having you understand my design intention is really important to > >>>> me. > >>>>>> :) > >>>>>> > >>>>>> Don't worry, I don't think you are bossy or condescending Mike, I'm > >>>>>> reading you > >>>>>> and try to put in parallel the new informations you give and what > I've > >>>>>> seen in the code > >>>>>> for a better understanding, that's it. > >>>>>> > >>>>>> Cheers, > >>>>>> Frédéric THOMAS > >>>>>> > >>>>>> > >>>>>> ---------------------------------------- > >>>>>>> Date: Sun, 28 Jun 2015 13:48:02 -0400 > >>>>>>> Subject: Re: [Externs] jasmine-2.0.js > >>>>>>> From: teotigraphix...@gmail.com > >>>>>>> To: dev@flex.apache.org > >>>>>>> > >>>>>>> Fred you did an awesome job. :) > >>>>>>> > >>>>>>> All I meant is that 75% of the time we would just want to save > things > >>>> in > >>>>>>> the model or a reference, such that you use addImport() during the > >>>>>>> resolution. Then it keeps the emit() phase straight burn rubber and > >>>> loop > >>>>>>> through all existing model structures, where imports would be just > a > >>>> list > >>>>>>> that emitImport() iterates through, no logic. > >>>>>>> > >>>>>>> I AM NOT saying what you did was wrong, I am just offering a look > into > >>>>>> how > >>>>>>> I set it up. You know how I got this pattern? From my massive > >>>> mistakes in > >>>>>>> code generators of past. :) I realized that an emit phase needs to > be > >>>>>>> stupid and not dependent on any type of intelligence, just needs to > >>>>>> create > >>>>>>> what already exists. > >>>>>>> > >>>>>>> This can also solve many problems at once. So I haven't got back > into > >>>> the > >>>>>>> code BUT my intuition says we need a universal solution for any > type > >>>> of > >>>>>>> TYPE that is attached to a member, identifier such as a param type, > >>>>>> return > >>>>>>> type, filed type, superclass and interface(already taken care of > using > >>>>>>> addImport()). > >>>>>>> > >>>>>>> See where I am coming from? We know that every type is eventually > >>>> going > >>>>>> to > >>>>>>> need to be scanned for imports and validated. > >>>>>>> > >>>>>>> Dude, I just don't want to come off bossy or condescending, I love > you > >>>>>>> help. A lot can be added to this compiler that could be very > >>>> interesting. > >>>>>>> So having you understand my design intention is really important to > >>>> me. > >>>>>> :) > >>>>>>> > >>>>>>> Mike > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> On Sun, Jun 28, 2015 at 1:37 PM, Frédéric THOMAS < > >>>>>> webdoubl...@hotmail.com> > >>>>>>> wrote: > >>>>>>> > >>>>>>>>> Fred pretty much iterated things correctly. > >>>>>>>>> > >>>>>>>>> The ResolvePackageNamePass I haven't to get back to. I was in the > >>>>>> middle > >>>>>>>> of > >>>>>>>>> implementing something when I got it to work in another place. > >>>>>>>>> > >>>>>>>>> There is a pattern to how things are parsed so most of the time > it's > >>>>>>>> better > >>>>>>>>> to set state as nodes/references are being added to the model. In > >>>> the > >>>>>>>> case > >>>>>>>>> of imports, I don't see any problems right now with checking > during > >>>> the > >>>>>>>>> emit phase but, if the model was more interactive during the > >>>> session, > >>>>>>>> this > >>>>>>>>> type of logic should happen during the resolve phase so the model > >>>> with > >>>>>>>> it's > >>>>>>>>> references has a correct state if there is any logic happening > >>>> between > >>>>>>>> two > >>>>>>>>> references. > >>>>>>>> > >>>>>>>> Thanks for the explanation, I will take the time to do some debug > >>>> spins > >>>>>> to > >>>>>>>> understand > >>>>>>>> when the phases are called, what they do and what classes are > >>>> involved. > >>>>>>>> Given it is a fairly small transpiler and despite the recursive > >>>> visitor > >>>>>>>> pattern, I guess I can do it. > >>>>>>>> > >>>>>>>>> How much are you working on right now Fred? I just ask because I > >>>> don't > >>>>>>>> want > >>>>>>>>> to create any conflicts. > >>>>>>>> > >>>>>>>> Go ahead Mike, I'm done with that at the moment, I did my last > >>>> cleanup > >>>>>>>> already. > >>>>>>>> Anyway, better I work on a branch and commit the branch instead > for > >>>>>> review > >>>>>>>> next time. > >>>>>>>> > >>>>>>>> Frédéric THOMAS > >>>>>>>> > >>>>>>>> > >>>>>>>> ---------------------------------------- > >>>>>>>>> Date: Sun, 28 Jun 2015 13:23:15 -0400 > >>>>>>>>> Subject: Re: [Externs] jasmine-2.0.js > >>>>>>>>> From: teotigraphix...@gmail.com > >>>>>>>>> To: dev@flex.apache.org > >>>>>>>>> > >>>>>>>>> Fred pretty much iterated things correctly. > >>>>>>>>> > >>>>>>>>> The ResolvePackageNamePass I haven't to get back to. I was in the > >>>>>> middle > >>>>>>>> of > >>>>>>>>> implementing something when I got it to work in another place. > >>>>>>>>> > >>>>>>>>> There is a pattern to how things are parsed so most of the time > it's > >>>>>>>> better > >>>>>>>>> to set state as nodes/references are being added to the model. In > >>>> the > >>>>>>>> case > >>>>>>>>> of imports, I don't see any problems right now with checking > during > >>>> the > >>>>>>>>> emit phase but, if the model was more interactive during the > >>>> session, > >>>>>>>> this > >>>>>>>>> type of logic should happen during the resolve phase so the model > >>>> with > >>>>>>>> it's > >>>>>>>>> references has a correct state if there is any logic happening > >>>> between > >>>>>>>> two > >>>>>>>>> references. > >>>>>>>>> > >>>>>>>>> How much are you working on right now Fred? I just ask because I > >>>> don't > >>>>>>>> want > >>>>>>>>> to create any conflicts. > >>>>>>>>> > >>>>>>>>> Mike > >>>>>>>>> . > >>>>>>>>> > >>>>>>>>> On Sat, Jun 27, 2015 at 5:58 PM, Michael Schmalle < > >>>>>>>> teotigraphix...@gmail.com > >>>>>>>>>> wrote: > >>>>>>>>> > >>>>>>>>>> Hey Fred, I was out all day. I will have some time in the > morning > >>>> to > >>>>>>>> look > >>>>>>>>>> at what you did and comment. :) > >>>>>>>>>> > >>>>>>>>>> Mike > >>>>>>>>>> > >>>>>>>>>> On Sat, Jun 27, 2015 at 5:27 PM, Frédéric THOMAS < > >>>>>>>> webdoubl...@hotmail.com> > >>>>>>>>>> wrote: > >>>>>>>>>> > >>>>>>>>>>> Just to explain what I did, especially to folks who would like > to > >>>> get > >>>>>>>>>>> their hand dirty on the compiler but like me, don't know how it > >>>> works > >>>>>>>> :-) > >>>>>>>>>>> > >>>>>>>>>>> I was adding jasmine-2.0.js [1], a file that contains only > jsDoc > >>>>>>>>>>> (parameters and return type descriptions) and declarations, no > >>>>>>>>>>> implementations. > >>>>>>>>>>> When I say "adding jasmine-2.0.js" I mean, transpile this .js > >>>> file to > >>>>>>>> .as > >>>>>>>>>>> and then compile it to a .swc. > >>>>>>>>>>> > >>>>>>>>>>> The transpilation part is done by EXTERNC > >>>>>>>>>>> > >>>>>>>>>>> You call it like that: > >>>>>>>>>>> > >>>>>>>>>>> <java jar="${basedir}/compiler.jx/lib/externc.jar" fork="true" > >>>>>>>>>>> failonerror="false"> > >>>>>>>>>>> <arg value="+flexlib=${env.ASJS_HOME}/frameworks" /> > >>>>>>>>>>> <arg value="-debug" /> > >>>>>>>>>>> <arg > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > value="-load-config=${basedir}/externs/jasmine/jasmine-compile-config.xml" > >>>>>>>>>>> /> > >>>>>>>>>>> > >>>>>>>>>>> In the jasmine-compile-config.xml, you can exclude classes and > >>>>>> member, > >>>>>>>>>>> for example, in the jasmine.Spec class, I excluded the variable > >>>>>>>> $injector > >>>>>>>>>>> as its type was coming from the Angular library that is not yet > >>>>>>>> transpiled. > >>>>>>>>>>> > >>>>>>>>>>> <field-exclude> > >>>>>>>>>>> <class>jasmine.Spec</class> > >>>>>>>>>>> <field>$injector</field> > >>>>>>>>>>> </field-exclude> > >>>>>>>>>>> > >>>>>>>>>>> You can also exclude classes and functions. > >>>>>>>>>>> > >>>>>>>>>>> The compile part is done by the falcon compc as follow: > >>>>>>>>>>> > >>>>>>>>>>> <java > >>>>>> jar="${basedir}/compiler/generated/dist/sdk/lib/falcon-compc.jar" > >>>>>>>>>>> fork="true" > >>>>>>>>>>> failonerror="true"> > >>>>>>>>>>> <arg value="+flexlib=${env.ASJS_HOME}/frameworks" /> > >>>>>>>>>>> <arg value="-debug" /> > >>>>>>>>>>> <arg > >>>>>>>>>>> > >>>> value="-load-config=${basedir}/externs/jasmine/compile-config.xml" /> > >>>>>>>>>>> <arg > >>>>>>>>>>> > >>>> value="-output=${basedir}/externs/jasmine/out/bin/jasmine-2.0.swc" /> > >>>>>>>>>>> </java> > >>>>>>>>>>> > >>>>>>>>>>> The problem was that this last part was failing with an NPE a > >>>> Type of > >>>>>>>>>>> something: > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.scopes.TypeScope.getPropertyForMemberAccess(TypeScope.java:344) > >>>>>>>>>>> > >>>>>>>>>>> Even looking closely at the code, I didn't get why it was > failing > >>>> but > >>>>>>>> for > >>>>>>>>>>> sure, because it was trying to compile one of the transpiled > .as > >>>>>> file, > >>>>>>>> this > >>>>>>>>>>> transpiled code was wrong. > >>>>>>>>>>> Looking at those .as, it was easy to see that some import were > >>>>>> missing. > >>>>>>>>>>> > >>>>>>>>>>> So, why the 2 others externs (js and jquery) had no issues ? > >>>>>>>>>>> It is always surprising to see something working on all the > things > >>>>>>>> except > >>>>>>>>>>> of yours, but it can help you too :-) > >>>>>>>>>>> > >>>>>>>>>>> So, I've been looking at those other transpiled .as files from > >>>>>> existing > >>>>>>>>>>> externs to see if they had imports and they were some. > >>>>>>>>>>> I then created a mini jasmine.js containing only the faulty > case > >>>>>> only, > >>>>>>>>>>> that, from what I've been able to determinate, was that the > import > >>>>>> was > >>>>>>>> not > >>>>>>>>>>> generated when a static function had a return type of a class > >>>> created > >>>>>>>> via a > >>>>>>>>>>> function constructor, so, I filled this mini jasmine.js with > the > >>>>>>>> equivalent > >>>>>>>>>>> of a static function like this: > >>>>>>>>>>> > >>>>>>>>>>> /** > >>>>>>>>>>> * @return {!jasmine.Clock} > >>>>>>>>>>> */ > >>>>>>>>>>> jasmine.clock = function() {}; > >>>>>>>>>>> > >>>>>>>>>>> Which should transpile in AS3, something like: > >>>>>>>>>>> > >>>>>>>>>>> import jasmine.Clock; > >>>>>>>>>>> public static function clock():Clock {} > >>>>>>>>>>> > >>>>>>>>>>> and a function constructor like this: > >>>>>>>>>>> > >>>>>>>>>>> /** @constructor */ > >>>>>>>>>>> jasmine.Clock = function() {}; > >>>>>>>>>>> > >>>>>>>>>>> which transpile: > >>>>>>>>>>> > >>>>>>>>>>> package jasmine { > >>>>>>>>>>> public class Clock {} > >>>>>>>>>>> } > >>>>>>>>>>> > >>>>>>>>>>> Created a test class based on those Mike created for the > previous > >>>>>>>> externs > >>>>>>>>>>> doing: > >>>>>>>>>>> > >>>>>>>>>>> // jasmine, the main jasmine class. > >>>>>>>>>>> ClassReference jasmine = model.getClassReference("jasmine"); > >>>>>>>>>>> assertNotNull(jasmine); > >>>>>>>>>>> > >>>>>>>>>>> assertTrue(jasmine.hasImport("jasmine.Clock")); > >>>>>>>>>>> > >>>>>>>>>>> The hasImport method didn't exist on ClassReference but it was > a > >>>>>>>>>>> addImport(), I follow to where it was called in > >>>> ResolvePackagesPass > >>>>>>>> hoping > >>>>>>>>>>> to find a missing case but after debug spin I wasn't able to do > >>>> what > >>>>>> I > >>>>>>>>>>> expected, I'm not sure I understood all the logic in this class > >>>> but > >>>>>> it > >>>>>>>>>>> looked like the Node of my return type was never visited and > >>>>>> therefore > >>>>>>>>>>> wasn't able to add my import here. > >>>>>>>>>>> > >>>>>>>>>>> But wait, in the ClassReference, I have a > >>>>>>>>>>> > >>>>>>>>>>> public MethodReference addMethod(Node node, String > functionName, > >>>>>>>>>>> JSDocInfo comment, boolean isStatic) > >>>>>>>>>>> > >>>>>>>>>>> To me it would be enough to add the import to the list of > imports > >>>> to > >>>>>> be > >>>>>>>>>>> emitted when the MethodReference is to be added, I just had to > >>>>>>>> determinate > >>>>>>>>>>> if the return type given in the jsDoc was not from the current > >>>>>>>> package, the > >>>>>>>>>>> given method not excluded, the given return type neither ! > >>>>>>>>>>> > >>>>>>>>>>> My test was passing was I was able to compile with this new > code > >>>> the > >>>>>>>> old > >>>>>>>>>>> externs. > >>>>>>>>>>> > >>>>>>>>>>> The only thing I had to do to finish to compile the jasmine > extern > >>>>>> was > >>>>>>>> to > >>>>>>>>>>> emit the imports for the global functions too as they shown to > be > >>>>>>>> faulty > >>>>>>>>>>> for the same reasons. > >>>>>>>>>>> > >>>>>>>>>>> Mike will probably tell me now where my logic was wrong now :-) > >>>>>>>>>>> > >>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>> From: webdoubl...@hotmail.com > >>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>> Subject: RE: [Externs] jasmine-2.0.js > >>>>>>>>>>>> Date: Sat, 27 Jun 2015 20:43:43 +0100 > >>>>>>>>>>>> > >>>>>>>>>>>> Ok, done ! > >>>>>>>>>>>> > >>>>>>>>>>>> I forgot to uncomment the externc build of jasmine and print > the > >>>>>>>> global > >>>>>>>>>>> function imports ! > >>>>>>>>>>>> > >>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>> From: webdoubl...@hotmail.com > >>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>> Subject: RE: [Externs] jasmine-2.0.js > >>>>>>>>>>>>> Date: Sat, 27 Jun 2015 20:12:16 +0100 > >>>>>>>>>>>>> > >>>>>>>>>>>>>> I pushed the changes which are ready to be reviewed. > >>>>>>>>>>>>> > >>>>>>>>>>>>> oups, hold on, I had some things commented that hidden other > >>>>>>>> problems, > >>>>>>>>>>> I will continue on it. > >>>>>>>>>>>>> > >>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>>> From: webdoubl...@hotmail.com > >>>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>>> Subject: RE: [Externs] jasmine-2.0.js > >>>>>>>>>>>>>> Date: Sat, 27 Jun 2015 18:31:32 +0100 > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Hi Mike, > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> I pushed the changes which are ready to be reviewed. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Note: The jasmine-2.0.js is not committed as it should be > >>>>>> downloaded > >>>>>>>>>>> with the unpack-externs target of the download.xml, I followed > the > >>>>>>>> model. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>>>> Date: Sat, 27 Jun 2015 05:31:50 -0400 > >>>>>>>>>>>>>>> Subject: Re: [Externs] jasmine-2.0.js > >>>>>>>>>>>>>>> From: teotigraphix...@gmail.com > >>>>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> I just noticed you said today or tomorrow, whatever man. > >>>> doesn't > >>>>>>>>>>> matter. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Mike > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> On Sat, Jun 27, 2015 at 5:17 AM, Michael Schmalle < > >>>>>>>>>>> teotigraphix...@gmail.com > >>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Well its the practice. I know the pattern I am using so > if I > >>>>>> have > >>>>>>>> to > >>>>>>>>>>>>>>>> adjust it to fit I will. You can tell that with AST type > >>>> stuff, > >>>>>> it > >>>>>>>>>>> has to > >>>>>>>>>>>>>>>> follow a specific pattern or everything turns to crap when > >>>>>> trying > >>>>>>>>>>> to add > >>>>>>>>>>>>>>>> stuff down the road. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Commit it sooner than later as I have a couple hours to > >>>> check it > >>>>>>>>>>> out this > >>>>>>>>>>>>>>>> morning. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Mike > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> On Sat, Jun 27, 2015 at 3:15 AM, Frédéric THOMAS < > >>>>>>>>>>> webdoubl...@hotmail.com> > >>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Hi Mike, > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> I can now compile jasmine, I'm not sure my fix is very > clean > >>>>>> but > >>>>>>>> it > >>>>>>>>>>>>>>>>> works, I've been able to compile all the externs with. > >>>>>>>>>>>>>>>>> I will commit it later today or tomorrow as I need to > clean > >>>> a > >>>>>> bit > >>>>>>>>>>> before > >>>>>>>>>>>>>>>>> and it would be nice if you can review it. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>>>>>>> From: webdoubl...@hotmail.com > >>>>>>>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>>>>>>> Subject: RE: [Externs] jasmine-2.0.js > >>>>>>>>>>>>>>>>>> Date: Fri, 26 Jun 2015 22:43:30 +0100 > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Hey Mike, it looks like "import jasmine.Clock;" is > missing > >>>> in > >>>>>>>> the > >>>>>>>>>>>>>>>>> generated jasmine.as, that's it ! > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>>>>>>>> From: webdoubl...@hotmail.com > >>>>>>>>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>>>>>>>> Subject: RE: [Externs] jasmine-2.0.js > >>>>>>>>>>>>>>>>>>> Date: Fri, 26 Jun 2015 22:26:32 +0100 > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> HAHA, ah that is a hard one man, thanks for the offer > >>>> but I > >>>>>>>>>>> think I am > >>>>>>>>>>>>>>>>>>>> going to need to get this one. There are a couple > places > >>>> it > >>>>>>>>>>> could be > >>>>>>>>>>>>>>>>> though > >>>>>>>>>>>>>>>>>>>> if you are curious. > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> First you really need to understand the problem, I am > >>>> typing > >>>>>>>>>>> this > >>>>>>>>>>>>>>>>> stuff in > >>>>>>>>>>>>>>>>>>>> between installing a bathroom vanity and sink, so I > >>>> haven't > >>>>>>>>>>> looked at > >>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>> code yet. :) > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> So I can't really give you an answer since I don't > quite > >>>>>> know > >>>>>>>>>>> the > >>>>>>>>>>>>>>>>> problem > >>>>>>>>>>>>>>>>>>>> yet. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Ok, I will check your solution :-) > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>>>>>>>>> Date: Fri, 26 Jun 2015 16:59:58 -0400 > >>>>>>>>>>>>>>>>>>>> Subject: Re: [Externs] jasmine-2.0.js > >>>>>>>>>>>>>>>>>>>> From: teotigraphix...@gmail.com > >>>>>>>>>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> On Fri, Jun 26, 2015 at 4:39 PM, Frédéric THOMAS < > >>>>>>>>>>>>>>>>> webdoubl...@hotmail.com> > >>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Yeah, this "jasmine.Clock" > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> The error means that the Falcon compiler is trying > to > >>>>>>>> resolve > >>>>>>>>>>> a > >>>>>>>>>>>>>>>>> member > >>>>>>>>>>>>>>>>>>>>>> expression and it can't resolve it. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> So this means there is a bug in the AST resolver. > You > >>>> are > >>>>>>>>>>> using the > >>>>>>>>>>>>>>>>>>>>> extern > >>>>>>>>>>>>>>>>>>>>>> in the GCC project correct? > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> Yes, > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > https://raw.githubusercontent.com/google/closure-compiler/master/contrib/externs/jasmine-2.0.js > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> If so, I need to take a look at it. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Everyone, I did one pass and tests on packages and > >>>> class > >>>>>>>>>>> creation, > >>>>>>>>>>>>>>>>> so > >>>>>>>>>>>>>>>>>>>>> these > >>>>>>>>>>>>>>>>>>>>>> types of bugs are to be expected as the AST/Type > >>>> resolver > >>>>>> is > >>>>>>>>>>>>>>>>> "asked" to > >>>>>>>>>>>>>>>>>>>>> do > >>>>>>>>>>>>>>>>>>>>>> more work then my initial implementation. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Make sense? > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> Well, kind of :-) > >>>>>>>>>>>>>>>>>>>>> What classes would you check for this ? > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> HAHA, ah that is a hard one man, thanks for the offer > >>>> but I > >>>>>>>>>>> think I am > >>>>>>>>>>>>>>>>>>>> going to need to get this one. There are a couple > places > >>>> it > >>>>>>>>>>> could be > >>>>>>>>>>>>>>>>> though > >>>>>>>>>>>>>>>>>>>> if you are curious. > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> First you really need to understand the problem, I am > >>>> typing > >>>>>>>>>>> this > >>>>>>>>>>>>>>>>> stuff in > >>>>>>>>>>>>>>>>>>>> between installing a bathroom vanity and sink, so I > >>>> haven't > >>>>>>>>>>> looked at > >>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>> code yet. :) > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> So I can't really give you an answer since I don't > quite > >>>>>> know > >>>>>>>>>>> the > >>>>>>>>>>>>>>>>> problem > >>>>>>>>>>>>>>>>>>>> yet. > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Mike > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> ---------------------------------------- > >>>>>>>>>>>>>>>>>>>>>> Date: Fri, 26 Jun 2015 16:32:16 -0400 > >>>>>>>>>>>>>>>>>>>>>> Subject: Re: [Externs] jasmine-2.0.js > >>>>>>>>>>>>>>>>>>>>>> From: teotigraphix...@gmail.com > >>>>>>>>>>>>>>>>>>>>>> To: dev@flex.apache.org > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Yeah, this "jasmine.Clock" > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> The error means that the Falcon compiler is trying > to > >>>>>>>> resolve > >>>>>>>>>>> a > >>>>>>>>>>>>>>>>> member > >>>>>>>>>>>>>>>>>>>>>> expression and it can't resolve it. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> So this means there is a bug in the AST resolver. > You > >>>> are > >>>>>>>>>>> using the > >>>>>>>>>>>>>>>>>>>>> extern > >>>>>>>>>>>>>>>>>>>>>> in the GCC project correct? > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> If so, I need to take a look at it. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Everyone, I did one pass and tests on packages and > >>>> class > >>>>>>>>>>> creation, > >>>>>>>>>>>>>>>>> so > >>>>>>>>>>>>>>>>>>>>> these > >>>>>>>>>>>>>>>>>>>>>> types of bugs are to be expected as the AST/Type > >>>> resolver > >>>>>> is > >>>>>>>>>>>>>>>>> "asked" to > >>>>>>>>>>>>>>>>>>>>> do > >>>>>>>>>>>>>>>>>>>>>> more work then my initial implementation. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Make sense? > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Mike > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> On Fri, Jun 26, 2015 at 3:27 PM, Frédéric THOMAS < > >>>>>>>>>>>>>>>>>>>>> webdoubl...@hotmail.com> > >>>>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Hi Mike, > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Any idea why ? > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>> U:\sources\asf\flex\falcon\externs\jasmine\out\as\classes\ > >>>>>>>>>>>>>>>>> jasmine.as:26 > >>>>>>>>>>>>>>>>>>>>>>> Erreur interne : java.lang.NullPointerException > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.scopes.TypeScope.getPropertyForMemberAccess(TypeScope.java:344) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.scopes.ScopeView.getPropertyForMemberAccess(ScopeView.java:81) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.scopes.ASScope.getPropertyFromDef(ASScope.java:879) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.scopes.ASScope.getPropertyFromDef(ASScope.java:841) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.scopes.ASScope.getPropertyFromDef(ASScope.java:760) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.tree.as.IdentifierNode.resolveMemberRef(IdentifierNode.java:829) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.tree.as.IdentifierNode.resolve(IdentifierNode.java:377) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.tree.as.IdentifierNode.getMName(IdentifierNode.java:432) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode.getMName(MemberAccessExpressionNode.java:158) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.as.codegen.ABCGeneratingReducer.dottedName(ABCGeneratingReducer.java:840) > >>>>>>>>>>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>> > >>>>>> > >>>> > org.apache.flex.compiler.internal.as.codegen.CmcEmitter.action_321(CmcEmitter.java:5236) > >>>>>>>>>>>>>>>>>>>>>>> ... > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> public static function clock():jasmine.Clock { > return > >>>>>>>> null; } > >>>>>>>>>>>>>>>>>>>>>>> ^ > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> ----------------------------- > >>>>>>>>>>>>>>>>>>>>>>> In the jasmine extern file > >>>>>>>>>>>>>>>>>>>>>>> ----------------------------- > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * @return {!jasmine.Clock} > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> jasmine.clock = function() {}; > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** @constructor */ > >>>>>>>>>>>>>>>>>>>>>>> jasmine.Clock = function() {}; > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** */ > >>>>>>>>>>>>>>>>>>>>>>> jasmine.Clock.prototype.install = function() {}; > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** */ > >>>>>>>>>>>>>>>>>>>>>>> jasmine.Clock.prototype.uninstall = function() {}; > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** @param {number} ms */ > >>>>>>>>>>>>>>>>>>>>>>> jasmine.Clock.prototype.tick = function(ms) {}; > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** @param {!Date} date */ > >>>>>>>>>>>>>>>>>>>>>>> jasmine.Clock.prototype.mockDate = function(date) > {}; > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> ----------------------------- > >>>>>>>>>>>>>>>>>>>>>>> In jasmine.as > >>>>>>>>>>>>>>>>>>>>>>> ----------------------------- > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> * @returns {jasmine.Clock} > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public static function clock():jasmine.Clock { > return > >>>>>>>> null; } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> ----------------------------- > >>>>>>>>>>>>>>>>>>>>>>> clock.as > >>>>>>>>>>>>>>>>>>>>>>> ----------------------------- > >>>>>>>>>>>>>>>>>>>>>>> package jasmine { > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public class Clock { > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public function Clock() { > >>>>>>>>>>>>>>>>>>>>>>> super(); > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * Generated doc for missing method JSDoc. > >>>>>>>>>>>>>>>>>>>>>>> * > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public function install():void { } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * @param ms [number] > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public function tick(ms:Number):void { } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * Generated doc for missing method JSDoc. > >>>>>>>>>>>>>>>>>>>>>>> * > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public function uninstall():void { } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> /** > >>>>>>>>>>>>>>>>>>>>>>> * @param date [Date] > >>>>>>>>>>>>>>>>>>>>>>> * @see [jasmine-2.0] > >>>>>>>>>>>>>>>>>>>>>>> */ > >>>>>>>>>>>>>>>>>>>>>>> public function mockDate(date:Date):void { } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>>>>>>>> Frédéric THOMAS > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>> > >>>>>> > >>>> > >>>> > >>> > >>> > > > >