Subject: [Netconf] FW: evaluation of the partial-lock document

From: "Ersue, Mehmet (NSN - DE/Munich)" <[email-masked]>
Date: Tue, 9 Sep 2008 13:36:17 +0200

Hi Balazs, All,

the Partial Lock schema in the attached draft seems 
to be valid with one exception.

rpcOperationTargetType is defined as a complex type 
in netconf.xsd, but the PL schema is using it as an 
element in rpcOperationType.
Hence the XML validation gives an error message that 
it must refer to an existing _element_ (i.e. not compex type).

Cheers, 
Mehmet 

-----Original Message-----
From: [email-masked] [mailto:[email-masked]] On
Behalf Of ext Balazs Lengyel
Sent: Monday, September 08, 2008 5:04 PM
To: Wes Hardaker; Bert Wijnen - IETF; netconf mailing list
Subject: Re: [Netconf] evaluation of the partial-lock document

Hello Wes, Bert,
Thanks for the review. Please see the answers for Wes below!

If you have a look of the attached version, you can see that I also
included Bert's comments. I 
basically accepted them all e.g. I added a list of locked-nodes to the
rpc-reply.

Please indicate if you still have problems with some of the issues.
Balazs

Wes Hardaker wrote:
> * My final thoughts and concerns on the partial-lock feature as
>   a whole are in the last section of this...
> 
> 
>              Netconf WG last call report on partial lock
>              ===========================================
> 
> Author: Wes Hardaker <[email-masked]>
> Date: 2008-08-26 16:50:09 PDT
> 
> Table of Contents
> =================
> 1 General Notes
> 2 Thoughts on: Partial locks don't cover non-existing nodes
> 3 section 2.1: "Note:" wording
> 4 section 2.1, starting with "As with most locking..."
> 5 Question about multiple locks from the same session...
> 6 Section 2.4.1.1: target:
> 7 Section 2.4.1.1: text change
> 8 Section 2.4.1.1: first example
> 9 Side thought: netconf documents all assume a particular data model
> 10 Section 2.4.1.1: 2nd to last paragraph:
> 11 Section 2.4.2:
> 12 Section 2.4.2, negative response:
> 13 Section 2.5
> 14 Section 3, second paragraph: first sentence needs ()s or commas
> 15 Comparison of xpath evaluated partial lock vs locked nodes
> 
> 
> 
> 1 General Notes
> ---------------
> * Document is very well layed out and easy to understand.
>   It flows well and is easy to read.
> * But...  The English grammar could use some polishing in a few
>   more places than I've listed here.
>   + I'd recommend the authors hand it to someone that hasn't
>     been involved in editing for a simple polishing pass.
[BALAZS]: Will try.
> * My final thoughts and concerns on the partial-lock feature as
>   a whole are in the last section of this...
> 
> 2 Thoughts on: Partial locks don't cover non-existing nodes
> -----------------------------------------------------------
>       * (Section 2.4.1-ish)
> * note: can't lock a tree part that doesn't exist yet
> * There exists odd an usage case when a tree doesn't yet exist
>   (empty configuration). E.G., I can't lock the users tree until
>   at least 1 users/user exists.  If I try to lock <users> when
>   no subelement exists then I believe I get an error back (I'm
>   not even positive about this).  Section 2.4.1 seems to
>   indicate that it'll fail since at least one of the select sets
>   MUST be non-empty.
>   + The result is that you *must* create a single <user> before
>     you can lock the <users> table, for example.  IE a manager
>     is expected to be able to perform and understand why it's
>     doing the following odd sequence:
>     - partial-lock <users>   => failure because it's empty.
>     - create a <users><user><name>joe</name></user></users>
>     - partial-lock <users>   => success
>     - Edit users
>     - unlock
>   + This is just an odd error handling case that manegers will
>     have to cope with and it only exists because of the
>     inability to lock an empty tree.
> * Section 2.4.1.2 discusses this aspect of partial-locking, but
>   the security implications may be that you don't have
>   permission to lock a parent node of <users> for exmaple.  IE,
>   You shouldn't have to take out lock on <top> just because you
>   want to lock <users> (and you shouldn't have to create a user
>   before you can lock the table).
[BALAZS]:
I am not sure I fully understand your comment, but here is what I think
is the answer (in YANG
to makes think simpler :-)

If you have a data model:

container USERS {
    list user {
       ...
    }
}

Here you CAN lock the container USERS even if there are no user nodes
below it. The select will
return the USERS node, so it will not be empty. In this case no one else
can touch any of the
user nodes or create a new user.
> 
> 3 section 2.1: "Note:" wording
> ------------------------------
> * First sentence isn't a complete sentence
> * I'd argue this isn't just a "Note" but an interaction with
>   another capability and probably should be spelled out more
>   importantly than just as a "Note:" that implies it's just
>   additional information.
[BALAZS]: OK, moved it to 2.6.2 Interactions with Other Capabilities /
Candidate Configuration
Capability
> 
> 4 section 2.1, starting with "As with most locking..."
> ------------------------------------------------------
> * Change:
> * "parts of the configuration become dead-locked" =>
> * "parts of the configuration *could* become dead-locked"
[BALAZS]: OK
> 
> 5 Question about multiple locks from the same session...
> --------------------------------------------------------
> * Is it allowed?  Doesn't say one way or another... 
> * Consider:
>   1. lock with one partial nodes A and B
>   2. and then with another try to lock B and C
>   3. Do I get an error because B is locked (by me in this session)?
>   4. or now do I have multiple locks covering A, B and C?
> * I *think* I get an error?
> * If I do have A, B and C locked:
>   + and then I release the lock
>   + do I still have B and C locked with the second or just C
>     (I'd assume B and C)?
> * The document discusses this ramification for <lock> but not
>   really well for <partial-lock>
> * It sort of implies an error further in 2.4.1.1 "If a lock is
>   already held on any node..."
[BALAZS]: It is allowed to have multiple locks from the same session. In
2.4.1.1 will be
reworded to indicate this. In 2.1 it is stated that:
"A NETCONF session MAY have multiple parts of one or more datastores
     (running, candidate,startup) locked using partial lock operations.
     The <partial-lock> operation returns a lock-id to identify each
     successfully acquired lock."
Indicating that a session might have multiple locks.
I will also add to 2.4.1:
A NETCONF server MUST be able to grant multiple simultaneous partial
locks to a single NETCONF
session. If the scope of the individual locks overlap, nodes in the
common area MUST be locked
until all of the locks are released.
> 
> 6 Section 2.4.1.1: target:
> --------------------------
> * Wouldn't it be best to state directly: "a <partial-lock> may
>   only have one <target> parameter?"
[BALAZS]: OK
> 
> 7 Section 2.4.1.1: text change
> ------------------------------
> * "If the device supports the :xpath capability as well any valid" =>
> * "If the device supports the :xpath capability *then* any valid"
[BALAZS]: OK
> 
> 8 Section 2.4.1.1: first example
> --------------------------------
> * Shouldn't <nt:running/> be within a <target> scope?
> * The schema seems to indicate no
> * But it should (IMHO) if nothing else to match <lock> usage
>   which does have a <target> parameter.
>   + (if memory serves this was discussed early on in netconf and
>     it was agreed that all targets should be directly specified
>     inside a named <target> or similar parameter tag)
[BALAZS]: OK
> 
> 9 Side thought: netconf documents all assume a particular data model
> --------------------------------------------------------------------
> * Is it just me, or should all the netconf documents be replaced
>   once a real data model exists with real example nodes to use?
> * Right now all the examples give the impression that the example
>   RPCs will work, when in actuality they won't match the real
>   world data models.
>   + EG: /interfaces/interface[Id='eth1']
[BALAZS]: This is just an example no more. IMHO we simply can not avoid
assuming some data
model for now. I agree, it would be nice to later include real examples
from standard modules;
   whether we will have the time for that?
> 
> 10 Section 2.4.1.1: 2nd to last paragraph:
> ------------------------------------------
> * Explicitly spelling out an xpath failure is nice to
>   understand.  But in reality this should be more generic in
>   order to handle failing on future select type expressions
>   (xpath2) or other syntax errors.  Maybe something like "search
>   expression type not supported"?
[BALAZS]: I would like to be explicit here. If we introduce Xpath2 later
we will anyway have to
update the RFC, and I don't see how that update would cause problems for
a management system.
Once it gets the error it will anyway know it failed.
>   + What type of error do I get back for /users/user[name='Joe
[BALAZS]: Tag: invalid-value
> 
> 11 Section 2.4.2:
> -----------------
> * Nit: Replace "Example: Unlock" with "Example: Unlock a
>   previously created lock"
>   + or just remove: "Unlock"
>   + The title just looks a touch odd as is (incomplete).
[BALAZS]: OK
> 
> 12 Section 2.4.2, negative response:
> ------------------------------------
> * So there is no way to break a lock from a different session?
>   Then what happens if a TCP connection drops according to the
>   client (or is forced to drop) but the server hasn't realized
>   it's closed?
>   + Looks like kill-session is the solution based on later reading,
>     but I'd suggest spelling it out here.
>   + Requires access to the kill-session command to release a
>     hung-lock.  Possibly worth mentioning in the security
>     expectations.
[BALAZS}: OK
> 
> 13 Section 2.5
> --------------
> * I'd spell out in no uncertain terms that any command that
>   modifies a datastore will be blocked, and that "includes" the
>   current list.  The wording as is could be easily
>   misinterpreted to read that the current list is all you need
>   to worry about (which I know wasn't the intent).
[BALAZS}: OK
> 
> 14 Section 3, second paragraph: first sentence needs ()s or commas
> ------------------------------------------------------------------
>       around the lock types.
[BALAZS}: OK
> 
> 15 Comparison of xpath evaluated partial lock vs locked nodes
> -------------------------------------------------------------
> * I'm not personally convienced still that locking existing
>   nodes only is the best solution for partial locking.  I know
>   it's been debated a bunch in the past but I'm not even
>   convienced there is consusus on the subject.  I suspect that
>   if you counted the number of folks that started an argument
>   about it the numbers wouldn't point clearly to a consensus.
>   Many of the arguments came at different times, which makes it
>   hard to count.
>   + That being said, letting this one go forward doesn't
>     prohibit a different later solution.
[BALAZS}: IMHO we did reach consensus on the issue, but anyway I am glad
to see that you can
still live with this solution.
>   + I'm not convienced that locking nodes is cheaper to
>     implement or execute than evaluating edits based on a
>     memorized xpath solution.
> * Comparison:
>   * XPATH eval:
>     + easier to list in a "list of outstanding locks" table
>     + storage cost is very small (a list of xpaths)
>     + CPU usage is higher (An eval on every command is required)
>     + I think it's more intuitive...  There isn't an unknown "it's
>     no longer locked because you deleted it" sudden surprise.
>   * locking a list of nodes with a eval-once:
>     + Lower CPU usage since it's a single xpath eval
>     - Higher memory cost (need to memorize every locked node
>       either through a list or a flag)
>     - Usage complexity is much higher
>       - Can't lock empty parent nodes
>       - security ramifications require parent nodes for *everything*
>       - deleted nodes can be recreated
>         * This is most critical when manipulating ordered lists of
>           things like access rules (eg, firewall rules)
> * I've seen real-world current discussions surrounding the need
>   to put in a parent tree for all nodes *just* because of the
>   partial-lock inability to lock a common set of nodes.  The
>   result of this type of partical lock means either:
>   + data models will add extra tree nodes everywhere
>   + Or they wont' and it'll turn out later they should have
>     because of opreational needs for locking all the subnodes
>     and it can't be done.
>     - IE, it becomes critical to create a <rules> node to
>       surround a list of firewall <rule> nodes.
>    + I think it's worth spelling out this issue in the security
>      considerations so that every data model ever created gets a
>      otherwise-empty top node added above it so that it can be locked.
[BALAZS}: In my eyes the deciding factor is avoiding surprises.
XPATH surprise 1:
I have a user: John OConnor. I lock him based on his name. Later I
correct his name to John
O'Connor. Whoops suddenly he is not locked. (The name might not even be
the key attribute/leaf).
XPATH surprise 2:
We use XPATH:   and "preceding-sibling::*". I modify some data in my
locked nodes. The order of
the nodes might be modified by the modifying their content in the
datastore (e.g. modifying a
leaf called "priority"). Due to the change in priority some nodes that
were previously locked
suddenly become unlocked.
XPATH surprise 3:
I know I have 3 users: Jack and Jill and John. I store my users in
alphabetical order. I want
to lock John so I use from XPATH: "position() = 3" Now another operator
comes and adds user
Blaise. Suddenly I am locking  Jill instead of John.
XPATH surprise 4:
Using an XPATH that includes state data or any configuration data that
is not itself locked is
just asking for disaster.

Probably a many more strange XPATH expressions could be designed.

regards Balazs

DQoNCg0KTkVUQ09ORiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLiBMZW5neWVsDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVyaWNzc29uIEh1bmdhcnkNCkludGVuZGVkIHN0YXR1czogU3RhbmRhcmRzIFRyYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uIEJqb3JrbHVuZA0KRXhwaXJlczogTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhaWwtZiBTeXN0ZW1zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXB0ZW1iZXIgMDgsIDIwMDgNCg0KDQogICAgICAgICAgICAgICAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORg0KICAgICAgICAgICAgICAgICAgIGRyYWZ0LWlldGYtbmV0Y29uZi1wYXJ0aWFsLWxvY2stMDQNCg0KU3RhdHVzIG9mIHRoaXMgTWVtbw0KDQogICBCeSBzdWJtaXR0aW5nIHRoaXMgSW50ZXJuZXQtRHJhZnQsIGVhY2ggYXV0aG9yIHJlcHJlc2VudHMgdGhhdCBhbnkNCiAgIGFwcGxpY2FibGUgcGF0ZW50IG9yIG90aGVyIElQUiBjbGFpbXMgb2Ygd2hpY2ggaGUgb3Igc2hlIGlzIGF3YXJlDQogICBoYXZlIGJlZW4gb3Igd2lsbCBiZSBkaXNjbG9zZWQsIGFuZCBhbnkgb2Ygd2hpY2ggaGUgb3Igc2hlIGJlY29tZXMNCiAgIGF3YXJlIHdpbGwgYmUgZGlzY2xvc2VkLCBpbiBhY2NvcmRhbmNlIHdpdGggU2VjdGlvbiA2IG9mIEJDUCA3OS4NCg0KICAgSW50ZXJuZXQtRHJhZnRzIGFyZSB3b3JraW5nIGRvY3VtZW50cyBvZiB0aGUgSW50ZXJuZXQgRW5naW5lZXJpbmcNCiAgIFRhc2sgRm9yY2UgKElFVEYpLCBpdHMgYXJlYXMsIGFuZCBpdHMgd29ya2luZyBncm91cHMuICBOb3RlIHRoYXQNCiAgIG90aGVyIGdyb3VwcyBtYXkgYWxzbyBkaXN0cmlidXRlIHdvcmtpbmcgZG9jdW1lbnRzIGFzIEludGVybmV0LQ0KICAgRHJhZnRzLg0KDQogICBJbnRlcm5ldC1EcmFmdHMgYXJlIGRyYWZ0IGRvY3VtZW50cyB2YWxpZCBmb3IgYSBtYXhpbXVtIG9mIHNpeCBtb250aHMNCiAgIGFuZCBtYXkgYmUgdXBkYXRlZCwgcmVwbGFjZWQsIG9yIG9ic29sZXRlZCBieSBvdGhlciBkb2N1bWVudHMgYXQgYW55DQogICB0aW1lLiAgSXQgaXMgaW5hcHByb3ByaWF0ZSB0byB1c2UgSW50ZXJuZXQtRHJhZnRzIGFzIHJlZmVyZW5jZQ0KICAgbWF0ZXJpYWwgb3IgdG8gY2l0ZSB0aGVtIG90aGVyIHRoYW4gYXMgIndvcmsgaW4gcHJvZ3Jlc3MuIg0KDQogICBUaGUgbGlzdCBvZiBjdXJyZW50IEludGVybmV0LURyYWZ0cyBjYW4gYmUgYWNjZXNzZWQgYXQNCiAgIGh0dHA6Ly93d3cuaWV0Zi5vcmcvaWV0Zi8xaWQtYWJzdHJhY3RzLnR4dC4NCg0KICAgVGhlIGxpc3Qgb2YgSW50ZXJuZXQtRHJhZnQgU2hhZG93IERpcmVjdG9yaWVzIGNhbiBiZSBhY2Nlc3NlZCBhdA0KICAgaHR0cDovL3d3dy5pZXRmLm9yZy9zaGFkb3cuaHRtbC4NCg0KICAgVGhpcyBJbnRlcm5ldC1EcmFmdCB3aWxsIGV4cGlyZSBvbiBNYXJjaCAxMiwgMjAwOS4NCg0KQ29weXJpZ2h0IE5vdGljZQ0KDQogICBDb3B5cmlnaHQgKEMpIFRoZSBJRVRGIFRydXN0ICgyMDA4KS4NCg0KQWJzdHJhY3QNCg0KICAgVGhlIE5FVENPTkYgcHJvdG9jb2wgZGVmaW5lcyB0aGUgbG9jayBhbmQgdW5sb2NrIFJQQ3MgdGhhdCBsb2NrDQogICBlbnRpcmUgY29uZmlndXJhdGlvbiBkYXRhc3RvcmVzLiAgSW4gc29tZSBzaXR1YXRpb25zLCBhIHdheSB0byBsb2NrDQogICBvbmx5IHBhcnRzIG9mIGEgY29uZmlndXJhdGlvbiBkYXRhc3RvcmUgaXMgcmVxdWlyZWQuICBUaGlzIGRvY3VtZW50DQogICBkZWZpbmVzIGEgY2FwYWJpbGl0eS1iYXNlZCBleHRlbnNpb24gdG8gdGhlIE5FVENPTkYgcHJvdG9jb2wgZm9yDQogICBsb2NraW5nIHBvcnRpb25zIG9mIGEgY29uZmlndXJhdGlvbiBkYXRhc3RvcmUuDQoNCg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgIFtQYWdlIDFdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQpUYWJsZSBvZiBDb250ZW50cw0KDQogICAxLiAgSW50cm9kdWN0aW9uIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDMNCiAgICAgMS4xLiAgRGVmaW5pdGlvbiBvZiBUZXJtcyAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgMw0KICAgMi4gIFBhcnRpYWwgTG9ja2luZyBDYXBhYmlsaXR5IC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICAzDQogICAgIDIuMS4gIE92ZXJ2aWV3IC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDMNCiAgICAgMi4yLiAgRGVwZW5kZW5jaWVzIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNA0KICAgICAyLjMuICBDYXBhYmlsaXR5IElkZW50aWZpZXIgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA0DQogICAgIDIuNC4gIE5ldyBPcGVyYXRpb25zIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDQNCiAgICAgICAyLjQuMS4gIDxwYXJ0aWFsLWxvY2s+IC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgNA0KICAgICAgIDIuNC4yLiAgPHBhcnRpYWwtdW5sb2NrPiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA4DQogICAgIDIuNS4gIE1vZGlmaWNhdGlvbnMgdG8gRXhpc3RpbmcgT3BlcmF0aW9ucyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gIDkNCiAgICAgMi42LiAgSW50ZXJhY3Rpb25zIHdpdGggT3RoZXIgQ2FwYWJpbGl0aWVzIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAgOQ0KICAgICAgIDIuNi4xLiAgV3JpdGFibGUtUnVubmluZyBDYXBhYmlsaXR5ICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuICA5DQogICAgICAgMi42LjIuICBDYW5kaWRhdGUgQ29uZmlndXJhdGlvbiBDYXBhYmlsaXR5IC4gLiAuIC4gLiAuIC4gLiAuIC4gIDkNCiAgICAgICAyLjYuMy4gIERpc3RpbmN0IFN0YXJ0dXAgQ2FwYWJpbGl0eSAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxMA0KICAgMy4gIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDEwDQogICA0LiAgSUFOQSBDb25zaWRlcmF0aW9ucyAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTENCiAgIDUuICBBcHBlbmRpeCBBICAtICBYTUwgU2NoZW1hIGZvciBQYXJ0aWFsIExvY2tpbmcgIChub3JtYXRpdmUpIC4gLiAxMg0KICAgNi4gIEFwcGVuZGl4IEIgIC0gWUFORyBNb2R1bGUgZm9yIFBhcnRpYWwgTG9ja2luZw0KICAgICAgIChub24tbm9ybWF0aXZlKSAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDE0DQogICA3LiAgQXBwZW5kaXggQyAgLSAgQ2hhbmdlIExvZyAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTYNCiAgICAgNy4xLiAgMDMtMDQgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxNg0KICAgICA3LjIuICAwMi0wMyAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDE2DQogICAgIDcuMy4gIDAxLTAyICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTYNCiAgICAgNy40LiAgMDAtMDEgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxNg0KICAgICA3LjUuICAtMDAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDE2DQogICA4LiAgQWNrbm93bGVkZ2VtZW50cyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTcNCiAgIDkuICBSZWZlcmVuY2VzIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxOA0KICAgICA5LjEuICBOb3JtYXRpdmUgUmVmZXJlbmNlcyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDE4DQogICAgIDkuMi4gIEluZm9ybWF0aXZlIFJlZmVyZW5jZXMgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gMTgNCiAgIEF1dGhvcnMnIEFkZHJlc3NlcyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAxOQ0KICAgSW50ZWxsZWN0dWFsIFByb3BlcnR5IGFuZCBDb3B5cmlnaHQgU3RhdGVtZW50cyAuIC4gLiAuIC4gLiAuIC4gLiAuIDIwDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpMZW5neWVsICYgQmpvcmtsdW5kICAgICAgRXhwaXJlcyBNYXJjaCAxMiwgMjAwOSAgICAgICAgICAgICAgICAgW1BhZ2UgMl0NCgwNCkludGVybmV0LURyYWZ0ICAgICAgICBQYXJ0aWFsIExvY2sgUlBDIGZvciBORVRDT05GICAgICAgICBTZXB0ZW1iZXIgMjAwOA0KDQoNCjEuICBJbnRyb2R1Y3Rpb24NCg0KICAgVGhlIE5FVENPTkYgcHJvdG9jb2wgW05FVENPTkZdIGRlc2NyaWJlcyB0aGUgbG9jayBhbmQgdW5sb2NrIFJQQ3MNCiAgIHRoYXQgb3BlcmF0ZSBvbiBlbnRpcmUgY29uZmlndXJhdGlvbiBkYXRhc3RvcmVzLiAgT2Z0ZW4sIG11bHRpcGxlDQogICBtYW5hZ2VtZW50IHNlc3Npb25zIG5lZWQgdG8gYmUgYWJsZSB0byBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYQ0KICAgbWFuYWdlZCBkZXZpY2UgaW4gcGFyYWxsZWwuICBJbiB0aGVzZSBjYXNlcywgbG9ja2luZyBvbmx5IHBhcnRzIG9mIGENCiAgIGNvbmZpZ3VyYXRpb24gZGF0YXN0b3JlIGlzIG5lZWRlZC4gIFRoaXMgZG9jdW1lbnQgZGVmaW5lcyBhbg0KICAgZXh0ZW5zaW9uIHRvIHRoZSBORVRDT05GIHByb3RvY29sIHRvIGFsbG93IHRoaXMuDQoNCiAgIFRoZSBtZWNoYW5pc20gZm9yIHBhcnRpYWwgbG9ja2luZyBpcyBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgWFBhdGgNCiAgIGZpbHRlcmluZyBtZWNoYW5pc21zLg0KDQogICBQYXJ0aWFsIGxvY2tpbmcgaXMgZGVmaW5lZCBhcyBhIGNhcGFiaWxpdHkgdG8gTkVUQ09ORi4NCg0KMS4xLiAgRGVmaW5pdGlvbiBvZiBUZXJtcw0KDQogICBUaGUga2V5IHdvcmRzICJNVVNUIiwgIk1VU1QgTk9UIiwgIlJFUVVJUkVEIiwgIlNIQUxMIiwgIlNIQUxMIE5PVCIsDQogICAiU0hPVUxEIiwgIlNIT1VMRCBOT1QiLCAiUkVDT01NRU5ERUQiLCAiTk9UIFJFQ09NTUVOREVEIiwgIk1BWSIsIGFuZA0KICAgIk9QVElPTkFMIiBpbiB0aGlzIGRvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcyBkZXNjcmliZWQgaW4gQkNQDQogICAxNCwgW1JGQzIxMTldLg0KDQoNCjIuICBQYXJ0aWFsIExvY2tpbmcgQ2FwYWJpbGl0eQ0KDQoyLjEuICBPdmVydmlldw0KDQogICBUaGUgOnBhcnRpYWwtbG9jayBjYXBhYmlsaXR5IGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlDQogICBsb2NraW5nIG9mIGl0cyBjb25maWd1cmF0aW9uIHdpdGggYSBzY29wZSBzbWFsbGVyIHRoZW4gYSBjb21wbGV0ZQ0KICAgY29uZmlndXJhdGlvbiBkYXRhc3RvcmUuICBUaGUgc2NvcGUgdG8gYmUgbG9ja2VkIGlzIHNwZWNpZmllZCBieQ0KICAgdXNpbmcgcmVzdHJpY3RlZCBvciBmdWxsIFhQYXRoIGV4cHJlc3Npb25zLiAgUGFydGlhbCBsb2NraW5nIGNvdmVycw0KICAgY29uZmlndXJhdGlvbiBkYXRhLCBidXQgbm90IHN0YXRlIGRhdGEuDQoNCiAgIFRoZSBzeXN0ZW0gTVVTVCBlbnN1cmUgdGhhdCBjb25maWd1cmF0aW9uIHJlc291cmNlcyBjb3ZlcmVkIGJ5IHRoZQ0KICAgbG9jayBhcmUgbm90IG1vZGlmaWVkIGJ5IG90aGVyIE5FVENPTkYgb3Igbm9uLU5FVENPTkYgbWFuYWdlbWVudA0KICAgb3BlcmF0aW9ucyBzdWNoIGFzIFNOTVAgYW5kIHRoZSBDTEkuDQoNCiAgIFRoZSBkdXJhdGlvbiBvZiB0aGUgcGFydGlhbCBsb2NrIGlzIGRlZmluZWQgYXMgYmVnaW5uaW5nIHdoZW4gdGhlDQogICBwYXJ0aWFsIGxvY2sgaXMgZ3JhbnRlZC4gIFRoZSBwYXJ0aWFsIGxvY2sgbGFzdHMgdW50aWwgZWl0aGVyIHRoZQ0KICAgY29ycmVzcG9uZGluZyA8cGFydGlhbC11bmxvY2s+IG9wZXJhdGlvbiBzdWNjZWVkcyBvciB0aGUgTkVUQ09ORg0KICAgc2Vzc2lvbiB0ZXJtaW5hdGVzLg0KDQogICBBIE5FVENPTkYgc2Vzc2lvbiBNQVkgaGF2ZSBtdWx0aXBsZSBwYXJ0cyBvZiBvbmUgb3IgbW9yZSBkYXRhc3RvcmVzDQogICAocnVubmluZywgY2FuZGlkYXRlLHN0YXJ0dXApIGxvY2tlZCB1c2luZyBwYXJ0aWFsIGxvY2sgb3BlcmF0aW9ucy4NCiAgIFRoZSA8cGFydGlhbC1sb2NrPiBvcGVyYXRpb24gcmV0dXJucyBhIGxvY2staWQgdG8gaWRlbnRpZnkgZWFjaA0KICAgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIGxvY2suDQoNCg0KDQoNCg0KDQpMZW5neWVsICYgQmpvcmtsdW5kICAgICAgRXhwaXJlcyBNYXJjaCAxMiwgMjAwOSAgICAgICAgICAgICAgICAgW1BhZ2UgM10NCgwNCkludGVybmV0LURyYWZ0ICAgICAgICBQYXJ0aWFsIExvY2sgUlBDIGZvciBORVRDT05GICAgICAgICBTZXB0ZW1iZXIgMjAwOA0KDQoNCjIuMi4gIERlcGVuZGVuY2llcw0KDQogICBUaGUgZGV2aWNlIE1VU1Qgc3VwcG9ydCB0aGUgcmVzdHJpY3RlZCBYUGF0aCBleHByZXNzaW9ucyBpbiB0aGUNCiAgIHNlbGVjdCBlbGVtZW50LCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiAyLjQuMS4gIElmIG9wdGlvbmFsbHkgdGhlDQogICA6eHBhdGggY2FwYWJpbGl0eSBpcyBhbHNvIHN1cHBvcnRlZCwgdGhlIGRldmljZSBNVVNUIGFsc28gc3VwcG9ydCB0aGUNCiAgIHVzYWdlIG9mIGFueSBYUGF0aCAxLjAgZXhwcmVzc2lvbiBpbiB0aGUgc2VsZWN0IGVsZW1lbnQuDQoNCjIuMy4gIENhcGFiaWxpdHkgSWRlbnRpZmllcg0KDQogICB1cm46aWV0ZjpwYXJhbXM6bmV0Y29uZjpjYXBhYmlsaXR5OnBhcnRpYWwtbG9jazoxLjANCg0KMi40LiAgTmV3IE9wZXJhdGlvbnMNCg0KMi40LjEuICA8cGFydGlhbC1sb2NrPg0KDQogICBUaGUgPHBhcnRpYWwtbG9jaz4gb3BlcmF0aW9uIGFsbG93cyB0aGUgY2xpZW50IHRvIGxvY2sgYSBwb3J0aW9uIG9mIGENCiAgIGRhdGEgc3RvcmUuICBUaGUgcG9ydGlvbiB0byBsb2NrIGlzIHNwZWNpZmllZCBieSB1c2luZyBYUGF0aA0KICAgZXhwcmVzc2lvbnMgaW4gdGhlIHNlbGVjdCBlbGVtZW50cyBvZiB0aGUgPHBhcnRpYWwtbG9jaz4gb3BlcmF0aW9uLg0KICAgRWFjaCBYUGF0aCBleHByZXNzaW9uIE1VU1QgcmV0dXJuIGEgbm9kZSBzZXQuICBMb2NraW5nIGEgbm9kZQ0KICAgcHJvdGVjdHMgdGhlIGNvbXBsZXRlIHN1YnRyZWUgdW5kZXIgaXQgZnJvbSBtb2RpZmljYXRpb24gYnkgb3RoZXJzLg0KDQogICBUaGUgc2VsZWN0IFhQYXRoIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgb25seSBvbmNlIGF0IGxvY2sgdGltZSwNCiAgIHRoZXJlYWZ0ZXIgdGhlIHNjb3BlIG9mIHRoZSBsb2NrIGlzIG1haW50YWluZWQgYXMgYSBzZXQgb2Ygbm9kZXMuICBJZg0KICAgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpcyBsYXRlciBhbHRlcmVkIGluIGEgd2F5IHRoYXQgd291bGQgbWFrZSB0aGUNCiAgIG9yaWdpbmFsIHNlbGVjdCBYUGF0aCBleHByZXNzaW9ucyBldmFsdWF0ZSB0byBhIGRpZmZlcmVudCBzZXQgb2YNCiAgIG5vZGVzLCB0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgc2NvcGUgb2YgdGhlIHBhcnRpYWwgbG9jay4NCg0KICAgWFBhdGggaXMgb25seSB1c2VkIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHBhcnRpYWwgbG9jay4NCiAgIENvbmNlcHR1YWxseSB0aGUgc2NvcGUgb2YgdGhlIGxvY2sgaXMgZGVmaW5lZCBieSB0aGUgcmV0dXJuZWQgbm9kZQ0KICAgc2V0IGFuZCBub3QgYnkgdGhlIFhQYXRoIGV4cHJlc3Npb24uDQoNCiAgIEEgPHBhcnRpYWwtbG9jaz4gb3BlcmF0aW9uIE1VU1QgYmUgaGFuZGxlZCBhdG9taWNhbGx5IGJ5IHRoZSBORVRDT05GDQogICBzZXJ2ZXIuICBUaGUgc2VydmVyIGVpdGhlciBsb2NrcyBhbGwgcmVxdWVzdGVkIHBhcnRzIG9mIHRoZSBkYXRhDQogICBzdG9yZSBvciBub25lOyBJLmUuIGlmIGR1cmluZyB0aGUgb3BlcmF0aW9uIG9uZSBvZiB0aGUgcmVxdWVzdGVkDQogICBwYXJ0cyBjYW5ub3QgYmUgbG9ja2VkIHRoZSBzZXJ2ZXIgTVVTVCB1bmxvY2sgYWxsIHBhcnRzIHRoYXQgaGF2ZQ0KICAgYmVlbiBhbHJlYWR5IGxvY2tlZCBkdXJpbmcgdGhhdCBvcGVyYXRpb24uDQoNCiAgIElmIGEgbm9kZSBpcyBsb2NrZWQgYnkgYSBzZXNzaW9uLCBvbmx5IHRoYXQgc2FtZSBzZXNzaW9uIGlzIGFibGUgdG8NCiAgIG1vZGlmeSB0aGF0IG5vZGUgb3IgYW55IG5vZGUgaW4gdGhlIHN1YnRyZWUgdW5kZXJuZWF0aCBpdC4NCg0KICAgSWYgYSB0b3AgbGV2ZWwgbm9kZSBvZiBhIGxvY2tlZCBzdWJ0cmVlIGlzIGRlbGV0ZWQsIGFueSBvdGhlciBzZXNzaW9uDQogICBjYW4gcmVjcmVhdGUgaXQsIGFzIGl0IGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBsb2NrIGFueW1vcmUuICBJZiBhbGwNCiAgIHRvcCBsZXZlbCBub2RlcyBhcmUgZGVsZXRlZCwgdGhlIGxvY2sgd2lsbCBzdGlsbCBiZSBwcmVzZW50LCBob3dldmVyDQogICBpdCdzIHNjb3BlIHdpbGwgYmVjb21lIG5pbCBpLmUuIGl0IHdpbGwgbm90IGNvdmVyIGFueSBub2Rlcy4NCg0KICAgQSBORVRDT05GIHNlcnZlciBNVVNUIGJlIGFibGUgdG8gZ3JhbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBhcnRpYWwNCiAgIGxvY2tzIHRvIGEgc2luZ2xlIE5FVENPTkYgc2Vzc2lvbi4gIElmIHRoZSBzY29wZSBvZiB0aGUgaW5kaXZpZHVhbA0KICAgbG9ja3Mgb3ZlcmxhcCwgbm9kZXMgaW4gdGhlIGNvbW1vbiBhcmVhIE1VU1QgYmUgbG9ja2VkIHVudGlsIGFsbCBvZg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgIFtQYWdlIDRdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQogICB0aGUgbG9ja3MgYXJlIHJlbGVhc2VkLg0KDQogICBBIHBhcnRpYWwgbG9jayBvcGVyYXRpb24gTVVTVCBmYWlsIGlmOg0KDQogICBvICBBbnkgTkVUQ09ORiBzZXNzaW9uIChpbmNsdWRpbmcgdGhlIGN1cnJlbnQgc2Vzc2lvbikgb3ducyB0aGUNCiAgICAgIGdsb2JhbCBsb2NrIG9uIHRoZSBkYXRhc3RvcmUuDQoNCiAgIG8gIEFueSBwYXJ0IG9mIHRoZSBzY29wZSB0byBiZSBsb2NrZWQgaXMgYWxyZWFkeSBsb2NrZWQgYnkgYW5vdGhlcg0KICAgICAgbWFuYWdlbWVudCBzZXNzaW9uL3Byb3RvY29sLCBpbmNsdWRpbmcgb3RoZXIgTkVUQ09ORiBzZXNzaW9ucw0KICAgICAgdXNpbmcgdGhlIDxwYXJ0aWFsLWxvY2s+IG9yIGFueSBvdGhlciBub24tTkVUQ09ORiBtYW5hZ2VtZW50DQogICAgICBtZXRob2QuDQoNCiAgIG8gIFRoZSBORVRDT05GIHNlcnZlciBpbXBsZW1lbnRzIGFjY2VzcyBjb250cm9sIGFuZCB0aGUgbG9ja2luZyB1c2VyDQogICAgICBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlcywgdG8gYWxsIHBhcnRzIG9mIHRoZSBkYXRhc3RvcmUNCiAgICAgIHNlY3Rpb24gdG8gYmUgbG9ja2VkLiAgVGhlIGV4YWN0IGhhbmRsaW5nIG9mIGFjY2VzcyByaWdodHMgaXMNCiAgICAgIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQsIGJ1dCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUNCiAgICAgIGlzIGFuIGFjY2VzcyBjb250cm9sIHN5c3RlbSB0aGF0IE1BWSBkZW55IG9yIGFsbG93IHRoZSBwYXJ0aWFsDQogICAgICBsb2NrIG9wZXJhdGlvbi4NCg0KICAgTm90ZTogSWYgcGFydGlhbCBsb2NrIGlzIHJlcXVlc3RlZCBmb3IgdGhlIHJ1bm5pbmcgZGF0YXN0b3JlLCBhbmQgdGhlDQogICBORVRDT05GIHNlcnZlciBpbXBsZW1lbnRzIHRoZSA6Y29uZmlybWVkLWNvbW1pdCBjYXBhYmlsaXR5LCBhbmQgdGhlcmUNCiAgIHdhcyBhIHJlY2VudCBjb25maXJtZWQgPGNvbW1pdD4gb3BlcmF0aW9uLCB3aGVyZSB0aGUgY29uZmlybWluZw0KICAgPGNvbW1pdD4gb3BlcmF0aW9uIGhhcyBub3QgYmVlbiByZWNlaXZlZC4gIEluIHRoaXMgY2FzZSB0aGUgbG9jayBNVVNUDQogICBiZSBkZW5pZWQsIGJlY2F1c2UgaWYgdGhlIGNvbmZpcm1hdGlvbiBkb2VzIG5vdCBhcnJpdmUsIHRoZSBydW5uaW5nDQogICBkYXRhc3RvcmUgTVVTVCBiZSByb2xsZWQgYmFjayB0byBpdHMgc3RhdGUgYmVmb3JlIHRoZSBjb21taXQsIHRodXMNCiAgIHRoZSBORVRDT05GIHNlcnZlciBtaWdodCBuZWVkIHRvIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbi4NCg0KICAgQXMgd2l0aCBtb3N0IGxvY2tpbmcgc3lzdGVtcywgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHR3bw0KICAgbWFuYWdlbWVudCBzZXNzaW9ucyB0cnlpbmcgdG8gbG9jayBkaWZmZXJlbnQgcGFydHMgb2YgdGhlDQogICBjb25maWd1cmF0aW9uIGNvdWxkIGJlY29tZSBkZWFkLWxvY2tlZC4gIFRvIGF2b2lkIHRoaXMgc2l0dWF0aW9uLA0KICAgY2xpZW50cyBTSE9VTEQgbG9jayBldmVyeXRoaW5nIHRoZXkgbmVlZCBpbiBvbmUgb3BlcmF0aW9uLiAgSWYgdGhhdA0KICAgb3BlcmF0aW9uIHN0aWxsIGZhaWxzLCB0aGUgY2xpZW50IFNIT1VMRCBiYWNrIGRvd24sIHJlbGVhc2UgYW55DQogICBhbHJlYWR5IGFjcXVpcmVkIGxvY2tzLCBhbmQgcmV0cnkgdGhlIHByb2NlZHVyZSBhZnRlciBzb21lIHRpbWUNCiAgIGludGVydmFsLiAgVGhlIGxlbmd0aCBvZiB0aGUgaW50ZXJ2YWwgc2hvdWxkIHByZWZlcmFibHkgYmUgcmFuZG9tIHRvDQogICBhdm9pZCByZXBlYXRlZCBkZWFkLWxvY2tzIHdoZW4gYm90aCAob3IgYWxsKSBjbGllbnRzIGJhY2sgZG93biBhbmQNCiAgIHRoZW4gcmVwZWF0IGxvY2tpbmcuDQoNCiAgIEl0IGlzIHRoZSBpbnRlbnRpb24gdG8ga2VlcCBwYXJ0aWFsLWxvY2tpbmcgc2ltcGxlLCBzbyB3aGVuIGEgcGFydGlhbA0KICAgbG9jayBpcyBleGVjdXRlZCB5b3UgZ2V0IHdoYXQgeW91IGFza2VkIGZvcjogYSBzZXQgb2Ygbm9kZXMgdGhhdCBhcmUNCiAgIGxvY2tlZCBmb3Igd3JpdGluZy4gIFRoZXJlIGFyZSBzb21lIG90aGVyIGlzc3VlcyB0aGF0IGFyZQ0KICAgaW50ZW50aW9uYWxseSBub3QgYWRkcmVzc2VkIGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5Og0KDQogICBvICBMb2NraW5nIGRvZXMgbm90IGFmZmVjdCByZWFkIG9wZXJhdGlvbnMuDQoNCiAgIG8gIElmIGEgcGFydCBvZiBhIGRhdGFzdG9yZSBpcyBsb2NrZWQsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiBhbnkNCiAgICAgIHVubG9ja2VkIHBhcnRzIG9mIHRoZSBkYXRhc3RvcmUuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSBlLmcuIHRoZQ0KICAgICAgb3BlcmF0b3IncyBjaGFuZ2VzIGRlcGVuZCBvbiBkYXRhIHZhbHVlcyBpbiB0aGUgdW5sb2NrZWQgcGFydCBvZg0KICAgICAgdGhlIGRhdGFzdG9yZSwgdGhlIG9wZXJhdG9yIHNob3VsZCBpbmNsdWRlIHRoZXNlIHZhbHVlcyBpbiB0aGUNCg0KDQoNCkxlbmd5ZWwgJiBCam9ya2x1bmQgICAgICBFeHBpcmVzIE1hcmNoIDEyLCAyMDA5ICAgICAgICAgICAgICAgICBbUGFnZSA1XQ0KDA0KSW50ZXJuZXQtRHJhZnQgICAgICAgIFBhcnRpYWwgTG9jayBSUEMgZm9yIE5FVENPTkYgICAgICAgIFNlcHRlbWJlciAyMDA4DQoNCg0KICAgICAgc2NvcGUgb2YgdGhlIGxvY2suDQoNCiAgIG8gIEFuIG9wZXJhdG9yIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29uZmlndXJhdGlvbiBib3RoIGluc2lkZSBhbmQNCiAgICAgIG91dHNpZGUgdGhlIHNjb3BlIG9mIGEgbG9jay4gIEl0IGlzIHRoZSBvcGVyYXRvcidzIHJlc3BvbnNpYmlsaXR5DQogICAgICB0byBsb2NrIGFsbCBwYXJ0cyBvZiB0aGUgZGF0YXN0b3JlIHRoYXQgYXJlIGNydWNpYWwgZm9yIGEgc3BlY2lmaWMNCiAgICAgIG1hbmFnZW1lbnQgYWN0aW9uLg0KDQoNCiAgIE5vdGU6IFRoZSA8cGFydGlhbC1sb2NrPiBvcGVyYXRpb24gZG9lcyBub3QgbW9kaWZ5IHRoZSBnbG9iYWwgPGxvY2s+DQogICBvcGVyYXRpb24gZGVmaW5lZCBpbiB0aGUgYmFzZSBORVRDT05GIFByb3RvY29sIFtORVRDT05GXS4gIElmIHBhcnQgb2YNCiAgIGEgZGF0YXN0b3JlIGlzIGFscmVhZHkgbG9ja2VkIGJ5IDxwYXJ0aWFsLWxvY2s+LCB0aGVuIGEgZ2xvYmFsIGxvY2sNCiAgIGZvciB0aGF0IGRhdGFzdG9yZSBmYWlscyBldmVuIGlmIHRoZSBnbG9iYWwgbG9jayBpcyBhdHRlbXB0ZWQgYnkgdGhlDQogICBzYW1lIE5FVENPTkYgc2Vzc2lvbiB3aGljaCBvd25zIHRoZSBwYXJ0aWFsLWxvY2suDQoNCjIuNC4xLjEuICBQYXJhbWV0ZXJzLCBSZXN1bHQsIEV4YW1wbGVzDQoNCiAgIFBhcmFtZXRlcnM6DQoNCiAgIHRhcmdldDogIE5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YXN0b3JlIG9mIHdoaWNoIGEgcGFydCBzaGFsbCBiZQ0KICAgICAgIGxvY2tlZC4gIE9uZSA8cGFydGlhbC1sb2NrPiBvcGVyYXRpb24gY2FuIGFmZmVjdCBvbmx5IG9uZSBvZiB0aGUNCiAgICAgICBkYXRhc3RvcmVzLCBzbyBvbmx5IG9uZSA8dGFyZ2V0PiBwYXJhbWV0ZXIgaXMgYWxsb3dlZC4gIFVSTHMgYXJlDQogICAgICAgbm90IGFjY2VwdGVkLg0KDQogICBzZWxlY3Q6ICBPbmUgb3IgbW9yZSAnc2VsZWN0JyBlbGVtZW50cyBlYWNoIGNvbnRhaW5pbmcgYW4gWFBhdGgNCiAgICAgICBleHByZXNzaW9uLiAgVGhlIFhQYXRoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGluIGEgY29udGV4dCB3aGVyZQ0KICAgICAgIHRoZSBjb250ZXh0IG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIHNlcnZlcidzIGNvbmNlcHR1YWwgZGF0YQ0KICAgICAgIG1vZGVsLCBhbmQgdGhlIHNldCBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFyZSB0aG9zZSBpbiBzY29wZQ0KICAgICAgIG9uIHRoZSBzZWxlY3QgZWxlbWVudC4NCg0KICAgICAgIFRoZSBzZWxlY3QgZXhwcmVzc2lvbnMgTVVTVCBlYWNoIHJldHVybiBhIG5vZGUgc2V0LCBhbmQgYXQgbGVhc3QNCiAgICAgICBvbmUgb2YgdGhlIG5vZGUgc2V0cyBtdXN0IGJlIG5vbi1lbXB0eS4NCg0KICAgICAgIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIDp4cGF0aCBjYXBhYmlsaXR5IHRoZW4gYW55IHZhbGlkIFhQYXRoDQogICAgICAgMS4wIGV4cHJlc3Npb24gY2FuIGJlIHVzZWQsIGlmIG5vdCwgdGhlIFhQYXRoIGV4cHJlc3Npb24gTVVTVCBiZQ0KICAgICAgIGxpbWl0ZWQgdG8gYW4gSW5zdGFuY2UgSWRlbnRpZmllciBleHByZXNzaW9uLiAgQW4gSW5zdGFuY2UNCiAgICAgICBJZGVudGlmaWVyIGlzIGFuIGFic29sdXRlIHBhdGggZXhwcmVzc2lvbiBpbiBhYmJyZXZpYXRlZCBzeW50YXgsDQogICAgICAgd2hlcmUgcHJlZGljYXRlcyBhcmUgdXNlZCBvbmx5IHRvIHNwZWNpZnkgdmFsdWVzIGZvciBub2Rlcw0KICAgICAgIGRlZmluZWQgYXMga2V5cyB0byBkaXN0aW5ndWlzaCBtdWx0aXBsZSBpbnN0YW5jZXMuDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCkxlbmd5ZWwgJiBCam9ya2x1bmQgICAgICBFeHBpcmVzIE1hcmNoIDEyLCAyMDA5ICAgICAgICAgICAgICAgICBbUGFnZSA2XQ0KDA0KSW50ZXJuZXQtRHJhZnQgICAgICAgIFBhcnRpYWwgTG9jayBSUEMgZm9yIE5FVENPTkYgICAgICAgIFNlcHRlbWJlciAyMDA4DQoNCg0KICAgRXhhbXBsZTogTG9jayB2aXJ0dWFsIHJvdXRlciAxIGFuZCBpbnRlcmZhY2UgZXRoMQ0KDQoNCiAgICAgICA8bmM6cnBjDQogICAgICAgICB4bWxuczpuYz0idXJuOmlldGY6cGFyYW1zOnhtbDpuczpuZXRjb25mOmJhc2U6MS4wIg0KICAgICAgICAgeG1sbnM9InVybjppZXRmOnBhcmFtczp4bWw6bnM6bmV0Y29uZjpwYXJ0aWFsLWxvY2s6MS4wIg0KICAgICAgICAgbmM6bWVzc2FnZS1pZD0iMTM1Ij4NCiAgICAgICAgICAgPHBhcnRpYWwtbG9jaz4NCiAgICAgICAgICAgICAgIDxuYzp0YXJnZXQ+DQogICAgICAgICAgICAgICAgICAgPG5jOnJ1bm5pbmcvPg0KICAgICAgICAgICAgICAgPC9uYzp0YXJnZXQ+DQogICAgICAgICAgICAgICA8c2VsZWN0IHhtbG5zPSJodHRwOi8vZXhhbXBsZS5jb20vbnMvcm91dGUiPg0KICAgICAgICAgICAgICAgICAgIC9yb3V0aW5nL3ZpcnR1YWxSb3V0ZXJbcm91dGVyTmFtZT0ncm91dGVyMSddDQogICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgIDxzZWxlY3QgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLmNvbS9ucy9pbnRlcmZhY2UiPg0KICAgICAgICAgICAgICAgICAgIC9pbnRlcmZhY2VzL2ludGVyZmFjZVtpZD0nZXRoMSddDQogICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICA8L3BhcnRpYWwtbG9jaz4NCiAgICAgICA8L25jOnJwYz4NCg0KICAgICAgIDxuYzpycGMtcmVwbHkNCiAgICAgICAgIHhtbG5zOm5jPSJ1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOm5ldGNvbmY6YmFzZToxLjAiDQogICAgICAgICB4bWxucz0idXJuOmlldGY6cGFyYW1zOnhtbDpuczpuZXRjb25mOnBhcnRpYWwtbG9jazoxLjAiDQogICAgICAgICBuYzptZXNzYWdlLWlkPSIxMzUiPg0KICAgICAgICAgICA8bmM6ZGF0YT4NCiAgICAgICAgICAgICAgIDxsb2NrLWlkPjEyNzwvbG9jay1pZD4NCiAgICAgICAgICAgICAgIDxsb2NrZWQtbm9kZSB4bWxucz0iaHR0cDovL2V4YW1wbGUuY29tL25zL3JvdXRlIj4NCiAgICAgICAgICAgICAgICAgICAvcm91dGluZy92aXJ0dWFsUm91dGVyW3JvdXRlck5hbWU9J3JvdXRlcjEnXQ0KICAgICAgICAgICAgICAgPC9sb2NrZWQtbm9kZT4NCiAgICAgICAgICAgICAgIDxsb2NrZWQtbm9kZSB4bWxucz0iaHR0cDovL2V4YW1wbGUuY29tL25zL2ludGVyZmFjZSI+DQogICAgICAgICAgICAgICAgICAgL2ludGVyZmFjZXMvaW50ZXJmYWNlW2lkPSdldGgxJ10NCiAgICAgICAgICAgICAgIDwvbG9ja2VkLW5vZGU+DQogICAgICAgICAgIDwvbmM6ZGF0YT4NCiAgICAgICA8L25jOnJwYy1yZXBseT4NCg0KDQogICBQb3NpdGl2ZSBSZXNwb25zZToNCg0KICAgSWYgdGhlIGRldmljZSB3YXMgYWJsZSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LCBhbiA8cnBjLXJlcGx5PiBpcyBzZW50DQogICB3aXRoIGEgPGxvY2staWQ+IGVsZW1lbnQgKGxvY2sgaWRlbnRpZmllcikgaW4gdGhlIDxkYXRhPiBlbGVtZW50LiAgQQ0KICAgbGlzdCBvZiBsb2NrZWQtbm9kZXMgaXMgYWxzbyByZXR1cm5lZC4NCg0KICAgTmVnYXRpdmUgUmVzcG9uc2U6DQoNCiAgIElmIGEgbG9jayBpcyBhbHJlYWR5IGhlbGQgYnkgYW5vdGhlciBzZXNzaW9uIG9uIGFueSBub2RlIHdpdGhpbiB0aGUNCiAgIHN1YnRyZWVzIHRvIGJlIGxvY2tlZCwgdGhlIDxlcnJvci10YWc+IGVsZW1lbnQgaXMgJ2xvY2stZGVuaWVkJyBhbmQNCiAgIHRoZSA8ZXJyb3ItaW5mbz4gZWxlbWVudCBpbmNsdWRlcyB0aGUgPHNlc3Npb24taWQ+IG9mIHRoZSBsb2NrIG93bmVyLg0KICAgSWYgdGhlIGxvY2sgaXMgaGVsZCBieSBhIG5vbi1ORVRDT05GIHNlc3Npb24sIGEgPHNlc3Npb24taWQ+IG9mIDANCg0KDQoNCkxlbmd5ZWwgJiBCam9ya2x1bmQgICAgICBFeHBpcmVzIE1hcmNoIDEyLCAyMDA5ICAgICAgICAgICAgICAgICBbUGFnZSA3XQ0KDA0KSW50ZXJuZXQtRHJhZnQgICAgICAgIFBhcnRpYWwgTG9jayBSUEMgZm9yIE5FVENPTkYgICAgICAgIFNlcHRlbWJlciAyMDA4DQoNCg0KICAgKHplcm8pIGlzIGluY2x1ZGVkLiAgSWYgbmVlZGVkIHRoZSByZXR1cm5lZCBzZXNzaW9uLWlkIG1heSBiZSB1c2VkIHRvDQogICA8a2lsbD4gdGhlIE5FVENPTkYgc2Vzc2lvbiBob2xkaW5nIHRoZSBsb2NrLiAgVGhlIHNhbWUgZXJyb3IgcmVzcG9uc2UNCiAgIGlzIHJldHVybmVkIGlmIHRoZSByZXF1ZXN0aW5nIHNlc3Npb24gYWxyZWFkeSBob2xkcyB0aGUgKGdsb2JhbCkgbG9jaw0KICAgZm9yIHRoZSBzYW1lIGRhdGFzdG9yZS4NCg0KICAgSWYgdGhlIHNlbGVjdCBleHByZXNzaW9ucyByZXR1cm4gYW4gZW1wdHkgbm9kZSBzZXQsIHRoZSA8ZXJyb3ItdGFnPg0KICAgaXMgJ29wZXJhdGlvbi1mYWlsZWQnLCBhbmQgdGhlIDxlcnJvci1hcHAtdGFnPiBpcyAnbm8tbWF0Y2hlcycuDQoNCiAgIElmIGFueSBzZWxlY3QgZXhwcmVzc2lvbiByZXR1cm5zIGFueXRoaW5nIGJ1dCBhIG5vZGUgc2V0LCB0aGUgPGVycm9yLQ0KICAgdGFnPiBpcyAnaW52YWxpZC12YWx1ZScsIHRoZSA8ZXJyb3ItYXBwLXRhZz4gaXMgJ1hQYXRoIGRvZXMgbm90DQogICByZXR1cm4gYSBub2RlIHNldCcuDQoNCiAgIElmIHRoZSA6eHBhdGggY2FwYWJpbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcw0KICAgbm90IGFuIEluc3RhbmNlIElkZW50aWZpZXIsIHRoZSA8ZXJyb3ItdGFnPiBpcyAnaW52YWxpZC12YWx1ZScsIHRoZQ0KICAgPGVycm9yLWFwcC10YWc+IGlzICc6eHBhdGggY2FwYWJpbGl0eSBub3Qgc3VwcG9ydGVkJy4NCg0KICAgSWYgYWNjZXNzIGNvbnRyb2wgZGVuaWVzIHRoZSBwYXJ0aWFsIGxvY2ssIHRoZSA8ZXJyb3ItdGFnPiBpcw0KICAgJ2FjY2Vzcy1kZW5pZWQnLg0KDQoNCjIuNC4xLjIuICBSZXNlcnZpbmcgbW9kZWwgc2VjdGlvbnMgZm9yIGZ1dHVyZSB3b3JrDQoNCiAgIFBhcnRpYWwgbG9jayBjYW4gbm90IGJlIHVzZWQgdG8gbG9jayBub24tZXhpc3Rpbmcgbm9kZXMsIGVmZmVjdGl2ZWx5DQogICByZXNlcnZpbmcgdGhlbSBmb3IgZnV0dXJlIHVzZS4gIFRvIG1ha2Ugc3VyZSB0aGF0IGEgbm9kZSBjYW5ub3QgYmUNCiAgIGNyZWF0ZWQgYnkgc29tZSBvdGhlciBzZXNzaW9uLCB0aGUgcGFyZW50IG5vZGUgc2hvdWxkIGJlIGxvY2tlZCwgdGhlDQogICB0b3AgbGV2ZWwgbm9kZSBvZiB0aGUgbmV3IHNlY3Rpb24gY3JlYXRlZCwgYW5kIHRoZW4gbG9ja2VkIHdpdGgNCiAgIGFub3RoZXIgPHBhcnRpYWwtbG9jaz4gb3BlcmF0aW9uLiAgQWZ0ZXIgdGhpcyB0aGUgbG9jayBvbiB0aGUgcGFyZW50DQogICBub2RlIHNob3VsZCBiZSByZW1vdmVkLg0KDQoyLjQuMi4gIDxwYXJ0aWFsLXVubG9jaz4NCg0KICAgVGhlIG9wZXJhdGlvbiB1bmxvY2tzIGEgcGFydCBvZiBhIGRhdGFzdG9yZSB0aGF0IHdhcyBwcmV2aW91c2x5DQogICBsb2NrZWQgdXNpbmcgPHBhcnRpYWwtbG9jaz4gZHVyaW5nIHRoZSBzYW1lIHNlc3Npb24uDQoNCiAgIFBhcmFtZXRlcnM6DQoNCiAgIGxvY2staWQ6ICBMb2NrIGlkZW50aWZpZXIgdG8gdW5sb2NrOyB0YWtlbiBmcm9tIGEgcmVwbHkgdG8gYSBwcmV2aW91cw0KICAgICAgIDxwYXJ0aWFsLWxvY2s+IG9wZXJhdGlvbi4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgIFtQYWdlIDhdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQogICBFeGFtcGxlOiBVbmxvY2sgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jaw0KDQoNCiAgIDxuYzpycGMgeG1sbnM6bmM9InVybjppZXRmOnBhcmFtczp4bWw6bnM6bmV0Y29uZjpiYXNlOjEuMCINCiAgICAgICB4bWxucz0idXJuOmlldGY6cGFyYW1zOnhtbDpuczpuZXRjb25mOnBhcnRpYWwtbG9jazoxLjAiDQogICAgICAgbmM6bWVzc2FnZS1pZD0iMTM2Ij4NCiAgICAgICA8cGFydGlhbC11bmxvY2s+DQogICAgICAgICAgIDxsb2NrLWlkPjEyNzwvbG9jay1pZD4NCiAgICAgICA8L3BhcnRpYWwtdW5sb2NrPg0KICAgPC9uYzpycGM+DQoNCiAgIFBvc2l0aXZlIFJlc3BvbnNlOg0KDQogICBJZiB0aGUgZGV2aWNlIHdhcyBhYmxlIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QsIGFuIDxycGMtcmVwbHk+IGlzIHNlbnQNCiAgIHRoYXQgY29udGFpbnMgYW4gPG9rPiBlbGVtZW50LiAgQSBwb3NpdGl2ZSByZXNwb25zZSBNVVNUIGJlIHNlbnQgZXZlbg0KICAgaWYgYWxsIG9mIHRoZSBsb2NrZWQgcGFydCBvZiB0aGUgZGF0YXN0b3JlIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZC4NCg0KICAgTmVnYXRpdmUgUmVzcG9uc2U6DQoNCiAgIElmIHRoZSA8bG9jay1pZD4gcGFyYW1ldGVyIGRvZXMgbm90IGlkZW50aWZ5IGEgbG9jayB3aGljaCBpcyBvd25lZCBieQ0KICAgdGhlIHNlc3Npb24sIGFuICdpbnZhbGlkLXZhbHVlJyBlcnJvciBpcyByZXR1cm5lZC4NCg0KMi41LiAgTW9kaWZpY2F0aW9ucyB0byBFeGlzdGluZyBPcGVyYXRpb25zDQoNCiAgIEEgZ3JhbnRlZCBwYXJ0aWFsLWxvY2sgd2lsbCBjYXVzZSBhbm90aGVyIG9wZXJhdGlvbiB0byBmYWlsLCBpZiBpdA0KICAgdHJpZXMgdG8gbW9kaWZ5IHRoZSBsb2NrZWQgYXJlYSBhbmQgaXMgZXhlY3V0ZWQgaW4gYSBORVRDT05GIHNlc3Npb24NCiAgIG90aGVyIHRoZW4gdGhlIG9uZSB0aGF0IG93bnMgdGhlIGxvY2suICBBbGwgb3BlcmF0aW9ucyB0aGF0IG1vZGlmeQ0KICAgdGhlIGRhdGFzdG9yZSBhcmUgYWZmZWN0ZWQgaW5jbHVkaW5nOiA8ZWRpdC1jb25maWc+LCA8Y29weS1jb25maWc+LA0KICAgPGRlbGV0ZS1jb25maWc+LCA8Y29tbWl0PiBhbmQgPGRpc2NhcmQtY2hhbmdlcz4uICBBIGdyYW50ZWQgcGFydGlhbC0NCiAgIGxvY2sgd2lsbCBhbHNvIGNhdXNlIHRoZSAoZ2xvYmFsKSA8bG9jaz4gb3BlcmF0aW9uIHRvIGZhaWwuICBBbGwgb2YNCiAgIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGFmZmVjdGVkIG9ubHkgaWYgdGhleSBhcmUgZm9yIHRoZSBzYW1lDQogICBkYXRhc3RvcmUuDQoNCjIuNi4gIEludGVyYWN0aW9ucyB3aXRoIE90aGVyIENhcGFiaWxpdGllcw0KDQoyLjYuMS4gIFdyaXRhYmxlLVJ1bm5pbmcgQ2FwYWJpbGl0eQ0KDQogICBQYXJ0aWFsIGxvY2tpbmcgb2YgdGhlIHJ1bm5pbmcgZGF0YXN0b3JlIGNhbiBvbmx5IGJlIGRvbmUgaWYgdGhlDQogICA6d3JpdGFibGUtcnVubmluZyBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLg0KDQoyLjYuMi4gIENhbmRpZGF0ZSBDb25maWd1cmF0aW9uIENhcGFiaWxpdHkNCg0KICAgUGFydGlhbCBsb2NraW5nIG9mIHRoZSBjYW5kaWRhdGUgZGF0YXN0b3JlIGNhbiBvbmx5IGJlIGRvbmUgaWYgdGhlDQogICA6Y2FuZGlkYXRlIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuICBUaGUgcGFydGlhbA0KICAgbG9ja2luZyBvZiB0aGUgY2FuZGlkYXRlIGRhdGFzdG9yZSBkb2VzIG5vdCBkZXBlbmQgb24gd2hldGhlciB0aGUNCiAgIGRhdGFzdG9yZSB3YXMgbW9kaWZpZWQgb3Igbm90Lg0KDQogICBJZiBwYXJ0aWFsIGxvY2sgaXMgcmVxdWVzdGVkIGZvciB0aGUgcnVubmluZyBkYXRhc3RvcmUsIGFuZCB0aGUNCg0KDQoNCkxlbmd5ZWwgJiBCam9ya2x1bmQgICAgICBFeHBpcmVzIE1hcmNoIDEyLCAyMDA5ICAgICAgICAgICAgICAgICBbUGFnZSA5XQ0KDA0KSW50ZXJuZXQtRHJhZnQgICAgICAgIFBhcnRpYWwgTG9jayBSUEMgZm9yIE5FVENPTkYgICAgICAgIFNlcHRlbWJlciAyMDA4DQoNCg0KICAgTkVUQ09ORiBzZXJ2ZXIgaW1wbGVtZW50cyB0aGUgOmNvbmZpcm1lZC1jb21taXQgY2FwYWJpbGl0eSwgYW5kIHRoZXJlDQogICB3YXMgYSByZWNlbnQgY29uZmlybWVkIDxjb21taXQ+IG9wZXJhdGlvbiwgd2hlcmUgdGhlIGNvbmZpcm1pbmcNCiAgIDxjb21taXQ+IG9wZXJhdGlvbiBoYXMgbm90IGJlZW4gcmVjZWl2ZWQsIGluIHRoaXMgY2FzZSB0aGUgbG9jayBNVVNUDQogICBiZSBkZW5pZWQsIGJlY2F1c2UgaWYgdGhlIGNvbmZpcm1hdGlvbiBkb2VzIG5vdCBhcnJpdmUsIHRoZSBydW5uaW5nDQogICBkYXRhc3RvcmUgTVVTVCBiZSByb2xsZWQgYmFjayB0byBpdHMgc3RhdGUgYmVmb3JlIHRoZSBjb21taXQsIHRodXMNCiAgIHRoZSBORVRDT05GIHNlcnZlciBtaWdodCBuZWVkIHRvIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbi4NCg0KMi42LjMuICBEaXN0aW5jdCBTdGFydHVwIENhcGFiaWxpdHkNCg0KICAgUGFydGlhbCBsb2NraW5nIG9mIHRoZSBzdGFydHVwIGRhdGFzdG9yZSBjYW4gb25seSBiZSBkb25lIGlmIHRoZQ0KICAgOnN0YXJ0dXAgY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4NCg0KDQozLiAgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMNCg0KICAgVGhlIHNhbWUgY29uc2lkZXJhdGlvbnMgYXMgZm9yIHRoZSBiYXNlIE5FVENPTkYgUHJvdG9jb2wgW05FVENPTkZdDQogICBhcmUgdmFsaWQuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIDxwYXJ0aWFsLWxvY2s+IGFuZCA8cGFydGlhbC0NCiAgIHVubG9jaz4gUlBDcyBhcmUgb25seSBhbGxvd2VkIGZvciBhbiBhdXRoZW50aWNhdGVkIHVzZXIgYWZ0ZXIgcGFzc2luZw0KICAgc29tZSBhY2Nlc3MgY29udHJvbCBtZWNoYW5pc20uDQoNCiAgIEEgbG9jayAoYSBwYXJ0aWFsLWxvY2sgb3IgYSBnbG9iYWwgbG9jaykgbWlnaHQgcHJldmVudCBvdGhlciB1c2Vycw0KICAgZnJvbSBjb25maWd1cmluZyB0aGUgc3lzdGVtLiAgVGhlIGZvbGxvd2luZyBtZWNoYW5pc21zIGFyZSBpbiBwbGFjZQ0KICAgdG8gcHJldmVudCB0aGUgbWlzdXNlIG9mIHRoaXMgcG9zc2liaWxpdHk6DQoNCiAgICAgIE9ubHkgYW4gYXV0aGVudGljYXRlZCB1c2VyIGFmdGVyIHBhc3NpbmcgYWNjZXNzIGNvbnRyb2wgY2FuDQogICAgICByZXF1ZXN0IGEgcGFydGlhbC1sb2NrLg0KDQogICAgICBUaGUgcGFydGlhbC1sb2NrIGlzIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgd2hlbiBhIHNlc3Npb24gaXMNCiAgICAgIHRlcm1pbmF0ZWQgaXJyZXNwZWN0aXZlIG9mIHRoZSBtYW5uZXIgdGhlIHNlc3Npb24gZW5kcy4NCg0KICAgICAgVGhlIDxraWxsLXNlc3Npb24+IG9wZXJhdGlvbiBhbGxvd3MgdGVybWluYXRpbmcgb3RoZXIgdXNlcnMNCiAgICAgIHNlc3Npb25zLg0KDQogICAgICBUaGUgTkVUQ09ORiBzZXJ2ZXIgbWF5IGxvZyBwYXJ0aWFsLWxvY2sgcmVxdWVzdHMgaW4gYW4gYXVkaXQNCiAgICAgIHRyYWlsLg0KDQoNCg0KICAgQSBsb2NrIHRoYXQgaXMgaGFuZ2luZyBmb3IgYW55IHJlYXNvbiwgZS5nLiBhIGJyb2tlbiBUQ1AgY29ubmVjdGlvbg0KICAgdGhhdCB0aGUgc2VydmVyIGhhcyBub3QgeWV0IHJlY29nbmlzZWQsIGNhbiBiZSByZWxlYXNlZCBmcm9tIGFub3RoZXINCiAgIE5FVENPTkYgc2Vzc2lvbiBieSBleHBsaWNpdGx5IGtpbGxpbmcgdGhlIHNlc3Npb24gb3duaW5nIHRoYXQgbG9jaw0KICAgdXNpbmcgdGhlIDxraWxsPiBvcGVyYXRpb24uDQoNCiAgIFBhcnRpYWwgbG9ja2luZyBpcyBOT1QgYW4gYXV0aG9yaXphdGlvbiBtZWNoYW5pc20sIGl0IHNob3VsZCBub3QgYmUNCiAgIHVzZWQgdG8gcHJvdmlkZSBzZWN1cml0eSBvciBhY2Nlc3MgY29udHJvbC4gIFBhcnRpYWwgbG9ja2luZyBzaG91bGQNCiAgIG9ubHkgYmUgdXNlZCBhcyBhIG1lY2hhbmlzbSB0byBwcm92aWRlIGNvbnNpc3RlbmN5IGluIGNhc2Ugb2YNCiAgIG11bHRpcGxlIG1hbmFnZXJzIHRyeWluZyB0byBjb25maWd1cmUgdGhlIG5vZGUuICBJdCBpcyB2aXRhbCB0aGF0IHRoZQ0KICAgb3BlcmF0b3IgY2FuIGVhc2lseSB1bmRlcnN0YW5kIHRoZSBleGFjdCBzY29wZSBvZiBhIGxvY2ssIGZvciB0aGlzDQoNCg0KDQpMZW5neWVsICYgQmpvcmtsdW5kICAgICAgRXhwaXJlcyBNYXJjaCAxMiwgMjAwOSAgICAgICAgICAgICAgICBbUGFnZSAxMF0NCgwNCkludGVybmV0LURyYWZ0ICAgICAgICBQYXJ0aWFsIExvY2sgUlBDIGZvciBORVRDT05GICAgICAgICBTZXB0ZW1iZXIgMjAwOA0KDQoNCiAgIHJlYXNvbiB0aGUgc2NvcGUgaXMgZGV0ZXJtaW5lZCB3aGVuIGdyYW50aW5nIGEgbG9jayBhbmQgaXMgbm90DQogICBtb2RpZmllZCBkeW5hbWljYWxseSBsYXRlci4NCg0KDQo0LiAgSUFOQSBDb25zaWRlcmF0aW9ucw0KDQogICBUaGlzIGRvY3VtZW50IHJlZ2lzdGVycyB0d28gVVJJcyBmb3IgdGhlIE5FVENPTkYgWE1MIG5hbWVzcGFjZSBpbiB0aGUNCiAgIElFVEYgWE1MIHJlZ2lzdHJ5IFtSRkMzNjg4XS4gIE5vdGUgdGhhdCB0aGUgY2FwYWJpbGl0eSBVUk4gaXMNCiAgIGNvbXBsaWFudCB0byBbTkVUQ09ORl0gc2VjdGlvbiAxMC4zLg0KDQogICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCiAgIHwgSW5kZXggICAgICAgICB8IENhcGFiaWxpdHkgSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQogICB8IDpwYXJ0aWFsLWxvY2sgfCB1cm46aWV0ZjpwYXJhbXM6bmV0Y29uZjpjYXBhYmlsaXR5OnBhcnRpYWwtbG9jazoxIHwNCiAgIHwgICAgICAgICAgICAgICB8IC4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoNCiAgIFVSSTogdXJuOmlldGY6cGFyYW1zOnhtbDpuczpuZXRjb25mOnBhcnRpYWwtbG9jazoxLjANCg0KICAgUmVnaXN0cmFudCBDb250YWN0OiBUaGUgSUVTRy4NCg0KICAgWE1MOiBOL0EsIHRoZSByZXF1ZXN0ZWQgVVJJIGlzIGFuIFhNTCBuYW1lc3BhY2UuDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgW1BhZ2UgMTFdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQo1LiAgQXBwZW5kaXggQSAgLSAgWE1MIFNjaGVtYSBmb3IgUGFydGlhbCBMb2NraW5nICAobm9ybWF0aXZlKQ0KDQogICBUaGUgZm9sbG93aW5nIFhNTCBTY2hlbWEgZGVmaW5lcyB0aGUgPHBhcnRpYWwtbG9jaz4gYW5kIDxwYXJ0aWFsLQ0KICAgdW5sb2NrPiBvcGVyYXRpb25zOg0KDQogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCiA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCiAgIHhtbG5zPSJ1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOm5ldGNvbmY6cGFydGlhbC1sb2NrOjEuMCINCiAgIHhtbG5zOm5jPSJ1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOm5ldGNvbmY6YmFzZToxLjAiDQogICB0YXJnZXROYW1lc3BhY2U9InVybjppZXRmOnBhcmFtczp4bWw6bnM6bmV0Y29uZjpwYXJ0aWFsLWxvY2s6MS4wIg0KICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+DQoNCiAgIDx4czphbm5vdGF0aW9uPg0KICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4NCiAgICAgICAgIFNjaGVtYSBkZWZpbmluZyB0aGUgcGFydGlhbC1sb2NrIGFuZCB1bmxvY2sgb3BlcmF0aW9ucy4NCiAgICAgICAgIG9yZ2FuaXphdGlvbiAiSUVURiBORVRDT05GIFdvcmtpbmcgR3JvdXAiDQogICAgICAgICBjb250YWN0DQogICAgICAgICAgICAgIkJhbGF6cyBMZW5neWVsDQogICAgICAgICAgICAgIEVyaWNzc29uIEh1bmdhcnksIEluYy4NCiAgICAgICAgICAgICAgYmFsYXpzLmxlbmd5ZWxAZXJpY3Nzb24uY29tIg0KICAgICAgPC94czpkb2N1bWVudGF0aW9uPg0KICAgPC94czphbm5vdGF0aW9uPg0KDQogICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0idXJuOmlldGY6cGFyYW1zOnhtbDpuczpuZXRjb25mOmJhc2U6MS4wIg0KICAgICBzY2hlbWFMb2NhdGlvbj0ibmV0Y29uZi54c2QiLz4NCg0KICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWxMb2NrVHlwZSI+DQogICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAgIDx4czpkb2N1bWVudGF0aW9uPg0KICAgICAgICAgQSBORVRDT05GIG9wZXJhdGlvbiB0aGF0IGxvY2tzIHBhcnQgb2YgYSBkYXRhc3RvcmUuDQogICAgICAgPC94czpkb2N1bWVudGF0aW9uPg0KICAgICA8L3hzOmFubm90YXRpb24+DQogICAgIDx4czpjb21wbGV4Q29udGVudD4NCiAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im5jOnJwY09wZXJhdGlvblR5cGUiPg0KICAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im5jOnJwY09wZXJhdGlvblRhcmdldFR5cGUiLz4NCiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4czpzdHJpbmciDQogICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+DQogICAgICAgICAgICAgICAgIFhQYXRoIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNjb3BlIG9mIHRoZSBsb2NrLg0KICAgICAgICAgICAgICAgICBBbiBJbnN0YW5jZSBJZGVudGlmaWVyIGV4cHJlc3Npb24gbXVzdCBiZSB1c2VkIHVubGVzcw0KICAgICAgICAgICAgICAgICB0aGUgOnhwYXRoIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkIGluIHdoaWNoIGNhc2UgYW55DQogICAgICAgICAgICAgICAgIFhQYXRoIDEuMCBleHByZXNzaW9uIGlzIGFsbG93ZWQuDQogICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+DQogICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQogICAgICAgICA8L3hzOnNlcXVlbmNlPg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgW1BhZ2UgMTJdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQogICAgICAgPC94czpleHRlbnNpb24+DQogICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogICA8L3hzOmNvbXBsZXhUeXBlPg0KDQogICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icGFydGlhbFVuTG9ja1R5cGUiPg0KICAgICA8eHM6YW5ub3RhdGlvbj4NCiAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4NCiAgICAgICAgIEEgTkVUQ09ORiBvcGVyYXRpb24gdGhhdCByZWxlYXNlcyBhIHByZXZpb3VzbHkgYWNxdWlyZWQNCiAgICAgICAgIHBhcnRpYWwtbG9jay4NCiAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+DQogICAgIDwveHM6YW5ub3RhdGlvbj4NCiAgICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ibmM6cnBjT3BlcmF0aW9uVHlwZSI+DQogICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxvY2staWQiIHR5cGU9InhzOnVuc2lnbmVkSW50Ij4NCiAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4NCiAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPg0KICAgICAgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBsb2NrIHRvIGJlIHJlbGVhc2VkLiBNdXN0IGJlIHRoZSB2YWx1ZQ0KICAgICAgICAgICAgICAgICByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2UgdG8gdGhlIHBhcnRpYWwtbG9jayBvcGVyYXRpb24uDQogICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+DQogICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQogICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICAgPC94czpjb21wbGV4VHlwZT4NCg0KICAgPCEtLSA8cGFydGlhbC1sb2NrPiBvcGVyYXRpb24gLS0+DQogICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJ0aWFsLWxvY2siIHR5cGU9InBhcnRpYWxMb2NrVHlwZSINCiAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJuYzpycGNPcGVyYXRpb24iLz4NCg0KICAgPCEtLSA8cGFydGlhbC11bmxvY2s+IG9wZXJhdGlvbiAtLT4NCiAgIDx4czplbGVtZW50IG5hbWU9InBhcnRpYWwtdW5sb2NrIiB0eXBlPSJwYXJ0aWFsVW5Mb2NrVHlwZSINCiAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJuYzpycGNPcGVyYXRpb24iLz4NCg0KICAgPCEtLSByZXBseSB0byA8cGFydGlhbC1sb2NrPiAtLT4NCiAgIDx4czplbGVtZW50IG5hbWU9ImxvY2staWQiIHR5cGU9InhzOnVuc2lnbmVkSW50Ii8+DQoNCiA8L3hzOnNjaGVtYT4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCkxlbmd5ZWwgJiBCam9ya2x1bmQgICAgICBFeHBpcmVzIE1hcmNoIDEyLCAyMDA5ICAgICAgICAgICAgICAgIFtQYWdlIDEzXQ0KDA0KSW50ZXJuZXQtRHJhZnQgICAgICAgIFBhcnRpYWwgTG9jayBSUEMgZm9yIE5FVENPTkYgICAgICAgIFNlcHRlbWJlciAyMDA4DQoNCg0KNi4gIEFwcGVuZGl4IEIgIC0gWUFORyBNb2R1bGUgZm9yIFBhcnRpYWwgTG9ja2luZyAobm9uLW5vcm1hdGl2ZSkNCg0KICAgVGhlIGZvbGxvd2luZyBZQU5HIG1vZHVsZSBkZWZpbmVzIHRoZSA8cGFydGlhbC1sb2NrPiBhbmQgPHBhcnRpYWwtDQogICB1bmxvY2s+IG9wZXJhdGlvbnMuICBUaGUgWUFORyBsYW5ndWFnZSBpcyBkZWZpbmVkIGluDQogICBbSS1ELmlldGYtbmV0bW9kLXlhbmddLg0KDQogIG1vZHVsZSBuZXRjb25mLXBhcnRpYWwtbG9jayB7DQoNCiAgICBuYW1lc3BhY2UgdXJuOmlldGY6cGFyYW1zOnhtbDpuczpuZXRjb25mOnBhcnRpYWwtbG9jazoxLjA7DQogICAgcHJlZml4IHBsOw0KDQogICAgb3JnYW5pemF0aW9uICJJRVRGIE5FVENPTkYgV29ya2luZyBHcm91cCI7DQoNCiAgICBjb250YWN0DQogICAgICAiQmFsYXpzIExlbmd5ZWwNCiAgICAgICBFcmljc3NvbiBIdW5nYXJ5LCBJbmMuDQogICAgICAgYmFsYXpzLmxlbmd5ZWxAZXJpY3Nzb24uY29tIjsNCg0KICAgIGRlc2NyaXB0aW9uDQogICAgICAiVGhpcyBZQU5HIG1vZHVsZSBkZWZpbmVzIHRoZSA8cGFydGlhbC1sb2NrPiBhbmQNCiAgICAgICA8cGFydGlhbC11bmxvY2s+IG9wZXJhdGlvbnMuIjsNCg0KICAgIHJldmlzaW9uIDIwMDgtMDYtMDYgew0KICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgdmVyc2lvbi4iOw0KICAgIH0NCg0KICAgIGdyb3VwaW5nIGNvbmZpZ05hbWUgew0KICAgICAgY29udGFpbmVyIHRhcmdldCB7DQogICAgICAgICAgZGVzY3JpcHRpb24NCiAgICAgICAgICAgICAgIkEgY2hvaWNlIHRvIGxpc3QgdGhlIGRhdGFzdG9yZSBuYW1lcyBmb3IgTkVUQ09ORi4iOw0KICAgICAgICAgIGNob2ljZSBjb25maWdOYW1lVHlwZSB7DQogICAgICAgICAgICBsZWFmIHJ1bm5pbmcgICB7IHR5cGUgZW1wdHk7IH0NCiAgICAgICAgICAgIGxlYWYgY2FuZGlkYXRlIHsgdHlwZSBlbXB0eTsgfQ0KICAgICAgICAgICAgbGVhZiBzdGFydHVwICAgeyB0eXBlIGVtcHR5OyB9DQogICAgICAgICAgfQ0KICAgICAgIH0NCiAgICB9DQoNCiAgICBycGMgcGFydGlhbC1sb2NrIHsNCiAgICAgIGRlc2NyaXB0aW9uICJBIE5FVENPTkYgb3BlcmF0aW9uIHRoYXQgbG9ja3MgcGFydCBvZiBhIGRhdGFzdG9yZS4iOw0KICAgICAgaW5wdXQgew0KICAgICAgICB1c2VzIGNvbmZpZ05hbWU7DQogICAgICAgIGxlYWYtbGlzdCBzZWxlY3Qgew0KICAgICAgICAgIGRlc2NyaXB0aW9uDQogICAgICAgICAgICAiWFBhdGggZXhwcmVzc2lvbiB0aGF0IHNwZWNpZmllcyB0aGUgc2NvcGUgb2YgdGhlIGxvY2suDQogICAgICAgICAgICBBbiBJbnN0YW5jZSBJZGVudGlmaWVyIGV4cHJlc3Npb24gbXVzdCBiZSB1c2VkIHVubGVzcyB0aGUNCiAgICAgICAgICAgIDp4cGF0aCBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZCBpbiB3aGljaCBjYXNlIGFueSBYUGF0aCAxLjANCiAgICAgICAgICAgIGV4cHJlc3Npb24gaXMgYWxsb3dlZC4iOw0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgW1BhZ2UgMTRdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQogICAgICAgICAgdHlwZSBzdHJpbmc7DQogICAgICAgICAgbWluLWVsZW1lbnRzIDE7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIG91dHB1dCB7DQogICAgICAgIGxlYWYgbG9jay1pZCB7DQogICAgICAgICAgZGVzY3JpcHRpb24NCiAgICAgICAgICAgICJJZGVudGlmaWVzIHRoZSBsb2NrLCBpZiBncmFudGVkLiBUaGUgbG9jay1pZCBtdXN0IGJlDQogICAgICAgICAgICAgdXNlZCBpbiB0aGUgcGFydGlhbC11bmxvY2sgcnBjLiI7DQogICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgIH0NCiAgICAgICAgbGVhZi1saXN0IGxvY2tlZC1ub2RlIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIGxvY2tlZC1ub2RlcyI7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICBycGMgcGFydGlhbC11bmxvY2sgew0KICAgICAgZGVzY3JpcHRpb24NCiAgICAgICAgIkEgTkVUQ09ORiBvcGVyYXRpb24gdGhhdCByZWxlYXNlcyBhIHByZXZpb3VzbHkgYWNxdWlyZWQNCiAgICAgICAgcGFydGlhbC1sb2NrLiI7DQogICAgICBpbnB1dCB7DQogICAgICAgIGxlYWYgbG9jay1pZCB7DQogICAgICAgICAgZGVzY3JpcHRpb24NCiAgICAgICAgICAgICJJZGVudGlmaWVzIHRoZSBsb2NrIHRvIGJlIHJlbGVhc2VkLiBNdXN0IGJlIHRoZSB2YWx1ZQ0KICAgICAgICAgICAgcmVjZWl2ZWQgaW4gdGhlIHJlc3BvbnNlIHRvIHRoZSBwYXJ0aWFsLWxvY2sgb3BlcmF0aW9uLiI7DQogICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgW1BhZ2UgMTVdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQo3LiAgQXBwZW5kaXggQyAgLSAgQ2hhbmdlIExvZw0KDQo3LjEuICAwMy0wNA0KDQogICBNaW5vciBjbGFyaWZpY2F0aW9ucw0KDQogICBBZGRlZCBsaXN0IG9mIGxvY2tlZC1ub2RlcyB0byB0aGUgb3V0cHV0IG9mIHBhcnRpYWwtbG9jay4NCg0KICAgQWRkZWQgPHRhcmdldD4gd3JhcHBlciBhcm91bmQgZGF0YXN0b3JlIG5hbWUuDQoNCjcuMi4gIDAyLTAzDQoNCiAgIE1pbm9yIGNsYXJpZmljYXRpb25zDQoNCiAgIFNhbWUgZGVzY3JpcHRpb25zIGluIFhTRCBhbmQgWUFORy4NCg0KNy4zLiAgMDEtMDINCg0KICAgTWFkZSBYU0Qgbm9ybWF0aXZlDQoNCiAgIENsYXJpZmllZCB0aGF0IG5vIHNwZWNpZmljIGFjY2VzcyBjb250cm9sIGlzIGFzc3VtZWQuDQoNCiAgIENsYXJpZmllZCB0aGF0IG5vbi1leGlzdGluZyBub2RlcyBhcmUgTk9UIGNvdmVyZWQgYnkgdGhlIGxvY2ssIGV2ZW4NCiAgIGlmIHRoZXkgd2hlcmUgZXhpc3RpbmcgYW5kIGNvdmVyZWQgYnkgdGhlIGxvY2sgd2hlbiBpdCB3YXMgb3JpZ2luYWxseQ0KICAgZ3JhbnRlZC4NCg0KICAgU29tZSByZXdvcmRpbmcNCg0KICAgQWRkZWQgYXBwLXRhZ3MgZm9yIHR3byBvZiB0aGUgZXJyb3IgY2FzZXMuDQoNCiAgIE1hZGUgWUFORyBhbiBpbmZvcm1hdGl2ZSByZWZlcmVuY2UNCg0KICAgRW5oYW5jZWQgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMuDQoNCjcuNC4gIDAwLTAxDQoNCiAgIEFkZGVkIFlBTkcgbW9kdWxlLg0KDQo3LjUuICAtMDANCg0KICAgQ3JlYXRlZCBmcm9tIGRyYWZ0LWxlbmd5ZWwtbmdvLXBhcnRpYWwtbG9jay0wMS50eHQNCg0KDQoNCg0KDQoNCg0KDQoNCg0KTGVuZ3llbCAmIEJqb3JrbHVuZCAgICAgIEV4cGlyZXMgTWFyY2ggMTIsIDIwMDkgICAgICAgICAgICAgICAgW1BhZ2UgMTZdDQoMDQpJbnRlcm5ldC1EcmFmdCAgICAgICAgUGFydGlhbCBMb2NrIFJQQyBmb3IgTkVUQ09ORiAgICAgICAgU2VwdGVtYmVyIDIwMDgNCg0KDQo4LiAgQWNrbm93bGVkZ2VtZW50cw0KDQogICBUaGFua3MgdG8gQW5keSBCaWVybWFuLCBTaGFyb24gQ2hpc2hvbG0sIFBoaWwgU2hhZmVyICwgRGF2aWQNCiAgIEhhcnJpbmd0b24sIE1laG1ldCBFcnN1ZSBhbmQgbWFueSBvdGhlciBtZW1iZXJzIG9mIHRoZSBORVRDT05GIFdHIGZvcg0KICAgcHJvdmlkaW5nIGltcG9ydGFudCBpbnB1dCB0byB0aGlzIGRvY3VtZW50Lg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpMZW5neWVsICYgQmpvcmtsdW5kICAgICAgRXhwaXJlcyBNYXJjaCAxMiwgMjAwOSAgICAgICAgICAgICAgICBbUGFnZSAxN10NCgwNCkludGVybmV0LURyYWZ0ICAgICAgICBQYXJ0aWFsIExvY2sgUlBDIGZvciBORVRDT05GICAgICAgICBTZXB0ZW1iZXIgMjAwOA0KDQoNCjkuICBSZWZlcmVuY2VzDQoNCjkuMS4gIE5vcm1hdGl2ZSBSZWZlcmVuY2VzDQoNCiAgIFtORVRDT05GXSAgRW5ucywgUi4sICJORVRDT05GIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wiLCBSRkMgNDc0MSwNCiAgICAgICAgICAgICAgRGVjZW1iZXIgMjAwNi4NCg0KICAgW1JGQzIxMTldICBCcmFkbmVyLCBTLiwgIktleSB3b3JkcyBmb3IgdXNlIGluIFJGQ3MgdG8gSW5kaWNhdGUNCiAgICAgICAgICAgICAgUmVxdWlyZW1lbnQgTGV2ZWxzIiwgQkNQIDE0LCBSRkMgMjExOSwgTWFyY2ggMTk5Ny4NCg0KICAgW1JGQzM2ODhdICBNZWFsbGluZywgTS4sICJUaGUgSUVURiBYTUwgUmVnaXN0cnkiLCBCQ1AgODEsIFJGQyAzNjg4LA0KICAgICAgICAgICAgICBKYW51YXJ5IDIwMDQuDQoNCjkuMi4gIEluZm9ybWF0aXZlIFJlZmVyZW5jZXMNCg0KICAgW0ktRC5pZXRmLW5ldG1vZC15YW5nXQ0KICAgICAgICAgICAgICBCam9ya2x1bmQsIE0uLCAiWUFORyAtIEEgZGF0YSBtb2RlbGluZyBsYW5ndWFnZSBmb3INCiAgICAgICAgICAgICAgTkVUQ09ORiIsIGRyYWZ0LWlldGYtbmV0bW9kLXlhbmctMDAgKHdvcmsgaW4gcHJvZ3Jlc3MpLA0KICAgICAgICAgICAgICBNYXkgMjAwOC4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpMZW5neWVsICYgQmpvcmtsdW5kICAgICAgRXhwaXJlcyBNYXJjaCAxMiwgMjAwOSAgICAgICAgICAgICAgICBbUGFnZSAxOF0NCgwNCkludGVybmV0LURyYWZ0ICAgICAgICBQYXJ0aWFsIExvY2sgUlBDIGZvciBORVRDT05GICAgICAgICBTZXB0ZW1iZXIgMjAwOA0KDQoNCkF1dGhvcnMnIEFkZHJlc3Nlcw0KDQogICBCYWxhenMgTGVuZ3llbA0KICAgRXJpY3Nzb24gSHVuZ2FyeQ0KDQogICBFbWFpbDogYmFsYXpzLmxlbmd5ZWxAZXJpY3Nzb24uY29tDQoNCg0KICAgTWFydGluIEJqb3JrbHVuZA0KICAgVGFpbC1mIFN5c3RlbXMNCg0KICAgRW1haWw6IG1iakB0YWlsLWYuY29tDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpMZW5neWVsICYgQmpvcmtsdW5kICAgICAgRXhwaXJlcyBNYXJjaCAxMiwgMjAwOSAgICAgICAgICAgICAgICBbUGFnZSAxOV0NCgwNCkludGVybmV0LURyYWZ0ICAgICAgICBQYXJ0aWFsIExvY2sgUlBDIGZvciBORVRDT05GICAgICAgICBTZXB0ZW1iZXIgMjAwOA0KDQoNCkZ1bGwgQ29weXJpZ2h0IFN0YXRlbWVudA0KDQogICBDb3B5cmlnaHQgKEMpIFRoZSBJRVRGIFRydXN0ICgyMDA4KS4NCg0KICAgVGhpcyBkb2N1bWVudCBpcyBzdWJqZWN0IHRvIHRoZSByaWdodHMsIGxpY2Vuc2VzIGFuZCByZXN0cmljdGlvbnMNCiAgIGNvbnRhaW5lZCBpbiBCQ1AgNzgsIGFuZCBleGNlcHQgYXMgc2V0IGZvcnRoIHRoZXJlaW4sIHRoZSBhdXRob3JzDQogICByZXRhaW4gYWxsIHRoZWlyIHJpZ2h0cy4NCg0KICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXJlIHByb3ZpZGVkIG9uIGFuDQogICAiQVMgSVMiIGJhc2lzIGFuZCBUSEUgQ09OVFJJQlVUT1IsIFRIRSBPUkdBTklaQVRJT04gSEUvU0hFIFJFUFJFU0VOVFMNCiAgIE9SIElTIFNQT05TT1JFRCBCWSAoSUYgQU5ZKSwgVEhFIElOVEVSTkVUIFNPQ0lFVFksIFRIRSBJRVRGIFRSVVNUIEFORA0KICAgVEhFIElOVEVSTkVUIEVOR0lORUVSSU5HIFRBU0sgRk9SQ0UgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMsIEVYUFJFU1MNCiAgIE9SIElNUEFrom [email-masked]  Tue Sep  9 04:36:28 2008Return-Path: <[email-masked]>X-Original-To: [email-masked]: [email-masked]: from [127.0.0.1] (localhost [127.0.0.1])	by core3.amsl.com (Postfix) with ESMTP id 3EBD53A6C7C;	Tue,  9 Sep 2008 04:36:28 -0700 (PDT)X-Original-To: [email-masked]: [email-masked]: from localhost (localhost [127.0.0.1])	by core3.amsl.com (Postfix) with ESMTP id 010703A6C7C	for <[email-masked]>; Tue,  9 Sep 2008 04:36:27 -0700 (PDT)X-Virus-Scanned: amavisd-new at amsl.comX-Spam-Flag: NOX-Spam-Score: -1.999X-Spam-Level: X-Spam-Status: No, score=-1.999 tagged_above=-999 required=5	tests=[BAYES_00=-2.599, J_CHICKENPOX_73=0.6]Received: from mail.ietf.org ([64.170.98.32])	by localhost (core3.amsl.com [127.0.0.1]) (amavisd-new, port 10024)	with ESMTP id VADQ8-ppnrW7 for <[email-masked]>;	Tue,  9 Sep 2008 04:36:23 -0700 (PDT)Received: from demumfd002.nsn-inter.net (demumfd002.nsn-inter.net	[217.115.75.234])	by core3.amsl.com (Postfix) with ESMTP id 3613D3A6ACF	for <[email-masked]>; Tue,  9 Sep 2008 04:36:22 -0700 (PDT)Received: from demuprx017.emea.nsn-intra.net ([10.150.129.56])	by demumfd002.nsn-inter.net (8.12.11.20060308/8.12.11) with ESMTP id	m89BaMKD003142	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);	Tue, 9 Sep 2008 13:36:22 +0200Received: from demuexc023.nsn-intra.net (webmail.nsn-intra.net [10.150.128.36])	by demuprx017.emea.nsn-intra.net (8.12.11.20060308/8.12.11) with ESMTP	id m89BaLUu024679; Tue, 9 Sep 2008 13:36:22 +0200Received: from DEMUEXC005.nsn-intra.net ([10.150.128.17]) by	demuexc023.nsn-intra.net with Microsoft SMTPSVC(6.0.3790.3959); 	Tue, 9 Sep 2008 13:36:20 +0200x-mimeole: Produced By Microsoft Exchange V6.5Content-class: urn:content-classes:messageMIME-Version: 1.0Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C91270.4668D332"Date: Tue, 9 Sep 2008 13:36:17 +0200Message-ID: <[email-masked]>X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [Netconf] evaluation of the partial-lock documentThread-Index: AckRxDgJq1qey0RQRgK3qVR046esUQAq7ANQFrom: "Ersue, Mehmet (NSN - DE/Munich)" <[email-masked]>To: <[email-masked]>,	"ext Bert Wijnen (IETF)" <[email-masked]>X-OriginalArrivalTime: 09 Sep 2008 11:36:20.0207 (UTC)	FILETIME=[478167F0:01C91270]Cc: [email-masked]: [Netconf] FW:  evaluation of the partial-lock documentX-BeenThere: [email-masked]: 2.1.9Precedence: listList-Id: Network Configuration WG mailing list <netconf.ietf.org>List-Unsubscribe: <https://www.ietf.org/mailman/listinfo/netconf>,	<mailto:[email-masked]?subject=unsubscribe>List-Archive: <https://www.ietf.org/mailman/private/netconf>List-Post: <mailto:[email-masked]>List-Help: <mailto:[email-masked]?subject=help>List-Subscribe: <https://www.ietf.org/mailman/listinfo/netconf>,	<mailto:[email-masked]?subject=subscribe>Sender: [email-masked]: [email-masked] is a multi-part message in MIME format.

Hi Balazs, All,

the Partial Lock schema in the attached draft seems 
to be valid with one exception.

rpcOperationTargetType is defined as a complex type 
in netconf.xsd, but the PL schema is using it as an 
element in rpcOperationType.
Hence the XML validation gives an error message that 
it must refer to an existing _element_ (i.e. not compex type).

Cheers, 
Mehmet 

-----Original Message-----
From: [email-masked] [mailto:[email-masked]] On
Behalf Of ext Balazs Lengyel
Sent: Monday, September 08, 2008 5:04 PM
To: Wes Hardaker; Bert Wijnen - IETF; netconf mailing list
Subject: Re: [Netconf] evaluation of the partial-lock document

Hello Wes, Bert,
Thanks for the review. PleasexJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJB
_______________________________________________
Netconf mailing list
[email-masked]
https://www.ietf.org/mailman/listinfo/netconf