On Mon, Sep 9, 2013 at 7:37 PM, Tommy-Carlos Williams <to...@devgeeks.org>wrote:
> I have been following this thread with a combination of interest and > trepidation. > > Interest: > > Anything that works towards ./platforms being a build artefact I am all > for. In our app, ./platforms is already a build artefact. We used hooks to > achieve this (updating config files, copying icon / splash assets, etc). > > Just a quick question… I know that ./platforms/../config.xml (even after a > `cordova build …`) still has the old defaults for name, author, id etc… but > it doesn't seem to make any difference. We don't modify > ./platforms/../config.xml as it seemed like the modifications to > ./www/config.xml (and our custom hook modifications to say > ./platforms/android/AndroidManifest.xml) were sufficient. > > What am I missing wrt there being differences between these files? > > Trepidation: > > Users are just starting to get a handle on how the CLI works (though there > are still some ongoing issues that I see fairly regularly, like thinking > they still need to use Plugman directly even with CLI created projects). > Just worried more workflow changes yet again are going to turn people off > the CLI entirely. I may be a bit "twice shy", so if it's not going to > impact users much (except for making things much better) feel free to set > me straight. hehe. > > - tommy > Some clarifications: - Change doesn't change workflow at all - Change will allow user's edits to their root config.xml actually work in all cases Win! > > > > > > On 10/09/2013, at 2:57 AM, Michal Mocny <mmo...@chromium.org> wrote: > > > Aside from moving some files around and changing the order of operations > a > > bit, the biggest change will be adding support for <platform> and > > <config-file> to app.xml. By the way, thats still called config.xml, do > we > > want to rename it to app.xml for 3.1? > > > > > > On Mon, Sep 9, 2013 at 12:47 PM, Braden Shepherdson <bra...@chromium.org > >wrote: > > > >> I should certainly be able to. I'm digging into a major refactoring of > >> Plugman right now, though, so I'll probably want to finish that. If it's > >> taking too long, though, then I'll switch gears and get this in before > we > >> cut 3.1. > >> > >> Braden > >> > >> > >> On Mon, Sep 9, 2013 at 11:48 AM, Michal Mocny <mmo...@chromium.org> > wrote: > >> > >>> Braden, are you going to be able to take this on this week? I think it > >>> would make the upgrade from 3.0 much easier. > >>> > >>> -Michal > >>> > >>> > >>> On Mon, Sep 9, 2013 at 9:48 AM, Michal Mocny <mmo...@chromium.org> > wrote: > >>> > >>>> If you would use a different helloworld app template (which is now > >>>> possible to specify in both CLI and old workflow), then the > >>> pre-generatred > >>>> platform config.xml template would likely be the wrong one, and thus > >>> this > >>>> bundling for self documentation would be a disservice. > >>>> > >>>> I don't see very much value in documentation for bundling the > config.xml > >>>> inside the platform template (when do we suspect users look at that > >>> file, > >>>> as apposed to whats actually generated inside their project?). Users > >>> can > >>>> read what is generated after adding a platform for their specific app > >>> using > >>>> their chosen flow. > >>>> > >>>> I think that since bin/create can mush defaults.xml with app.xml for > >>> both > >>>> flows, it should. > >>>> > >>>> > >>>> On Mon, Sep 9, 2013 at 9:21 AM, Ian Clelland <iclell...@chromium.org > >>>> wrote: > >>>> > >>>>> On Mon, Sep 9, 2013 at 8:45 AM, Braden Shepherdson < > >>> bra...@chromium.org > >>>>>> wrote: > >>>>> > >>>>>> The defaults.xml is only part of the CLI workflow, yes. It has no > >>>>> relevance > >>>>>> if you're not using CLI. BUT there is a complete config.xml in the > >>>>>> bin/create template, and it can of course have the same values as > you > >>>>> would > >>>>>> get from an unchanged CLI project (defaults.xml + app.xml). The > >>>>>> configuration values you get from the templates should be the same > in > >>>>> both > >>>>>> cases, I agree completely. > >>>>>> > >>>>> > >>>>> Yes, I think it's definitely achievable to have the complete template > >>>>> config.xml be exactly what you would get (modulo whitespace / > comments > >>> / > >>>>> etc) from installing the same sample app on the same platform with > CLI. > >>>>> > >>>>> If we can maintain that standard, then the various files become > almost > >>>>> self-documenting; its easy to look at the final config.xml file in > the > >>>>> template to see how the pieces should fit together, and work out > where > >>>>> each > >>>>> of the tags originally came from. > >>>>> > >>>>> It might be worth trying to generate the template config.xml *using* > >>> cli, > >>>>> just to maintain the correspondence between them. > >>>>> > >>>>> Ian > >>>>> > >>>>> > >>>>>> Braden > >>>>>> > >>>>>> > >>>>>> On Sun, Sep 8, 2013 at 5:28 AM, James Jong <wjamesj...@gmail.com> > >>>>> wrote: > >>>>>> > >>>>>>> Andrew - what I was thinking was pretty much what Michal wrote > >>> below. > >>>>>>> Perhaps it was my interpretation of the original note but I > >>> thought > >>>>>>> defaults was to be applied only in the CLI workflow. > >>>>>>> > >>>>>>> -James Jong > >>>>>>> > >>>>>>> On Sep 7, 2013, at 1:05 PM, Michal Mocny <mmo...@chromium.org> > >>> wrote: > >>>>>>> > >>>>>>>> With this proposal as it stands, I think that is already true (at > >>>>> least > >>>>>>> for > >>>>>>>> the initial contents, obviously user can make edits later). > >>>>>>>> > >>>>>>>> Ie, defaults.xml + app.xml = initial config.xml for both cases, > >>>>> which > >>>>>> use > >>>>>>>> the same helloworld template's app.xml. > >>>>>>>> > >>>>>>>> If there are specific differences to the default values that we > >>>>> want, > >>>>>> we > >>>>>>>> maybe will want to use a different app.xml for each, but > >>>>> defaults.xml > >>>>>>>> should be tied to a platform-version not to a workflow. > >>>>>>>> > >>>>>>>> -Michal > >>>>>>>> > >>>>>>>> > >>>>>>>> On Sat, Sep 7, 2013 at 7:56 AM, Andrew Grieve < > >>> agri...@chromium.org > >>>>>> > >>>>>>> wrote: > >>>>>>>> > >>>>>>>>> James - that's a nice goal, but I don't think it's feasible. Did > >>>>> you > >>>>>>> have a > >>>>>>>>> way to do that in mind? > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> On Fri, Sep 6, 2013 at 10:31 PM, James Jong < > >>> wjamesj...@gmail.com> > >>>>>>> wrote: > >>>>>>>>> > >>>>>>>>>> I would like to see the defaults be applied in all cases. For > >>>>>>>>>> consistency, less confusion, and easier documentation. If we > >>> add > >>>>> or > >>>>>>>>> change > >>>>>>>>>> the defaults in a release, both workflows should get it. In my > >>>>> mind, > >>>>>>> the > >>>>>>>>>> CLI platform config.xml should be equivalent to the bin/create > >>>>> one. > >>>>>>>>>> > >>>>>>>>>> -James Jong > >>>>>>>>>> > >>>>>>>>>> On Sep 6, 2013, at 11:06 AM, Michal Mocny <mmo...@chromium.org > >>>> > >>>>>> wrote: > >>>>>>>>>> > >>>>>>>>>>> I thought we were adding support for the last bit (ie, app > >>>>> generic > >>>>>> not > >>>>>>>>>>> platform specific preferences) to "app.xml" which the > >>> helloworld > >>>>>>>>> template > >>>>>>>>>>> should ship with and bin/create should apply. > >>>>>>>>>>> > >>>>>>>>>>> -Michal > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> On Fri, Sep 6, 2013 at 10:52 AM, Ian Clelland < > >>>>>> iclell...@chromium.org > >>>>>>>>>>> wrote: > >>>>>>>>>>> > >>>>>>>>>>>> The template version needs to be a complete config file for > >>> the > >>>>>>> sample > >>>>>>>>>> app, > >>>>>>>>>>>> though. You should be able to run bin/create and then build > >>> the > >>>>>>> Hello, > >>>>>>>>>>>> Cordova app immediately. > >>>>>>>>>>>> > >>>>>>>>>>>> defaults.xml is supposed to be stripped right down to just > >>> the > >>>>>>>>>>>> platform-specific options which, in theory, shouldn't need > >>> to be > >>>>>>>>>> specified > >>>>>>>>>>>> by every app. > >>>>>>>>>>>> > >>>>>>>>>>>> At least that's how it works in my head :) The distinction > >>> may > >>>>> be > >>>>>>> less > >>>>>>>>>>>> important than I'm imagining. > >>>>>>>>>>>> > >>>>>>>>>>>> Ian > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> On Fri, Sep 6, 2013 at 9:08 AM, Michal Mocny < > >>>>> mmo...@chromium.org> > >>>>>>>>>> wrote: > >>>>>>>>>>>> > >>>>>>>>>>>>> If the content or format of defaults.xml and the initial > >>>>>> config.xml > >>>>>>>>>> will > >>>>>>>>>>>> be > >>>>>>>>>>>>> different then we should ship both -- but I don't think they > >>>>> will > >>>>>>> be, > >>>>>>>>>> so > >>>>>>>>>>>> I > >>>>>>>>>>>>> think we just ship the template with a defaults file. > >>>>>>>>>>>>> > >>>>>>>>>>>>> -Michal > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> On Thu, Sep 5, 2013 at 11:19 PM, Ian Clelland < > >>>>>>>>> iclell...@chromium.org > >>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>> > >>>>>>>>>>>>>> On Thu, Sep 5, 2013 at 5:16 PM, James Jong < > >>>>> wjamesj...@gmail.com > >>>>>>> > >>>>>>>>>>>> wrote: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> defaults.xml - Is that only used by CLI? And not used by > >>>>>>>>> bin/create > >>>>>>>>>>>>>>> scripts? > >>>>>>>>>>>>>>> It was bit unclear to me from the description since both > >>> were > >>>>>>>>>>>> mentioned > >>>>>>>>>>>>>>> regarding the 2 xml files. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Yes, that's the idea. If you're using the bin/create > >>> scripts, > >>>>>> then > >>>>>>>>>>>> there > >>>>>>>>>>>>> is > >>>>>>>>>>>>>> a complete "config.xml" file in the template that will be > >>> used > >>>>>> for > >>>>>>>>>> your > >>>>>>>>>>>>> new > >>>>>>>>>>>>>> app. This is for strict backwards compatibility with > >>> anyone's > >>>>>>>>> workflow > >>>>>>>>>>>>> that > >>>>>>>>>>>>>> doesn't currently include CLI. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> If you are using CLI, then we will construct a new > >>> config.xml > >>>>>> file > >>>>>>>>> for > >>>>>>>>>>>>> you > >>>>>>>>>>>>>> instead, from three sources: defaults.xml, which specifies > >>>>> all of > >>>>>>>>> the > >>>>>>>>>>>>>> platform defaults; the various plugin.xml files, and your > >>>>> app's > >>>>>>>>>>>>> config.xml > >>>>>>>>>>>>>> file. The end-result should be the same, but you have a > >>> clear > >>>>>> place > >>>>>>>>> to > >>>>>>>>>>>>>> override the defaults for your app that lives outside of > >>> your > >>>>>>>>>> platforms > >>>>>>>>>>>>>> directory, and the cordova team has a clear place to set > >>> those > >>>>>> same > >>>>>>>>>>>>>> defaults. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Ian > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> The new CLI prepare flow makes sense to me. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> -James Jong > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> On Sep 5, 2013, at 2:21 PM, Michal Mocny < > >>>>> mmo...@chromium.org> > >>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> We briefly discussed JSON and the two thoughts were: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> (1) We like it, but really what does it buy us? > >>>>>>>>>>>>>>>> (2) This change is at the moment 100% compatible with all > >>>>>> current > >>>>>>>>>>>>>>> workflows > >>>>>>>>>>>>>>>> (including upgrades from 3.0->3.1), and we think that's > >>>>>> important > >>>>>>>>>>>> for > >>>>>>>>>>>>>>>> headache-less adoption. JSON would obviously not be. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Regarding where to store the defaults, we had thought it > >>>>> would > >>>>>> be > >>>>>>>>> a > >>>>>>>>>>>>>> file > >>>>>>>>>>>>>>>> bundled with the platform, perhaps in bin/templates? > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> -Michal > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> On Thu, Sep 5, 2013 at 12:38 PM, Brian LeRoux < > >>> b...@brian.io> > >>>>>>> wrote: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> The logic flow is much safer in this method. Where do > >>> you > >>>>>> think > >>>>>>>>>>>>>>> default.xml > >>>>>>>>>>>>>>>>> should live? (Maybe it doesn't have to exist and > >>> defaults > >>>>> can > >>>>>>>>> just > >>>>>>>>>>>>> be > >>>>>>>>>>>>>>> vars > >>>>>>>>>>>>>>>>> in the logic that does the processing?) > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Is this our opportunity to move to JSON? > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> On Thu, Sep 5, 2013 at 8:21 AM, Braden Shepherdson < > >>>>>>>>>>>>>> bra...@chromium.org > >>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> config.xml as a build artifact for less suffering and > >>>>> easier > >>>>>>>>>>>>> upgrades > >>>>>>>>>>>>>>>>>> Terminology > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> “platform config.xml” refers to the platform-specific > >>>>>>>>>>>> config.xml > >>>>>>>>>>>>>>>>> files, > >>>>>>>>>>>>>>>>>> eg. platforms/android/res/xml/config.xml. This is the > >>>>> final > >>>>>>>>>>>> file > >>>>>>>>>>>>>> read > >>>>>>>>>>>>>>>>> by > >>>>>>>>>>>>>>>>>> Cordova at runtime. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> “app config.xml” refers to the top-level config.xml > >>> found > >>>>> in > >>>>>>>>>>>>>>>>>> www/config.xml. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Why the current situation is suffering > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Chiefly, the platforms/foo/.../config.xml files are > >>> both > >>>>> the > >>>>>>>>>>>>> input > >>>>>>>>>>>>>>> and > >>>>>>>>>>>>>>>>>> output of munging by Plugman and the user. This sucks. > >>> It > >>>>>> makes > >>>>>>>>>>>>>>>>>> automatic upgrades difficult because everybody has a > >>>>>> customized > >>>>>>>>>>>>>>>>>> config.xml > >>>>>>>>>>>>>>>>>> file in their platforms. It also makes plugin rm harder > >>>>> and > >>>>>>>>>>>> less > >>>>>>>>>>>>>>>>> robust > >>>>>>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>>>> CLI than it needs to be. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Currently only some tags in the app config.xml are > >>>>> actually > >>>>>>>>>>>>>> honoured. > >>>>>>>>>>>>>>>>>> Others are ignored, and this has tripped up our users. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Goals > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> bin/create workflow is unchanged. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Final content of the platform config.xml file is > >>>>> unchanged, > >>>>>>>>>>>>> though > >>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>> method of building it in the CLI can change. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> CLI workflow is unchanged, in terms of what a user > >>> types. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> platform config.xml stops being both input and output > >>>>> under > >>>>>>>>>>>> CLI. > >>>>>>>>>>>>>> Less > >>>>>>>>>>>>>>>>>> munging, and easier upgrades. In short, platform > >>>>> config.xml > >>>>>>>>>>>> files > >>>>>>>>>>>>>>>>> become > >>>>>>>>>>>>>>>>>> build artifacts. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> What we propose to do about it > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> First, adjust the platform template (used by > >>> bin/create) > >>>>> to > >>>>>>>>>>>>> contain > >>>>>>>>>>>>>>>>> two > >>>>>>>>>>>>>>>>>> files: > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> defaults.xml, which is versioned, immutable, and > >>> tucked > >>>>>> away > >>>>>>>>>>>>>>>>>> somewhere (only CLI accesses it) and contains only > >>> the > >>>>>>>>>>>>>>>>>> Cordova-specified > >>>>>>>>>>>>>>>>>> platform defaults, such as the preferences, any > >>> default > >>>>>>>>>>>>>>>>>> whitelist entries, > >>>>>>>>>>>>>>>>>> etc. It does NOT contain any <author>, <name> or > >>> other > >>>>>> such > >>>>>>>>>>>>>> tags. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> platform config.xml, which is the same as it > >>> currently > >>>>>> is, a > >>>>>>>>>>>>>>>>> complete > >>>>>>>>>>>>>>>>>> config.xml for the HelloWorld app. This means > >>> behavior > >>>>> is > >>>>>>>>>>>>>>> unchanged > >>>>>>>>>>>>>>>>>> for people who are not using CLI. Plugman still > >>> munges > >>>>>> this > >>>>>>>>>>>>> file > >>>>>>>>>>>>>>>>> and > >>>>>>>>>>>>>>>>>> outputs back to it, same as now. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Second, adjust the CLI’s cordova create template so > >>> that > >>>>> its > >>>>>>>>>>>>>>> top-level > >>>>>>>>>>>>>>>>>> app config.xml contains <name>, <author>, <content>, > >>> etc. > >>>>> - > >>>>>>>>>>>> tags > >>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>> user is likely to edit. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Third, modify the CLI so that the new cordova prepare > >>> flow > >>>>>> is: > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Delete the old platform config.xml. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Copy the defaults.xml to config.xml. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Re-run the Plugman config munging for every plugin, > >>>>>>>>>>>> modifying > >>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>> fresh platform config.xml. (The order here is > >>>>> deliberately > >>>>>>>>>>>>>>>>> undefined; > >>>>>>>>>>>>>>>>>> plugins should already not be relying on this.) > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Run the config munging for the app’s config.xml as > >>>>> well. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> This results in a freshly built, build-artifact > >>>>> platform > >>>>>>>>>>>>>>>>> config.xml. > >>>>>>>>>>>>>>>>>> Users should not be editing it; their top-level app > >>>>>>>>>>>> config.xml > >>>>>>>>>>>>>>>>>> has the last > >>>>>>>>>>>>>>>>>> word and will override any settings the defaults or > >>>>>> plugins > >>>>>>>>>>>>>> might > >>>>>>>>>>>>>>>>>> make. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Note that this means we shouldn’t be needlessly > >>>>> setting > >>>>>>>>>>>>>>> defaults > >>>>>>>>>>>>>>>>>> in the app config.xml, since this might prevent > >>>>>> plugins > >>>>>>>>>>>>> from > >>>>>>>>>>>>>>>>>> changing > >>>>>>>>>>>>>>>>>> things that need changing. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Fourth, extend the app config.xml format so that it can > >>>>> have > >>>>>>>>>>>>>>>>>> <platform>tags, like a plugin.xml. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Into this it can put platform-specific things like > >>>>>>>>>>>>>> splashscreens, > >>>>>>>>>>>>>>>>>> preferences and other things, rather than mixing > >>> these > >>>>>>>>>>>>> together > >>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>> config. > >>>>>>>>>>>>>>>>>> - > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> In particular, it can have <config-file> tags in the > >>>>> usual > >>>>>>>>>>>>>> format > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>> > >>>>>>> > >>>>>> > >>>>> > >>>> > >>>> > >>> > >> > >> > >