Oh yeah I think that is better, I hadn't thought of that approach! Any way
you could describe the usage in the KIP, just for completeness?

-Jay

On Thu, Jan 22, 2015 at 10:23 AM, Gwen Shapira <gshap...@cloudera.com>
wrote:

> I think what you described was the original design, so no wonder you
> are confused :)
>
> Following suggestions from Jun, I changed it a bit. The current model is:
>
> - Clients (producers and consumers) need to know about the broker
> ports in advance. They don't need to know about all brokers, but they
> need to know at least one host:port pair that speaks the protocol they
> want to use. The change is that all host:port pairs in broker.list
> must be of the same protocol and match the security.protocol
> configuration parameter.
>
> - Client uses security.protocol configuration parameter to open a
> connection to one of the brokers and sends the good old
> MetadataRequest. The broker knows which port it got the connection on,
> therefore it knows which security protocol is expected (it needs to
> use the same protocol to accept the connection and respond), and
> therefore it can send a response that contains only the host:port
> pairs that are relevant to that protocol.
>
> - From the client side the MetadataResponse did not change - it
> contains a list of brokerId,host,port that the client can connect to.
> The fact that all those broker endpoints were chosen out of a larger
> collection to match the right protocol is irrelevant for the client.
>
> I really like the new design since it preserves a lot of the same
> configurations and APIs.
>
> Thoughts?
>
> Gwen
>
> On Thu, Jan 22, 2015 at 9:19 AM, Jay Kreps <jay.kr...@gmail.com> wrote:
> > I think I am still confused. In addition to the UpdateMetadataRequest
> don't
> > we have to change the MetadataResponse so that it's possible for clients
> to
> > discover the new ports? Or is that a second phase? I was imagining it
> > worked by basically allowing the brokers to advertise multiple ports, one
> > per security type, and then in the client you configure a protocol which
> > will implicitly choose the port from the options returned in metadata to
> > you...
> >
> > Likewise in the ConsumerMetadataResponse we are currently giving back
> full
> > broker information. I think we would have two options here: either change
> > the broker information included in that response to match the
> > metadataresponse or else remove the broker information entirely and just
> > return the node id (since in order to use that request you would already
> > have to have the cluster metadata). The second option may be cleaner
> since
> > it means we won't have to continue evolving those two in lockstep...
> >
> > -Jay
> >
> > On Wed, Jan 21, 2015 at 6:19 PM, Gwen Shapira <gshap...@cloudera.com>
> wrote:
> >
> >> Good point :)
> >>
> >> I added the specifics of the new  UpdateMetadataRequest, which is the
> >> only protocol bump in this change.
> >>
> >> Highlighted the broker and producer/consumer configuration changes,
> >> added some example values and added the new zookeeper json.
> >>
> >> Hope this makes things clearer.
> >>
> >> On Wed, Jan 21, 2015 at 2:19 PM, Jay Kreps <jay.kr...@gmail.com> wrote:
> >> > Hey Gwen,
> >> >
> >> > Could we get the actual changes in that KIP? I.e. changes to metadata
> >> > request, changes to UpdateMetadataRequest, new configs and what will
> >> their
> >> > valid values be, etc. This kind of says that those things will change
> but
> >> > doesn't say what they will change to...
> >> >
> >> > -Jay
> >> >
> >> > On Mon, Jan 19, 2015 at 9:45 PM, Gwen Shapira <gshap...@cloudera.com>
> >> wrote:
> >> >
> >> >> I created a KIP for the multi-port broker change.
> >> >>
> >> >>
> >>
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-2+-+Refactor+brokers+to+allow+listening+on+multiple+ports+and+IPs
> >> >>
> >> >> I'm not re-opening the discussion, since it was agreed on over a
> month
> >> >> ago and implementation is close to complete (I hope!). Lets consider
> >> >> this voted and accepted?
> >> >>
> >> >> Gwen
> >> >>
> >> >> On Sun, Jan 18, 2015 at 10:31 AM, Jay Kreps <jay.kr...@gmail.com>
> >> wrote:
> >> >> > Great! Sounds like everyone is on the same page
> >> >> >
> >> >> >    - I created a template page to make things easier. If you do
> >> >> Tools->Copy
> >> >> >    on this page you can just fill in the italic portions with your
> >> >> details.
> >> >> >    - I retrofitted KIP-1 to match this formatting
> >> >> >    - I added the metadata section people asked for (a link to the
> >> >> >    discussion, the JIRA, and the current status). Let's make sure
> we
> >> >> remember
> >> >> >    to update the current status as things are figured out.
> >> >> >    - Let's keep the discussion on the mailing list rather than on
> the
> >> >> wiki
> >> >> >    pages. It makes sense to do one or the other so all the comments
> >> are
> >> >> in one
> >> >> >    place and I think prior experience is that the wiki comments are
> >> the
> >> >> worse
> >> >> >    way.
> >> >> >
> >> >> > I think it would be great do KIPs for some of the in-flight items
> >> folks
> >> >> > mentioned.
> >> >> >
> >> >> > -Jay
> >> >> >
> >> >> > On Sat, Jan 17, 2015 at 8:23 AM, Gwen Shapira <
> gshap...@cloudera.com>
> >> >> wrote:
> >> >> >
> >> >> >> +1
> >> >> >>
> >> >> >> Will be happy to provide a KIP for the multiple-listeners patch.
> >> >> >>
> >> >> >> Gwen
> >> >> >>
> >> >> >> On Sat, Jan 17, 2015 at 8:10 AM, Joe Stein <joe.st...@stealth.ly>
> >> >> wrote:
> >> >> >> > +1 to everything we have been saying and where this (has settled
> >> >> to)/(is
> >> >> >> > settling to).
> >> >> >> >
> >> >> >> > I am sure other folks have some more feedback and think we
> should
> >> try
> >> >> to
> >> >> >> > keep this discussion going if need be. I am also a firm
> believer of
> >> >> form
> >> >> >> > following function so kicking the tires some to flesh out the
> >> details
> >> >> of
> >> >> >> > this and have some organic growth with the process will be
> healthy
> >> and
> >> >> >> > beneficial to the community.
> >> >> >> >
> >> >> >> > For my part, what I will do is open a few KIP based on some of
> the
> >> >> work I
> >> >> >> > have been involved with for 0.8.3. Off the top of my head this
> >> would
> >> >> >> > include 1) changes to re-assignment of partitions 2) kafka cli
> 3)
> >> >> global
> >> >> >> > configs 4) security white list black list by ip 5) SSL 6) We
> >> probably
> >> >> >> will
> >> >> >> > have lots of Security related KIPs and should treat them all
> >> >> individually
> >> >> >> > when the time is appropriate 7) Kafka on Mesos.
> >> >> >> >
> >> >> >> > If someone else wants to jump in to start getting some of the
> >> security
> >> >> >> KIP
> >> >> >> > that we are going to have in 0.8.3 I think that would be great
> >> (e.g.
> >> >> >> > Multiple Listeners for Kafka Brokers). There are also a few
> other
> >> >> >> tickets I
> >> >> >> > can think of that are important to have in the code in 0.8.3
> that
> >> >> should
> >> >> >> > have KIP also that I haven't really been involved in. I will
> take a
> >> >> few
> >> >> >> > minutes and go through JIRA (one I can think of like auto
> assign id
> >> >> that
> >> >> >> is
> >> >> >> > already committed I think) and ask for a KIP if appropriate or
> if I
> >> >> feel
> >> >> >> > that I can write it up (both from a time and understanding
> >> >> perspective)
> >> >> >> do
> >> >> >> > so.
> >> >> >> >
> >> >> >> > long story short, I encourage folks to start moving ahead with
> the
> >> KIP
> >> >> >> for
> >> >> >> > 0.8.3 as how we operate. any objections?
> >> >> >> >
> >> >> >> > On Fri, Jan 16, 2015 at 2:40 PM, Guozhang Wang <
> wangg...@gmail.com
> >> >
> >> >> >> wrote:
> >> >> >> >
> >> >> >> >> +1 on the idea, and we could mutually link the KIP wiki page
> with
> >> the
> >> >> >> the
> >> >> >> >> created JIRA ticket (i.e. include the JIRA number on the page
> and
> >> the
> >> >> >> KIP
> >> >> >> >> url on the ticket description).
> >> >> >> >>
> >> >> >> >> Regarding the KIP process, probably we do not need two phase
> >> >> >> communication
> >> >> >> >> of a [DISCUSS] followed by [VOTE], as Jay said the voting
> should
> >> be
> >> >> >> clear
> >> >> >> >> while people discuss about that.
> >> >> >> >>
> >> >> >> >> About who should trigger the process, I think the only involved
> >> >> people
> >> >> >> >> would be 1) when the patch is submitted / or even the ticket is
> >> >> created,
> >> >> >> >> the assignee could choose to start the KIP process if she
> thought
> >> it
> >> >> is
> >> >> >> >> necessary; 2) the reviewer of the patch can also suggest
> starting
> >> KIP
> >> >> >> >> discussions.
> >> >> >> >>
> >> >> >> >> On Fri, Jan 16, 2015 at 10:49 AM, Gwen Shapira <
> >> >> gshap...@cloudera.com>
> >> >> >> >> wrote:
> >> >> >> >>
> >> >> >> >> > +1 to Ewen's suggestions: Deprecation, status and version.
> >> >> >> >> >
> >> >> >> >> > Perhaps add the JIRA where the KIP was implemented to the
> >> metadata.
> >> >> >> >> > This will help tie things together.
> >> >> >> >> >
> >> >> >> >> > On Fri, Jan 16, 2015 at 9:35 AM, Ewen Cheslack-Postava
> >> >> >> >> > <e...@confluent.io> wrote:
> >> >> >> >> > > I think adding a section about deprecation would be
> helpful. A
> >> >> good
> >> >> >> >> > > fraction of the time I would expect the goal of a KIP is to
> >> fix
> >> >> or
> >> >> >> >> > replace
> >> >> >> >> > > older functionality that needs continued support for
> >> >> compatibility,
> >> >> >> but
> >> >> >> >> > > should eventually be phased out. This helps Kafka devs
> >> understand
> >> >> >> how
> >> >> >> >> > long
> >> >> >> >> > > they'll end up supporting multiple versions of features and
> >> helps
> >> >> >> users
> >> >> >> >> > > understand when they're going to have to make updates to
> their
> >> >> >> >> > applications.
> >> >> >> >> > >
> >> >> >> >> > > Less important but useful -- having a bit of standard
> metadata
> >> >> like
> >> >> >> >> PEPs
> >> >> >> >> > > do. Two I think are important are status (if someone lands
> on
> >> the
> >> >> >> KIP
> >> >> >> >> > page,
> >> >> >> >> > > can they tell whether this KIP was ever completed?) and/or
> the
> >> >> >> version
> >> >> >> >> > the
> >> >> >> >> > > KIP was first released in.
> >> >> >> >> > >
> >> >> >> >> > >
> >> >> >> >> > >
> >> >> >> >> > > On Fri, Jan 16, 2015 at 9:20 AM, Joel Koshy <
> >> jjkosh...@gmail.com
> >> >> >
> >> >> >> >> wrote:
> >> >> >> >> > >
> >> >> >> >> > >> I'm definitely +1 on the KIP concept. As Joe mentioned, we
> >> are
> >> >> >> already
> >> >> >> >> > >> doing this in one form or the other. However, IMO it is
> >> fairly
> >> >> ad
> >> >> >> hoc
> >> >> >> >> > >> - i.e., a combination of DISCUSS threads, jira comments,
> RB
> >> and
> >> >> >> code
> >> >> >> >> > >> comments, wikis and html documentation. In the past I have
> >> had
> >> >> to
> >> >> >> dig
> >> >> >> >> > >> into a bunch of these to try and figure out why something
> was
> >> >> >> >> > >> implemented a certain way. I think KIPs can help a lot
> here
> >> >> first
> >> >> >> by
> >> >> >> >> > >> providing guidelines on what to think about
> (compatibility,
> >> new
> >> >> >> APIs,
> >> >> >> >> > >> etc.) when working through a major feature; and second by
> >> >> becoming
> >> >> >> a
> >> >> >> >> > >> crisp source of truth documentation for new releases.
> E.g.,
> >> for
> >> >> >> >> > >> feature X: see relevant KIPs: a, b, c, etc.
> >> >> >> >> > >>
> >> >> >> >> > >> On Thu, Jan 15, 2015 at 08:11:20PM -0800, Jay Kreps wrote:
> >> >> >> >> > >> > Hey Joe,
> >> >> >> >> > >> >
> >> >> >> >> > >> > Yeah I guess the question is what is the definition of
> >> major?
> >> >> I
> >> >> >> >> agree
> >> >> >> >> > we
> >> >> >> >> > >> > definitely don't want to generate a bunch of paperwork.
> We
> >> >> have
> >> >> >> >> enough
> >> >> >> >> > >> > problems just getting all the contributions reviewed and
> >> >> checked
> >> >> >> in
> >> >> >> >> > in a
> >> >> >> >> > >> > timely fashion...
> >> >> >> >> > >> >
> >> >> >> >> > >> > So obviously bug fixes would not apply here.
> >> >> >> >> > >> >
> >> >> >> >> > >> > I think it is also pretty clear that big features should
> >> get
> >> >> >> >> reviewed
> >> >> >> >> > and
> >> >> >> >> > >> > discussed. To pick on myself, for example, the log
> >> compaction
> >> >> >> work
> >> >> >> >> was
> >> >> >> >> > >> done
> >> >> >> >> > >> > without enough public discussion about how it worked and
> >> why
> >> >> >> >> (imho). I
> >> >> >> >> > >> > hope/claim that enough rigour in thinking about
> use-cases
> >> and
> >> >> >> >> > operations
> >> >> >> >> > >> > and so on was done that it turned out well, but the
> >> discussion
> >> >> >> was
> >> >> >> >> > just
> >> >> >> >> > >> > between a few people with no real public output. This
> kind
> >> of
> >> >> >> >> feature
> >> >> >> >> > is
> >> >> >> >> > >> > clearly a big change and something we should discuss.
> >> >> >> >> > >> >
> >> >> >> >> > >> > If we limit ourselves to just the public contracts the
> KIP
> >> >> >> >> introduces
> >> >> >> >> > the
> >> >> >> >> > >> > discussion would just be on the new configs and
> monitoring
> >> >> >> without
> >> >> >> >> > >> really a
> >> >> >> >> > >> > discussion of the design and how it works which is
> >> obviously
> >> >> >> closely
> >> >> >> >> > >> > related.
> >> >> >> >> > >> >
> >> >> >> >> > >> > I don't think this should be more work because in
> practice
> >> we
> >> >> are
> >> >> >> >> > making
> >> >> >> >> > >> > wiki pages for any big thing anyway. So this would just
> be
> >> a
> >> >> >> >> > consistent
> >> >> >> >> > >> way
> >> >> >> >> > >> > of numbering and structuring these pages. This would
> also
> >> >> give a
> >> >> >> >> clear
> >> >> >> >> > >> call
> >> >> >> >> > >> > to action: "hey kafka people, come read my wiki and
> think
> >> this
> >> >> >> >> > through".
> >> >> >> >> > >> >
> >> >> >> >> > >> > I actually thinking the voting aspect is less
> important. I
> >> >> think
> >> >> >> it
> >> >> >> >> is
> >> >> >> >> > >> > generally clear when there is agreement on something and
> >> not.
> >> >> So
> >> >> >> >> from
> >> >> >> >> > my
> >> >> >> >> > >> > point of view we could actually just eliminate that
> part if
> >> >> that
> >> >> >> is
> >> >> >> >> > too
> >> >> >> >> > >> > formal, it just seemed like a good way to formally adopt
> >> >> >> something.
> >> >> >> >> > >> >
> >> >> >> >> > >> > To address some of your comments from the wiki:
> >> >> >> >> > >> >
> >> >> >> >> > >> > 1. This doesn't inhibit someone coming along and putting
> >> up a
> >> >> >> patch.
> >> >> >> >> > It
> >> >> >> >> > >> is
> >> >> >> >> > >> > just that when they do if it is a big thing introducing
> new
> >> >> >> >> > functionality
> >> >> >> >> > >> > we would ask for a little discussion on the basic
> >> >> >> feature/contracts
> >> >> >> >> > prior
> >> >> >> >> > >> > to code review.
> >> >> >> >> > >> >
> >> >> >> >> > >> > 2. We definitely definitely don't want people
> generating a
> >> >> lot of
> >> >> >> >> > these
> >> >> >> >> > >> > things every time they have an idea that they aren't
> going
> >> to
> >> >> >> >> > implement.
> >> >> >> >> > >> So
> >> >> >> >> > >> > this is only applicable to things you absolutely will
> >> check in
> >> >> >> code
> >> >> >> >> > for.
> >> >> >> >> > >> We
> >> >> >> >> > >> > also don't want to be making proposals before things are
> >> >> thought
> >> >> >> >> > through,
> >> >> >> >> > >> > which often requires writing the code. So I think the
> right
> >> >> time
> >> >> >> >> for a
> >> >> >> >> > >> KIP
> >> >> >> >> > >> > is when you are far enough along that you know the
> issues
> >> and
> >> >> >> >> > tradeoffs
> >> >> >> >> > >> but
> >> >> >> >> > >> > not so far along that you are going to be totally
> opposed
> >> to
> >> >> any
> >> >> >> >> > change.
> >> >> >> >> > >> > Sometimes that is prior to writing any code and
> sometimes
> >> not
> >> >> >> until
> >> >> >> >> > you
> >> >> >> >> > >> are
> >> >> >> >> > >> > practically done.
> >> >> >> >> > >> >
> >> >> >> >> > >> > The key problem I see this fixing is that there is
> enough
> >> new
> >> >> >> >> > development
> >> >> >> >> > >> > happening that it is pretty hard for everyone to review
> >> every
> >> >> >> line
> >> >> >> >> of
> >> >> >> >> > >> every
> >> >> >> >> > >> > iteration of every patch. But all of us should be fully
> >> aware
> >> >> of
> >> >> >> new
> >> >> >> >> > >> > features, the ramifications, the new public interfaces,
> >> etc.
> >> >> If
> >> >> >> we
> >> >> >> >> > aren't
> >> >> >> >> > >> > aware of that we can't really build a holistic system
> that
> >> is
> >> >> >> >> > beautiful
> >> >> >> >> > >> and
> >> >> >> >> > >> > consistent across. So the idea is that if you fully
> review
> >> the
> >> >> >> KIPs
> >> >> >> >> > you
> >> >> >> >> > >> can
> >> >> >> >> > >> > be sure that even if you don't know every new line of
> code,
> >> >> you
> >> >> >> know
> >> >> >> >> > the
> >> >> >> >> > >> > major changes coming in.
> >> >> >> >> > >> >
> >> >> >> >> > >> > -Jay
> >> >> >> >> > >> >
> >> >> >> >> > >> >
> >> >> >> >> > >> >
> >> >> >> >> > >> > On Thu, Jan 15, 2015 at 12:18 PM, Joe Stein <
> >> >> >> joe.st...@stealth.ly>
> >> >> >> >> > >> wrote:
> >> >> >> >> > >> >
> >> >> >> >> > >> > > Thanks Jay for kicking this off! I think the
> confluence
> >> page
> >> >> >> you
> >> >> >> >> > wrote
> >> >> >> >> > >> up
> >> >> >> >> > >> > > is a great start.
> >> >> >> >> > >> > >
> >> >> >> >> > >> > >
> >> >> >> >> > >> > > The KIP makes sense to me (at a minimum) if there is
> >> going
> >> >> to
> >> >> >> be
> >> >> >> >> any
> >> >> >> >> > >> > > "breaking change". This way Kafka can continue to grow
> >> and
> >> >> >> blossom
> >> >> >> >> > and
> >> >> >> >> > >> we
> >> >> >> >> > >> > > have a process in place if we are going to release a
> >> thorn
> >> >> ...
> >> >> >> and
> >> >> >> >> > >> when we
> >> >> >> >> > >> > > do it is *CLEAR* about what and why that is. We can
> >> easily
> >> >> >> >> document
> >> >> >> >> > >> which
> >> >> >> >> > >> > > KIPs where involved with this release (which I think
> >> should
> >> >> get
> >> >> >> >> > >> committed
> >> >> >> >> > >> > > afterwards somewhere so no chance of edit after
> release).
> >> >> This
> >> >> >> >> > >> approach I
> >> >> >> >> > >> > > had been thinking about also allows changes to occur
> as
> >> >> they do
> >> >> >> >> now
> >> >> >> >> > as
> >> >> >> >> > >> long
> >> >> >> >> > >> > > as they are backwards compatible.  Hopefully we never
> >> need a
> >> >> >> KIP
> >> >> >> >> but
> >> >> >> >> > >> when
> >> >> >> >> > >> > > we do the PMC can vote on it and folks can read the
> >> release
> >> >> >> notes
> >> >> >> >> > with
> >> >> >> >> > >> > > *CLEAR* understanding what is going to break their
> >> existing
> >> >> >> >> > setup... at
> >> >> >> >> > >> > > least that is how I have been thinking about it.
> >> >> >> >> > >> > >
> >> >> >> >> > >> > >
> >> >> >> >> > >> > > Let me know what you think about this base minimum
> >> >> approach...
> >> >> >> I
> >> >> >> >> > hadn't
> >> >> >> >> > >> > > really thought of the KIP for *ANY* "major change"
> and I
> >> >> have
> >> >> >> to
> >> >> >> >> > think
> >> >> >> >> > >> more
> >> >> >> >> > >> > > about that. I have some other comments for minor
> items in
> >> >> the
> >> >> >> >> > >> confluence
> >> >> >> >> > >> > > page I will make once I think more about how I feel
> >> having a
> >> >> >> KIP
> >> >> >> >> for
> >> >> >> >> > >> more
> >> >> >> >> > >> > > than what I was thinking about already.
> >> >> >> >> > >> > >
> >> >> >> >> > >> > >
> >> >> >> >> > >> > > I do think we should have "major changes" go through
> >> >> >> confluence,
> >> >> >> >> > >> mailing
> >> >> >> >> > >> > > list discuss and JIRA but kind of feel we have been
> doing
> >> >> that
> >> >> >> >> > already
> >> >> >> >> > >> ...
> >> >> >> >> > >> > > if there are cases where that isn't the case we should
> >> >> >> highlight
> >> >> >> >> and
> >> >> >> >> > >> learn
> >> >> >> >> > >> > > from them and formalize that more if need be.
> >> >> >> >> > >> > >
> >> >> >> >> > >> > >
> >> >> >> >> > >> > > /*******************************************
> >> >> >> >> > >> > >  Joe Stein
> >> >> >> >> > >> > >  Founder, Principal Consultant
> >> >> >> >> > >> > >  Big Data Open Source Security LLC
> >> >> >> >> > >> > >  http://www.stealth.ly
> >> >> >> >> > >> > >  Twitter: @allthingshadoop <
> >> >> >> >> http://www.twitter.com/allthingshadoop>
> >> >> >> >> > >> > > ********************************************/
> >> >> >> >> > >> > >
> >> >> >> >> > >> > > On Thu, Jan 15, 2015 at 1:42 PM, Jay Kreps <
> >> >> >> jay.kr...@gmail.com>
> >> >> >> >> > >> wrote:
> >> >> >> >> > >> > >
> >> >> >> >> > >> > > > The idea of KIPs came up in a previous discussion
> but
> >> >> there
> >> >> >> was
> >> >> >> >> no
> >> >> >> >> > >> real
> >> >> >> >> > >> > > > crisp definition of what they were. Here is an
> attempt
> >> at
> >> >> >> >> > defining a
> >> >> >> >> > >> > > > process:
> >> >> >> >> > >> > > >
> >> >> >> >> > >> > > >
> >> >> >> >> > >> > >
> >> >> >> >> > >>
> >> >> >> >> >
> >> >> >> >>
> >> >> >>
> >> >>
> >>
> https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Improvement+Proposals
> >> >> >> >> > >> > > >
> >> >> >> >> > >> > > > The trick here is to have something light-weight
> enough
> >> >> that
> >> >> >> it
> >> >> >> >> > >> isn't a
> >> >> >> >> > >> > > > hassle for small changes, but enough so that changes
> >> get
> >> >> the
> >> >> >> >> > >> eyeballs of
> >> >> >> >> > >> > > > the committers and heavy users.
> >> >> >> >> > >> > > >
> >> >> >> >> > >> > > > Thoughts?
> >> >> >> >> > >> > > >
> >> >> >> >> > >> > > > -Jay
> >> >> >> >> > >> > > >
> >> >> >> >> > >> > >
> >> >> >> >> > >>
> >> >> >> >> > >>
> >> >> >> >> > >
> >> >> >> >> > >
> >> >> >> >> > > --
> >> >> >> >> > > Thanks,
> >> >> >> >> > > Ewen
> >> >> >> >> >
> >> >> >> >>
> >> >> >> >>
> >> >> >> >>
> >> >> >> >> --
> >> >> >> >> -- Guozhang
> >> >> >> >>
> >> >> >>
> >> >>
> >>
>

Reply via email to