Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
251283B29472A065F06D4BCE67EA2974874CF3FAB7527A7D0BE7E80F9690D43C

Transaction overview

Status
Success
Execution completed
Block
#77260
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
208,604,948
Requested gas limit
GAS USED
173,837,506
Gas consumed
FEE
208605ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

Ct2xCAoML3ZtLm1fYWRkcGtnEsuxCAooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBKdsQgKBnN0YWtlchIdZ25vLmxhbmQvci9nbm9zd2FwL2dvdi9zdGFrZXIayCgKCVJFQURNRS5tZBK6KCMgR292IFN0YWtlcgoKR292ZXJuYW5jZSBkZWxlZ2F0aW9uIGFuZCB4R05TLWJhc2VkIHZvdGluZyBwb3dlciBtYW5hZ2VtZW50LgoKIyMgT3ZlcnZpZXcKCkdvdiBTdGFrZXIgYWNjZXB0cyBHTlMgc3Rha2luZywgbWludHMgYW5kIGJ1cm5zIHhHTlMsIG1haW50YWlucyBkZWxlZ2F0ZWUgYmFsYW5jZXMgYW5kIHRpbWVzdGFtcGVkIGRlbGVnYXRpb24gaGlzdG9yeSwgdHJhY2tzIHVuZGVsZWdhdGlvbiBsb2NrdXBzLCBhbmQgc2V0dGxlcyB0d28gcmV3YXJkIHN0cmVhbXMgZm9yIHN0YWtlcnM6IEdOUyBlbWlzc2lvbiByZXdhcmRzIGFuZCBwcm90b2NvbC1mZWUgcmV3YXJkcyBpbiBhbnkgcmVnaXN0ZXJlZCB0b2tlbi4KCiMjIENvbmZpZ3VyYXRpb24KCi0gKipVbmRlbGVnYXRpb24gTG9ja3VwKio6IGNvbmZpZ3VyYWJsZTsgdGhlIGRlZmF1bHQgaXMgNyBkYXlzIGJlZm9yZSB1bmRlbGVnYXRlZCBHTlMgY2FuIGJlIGNvbGxlY3RlZC4KLSAqKlJld2FyZCBTb3VyY2VzKio6IEdOUyBlbWlzc2lvbiAoc2luZ2xlIHRva2VuKSBhbmQgcHJvdG9jb2wtZmVlIGRpc3RyaWJ1dGlvbiAob25lIGFjY3VtdWxhdG9yIHBlciBmZWUgdG9rZW4pLgotICoqRGVsZWdhdGlvbiBTdGF0ZSoqOiBwZXItZGVsZWdhdG9yL2RlbGVnYXRlZSByZWNvcmRzLCB0b3RhbCBhbmQgdXNlciB0aW1lc3RhbXAgaGlzdG9yaWVzLCBhbmQgcmV3YXJkIHN0YWtlIGV2ZW50cy4KCiMjIENvcmUgRmVhdHVyZXMKCiMjIyBEZWxlZ2F0aW9uCgotIERlbGVnYXRlIEdOUyB0byBhbnkgdmFsaWQgYWRkcmVzczsgdGhlIGRlbGVnYXRlZCBhbW91bnQgaXMgbWlycm9yZWQgYXMgeEdOUyB2b3RpbmcgcG93ZXIuCi0gUmVkZWxlZ2F0ZSBiZXR3ZWVuIGRlbGVnYXRlZXMgd2l0aG91dCBhIGxvY2t1cC4gUmVkZWxlZ2F0aW9uIHBlcmZvcm1zIGFuIGltbWVkaWF0ZSByZW1vdmUtcGx1cy1hZGQgZm9yIHJld2FyZCBhY2NvdW50aW5nLgotIFRyYWNrIHVuZGVsZWdhdGVkIGJhbGFuY2VzIHVudGlsIHRoZSBjb25maWd1cmVkIGxvY2t1cCBleHBpcmVzOyBjb2xsZWN0aW5nIHRoZW4gYnVybnMgdGhlIGNvcnJlc3BvbmRpbmcgeEdOUyBhbmQgcmV0dXJucyBHTlMuCgojIyMgUmV3YXJkcwoKLSBgQ29sbGVjdFJld2FyZGAgY2xhaW1zIGJvdGggdGhlIGVtaXNzaW9uIHN0cmVhbSBhbmQgYWxsIGtub3duIHByb3RvY29sLWZlZSB0b2tlbnMuCi0gYENvbGxlY3RFbWlzc2lvblJld2FyZGAgY2xhaW1zIG9ubHkgR05TIGVtaXNzaW9uIHJld2FyZHMuCi0gYENvbGxlY3RQcm90b2NvbEZlZVJld2FyZGAgY2xhaW1zIG9uZSBwcm90b2NvbC1mZWUgdG9rZW47IGl0cyBidWNrZXQgYW5kIHN0YWtlLWV2ZW50IHdvcmsgaXMgYm91bmRlZCBwZXIgY2FsbCwgc28gcmVtYWluaW5nIHdvcmsgaXMgY29sbGVjdGVkIGxhdGVyLgotIExhdW5jaHBhZCBjYW4gY29sbGVjdCB0aGUgbWF0Y2hpbmcgZW1pc3Npb24gYW5kIHByb3RvY29sLWZlZSByZXdhcmRzIGZvciBhIHJlZ2lzdGVyZWQgcHJvamVjdCB3YWxsZXQgdGhyb3VnaCBsYXVuY2hwYWQtb25seSBlbnRyeSBwb2ludHMuCgpQcm90b2NvbC1mZWUgcmV3YXJkcyBhcmUgbm90IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgY3VycmVudC1iYWxhbmNlIHNoYXJlLiBFYWNoIHRva2VuJ3MgZmVlIGJ1Y2tldHMgYXJlIGRpdmlkZWQgYnkgdGhlIHRvdGFsIHN0YWtlIGluIGZvcmNlIGR1cmluZyB0aGVpciBhY2NydWFsIGVwb2NocywgYWNjdW11bGF0ZWQgaW4gUTEyOCBmaXhlZCBwb2ludCwgYW5kIHNldHRsZWQgYWNyb3NzIGVhY2ggc3Rha2VyJ3MgdGltZXN0YW1wZWQgc3Rha2UtZXZlbnQgc2VnbWVudHMuIEZyYWN0aW9uYWwgcmVtYWluZGVycyByZW1haW4gaW4gc3RhdGUgZm9yIGxhdGVyIGNvbGxlY3Rpb24uCgojIyMgSGlzdG9yeSBhbmQgU25hcHNob3RzCgotIEhpc3RvcmljYWwgZGVsZWdhdGlvbiBzbmFwc2hvdHMgYXJlIHRpbWVzdGFtcCBsb29rdXBzIHVzZWQgYnkgZ292ZXJuYW5jZSdzIGNvbmZpZ3VyZWQgc21vb3RoaW5nIGNhbGN1bGF0aW9uOyB0aGV5IGFyZSBub3QgYmxvY2staGVpZ2h0IHNuYXBzaG90cy4KLSBDbGVhbnVwIGZ1bmN0aW9ucyBwcmVzZXJ2ZSBoaXN0b3J5IG5lZWRlZCBieSBhY3RpdmUgcHJvcG9zYWxzLgoKIyMgS2V5IEZ1bmN0aW9ucwoKIyMjIGBEZWxlZ2F0ZWAKClRyYW5zZmVycyBHTlMgZnJvbSB0aGUgY2FsbGVyLCBtaW50cyB0aGUgc2FtZSBhbW91bnQgb2YgeEdOUywgYW5kIGFzc2lnbnMgdGhlIGRlbGVnYXRlZCB2b3RpbmcgcG93ZXIgdG8gYSB0YXJnZXQgYWRkcmVzcy4gVGhlIGNhbGxlciBtdXN0IGFwcHJvdmUgdGhlIEdOUyB0cmFuc2ZlciBmaXJzdC4KCiMjIyBgVW5kZWxlZ2F0ZWAKClJlbW92ZXMgdm90aW5nIHBvd2VyIGltbWVkaWF0ZWx5IGFuZCBjcmVhdGVzIGEgd2l0aGRyYXdhbCBzdWJqZWN0IHRvIHRoZSBjb25maWd1cmVkIGxvY2t1cC4KCiMjIyBgUmVkZWxlZ2F0ZWAKCk1vdmVzIGRlbGVnYXRlZCBiYWxhbmNlIGZyb20gb25lIGRlbGVnYXRlZSB0byBhbm90aGVyIGltbWVkaWF0ZWx5LCB3aXRob3V0IGNyZWF0aW5nIGEgdXNlci1mYWNpbmcgbG9ja3VwLgoKIyMjIGBDb2xsZWN0UmV3YXJkYAoKQ2xhaW1zIHRoZSBjYWxsZXIncyBHTlMgZW1pc3Npb24gcmV3YXJkcyBhbmQgYWxsIGtub3duIHByb3RvY29sLWZlZSByZXdhcmRzLiBUaGUgYWxsLXRva2VuIHBhdGggaW50ZW50aW9uYWxseSBncm93cyB3aXRoIHRoZSBudW1iZXIgb2Yga25vd24gZmVlIHRva2Vucy4KCiMjIyBgQ29sbGVjdEVtaXNzaW9uUmV3YXJkYAoKQ2xhaW1zIG9ubHkgdGhlIGNhbGxlcidzIGFjY3VtdWxhdGVkIEdOUyBlbWlzc2lvbiByZXdhcmQuCgojIyMgYENvbGxlY3RQcm90b2NvbEZlZVJld2FyZGAKCkNsYWltcyBvbmUgdG9rZW4gcGF0aCdzIGFjY3VtdWxhdGVkIHByb3RvY29sLWZlZSByZXdhcmQuIEEgbGF0ZXIgY2FsbCBtYXkgYmUgcmVxdWlyZWQgd2hlbiBwZW5kaW5nIGFjY3J1YWwgYnVja2V0cyBvciBzdGFrZSBldmVudHMgZXhjZWVkIHRoZSBwZXItY2FsbCBib3VuZC4KCiMjIyBgQ29sbGVjdFVuZGVsZWdhdGVkR25zYAoKQ29sbGVjdHMgR05TIGFmdGVyIHRoZSBjb25maWd1cmVkIHVuZGVsZWdhdGlvbiBsb2NrdXAgaGFzIHBhc3NlZCBhbmQgYnVybnMgdGhlIGNvcnJlc3BvbmRpbmcgeEdOUy4KCiMjIyBgQ29sbGVjdFJld2FyZEZyb21MYXVuY2hQYWRgCgpDb2xsZWN0cyBib3RoIHJld2FyZCBzdHJlYW1zIGZvciBhIHJlZ2lzdGVyZWQgbGF1bmNocGFkIHByb2plY3Qgd2FsbGV0LiBUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxhYmxlIG9ubHkgYnkgdGhlIGxhdW5jaHBhZCBjb250cmFjdCBhbmQgc2VuZHMgcmV3YXJkcyB0byB0aGUgc3VwcGxpZWQgcHJvamVjdC13YWxsZXQgYWRkcmVzcy4KCiMjIERlbGVnYXRpb24gTG9naWMKCiMjIyBEZWxlZ2F0aW9uIEZsb3cKCjEuIEFwcHJvdmUgR05TIHNwZW5kaW5nIGJ5IHRoZSBnb3Yvc3Rha2VyIHJlYWxtLgoyLiBEZWxlZ2F0ZSBHTlMgdG8gYSBkZWxlZ2F0ZWU7IHhHTlMgaXMgbWludGVkIGFuZCB0aW1lc3RhbXBlZCBoaXN0b3J5IGlzIHVwZGF0ZWQuCjMuIEdvdmVybmFuY2UgcmVhZHMgdGhlIGRlbGVnYXRlZSdzIGhpc3RvcnkgYXQgcHJvcG9zYWwtZGVmaW5lZCB0aW1lc3RhbXBzIGZvciB2b3RlIHdlaWdodC4KNC4gVW5kZWxlZ2F0ZSB0byBzdGFydCB0aGUgbG9ja3VwLCBvciByZWRlbGVnYXRlIGltbWVkaWF0ZWx5IHRvIGFub3RoZXIgZGVsZWdhdGVlLgo1LiBBZnRlciB0aGUgbG9ja3VwIGV4cGlyZXMsIGNvbGxlY3QgdW5kZWxlZ2F0ZWQgR05TLgoKIyMgVXNhZ2UKClRoZXNlIHNuaXBwZXRzIGNhbGwgdGhlIHB1YmxpYyBkb21haW4gcHJveHkgZnJvbSBhIHJlYWxtIGZ1bmN0aW9uIHdpdGggYSBjdXJyZW50IGBjdXJgIHRva2VuLgpJbXBvcnQgdGhlIHByb3h5IHBhY2thZ2UgYW5kIHF1YWxpZnkgaXRzIGZ1bmN0aW9uIG5hbWVzIGluIGludGVncmF0aW5nIGNvZGUuCgpgYGBnbwovLyBEZWxlZ2F0ZSBHTlMgdG8gYW5vdGhlciBhZGRyZXNzOyB4R05TIHZvdGluZyBwb3dlciBpcyBtaW50ZWQgMToxLgpkZWxlZ2F0ZWRBbW91bnQgOj0gRGVsZWdhdGUoY3Jvc3MoY3VyKSwgZGVsZWdhdGVlLCAxXzAwMF8wMDBfMDAwLCAiZzFyZWZlcnJlci4uLiIpCgovLyBSZWRlbGVnYXRlIHBhcnQgb2YgdGhlIGFjdGl2ZSBiYWxhbmNlIGltbWVkaWF0ZWx5LgpSZWRlbGVnYXRlKGNyb3NzKGN1ciksIGRlbGVnYXRlZSwgbmV3RGVsZWdhdGVlLCA1MDBfMDAwXzAwMCkKCi8vIENsYWltIGJvdGggR05TIGVtaXNzaW9uIGFuZCBhbGwga25vd24gcHJvdG9jb2wtZmVlIHRva2Vucy4KQ29sbGVjdFJld2FyZChjcm9zcyhjdXIpKQoKLy8gT3IgY2xhaW0gb25seSBvbmUgc3RyZWFtL3Rva2VuLgpDb2xsZWN0RW1pc3Npb25SZXdhcmQoY3Jvc3MoY3VyKSkKQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkKGNyb3NzKGN1ciksIHRva2VuUGF0aCkKCi8vIFN0YXJ0IHVuZGVsZWdhdGlvbi4gQ29sbGVjdCBvbmx5IGFmdGVyIHRoZSBjb25maWd1cmVkIGxvY2t1cCAoNyBkYXlzIGJ5IGRlZmF1bHQpLgpVbmRlbGVnYXRlKGNyb3NzKGN1ciksIGRlbGVnYXRlZSwgMjUwXzAwMF8wMDApCi8vIC4uLndhaXQgdW50aWwgdGhlIGxvY2t1cCBoYXMgZXhwaXJlZC4uLgpDb2xsZWN0VW5kZWxlZ2F0ZWRHbnMoY3Jvc3MoY3VyKSkKYGBgCgojIyBTZWN1cml0eQoKLSBUaW1lc3RhbXBlZCBkZWxlZ2F0aW9uIGhpc3RvcnkgYW5kIGNvbmZpZ3VyYWJsZSBzbW9vdGhpbmcgcmVkdWNlIGZsYXNoLWxvYW4tc3R5bGUgdm90aW5nIG1hbmlwdWxhdGlvbjsgdGhleSBkbyBub3QgcHJvdmlkZSBhIGJsb2NrIHNuYXBzaG90LgotIFVuZGVsZWdhdGlvbiByZW1vdmVzIHZvdGluZyBwb3dlciBpbW1lZGlhdGVseSwgd2hpbGUgdGhlIGxvY2t1cCBkZWxheXMgR05TIHdpdGhkcmF3YWwuCi0gUHJvdG9jb2wtZmVlIHN0YWtlIGNoYW5nZXMgbXVzdCByZW1haW4gaW5kZXBlbmRlbnQgb2YgdGhlIG51bWJlciBvZiBmZWUgdG9rZW5zOyBvbmx5IGNvbGxlY3Rpb24gZm9sZHMgZmVlIGJ1Y2tldHMuCi0gTGF1bmNocGFkIHJld2FyZCBlbnRyeSBwb2ludHMgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGxhdW5jaHBhZCBjb250cmFjdCBhbmQgcmVnaXN0ZXJlZCBwcm9qZWN0IHdhbGxldHMuCi0gU25hcHNob3QgY2xlYW51cCBtdXN0IHByZXNlcnZlIGRhdGEgc3RpbGwgbmVlZGVkIGJ5IGFjdGl2ZSBwcm9wb3NhbHMuChrDBQoLY291bnRlci5nbm8SswVwYWNrYWdlIHN0YWtlcgoKdHlwZSBDb3VudGVyIHN0cnVjdCB7CglpZCBpbnQ2NAp9CgovLyBOZXdDb3VudGVyIGNyZWF0ZXMgYSBjb3VudGVyIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgZmlyc3QgYWxsb2NhdGVkIGlkZW50aWZpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqQ291bnRlcjogY291bnRlciB3aG9zZSBjdXJyZW50IGlkZW50aWZpZXIgaXMgemVyby4KZnVuYyBOZXdDb3VudGVyKCkgKkNvdW50ZXIgewoJcmV0dXJuICZDb3VudGVye2lkOiAwfQp9CgovLyBHZXQgcmV0dXJucyB0aGUgY291bnRlcidzIGN1cnJlbnQgaWRlbnRpZmllciB3aXRob3V0IGluY3JlbWVudGluZyBpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBpZGVudGlmaWVyLCBvciB6ZXJvIGZvciBhIG5ldyBjb3VudGVyLgpmdW5jIChjICpDb3VudGVyKSBHZXQoKSBpbnQ2NCB7IHJldHVybiBjLmlkIH0KCi8vIE5leHQgaW5jcmVtZW50cyB0aGUgY291bnRlciBhbmQgcmV0dXJucyB0aGUgbmV3bHkgYWxsb2NhdGVkIGlkZW50aWZpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogbmV4dCBpZGVudGlmaWVyIGFmdGVyIGluY3JlbWVudGluZyB0aGUgY291bnRlciBieSBvbmUuCmZ1bmMgKGMgKkNvdW50ZXIpIE5leHQoKSBpbnQ2NCB7CgljLmlkKysKCXJldHVybiBjLmlkCn0KGp40Cg5kZWxlZ2F0aW9uLmdubxKLNHBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCi8vIERlbGVnYXRpb25UeXBlIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGVsZWdhdGlvbiBvcGVyYXRpb24KdHlwZSBEZWxlZ2F0aW9uVHlwZSBzdHJpbmcKCmNvbnN0ICgKCURlbGVnYXRlVHlwZSAgIERlbGVnYXRpb25UeXBlID0gIkRFTEVHQVRFIgoJVW5EZWxlZ2F0ZVR5cGUgRGVsZWdhdGlvblR5cGUgPSAiVU5ERUxFR0FURSIKKQoKLy8gU3RyaW5nIHJldHVybnMgdGhlIHRleHR1YWwgb3BlcmF0aW9uIG5hbWUgcmVwcmVzZW50ZWQgYnkgdGhlIGRlbGVnYXRpb24gdHlwZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogIkRFTEVHQVRFIiwgIlVOREVMRUdBVEUiLCBvciB0aGUgdW5kZXJseWluZyB2YWx1ZSBmb3IgYW5vdGhlciB0eXBlLgpmdW5jIChkIERlbGVnYXRpb25UeXBlKSBTdHJpbmcoKSBzdHJpbmcgeyByZXR1cm4gc3RyaW5nKGQpIH0KCi8vIElzRGVsZWdhdGUgcmVwb3J0cyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gdHlwZSBpcyBEZWxlZ2F0ZVR5cGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIG9ubHkgd2hlbiBkIHJlcHJlc2VudHMgYSBkZWxlZ2F0aW9uIG9wZXJhdGlvbi4KZnVuYyAoZCBEZWxlZ2F0aW9uVHlwZSkgSXNEZWxlZ2F0ZSgpIGJvb2wgeyByZXR1cm4gZCA9PSBEZWxlZ2F0ZVR5cGUgfQoKLy8gSXNVbkRlbGVnYXRlIHJlcG9ydHMgd2hldGhlciB0aGUgb3BlcmF0aW9uIHR5cGUgaXMgVW5EZWxlZ2F0ZVR5cGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIG9ubHkgd2hlbiBkIHJlcHJlc2VudHMgYW4gdW5kZWxlZ2F0aW9uIG9wZXJhdGlvbi4KZnVuYyAoZCBEZWxlZ2F0aW9uVHlwZSkgSXNVbkRlbGVnYXRlKCkgYm9vbCB7IHJldHVybiBkID09IFVuRGVsZWdhdGVUeXBlIH0KCi8vIERlbGVnYXRpb24gcmVwcmVzZW50cyBhIGRlbGVnYXRpb24gYmV0d2VlbiB0d28gYWRkcmVzc2VzCnR5cGUgRGVsZWdhdGlvbiBzdHJ1Y3QgewoJaWQgICAgICAgICAgICAgICBpbnQ2NAoJZGVsZWdhdGVBbW91bnQgICBpbnQ2NAoJdW5EZWxlZ2F0ZUFtb3VudCBpbnQ2NAoJY29sbGVjdGVkQW1vdW50ICBpbnQ2NAoJZGVsZWdhdGVGcm9tICAgICBhZGRyZXNzCglkZWxlZ2F0ZVRvICAgICAgIGFkZHJlc3MKCWNyZWF0ZWRIZWlnaHQgICAgaW50NjQKCWNyZWF0ZWRBdCAgICAgICAgaW50NjQKCXdpdGhkcmF3cyAgICAgICAgW11EZWxlZ2F0aW9uV2l0aGRyYXcKfQoKLy8gTmV3RGVsZWdhdGlvbiBjcmVhdGVzIGEgZGVsZWdhdGlvbiByZWNvcmQgd2l0aCBubyB1bmRlbGVnYXRlZCBvciBjb2xsZWN0ZWQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaWQ6IHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHRoaXMgZGVsZWdhdGlvbiByZWNvcmQuCi8vICAgLSBkZWxlZ2F0ZUZyb206IGFkZHJlc3Mgd2hvc2UgdG9rZW5zIGFyZSBkZWxlZ2F0ZWQuCi8vICAgLSBkZWxlZ2F0ZVRvOiBhZGRyZXNzIHJlY2VpdmluZyB0aGUgZGVsZWdhdGVkIHZvdGluZyBwb3dlci4KLy8gICAtIGRlbGVnYXRlQW1vdW50OiBpbml0aWFsIGRlbGVnYXRlZCB0b2tlbiBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCi8vICAgLSBjcmVhdGVkSGVpZ2h0OiBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIGRlbGVnYXRpb24gd2FzIGNyZWF0ZWQuCi8vICAgLSBjcmVhdGVkQXQ6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBkZWxlZ2F0aW9uIHdhcyBjcmVhdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkRlbGVnYXRpb246IGluaXRpYWxpemVkIGRlbGVnYXRpb24gd2l0aCBlbXB0eSB3aXRoZHJhd2FsIGhpc3RvcnkuCmZ1bmMgTmV3RGVsZWdhdGlvbigKCWlkIGludDY0LAoJZGVsZWdhdGVGcm9tLCBkZWxlZ2F0ZVRvIGFkZHJlc3MsCglkZWxlZ2F0ZUFtb3VudCwgY3JlYXRlZEhlaWdodCwgY3JlYXRlZEF0IGludDY0LAopICpEZWxlZ2F0aW9uIHsKCXJldHVybiAmRGVsZWdhdGlvbnsKCQlpZDogICAgICAgICAgICAgICBpZCwKCQlkZWxlZ2F0ZUZyb206ICAgICBkZWxlZ2F0ZUZyb20sCgkJZGVsZWdhdGVUbzogICAgICAgZGVsZWdhdGVUbywKCQlkZWxlZ2F0ZUFtb3VudDogICBkZWxlZ2F0ZUFtb3VudCwKCQljcmVhdGVkSGVpZ2h0OiAgICBjcmVhdGVkSGVpZ2h0LAoJCWNyZWF0ZWRBdDogICAgICAgIGNyZWF0ZWRBdCwKCQl1bkRlbGVnYXRlQW1vdW50OiAwLAoJCWNvbGxlY3RlZEFtb3VudDogIDAsCgkJd2l0aGRyYXdzOiAgICAgICAgbWFrZShbXURlbGVnYXRpb25XaXRoZHJhdywgMCksCgl9Cn0KCi8vIEJhc2ljIGdldHRlcnMKLy8gSUQgcmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRlbGVnYXRpb24gcmVjb3JkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGRlbGVnYXRpb24gaWRlbnRpZmllciBhc3NpZ25lZCBhdCBjcmVhdGlvbi4KZnVuYyAoZCAqRGVsZWdhdGlvbikgSUQoKSBpbnQ2NCB7IHJldHVybiBkLmlkIH0KCi8vIERlbGVnYXRlRnJvbSByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgc3VwcGxpZWQgdGhlIGRlbGVnYXRlZCB0b2tlbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhZGRyZXNzOiBkZWxlZ2F0b3IgYWRkcmVzcyByZWNvcmRlZCBvbiB0aGUgZGVsZWdhdGlvbi4KZnVuYyAoZCAqRGVsZWdhdGlvbikgRGVsZWdhdGVGcm9tKCkgYWRkcmVzcyB7IHJldHVybiBkLmRlbGVnYXRlRnJvbSB9CgovLyBEZWxlZ2F0ZVRvIHJldHVybnMgdGhlIGFkZHJlc3MgcmVjZWl2aW5nIHRoZSBkZWxlZ2F0ZWQgdm90aW5nIHBvd2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYWRkcmVzczogZGVsZWdhdGVlIGFkZHJlc3MgcmVjb3JkZWQgb24gdGhlIGRlbGVnYXRpb24uCmZ1bmMgKGQgKkRlbGVnYXRpb24pIERlbGVnYXRlVG8oKSBhZGRyZXNzIHsgcmV0dXJuIGQuZGVsZWdhdGVUbyB9CgovLyBDcmVhdGVkQXQgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgcmVjb3JkZWQgd2hlbiB0aGUgZGVsZWdhdGlvbiB3YXMgY3JlYXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBjcmVhdGlvbiB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChkICpEZWxlZ2F0aW9uKSBDcmVhdGVkQXQoKSBpbnQ2NCB7IHJldHVybiBkLmNyZWF0ZWRBdCB9CgovLyBBbW91bnQgZ2V0dGVycwovLyBUb3RhbERlbGVnYXRlZEFtb3VudCByZXR1cm5zIHRoZSBjdXJyZW50IGFtb3VudCBzdGlsbCBhY3RpdmVseSBkZWxlZ2F0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogYWN0aXZlIGRlbGVnYXRlZCB0b2tlbiBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCmZ1bmMgKGQgKkRlbGVnYXRpb24pIFRvdGFsRGVsZWdhdGVkQW1vdW50KCkgaW50NjQgeyByZXR1cm4gZC5kZWxlZ2F0ZUFtb3VudCB9CgovLyBVbkRlbGVnYXRlZEFtb3VudCByZXR1cm5zIHRoZSBhbW91bnQgbW92ZWQgaW50byB1bmRlbGVnYXRpb24gbG9ja3VwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRva2VuIGFtb3VudCBhd2FpdGluZyBjb2xsZWN0aW9uIGFmdGVyIGl0cyBsb2NrdXAgcGVyaW9kLgpmdW5jIChkICpEZWxlZ2F0aW9uKSBVbkRlbGVnYXRlZEFtb3VudCgpIGludDY0IHsgcmV0dXJuIGQudW5EZWxlZ2F0ZUFtb3VudCB9CgovLyBDb2xsZWN0ZWRBbW91bnQgcmV0dXJucyB0aGUgYW1vdW50IGFscmVhZHkgY29sbGVjdGVkIGZyb20gdW5kZWxlZ2F0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRva2VuIGFtb3VudCByZWxlYXNlZCBmcm9tIHRoaXMgZGVsZWdhdGlvbi4KZnVuYyAoZCAqRGVsZWdhdGlvbikgQ29sbGVjdGVkQW1vdW50KCkgaW50NjQgeyByZXR1cm4gZC5jb2xsZWN0ZWRBbW91bnQgfQoKLy8gV2l0aGRyYXdzIGdldHRlcnMKLy8gV2l0aGRyYXdzIHJldHVybnMgdGhlIGRlbGVnYXRpb24ncyB3aXRoZHJhd2FsIHJlY29yZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBbXURlbGVnYXRpb25XaXRoZHJhdzogd2l0aGRyYXdhbCBlbnRyaWVzIHRyYWNrZWQgZm9yIHRoaXMgZGVsZWdhdGlvbi4KZnVuYyAoZCAqRGVsZWdhdGlvbikgV2l0aGRyYXdzKCkgW11EZWxlZ2F0aW9uV2l0aGRyYXcgeyByZXR1cm4gZC53aXRoZHJhd3MgfQoKLy8gU2V0dGVycwovLyBTZXRVbkRlbGVnYXRlQW1vdW50IHJlcGxhY2VzIHRoZSBhbW91bnQgY3VycmVudGx5IGluIHVuZGVsZWdhdGlvbiBsb2NrdXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IHRva2VuIGFtb3VudCBhd2FpdGluZyBjb2xsZWN0aW9uIGluIHRoZSBzbWFsbGVzdCB0b2tlbiB1bml0LgpmdW5jIChkICpEZWxlZ2F0aW9uKSBTZXRVbkRlbGVnYXRlQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJZC51bkRlbGVnYXRlQW1vdW50ID0gYW1vdW50Cn0KCi8vIFNldENvbGxlY3RlZEFtb3VudCByZXBsYWNlcyB0aGUgYW1vdW50IGFscmVhZHkgY29sbGVjdGVkIGZyb20gdGhpcyBkZWxlZ2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiByZWxlYXNlZCB0b2tlbiBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCmZ1bmMgKGQgKkRlbGVnYXRpb24pIFNldENvbGxlY3RlZEFtb3VudChhbW91bnQgaW50NjQpIHsKCWQuY29sbGVjdGVkQW1vdW50ID0gYW1vdW50Cn0KCi8vIEFkZFdpdGhkcmF3IGFwcGVuZHMgYSB3aXRoZHJhd2FsIHJlY29yZCB0byB0aGUgZGVsZWdhdGlvbiBoaXN0b3J5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gd2l0aGRyYXc6IHdpdGhkcmF3YWwgcmVjb3JkIHRvIGFwcGVuZCwgaW5jbHVkaW5nIGl0cyBhbW91bnQgYW5kIHVubG9jayB0aW1pbmcuCmZ1bmMgKGQgKkRlbGVnYXRpb24pIEFkZFdpdGhkcmF3KHdpdGhkcmF3IERlbGVnYXRpb25XaXRoZHJhdykgewoJZC53aXRoZHJhd3MgPSBhcHBlbmQoZC53aXRoZHJhd3MsIHdpdGhkcmF3KQp9CgovLyBTZXRXaXRoZHJhdyByZXBsYWNlcyBvbmUgd2l0aGRyYXdhbCByZWNvcmQgYXQgdGhlIHN1cHBsaWVkIHNsaWNlIGluZGV4LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5kZXg6IHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHdpdGhkcmF3YWwgZW50cnkgdG8gcmVwbGFjZS4KLy8gICAtIHdpdGhkcmF3OiByZXBsYWNlbWVudCB3aXRoZHJhd2FsIHJlY29yZC4KZnVuYyAoZCAqRGVsZWdhdGlvbikgU2V0V2l0aGRyYXcoaW5kZXggaW50LCB3aXRoZHJhdyBEZWxlZ2F0aW9uV2l0aGRyYXcpIHsKCWQud2l0aGRyYXdzW2luZGV4XSA9IHdpdGhkcmF3Cn0KCi8vIFNldFdpdGhkcmF3cyByZXBsYWNlcyB0aGUgY29tcGxldGUgd2l0aGRyYXdhbCBoaXN0b3J5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gd2l0aGRyYXdzOiB3aXRoZHJhd2FsIHJlY29yZHMgdG8gc3RvcmUgZm9yIHRoaXMgZGVsZWdhdGlvbi4KZnVuYyAoZCAqRGVsZWdhdGlvbikgU2V0V2l0aGRyYXdzKHdpdGhkcmF3cyBbXURlbGVnYXRpb25XaXRoZHJhdykgewoJZC53aXRoZHJhd3MgPSB3aXRoZHJhd3MKfQoKLy8gQ2xvbmUgcmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZGVsZWdhdGlvbiBhbmQgaXRzIHdpdGhkcmF3YWwgc2xpY2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqRGVsZWdhdGlvbjogY29waWVkIGRlbGVnYXRpb24sIG9yIG5pbCB3aGVuIHRoZSByZWNlaXZlciBpcyBuaWwuCmZ1bmMgKGQgKkRlbGVnYXRpb24pIENsb25lKCkgKkRlbGVnYXRpb24gewoJaWYgZCA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCgljbG9uZWRXaXRoZHJhd3MgOj0gbWFrZShbXURlbGVnYXRpb25XaXRoZHJhdywgbGVuKGQud2l0aGRyYXdzKSkKCWNvcHkoY2xvbmVkV2l0aGRyYXdzLCBkLndpdGhkcmF3cykKCglyZXR1cm4gJkRlbGVnYXRpb257CgkJaWQ6ICAgICAgICAgICAgICAgZC5pZCwKCQlkZWxlZ2F0ZUFtb3VudDogICBkLmRlbGVnYXRlQW1vdW50LAoJCXVuRGVsZWdhdGVBbW91bnQ6IGQudW5EZWxlZ2F0ZUFtb3VudCwKCQljb2xsZWN0ZWRBbW91bnQ6ICBkLmNvbGxlY3RlZEFtb3VudCwKCQlkZWxlZ2F0ZUZyb206ICAgICBkLmRlbGVnYXRlRnJvbSwKCQlkZWxlZ2F0ZVRvOiAgICAgICBkLmRlbGVnYXRlVG8sCgkJY3JlYXRlZEhlaWdodDogICAgZC5jcmVhdGVkSGVpZ2h0LAoJCWNyZWF0ZWRBdDogICAgICAgIGQuY3JlYXRlZEF0LAoJCXdpdGhkcmF3czogICAgICAgIGNsb25lZFdpdGhkcmF3cywKCX0KfQoKLy8gTmV3RGVsZWdhdGlvblRyZWUgY3JlYXRlcyBhbiBlbXB0eSB0cmVlIGZvciBkZWxlZ2F0ZWUtdG8tZGVsZWdhdGlvbi1JRCBtYXBwaW5ncy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBlbXB0eSB0cmVlIGNvbmZpZ3VyZWQgZm9yIGRlbGVnYXRpb24gbG9va3VwIGVudHJpZXMuCmZ1bmMgTmV3RGVsZWdhdGlvblRyZWUoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gYnB0cmVlLk5ld0JQVHJlZU4oMTYpCn0KCi8vIE5ld1VzZXJEZWxlZ2F0aW9uVHJlZSBjcmVhdGVzIGFuIGVtcHR5IHRyZWUgZm9yIHVzZXIgZGVsZWdhdGlvbiBtYXBwaW5ncy4KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBlbXB0eSB0cmVlIGNvbmZpZ3VyZWQgZm9yIHVzZXIgZGVsZWdhdGlvbiBlbnRyaWVzLgpmdW5jIE5ld1VzZXJEZWxlZ2F0aW9uVHJlZSgpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiBicHRyZWUuTmV3QlBUcmVlTigxNikKfQoamCoKFmRlbGVnYXRpb25fbWFuYWdlci5nbm8S/SlwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCi8vIERlbGVnYXRpb25NYW5hZ2VyIG1hbmFnZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB1c2VycyBhbmQgdGhlaXIgZGVsZWdhdGlvbiBJRHMuCi8vIEl0IHByb3ZpZGVzIGVmZmljaWVudCBsb29rdXAgYW5kIG1hbmFnZW1lbnQgb2YgdXNlciBkZWxlZ2F0aW9ucyBvcmdhbml6ZWQgYnkgZGVsZWdhdG9yIGFuZCBkZWxlZ2F0ZWUgYWRkcmVzc2VzLgp0eXBlIERlbGVnYXRpb25NYW5hZ2VyIHN0cnVjdCB7CgkvLyB1c2VyRGVsZWdhdGlvbnMgbWFwcyBkZWxlZ2F0b3IgYWRkcmVzcyAtPiAqYnB0cmVlLkJQVHJlZSAoZGVsZWdhdGVlIGFkZHJlc3MgLT4gbGlzdCBvZiBkZWxlZ2F0aW9uIElEcykKCS8vIFVzaW5nIEJQVHJlZSBpbnN0ZWFkIG9mIG1hcCB0byBoYW5kbGUgdW5ib3VuZGVkIGdyb3d0aCBvZiBkZWxlZ2F0b3JzIGVmZmljaWVudGx5Cgl1c2VyRGVsZWdhdGlvbnMgKmJwdHJlZS5CUFRyZWUKfQoKLy8gTmV3RGVsZWdhdGlvbk1hbmFnZXIgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBEZWxlZ2F0aW9uTWFuYWdlci4KLy8gVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBCUFRyZWUgc3RydWN0dXJlIGZvciB0cmFja2luZyB1c2VyIGRlbGVnYXRpb25zLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkRlbGVnYXRpb25NYW5hZ2VyOiBtYW5hZ2VyIHJlYWR5IHRvIHRyYWNrIGRlbGVnYXRvci9kZWxlZ2F0ZWUgSUQgbGlzdHMuCmZ1bmMgTmV3RGVsZWdhdGlvbk1hbmFnZXIoKSAqRGVsZWdhdGlvbk1hbmFnZXIgewoJcmV0dXJuICZEZWxlZ2F0aW9uTWFuYWdlcnsKCQl1c2VyRGVsZWdhdGlvbnM6IGJwdHJlZS5OZXdCUFRyZWVOKDE2KSwKCX0KfQoKLy8gR2V0VXNlckRlbGVnYXRpb25zIHJldHVybnMgdGhlIGVudGlyZSB1c2VyIGRlbGVnYXRpb25zIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogdHJlZSBrZXllZCBieSBkZWxlZ2F0b3IgYWRkcmVzcyBzdHJpbmcuCmZ1bmMgKGRtICpEZWxlZ2F0aW9uTWFuYWdlcikgR2V0VXNlckRlbGVnYXRpb25zKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIGRtLnVzZXJEZWxlZ2F0aW9ucwp9CgovLyBTZXRVc2VyRGVsZWdhdGlvbnMgcmVwbGFjZXMgdGhlIHJvb3QgZGVsZWdhdG9yLXRvLWRlbGVnYXRpb25zIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB1c2VyRGVsZWdhdGlvbnM6IHRyZWUga2V5ZWQgYnkgZGVsZWdhdG9yIGFkZHJlc3Mgc3RyaW5nIGFuZCBjb250YWluaW5nIGRlbGVnYXRlZSB0cmVlcy4KZnVuYyAoZG0gKkRlbGVnYXRpb25NYW5hZ2VyKSBTZXRVc2VyRGVsZWdhdGlvbnModXNlckRlbGVnYXRpb25zICpicHRyZWUuQlBUcmVlKSB7CglkbS51c2VyRGVsZWdhdGlvbnMgPSB1c2VyRGVsZWdhdGlvbnMKfQoKLy8gR2V0RGVsZWdhdG9yRGVsZWdhdGlvbnMgcmV0dXJucyB0aGUgZGVsZWdhdGVlIHRyZWUgZm9yIG9uZSBkZWxlZ2F0b3IuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWxlZ2F0b3I6IGRlbGVnYXRvciBhZGRyZXNzIHN0cmluZyB1c2VkIGFzIHRoZSByb290LXRyZWUga2V5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IGRlbGVnYXRlZS10by1kZWxlZ2F0aW9uLUlEIHRyZWUgd2hlbiBwcmVzZW50IGFuZCBjb3JyZWN0bHkgdHlwZWQuCi8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGRlbGVnYXRvciBlbnRyeSBleGlzdHMgd2l0aCB0aGUgZXhwZWN0ZWQgdHJlZSB0eXBlLgpmdW5jIChkbSAqRGVsZWdhdGlvbk1hbmFnZXIpIEdldERlbGVnYXRvckRlbGVnYXRpb25zKGRlbGVnYXRvciBzdHJpbmcpICgqYnB0cmVlLkJQVHJlZSwgYm9vbCkgewoJZGVsZWdhdGlvbnMgOj0gZG0udXNlckRlbGVnYXRpb25zLkdldChkZWxlZ2F0b3IpCglpZiBkZWxlZ2F0aW9ucyA9PSBuaWwgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CglkZWxlZ2F0aW9uc1RyZWUsIG9rIDo9IGRlbGVnYXRpb25zLigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiBkZWxlZ2F0aW9uc1RyZWUsIHRydWUKfQoKLy8gR2V0RGVsZWdhdGlvbklEcyByZXR1cm5zIElEcyByZWNvcmRlZCBmb3Igb25lIGRlbGVnYXRvci9kZWxlZ2F0ZWUgcGFpci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlbGVnYXRvcjogZGVsZWdhdG9yIGFkZHJlc3Mgc3RyaW5nIHVzZWQgdG8gc2VsZWN0IHRoZSBuZXN0ZWQgdHJlZS4KLy8gICAtIGRlbGVnYXRlZTogZGVsZWdhdGVlIGFkZHJlc3Mgc3RyaW5nIHVzZWQgYXMgdGhlIG5lc3RlZC10cmVlIGtleS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFtdaW50NjQ6IGRlbGVnYXRpb24gSURzIHN0b3JlZCBmb3IgdGhlIHBhaXIuCi8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHBhaXIgZXhpc3RzIHdpdGggYSB2YWxpZCBJRCBzbGljZS4KZnVuYyAoZG0gKkRlbGVnYXRpb25NYW5hZ2VyKSBHZXREZWxlZ2F0aW9uSURzKGRlbGVnYXRvciwgZGVsZWdhdGVlIHN0cmluZykgKFtdaW50NjQsIGJvb2wpIHsKCWRlbGVnYXRpb25zLCBleGlzdHMgOj0gZG0uR2V0RGVsZWdhdG9yRGVsZWdhdGlvbnMoZGVsZWdhdG9yKQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCWlkcyA6PSBkZWxlZ2F0aW9ucy5HZXQoZGVsZWdhdGVlKQoJaWYgaWRzID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCWlkc1NsaWNlLCBvayA6PSBpZHMuKFtdaW50NjQpCglpZiAhb2sgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CglyZXR1cm4gaWRzU2xpY2UsIHRydWUKfQoKLy8gU2V0RGVsZWdhdGlvbklEcyBzdG9yZXMgdGhlIGNvbXBsZXRlIElEIHNsaWNlIGZvciBhIGRlbGVnYXRvci9kZWxlZ2F0ZWUgcGFpci4KLy8gQSBtaXNzaW5nIGRlbGVnYXRvciBlbnRyeSBpcyBpbml0aWFsaXplZCB3aXRoIGEgbmV3IG5lc3RlZCB0cmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZGVsZWdhdG9yOiBkZWxlZ2F0b3IgYWRkcmVzcyBzdHJpbmcgdXNlZCB0byBzZWxlY3Qgb3IgY3JlYXRlIHRoZSBuZXN0ZWQgdHJlZS4KLy8gICAtIGRlbGVnYXRlZTogZGVsZWdhdGVlIGFkZHJlc3Mgc3RyaW5nIHVzZWQgYXMgdGhlIG5lc3RlZC10cmVlIGtleS4KLy8gICAtIGlkczogZGVsZWdhdGlvbiBJRHMgdG8gc3RvcmUgZm9yIHRoZSBwYWlyLgpmdW5jIChkbSAqRGVsZWdhdGlvbk1hbmFnZXIpIFNldERlbGVnYXRpb25JRHMoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUgc3RyaW5nLCBpZHMgW11pbnQ2NCkgewoJZGVsZWdhdGlvbnMsIGV4aXN0cyA6PSBkbS5HZXREZWxlZ2F0b3JEZWxlZ2F0aW9ucyhkZWxlZ2F0b3IpCglpZiAhZXhpc3RzIHsKCQlkZWxlZ2F0aW9ucyA9IE5ld0RlbGVnYXRpb25UcmVlKCkKCQlkbS51c2VyRGVsZWdhdGlvbnMuU2V0KGRlbGVnYXRvciwgZGVsZWdhdGlvbnMpCgl9CglkZWxlZ2F0aW9ucy5TZXQoZGVsZWdhdGVlLCBpZHMpCn0KCi8vIEFkZERlbGVnYXRpb25JRCBhcHBlbmRzIGEgZGVsZWdhdGlvbiBJRCB0byB0aGUgZGVsZWdhdG9yLWRlbGVnYXRlZSBwYWlyLAovLyBza2lwcGluZyBkdXBsaWNhdGVzLiBUaGUgd2hvbGUgZ2V0LW1vZGlmeS1zZXQgcnVucyBpbnNpZGUgdGhpcyBkb21haW4gbWV0aG9kCi8vIHNvIHRoZSBuZXN0ZWQgQlBUcmVlIG11dGF0aW9uIG5ldmVyIGVzY2FwZXMgdGhlIG93bmluZyByZWFsbS4gUGVyZm9ybWluZyB0aGUKLy8gbG9va3VwIGluIG9uZSByZWFsbSBhbmQgdGhlIHdyaXRlIGluIGFub3RoZXIgKGUuZy4gcmUtZmV0Y2hpbmcgdGhlIGlubmVyIHRyZWUKLy8gYWNyb3NzIGEgcmVhbG0gYm91bmRhcnkgYW5kIG11dGF0aW5nIGl0KSB3b3VsZCBoaXQgdGhlIGNyb3NzLXJlYWxtIHdyaXRlCi8vIGd1YXJkIGZvciB0aGUgcGVyc2lzdGVkIGxlYWYgc2xvdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlbGVnYXRvcjogZGVsZWdhdG9yIGFkZHJlc3Mgc3RyaW5nIHVzZWQgdG8gc2VsZWN0IHRoZSBuZXN0ZWQgdHJlZS4KLy8gICAtIGRlbGVnYXRlZTogZGVsZWdhdGVlIGFkZHJlc3Mgc3RyaW5nIHVzZWQgYXMgdGhlIG5lc3RlZC10cmVlIGtleS4KLy8gICAtIGRlbGVnYXRpb25JRDogZGVsZWdhdGlvbiBJRCB0byBhcHBlbmQgd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgpmdW5jIChkbSAqRGVsZWdhdGlvbk1hbmFnZXIpIEFkZERlbGVnYXRpb25JRChkZWxlZ2F0b3IsIGRlbGVnYXRlZSBzdHJpbmcsIGRlbGVnYXRpb25JRCBpbnQ2NCkgewoJaWRzLCBfIDo9IGRtLkdldERlbGVnYXRpb25JRHMoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUpCglmb3IgXywgaWQgOj0gcmFuZ2UgaWRzIHsKCQlpZiBpZCA9PSBkZWxlZ2F0aW9uSUQgewoJCQlyZXR1cm4KCQl9Cgl9CglpZHMgPSBhcHBlbmQoaWRzLCBkZWxlZ2F0aW9uSUQpCglkbS5TZXREZWxlZ2F0aW9uSURzKGRlbGVnYXRvciwgZGVsZWdhdGVlLCBpZHMpCn0KCi8vIFJlbW92ZURlbGVnYXRpb25JRCByZW1vdmVzIGEgZGVsZWdhdGlvbiBJRCBmcm9tIHRoZSBkZWxlZ2F0b3ItZGVsZWdhdGVlIHBhaXIuCi8vIExpa2UgQWRkRGVsZWdhdGlvbklELCB0aGUgcmVhZC1tb2RpZnktd3JpdGUgaXMga2VwdCBpbnNpZGUgdGhpcyBkb21haW4gbWV0aG9kLgovLyBSZW1vdmVEZWxlZ2F0aW9uSUQgcmVtb3ZlcyBvbmUgSUQgZnJvbSBhIGRlbGVnYXRvci9kZWxlZ2F0ZWUgcGFpci4KLy8gTWlzc2luZyBwYWlycyBhbmQgSURzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlbGVnYXRvcjogZGVsZWdhdG9yIGFkZHJlc3Mgc3RyaW5nIHVzZWQgdG8gc2VsZWN0IHRoZSBuZXN0ZWQgdHJlZS4KLy8gICAtIGRlbGVnYXRlZTogZGVsZWdhdGVlIGFkZHJlc3Mgc3RyaW5nIHVzZWQgYXMgdGhlIG5lc3RlZC10cmVlIGtleS4KLy8gICAtIGRlbGVnYXRpb25JRDogZGVsZWdhdGlvbiBJRCB0byByZW1vdmUgd2hlbiBpdCBpcyBwcmVzZW50LgpmdW5jIChkbSAqRGVsZWdhdGlvbk1hbmFnZXIpIFJlbW92ZURlbGVnYXRpb25JRChkZWxlZ2F0b3IsIGRlbGVnYXRlZSBzdHJpbmcsIGRlbGVnYXRpb25JRCBpbnQ2NCkgewoJaWRzLCBleGlzdHMgOj0gZG0uR2V0RGVsZWdhdGlvbklEcyhkZWxlZ2F0b3IsIGRlbGVnYXRlZSkKCWlmICFleGlzdHMgewoJCXJldHVybgoJfQoJaW5kZXggOj0gLTEKCWZvciBpLCBpZCA6PSByYW5nZSBpZHMgewoJCWlmIGlkID09IGRlbGVnYXRpb25JRCB7CgkJCWluZGV4ID0gaQoJCQlicmVhawoJCX0KCX0KCWlmIGluZGV4ID09IC0xIHsKCQlyZXR1cm4KCX0KCWlkcyA9IGFwcGVuZChpZHNbOmluZGV4XSwgaWRzW2luZGV4KzE6XS4uLikKCWRtLlNldERlbGVnYXRpb25JRHMoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIGlkcykKfQoarS4KF2RlbGVnYXRpb25fd2l0aGRyYXcuZ25vEpEucGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKKQoKLy8gRGVsZWdhdGlvbldpdGhkcmF3IHJlcHJlc2VudHMgYSBwZW5kaW5nIHdpdGhkcmF3YWwgZnJvbSBhIGRlbGVnYXRpb24uCi8vIFRoaXMgc3RydWN0IHRyYWNrcyB1bmRlbGVnYXRlZCBhbW91bnRzIHRoYXQgYXJlIHN1YmplY3QgdG8gbG9ja3VwIHBlcmlvZHMKLy8gYW5kIG1hbmFnZXMgdGhlIGNvbGxlY3Rpb24gcHJvY2VzcyBvbmNlIHRoZSBsb2NrdXAgcGVyaW9kIGV4cGlyZXMuCnR5cGUgRGVsZWdhdGlvbldpdGhkcmF3IHN0cnVjdCB7CgkvLyBkZWxlZ2F0aW9uSUQgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NvY2lhdGVkIGRlbGVnYXRpb24KCWRlbGVnYXRpb25JRCBpbnQ2NAoJLy8gdW5EZWxlZ2F0ZUFtb3VudCBpcyB0aGUgdG90YWwgYW1vdW50IHRoYXQgd2FzIHVuZGVsZWdhdGVkCgl1bkRlbGVnYXRlQW1vdW50IGludDY0CgkvLyB1bkRlbGVnYXRlZEhlaWdodCBpcyB0aGUgaGVpZ2h0IHdoZW4gdGhlIHVuZGVsZWdhdGlvbiBvY2N1cnJlZAoJdW5EZWxlZ2F0ZWRIZWlnaHQgaW50NjQKCS8vIHVuRGVsZWdhdGVkQXQgaXMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB1bmRlbGVnYXRpb24gb2NjdXJyZWQKCXVuRGVsZWdhdGVkQXQgaW50NjQKCS8vIGNvbGxlY3RlZEFtb3VudCBpcyB0aGUgYW1vdW50IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjb2xsZWN0ZWQKCWNvbGxlY3RlZEFtb3VudCBpbnQ2NAoJLy8gY29sbGVjdGFibGVUaW1lIGlzIHRoZSB0aW1lc3RhbXAgd2hlbiBjb2xsZWN0aW9uIGJlY29tZXMgYXZhaWxhYmxlCgljb2xsZWN0YWJsZVRpbWUgaW50NjQKCS8vIGNvbGxlY3RlZEF0IGlzIHRoZSB0aW1lc3RhbXAgd2hlbiBjb2xsZWN0aW9uIG9jY3VycmVkCgljb2xsZWN0ZWRBdCBpbnQ2NAoJLy8gY29sbGVjdGVkIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3aXRoZHJhd2FsIGhhcyBiZWVuIGZ1bGx5IGNvbGxlY3RlZAoJY29sbGVjdGVkIGJvb2wKfQoKLy8gRGVsZWdhdGlvbklEIHJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NvY2lhdGVkIGRlbGVnYXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogZGVsZWdhdGlvbiBJRApmdW5jIChkICpEZWxlZ2F0aW9uV2l0aGRyYXcpIERlbGVnYXRpb25JRCgpIGludDY0IHsKCXJldHVybiBkLmRlbGVnYXRpb25JRAp9CgovLyBVbkRlbGVnYXRlQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCB0aGF0IHdhcyB1bmRlbGVnYXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB1bmRlbGVnYXRlZCBhbW91bnQKZnVuYyAoZCAqRGVsZWdhdGlvbldpdGhkcmF3KSBVbkRlbGVnYXRlQW1vdW50KCkgaW50NjQgewoJcmV0dXJuIGQudW5EZWxlZ2F0ZUFtb3VudAp9CgovLyBVbkRlbGVnYXRlZEF0IHJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoZSB1bmRlbGVnYXRpb24gb2NjdXJyZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdW5kZWxlZ2F0aW9uIHRpbWVzdGFtcApmdW5jIChkICpEZWxlZ2F0aW9uV2l0aGRyYXcpIFVuRGVsZWdhdGVkQXQoKSBpbnQ2NCB7CglyZXR1cm4gZC51bkRlbGVnYXRlZEF0Cn0KCi8vIFVuRGVsZWdhdGVkSGVpZ2h0IHJldHVybnMgdGhlIGhlaWdodCB3aGVuIHRoZSB1bmRlbGVnYXRpb24gb2NjdXJyZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdW5kZWxlZ2F0aW9uIGhlaWdodApmdW5jIChkICpEZWxlZ2F0aW9uV2l0aGRyYXcpIFVuRGVsZWdhdGVkSGVpZ2h0KCkgaW50NjQgewoJcmV0dXJuIGQudW5EZWxlZ2F0ZWRIZWlnaHQKfQoKLy8gQ29sbGVjdGVkQW1vdW50IHJldHVybnMgdGhlIGFtb3VudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29sbGVjdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGNvbGxlY3RlZCBhbW91bnQKZnVuYyAoZCAqRGVsZWdhdGlvbldpdGhkcmF3KSBDb2xsZWN0ZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZC5jb2xsZWN0ZWRBbW91bnQKfQoKLy8gQ29sbGVjdGFibGVUaW1lIHJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIGNvbGxlY3Rpb24gYmVjb21lcyBhdmFpbGFibGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogY29sbGVjdGFibGUgdGltZQpmdW5jIChkICpEZWxlZ2F0aW9uV2l0aGRyYXcpIENvbGxlY3RhYmxlVGltZSgpIGludDY0IHsKCXJldHVybiBkLmNvbGxlY3RhYmxlVGltZQp9CgovLyBDb2xsZWN0ZWRBdCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgd2hlbiBjb2xsZWN0aW9uIG9jY3VycmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGNvbGxlY3Rpb24gdGltZXN0YW1wCmZ1bmMgKGQgKkRlbGVnYXRpb25XaXRoZHJhdykgQ29sbGVjdGVkQXQoKSBpbnQ2NCB7CglyZXR1cm4gZC5jb2xsZWN0ZWRBdAp9CgovLyBJc0NvbGxlY3RlZCByZXR1cm5zIHdoZXRoZXIgdGhlIHdpdGhkcmF3YWwgaGFzIGJlZW4gZnVsbHkgY29sbGVjdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSBpZiBmdWxseSBjb2xsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZQpmdW5jIChkICpEZWxlZ2F0aW9uV2l0aGRyYXcpIElzQ29sbGVjdGVkKCkgYm9vbCB7CglyZXR1cm4gZC5jb2xsZWN0ZWQKfQoKLy8gU2V0Q29sbGVjdGVkIHNldHMgdGhlIGNvbGxlY3RlZCBzdGF0dXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjb2xsZWN0ZWQ6IG5ldyBjb2xsZWN0ZWQgc3RhdHVzCmZ1bmMgKGQgKkRlbGVnYXRpb25XaXRoZHJhdykgU2V0Q29sbGVjdGVkKGNvbGxlY3RlZCBib29sKSB7CglkLmNvbGxlY3RlZCA9IGNvbGxlY3RlZAp9CgovLyBTZXRDb2xsZWN0ZWRBdCBzZXRzIHRoZSBjb2xsZWN0aW9uIHRpbWVzdGFtcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvbGxlY3RlZEF0OiBjb2xsZWN0aW9uIHRpbWVzdGFtcApmdW5jIChkICpEZWxlZ2F0aW9uV2l0aGRyYXcpIFNldENvbGxlY3RlZEF0KGNvbGxlY3RlZEF0IGludDY0KSB7CglkLmNvbGxlY3RlZEF0ID0gY29sbGVjdGVkQXQKfQoKLy8gU2V0Q29sbGVjdGVkQW1vdW50IHNldHMgdGhlIGNvbGxlY3RlZCBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IGNvbGxlY3RlZCBhbW91bnQKZnVuYyAoZCAqRGVsZWdhdGlvbldpdGhkcmF3KSBTZXRDb2xsZWN0ZWRBbW91bnQoYW1vdW50IGludDY0KSB7CglkLmNvbGxlY3RlZEFtb3VudCA9IGFtb3VudAp9CgovLyBOZXdEZWxlZ2F0aW9uV2l0aGRyYXcgY3JlYXRlcyBhIG5ldyBkZWxlZ2F0aW9uIHdpdGhkcmF3YWwgd2l0aCBsb2NrdXAgcGVyaW9kLgovLyBUaGUgd2l0aGRyYXdhbCBiZWNvbWVzIGNvbGxlY3RhYmxlIGFmdGVyIHRoZSBsb2NrdXAgcGVyaW9kIGV4cGlyZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWxlZ2F0aW9uSUQ6IFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NvY2lhdGVkIGRlbGVnYXRpb24uCi8vICAgLSB1bkRlbGVnYXRlQW1vdW50OiBBbW91bnQgYmVpbmcgd2l0aGRyYXduLgovLyAgIC0gY3JlYXRlZEhlaWdodDogQmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSB1bmRlbGVnYXRpb24gd2FzIGNyZWF0ZWQuCi8vICAgLSBjcmVhdGVkQXQ6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRoZSB3aXRoZHJhd2FsIHdhcyBjcmVhdGVkLgovLyAgIC0gdW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kOiBMb2NrdXAgZHVyYXRpb24gaW4gc2Vjb25kcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIERlbGVnYXRpb25XaXRoZHJhdzogbmV3IHdpdGhkcmF3YWwgaW5zdGFuY2Ugd2l0aCBpdHMgY29sbGVjdGFibGUgdGltZSBzZXQgYWZ0ZXIgdGhlIGxvY2t1cC4KZnVuYyBOZXdEZWxlZ2F0aW9uV2l0aGRyYXcoCglkZWxlZ2F0aW9uSUQsCgl1bkRlbGVnYXRlQW1vdW50LAoJY3JlYXRlZEhlaWdodCwKCWNyZWF0ZWRBdCwKCXVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCBpbnQ2NCwKKSBEZWxlZ2F0aW9uV2l0aGRyYXcgewoJcmV0dXJuIERlbGVnYXRpb25XaXRoZHJhd3sKCQlkZWxlZ2F0aW9uSUQ6ICAgICAgZGVsZWdhdGlvbklELAoJCXVuRGVsZWdhdGVBbW91bnQ6ICB1bkRlbGVnYXRlQW1vdW50LAoJCXVuRGVsZWdhdGVkSGVpZ2h0OiBjcmVhdGVkSGVpZ2h0LAoJCXVuRGVsZWdhdGVkQXQ6ICAgICBjcmVhdGVkQXQsCgkJY29sbGVjdGFibGVUaW1lOiAgIGduc21hdGguU2FmZUFkZEludDY0KGNyZWF0ZWRBdCwgdW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kKSwKCQljb2xsZWN0ZWRBbW91bnQ6ICAgMCwKCQljb2xsZWN0ZWRBdDogICAgICAgMCwKCQljb2xsZWN0ZWQ6ICAgICAgICAgZmFsc2UsCgl9Cn0KCi8vIE5ld0RlbGVnYXRpb25XaXRoZHJhd1dpdGhvdXRMb2NrdXAgY3JlYXRlcyBhIHdpdGhkcmF3YWwgdGhhdCBpcyBpbW1lZGlhdGVseSBjb2xsZWN0YWJsZS4KLy8gVGhpcyBpcyB1c2VkIGZvciBzcGVjaWFsIGNhc2VzIHN1Y2ggYXMgcmVkZWxlZ2F0aW9uIHdoZXJlIG5vIGxvY2t1cCBpcyByZXF1aXJlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlbGVnYXRpb25JRDogVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc29jaWF0ZWQgZGVsZWdhdGlvbi4KLy8gICAtIHVuRGVsZWdhdGVBbW91bnQ6IEFtb3VudCBiZWluZyB3aXRoZHJhd24uCi8vICAgLSBjcmVhdGVkSGVpZ2h0OiBCbG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIHVuZGVsZWdhdGlvbiB3YXMgY3JlYXRlZC4KLy8gICAtIGNyZWF0ZWRBdDogVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIHdpdGhkcmF3YWwgd2FzIGNyZWF0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBEZWxlZ2F0aW9uV2l0aGRyYXc6IG5ldyB3aXRoZHJhd2FsIGluc3RhbmNlIG1hcmtlZCBjb2xsZWN0ZWQgd2l0aCBjb2xsZWN0YWJsZSB0aW1lIGVxdWFsIHRvIGNyZWF0ZWRBdC4KZnVuYyBOZXdEZWxlZ2F0aW9uV2l0aGRyYXdXaXRob3V0TG9ja3VwKAoJZGVsZWdhdGlvbklELAoJdW5EZWxlZ2F0ZUFtb3VudCwKCWNyZWF0ZWRIZWlnaHQsCgljcmVhdGVkQXQgaW50NjQsCikgRGVsZWdhdGlvbldpdGhkcmF3IHsKCXJldHVybiBEZWxlZ2F0aW9uV2l0aGRyYXd7CgkJZGVsZWdhdGlvbklEOiAgICAgIGRlbGVnYXRpb25JRCwKCQl1bkRlbGVnYXRlQW1vdW50OiAgdW5EZWxlZ2F0ZUFtb3VudCwKCQl1bkRlbGVnYXRlZEhlaWdodDogY3JlYXRlZEhlaWdodCwKCQl1bkRlbGVnYXRlZEF0OiAgICAgY3JlYXRlZEF0LAoJCWNvbGxlY3RhYmxlVGltZTogICBjcmVhdGVkQXQsCgkJY29sbGVjdGVkQW1vdW50OiAgIHVuRGVsZWdhdGVBbW91bnQsIC8vIEltbWVkaWF0ZWx5IGNvbGxlY3RlZAoJCWNvbGxlY3RlZEF0OiAgICAgICBjcmVhdGVkQXQsCgkJY29sbGVjdGVkOiAgICAgICAgIHRydWUsCgl9Cn0KCi8vIENsb25lIGNyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGRlbGVnYXRpb24gd2l0aGRyYXcuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBEZWxlZ2F0aW9uV2l0aGRyYXc6IGluZGVwZW5kZW50IGNvcHkgb2YgdGhlIHdpdGhkcmF3YWwgc3RhdGUuCmZ1bmMgKGQgKkRlbGVnYXRpb25XaXRoZHJhdykgQ2xvbmUoKSBEZWxlZ2F0aW9uV2l0aGRyYXcgewoJcmV0dXJuIERlbGVnYXRpb25XaXRoZHJhd3sKCQlkZWxlZ2F0aW9uSUQ6ICAgICAgZC5kZWxlZ2F0aW9uSUQsCgkJdW5EZWxlZ2F0ZUFtb3VudDogIGQudW5EZWxlZ2F0ZUFtb3VudCwKCQl1bkRlbGVnYXRlZEhlaWdodDogZC51bkRlbGVnYXRlZEhlaWdodCwKCQl1bkRlbGVnYXRlZEF0OiAgICAgZC51bkRlbGVnYXRlZEF0LAoJCWNvbGxlY3RlZEFtb3VudDogICBkLmNvbGxlY3RlZEFtb3VudCwKCQljb2xsZWN0YWJsZVRpbWU6ICAgZC5jb2xsZWN0YWJsZVRpbWUsCgkJY29sbGVjdGVkQXQ6ICAgICAgIGQuY29sbGVjdGVkQXQsCgkJY29sbGVjdGVkOiAgICAgICAgIGQuY29sbGVjdGVkLAoJfQp9ChoaCgdkb2MuZ25vEg9wYWNrYWdlIHN0YWtlcgoauSoKG2VtaXNzaW9uX3Jld2FyZF9tYW5hZ2VyLmdubxKZKnBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgKAoJYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKY29uc3QgZXJyRmFpbGVkVG9DYXN0UmV3YXJkU3RhdGUgPSAiZmFpbGVkIHRvIGNhc3QgcmV3YXJkU3RhdGVzJ3MgZWxlbWVudCB0byAqRW1pc3Npb25SZXdhcmRTdGF0ZTogJVQiCgovLyBFbWlzc2lvblJld2FyZE1hbmFnZXIgbWFuYWdlcyB0aGUgZGlzdHJpYnV0aW9uIG9mIGVtaXNzaW9uIHJld2FyZHMgdG8gc3Rha2Vycy4KdHlwZSBFbWlzc2lvblJld2FyZE1hbmFnZXIgc3RydWN0IHsKCS8vIHJld2FyZFN0YXRlcyBtYXBzIGFkZHJlc3MgdG8gRW1pc3Npb25SZXdhcmRTdGF0ZSBmb3IgdHJhY2tpbmcgaW5kaXZpZHVhbCBzdGFrZXIgcmV3YXJkcwoJcmV3YXJkU3RhdGVzICpicHRyZWUuQlBUcmVlIC8vIGFkZHJlc3MgLT4gRW1pc3Npb25SZXdhcmRTdGF0ZQoKCS8vIGFjY3VtdWxhdGVkUmV3YXJkWDEyOFBlclN0YWtlIHRyYWNrcyB0aGUgY3VtdWxhdGl2ZSByZXdhcmQgcGVyIHVuaXQgb2Ygc3Rha2Ugd2l0aCAxMjgtYml0IHByZWNpc2lvbgoJYWNjdW11bGF0ZWRSZXdhcmRYMTI4UGVyU3Rha2UgKnUyNTYuVWludAoJLy8gZGlzdHJpYnV0ZWRBbW91bnQgdHJhY2tzIHRoZSB0b3RhbCBhbW91bnQgb2YgcmV3YXJkcyBkaXN0cmlidXRlZAoJZGlzdHJpYnV0ZWRBbW91bnQgaW50NjQKCS8vIGFjY3VtdWxhdGVkVGltZXN0YW1wIHRyYWNrcyB0aGUgbGFzdCB0aW1lc3RhbXAgd2hlbiByZXdhcmRzIHdlcmUgYWNjdW11bGF0ZWQKCWFjY3VtdWxhdGVkVGltZXN0YW1wIGludDY0CgkvLyB0b3RhbFN0YWtlZEFtb3VudCB0cmFja3MgdGhlIHRvdGFsIGFtb3VudCBvZiB0b2tlbnMgc3Rha2VkIGluIHRoZSBzeXN0ZW0KCXRvdGFsU3Rha2VkQW1vdW50IGludDY0Cn0KCi8vIE5ld0VtaXNzaW9uUmV3YXJkTWFuYWdlciBjcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBFbWlzc2lvblJld2FyZE1hbmFnZXIgd2l0aCBlbXB0eSByZXdhcmQgc3RhdGVzIGFuZCB6ZXJvIGFjY291bnRpbmcgdG90YWxzLgovLyBSZXR1cm5zOgovLyAgIC0gKkVtaXNzaW9uUmV3YXJkTWFuYWdlcjogaW5pdGlhbGl6ZWQgbWFuYWdlciB3aXRoIGVtcHR5IHJld2FyZCBzdGF0ZXMsIHplcm8gdG90YWxzLCBhbmQgYSB6ZXJvIFExMjggYWNjdW11bGF0b3IuCmZ1bmMgTmV3RW1pc3Npb25SZXdhcmRNYW5hZ2VyKCkgKkVtaXNzaW9uUmV3YXJkTWFuYWdlciB7CglyZXR1cm4gJkVtaXNzaW9uUmV3YXJkTWFuYWdlcnsKCQlhY2N1bXVsYXRlZFJld2FyZFgxMjhQZXJTdGFrZTogdTI1Ni5OZXdVaW50KDApLAoJCWFjY3VtdWxhdGVkVGltZXN0YW1wOiAgICAgICAgICAwLAoJCXRvdGFsU3Rha2VkQW1vdW50OiAgICAgICAgICAgICAwLAoJCWRpc3RyaWJ1dGVkQW1vdW50OiAgICAgICAgICAgICAwLAoJCXJld2FyZFN0YXRlczogICAgICAgICAgICAgICAgICBicHRyZWUuTmV3QlBUcmVlTigxNiksCgl9Cn0KCi8vIEdldEFjY3VtdWxhdGVkUmV3YXJkWDEyOFBlclN0YWtlIHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHJld2FyZCBwZXIgc3Rha2Ugd2l0aCAxMjgtYml0IHByZWNpc2lvbi4KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IGFjY3VtdWxhdGVkIGVtaXNzaW9uIHJld2FyZCBwZXIgdW5pdCBvZiBzdGFrZSBpbiBRMTI4IGZpeGVkLXBvaW50IGZvcm0uCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkTWFuYWdlcikgR2V0QWNjdW11bGF0ZWRSZXdhcmRYMTI4UGVyU3Rha2UoKSAqdTI1Ni5VaW50IHsKCXJldHVybiBlLmFjY3VtdWxhdGVkUmV3YXJkWDEyOFBlclN0YWtlCn0KCi8vIEdldEFjY3VtdWxhdGVkVGltZXN0YW1wIHJldHVybnMgdGhlIGxhc3QgdGltZXN0YW1wIHdoZW4gcmV3YXJkcyB3ZXJlIGFjY3VtdWxhdGVkLgovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIG9mIHRoZSBsYXRlc3QgZW1pc3Npb24tcmV3YXJkIGFjY3VtdWxhdGlvbi4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRNYW5hZ2VyKSBHZXRBY2N1bXVsYXRlZFRpbWVzdGFtcCgpIGludDY0IHsKCXJldHVybiBlLmFjY3VtdWxhdGVkVGltZXN0YW1wCn0KCi8vIEdldFRvdGFsU3Rha2VkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBvZiB0b2tlbnMgc3Rha2VkIGluIHRoZSBzeXN0ZW0uCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgc3Rha2VkIHRva2VuIGFtb3VudCB0cmFja2VkIGJ5IHRoZSBtYW5hZ2VyLgpmdW5jIChlICpFbWlzc2lvblJld2FyZE1hbmFnZXIpIEdldFRvdGFsU3Rha2VkQW1vdW50KCkgaW50NjQgewoJcmV0dXJuIGUudG90YWxTdGFrZWRBbW91bnQKfQoKLy8gR2V0RGlzdHJpYnV0ZWRBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgYW1vdW50IG9mIHJld2FyZHMgZGlzdHJpYnV0ZWQuCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgZW1pc3Npb24gcmV3YXJkIGFtb3VudCBtYXJrZWQgYXMgZGlzdHJpYnV0ZWQuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkTWFuYWdlcikgR2V0RGlzdHJpYnV0ZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZS5kaXN0cmlidXRlZEFtb3VudAp9CgovLyBHZXRSZXdhcmRTdGF0ZSByZXRyaWV2ZXMgdGhlIHJld2FyZCBzdGF0ZSBmb3IgYWRkci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHI6IEFkZHJlc3Mga2V5IGlkZW50aWZ5aW5nIHRoZSBzdGFrZXIncyBlbWlzc2lvbiByZXdhcmQgc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqRW1pc3Npb25SZXdhcmRTdGF0ZTogc3RvcmVkIHN0YXRlLCBvciBuaWwgd2hlbiBhZGRyIGhhcyBubyBzdGF0ZS4KLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHJld2FyZCBzdGF0ZSBleGlzdHMgZm9yIGFkZHI7IGZhbHNlIHdoZW4gYWJzZW50LgovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzIG9yIGFic2VuY2U7IG5vbi1uaWwgd2hlbiB0aGUgc3RvcmVkIHZhbHVlIGhhcyB0aGUgd3JvbmcgdHlwZS4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRNYW5hZ2VyKSBHZXRSZXdhcmRTdGF0ZShhZGRyIHN0cmluZykgKCpFbWlzc2lvblJld2FyZFN0YXRlLCBib29sLCBlcnJvcikgewoJcmkgOj0gZS5yZXdhcmRTdGF0ZXMuR2V0KGFkZHIpCglpZiByaSA9PSBuaWwgewoJCXJldHVybiBuaWwsIGZhbHNlLCBuaWwKCX0KCXJzLCBjYXN0T2sgOj0gcmkuKCpFbWlzc2lvblJld2FyZFN0YXRlKQoJaWYgIWNhc3RPayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UsIHVmbXQuRXJyb3JmKGVyckZhaWxlZFRvQ2FzdFJld2FyZFN0YXRlLCByaSkKCX0KCXJldHVybiBycywgdHJ1ZSwgbmlsCn0KCi8qIFNldHRlcnMgKi8KCi8vIFNldFJld2FyZFN0YXRlcyByZXBsYWNlcyB0aGUgdHJlZSBjb250YWluaW5nIHBlci1hZGRyZXNzIGVtaXNzaW9uIHJld2FyZCBzdGF0ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByZXdhcmRTdGF0ZXM6IEJQVHJlZSBtYXBwaW5nIHN0YWtlciBhZGRyZXNzZXMgdG8gZW1pc3Npb24gcmV3YXJkIHN0YXRlcy4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRNYW5hZ2VyKSBTZXRSZXdhcmRTdGF0ZXMocmV3YXJkU3RhdGVzICpicHRyZWUuQlBUcmVlKSB7CgllLnJld2FyZFN0YXRlcyA9IHJld2FyZFN0YXRlcwp9CgovLyBTZXRBY2N1bXVsYXRlZFJld2FyZFgxMjhQZXJTdGFrZSBzdG9yZXMgdGhlIGFjY3VtdWxhdGVkIGVtaXNzaW9uIHJld2FyZCBwZXIgc3Rha2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhY2N1bXVsYXRlZFJld2FyZFgxMjhQZXJTdGFrZTogUTEyOCBmaXhlZC1wb2ludCByZXdhcmQtcGVyLXN0YWtlIGFjY3VtdWxhdG9yIHRvIGNvcHkgaW50byB0aGUgbWFuYWdlci4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRNYW5hZ2VyKSBTZXRBY2N1bXVsYXRlZFJld2FyZFgxMjhQZXJTdGFrZShhY2N1bXVsYXRlZFJld2FyZFgxMjhQZXJTdGFrZSAqdTI1Ni5VaW50KSB7CgllLmFjY3VtdWxhdGVkUmV3YXJkWDEyOFBlclN0YWtlID0gdTI1Ni5aZXJvKCkuU2V0KGFjY3VtdWxhdGVkUmV3YXJkWDEyOFBlclN0YWtlKQp9CgovLyBTZXREaXN0cmlidXRlZEFtb3VudCBzdG9yZXMgdGhlIHRvdGFsIGVtaXNzaW9uIGFtb3VudCBtYXJrZWQgYXMgZGlzdHJpYnV0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkaXN0cmlidXRlZEFtb3VudDogVG90YWwgZW1pc3Npb24gcmV3YXJkIGFtb3VudCBkaXN0cmlidXRlZCBzbyBmYXIuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkTWFuYWdlcikgU2V0RGlzdHJpYnV0ZWRBbW91bnQoZGlzdHJpYnV0ZWRBbW91bnQgaW50NjQpIHsKCWUuZGlzdHJpYnV0ZWRBbW91bnQgPSBkaXN0cmlidXRlZEFtb3VudAp9CgovLyBTZXRBY2N1bXVsYXRlZFRpbWVzdGFtcCBzdG9yZXMgdGhlIGxhdGVzdCBlbWlzc2lvbi1yZXdhcmQgYWNjdW11bGF0aW9uIHRpbWVzdGFtcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFjY3VtdWxhdGVkVGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYWNjdW11bGF0b3IuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkTWFuYWdlcikgU2V0QWNjdW11bGF0ZWRUaW1lc3RhbXAoYWNjdW11bGF0ZWRUaW1lc3RhbXAgaW50NjQpIHsKCWUuYWNjdW11bGF0ZWRUaW1lc3RhbXAgPSBhY2N1bXVsYXRlZFRpbWVzdGFtcAp9CgovLyBTZXRUb3RhbFN0YWtlZEFtb3VudCBzdG9yZXMgdGhlIHRvdGFsIGFtb3VudCBjdXJyZW50bHkgc3Rha2VkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG90YWxTdGFrZWRBbW91bnQ6IEFnZ3JlZ2F0ZSB0b2tlbiBhbW91bnQgcGFydGljaXBhdGluZyBpbiBlbWlzc2lvbiByZXdhcmRzLgpmdW5jIChlICpFbWlzc2lvblJld2FyZE1hbmFnZXIpIFNldFRvdGFsU3Rha2VkQW1vdW50KHRvdGFsU3Rha2VkQW1vdW50IGludDY0KSB7CgllLnRvdGFsU3Rha2VkQW1vdW50ID0gdG90YWxTdGFrZWRBbW91bnQKfQoKLy8gU2V0UmV3YXJkU3RhdGUgc2V0cyB0aGUgcmV3YXJkIHN0YXRlIGZvciBhIHNwZWNpZmljIGFkZHJlc3MKLy8gU2V0UmV3YXJkU3RhdGUgc3RvcmVzIG9uZSBzdGFrZXIncyBlbWlzc2lvbiByZXdhcmQgc3RhdGUgdW5kZXIgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHJlc3M6IEFkZHJlc3Mga2V5IGZvciB0aGUgc3Rha2VyJ3MgcmV3YXJkIHN0YXRlLgovLyAgIC0gcmV3YXJkU3RhdGU6IEVtaXNzaW9uIHJld2FyZCBzdGF0ZSB0byBzdG9yZSBmb3IgYWRkcmVzcy4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRNYW5hZ2VyKSBTZXRSZXdhcmRTdGF0ZShhZGRyZXNzIHN0cmluZywgcmV3YXJkU3RhdGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIHsKCWUucmV3YXJkU3RhdGVzLlNldChhZGRyZXNzLCByZXdhcmRTdGF0ZSkKfQoawycKGWVtaXNzaW9uX3Jld2FyZF9zdGF0ZS5nbm8SpSdwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgopCgovLyBFbWlzc2lvblJld2FyZFN0YXRlIHRyYWNrcyBlbWlzc2lvbiByZXdhcmQgaW5mb3JtYXRpb24gZm9yIGFuIGluZGl2aWR1YWwgc3Rha2VyLgovLyBUaGlzIHN0cnVjdCBtYWludGFpbnMgcmV3YXJkIGRlYnQsIGFjY3VtdWxhdGVkIHJld2FyZHMsIGFuZCBjbGFpbWluZyBoaXN0b3J5Ci8vIHRvIGVuc3VyZSBhY2N1cmF0ZSByZXdhcmQgY2FsY3VsYXRpb25zIGFuZCBwcmV2ZW50IGRvdWJsZS1jbGFpbWluZy4KdHlwZSBFbWlzc2lvblJld2FyZFN0YXRlIHN0cnVjdCB7CgkvLyByZXdhcmREZWJ0WDEyOCByZXByZXNlbnRzIHRoZSByZXdhcmQgZGVidCB3aXRoIDEyOC1iaXQgcHJlY2lzaW9uIHNjYWxpbmcKCS8vIFVzZWQgdG8gY2FsY3VsYXRlIHJld2FyZHMgZWFybmVkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZQoJcmV3YXJkRGVidFgxMjggKnUyNTYuVWludAoJLy8gYWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgaXMgdGhlIHRvdGFsIHJld2FyZHMgYWNjdW11bGF0ZWQgYnV0IG5vdCB5ZXQgY2xhaW1lZAoJYWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgaW50NjQKCS8vIGFjY3VtdWxhdGVkVGltZXN0YW1wIGlzIHRoZSBsYXN0IHRpbWVzdGFtcCB3aGVuIHJld2FyZHMgd2VyZSBhY2N1bXVsYXRlZAoJYWNjdW11bGF0ZWRUaW1lc3RhbXAgaW50NjQKCS8vIGNsYWltZWRSZXdhcmRBbW91bnQgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiByZXdhcmRzIHRoYXQgaGF2ZSBiZWVuIGNsYWltZWQKCWNsYWltZWRSZXdhcmRBbW91bnQgaW50NjQKCS8vIGNsYWltZWRUaW1lc3RhbXAgaXMgdGhlIGxhc3QgdGltZXN0YW1wIHdoZW4gcmV3YXJkcyB3ZXJlIGNsYWltZWQKCWNsYWltZWRUaW1lc3RhbXAgaW50NjQKCS8vIHN0YWtlZEFtb3VudCBpcyB0aGUgY3VycmVudCBhbW91bnQgb2YgdG9rZW5zIHN0YWtlZCBieSB0aGlzIGFkZHJlc3MKCXN0YWtlZEFtb3VudCBpbnQ2NAp9CgovLyBOZXdFbWlzc2lvblJld2FyZFN0YXRlIGNyZWF0ZXMgYSBuZXcgZW1pc3Npb24gcmV3YXJkIHN0YXRlIGZvciBhIHN0YWtlci4KLy8gVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzdGF0ZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSByZXdhcmQgZGVidC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFjY3VtdWxhdGVkUmV3YXJkWDEyOFBlclN0YWtlOiBjdXJyZW50IHN5c3RlbS13aWRlIGFjY3VtdWxhdGVkIHJld2FyZCBwZXIgc3Rha2UKLy8KLy8gUmV0dXJuczoKLy8gICAtICpFbWlzc2lvblJld2FyZFN0YXRlOiBuZXcgZW1pc3Npb24gcmV3YXJkIHN0YXRlIGluc3RhbmNlCmZ1bmMgTmV3RW1pc3Npb25SZXdhcmRTdGF0ZShhY2N1bXVsYXRlZFJld2FyZFgxMjhQZXJTdGFrZSAqdTI1Ni5VaW50KSAqRW1pc3Npb25SZXdhcmRTdGF0ZSB7CglyZXR1cm4gJkVtaXNzaW9uUmV3YXJkU3RhdGV7CgkJLy8gRGVlcCBjb3B5IHRoZSBpbnB1dCB0byBzbmFwc2hvdCB0aGUgY3VycmVudCBhY2N1bXVsYXRvciB2YWx1ZS4KCQlyZXdhcmREZWJ0WDEyODogICAgICAgICAgYWNjdW11bGF0ZWRSZXdhcmRYMTI4UGVyU3Rha2UuQ2xvbmUoKSwKCQlhY2N1bXVsYXRlZFJld2FyZEFtb3VudDogMCwKCQlhY2N1bXVsYXRlZFRpbWVzdGFtcDogICAgMCwKCQljbGFpbWVkUmV3YXJkQW1vdW50OiAgICAgMCwKCQljbGFpbWVkVGltZXN0YW1wOiAgICAgICAgMCwKCQlzdGFrZWRBbW91bnQ6ICAgICAgICAgICAgMCwKCX0KfQoKLyogR2V0dGVycyAqLwoKLy8gR2V0UmV3YXJkRGVidFgxMjggcmV0dXJucyB0aGUgc2NhbGVkIHJld2FyZCBkZWJ0IHVzZWQgZm9yIGFjY3J1YWwgY2FsY3VsYXRpb25zLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKnUyNTYuVWludDogY3VycmVudCByZXdhcmQgZGVidCBpbiB0aGUgcHJvdG9jb2wncyAxMjgtYml0IGZpeGVkLXBvaW50IHNjYWxlLgpmdW5jIChlICpFbWlzc2lvblJld2FyZFN0YXRlKSBHZXRSZXdhcmREZWJ0WDEyOCgpICp1MjU2LlVpbnQgeyByZXR1cm4gZS5yZXdhcmREZWJ0WDEyOCB9CgovLyBHZXRBY2N1bXVsYXRlZFJld2FyZEFtb3VudCByZXR1cm5zIHJld2FyZHMgYWNjcnVlZCBidXQgbm90IHlldCBjbGFpbWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGFjY3VtdWxhdGVkIHJld2FyZCBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIEdldEFjY3VtdWxhdGVkUmV3YXJkQW1vdW50KCkgaW50NjQgeyByZXR1cm4gZS5hY2N1bXVsYXRlZFJld2FyZEFtb3VudCB9CgovLyBHZXRBY2N1bXVsYXRlZFRpbWVzdGFtcCByZXR1cm5zIHdoZW4gYWNjdW11bGF0ZWQgcmV3YXJkcyB3ZXJlIGxhc3QgdXBkYXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIG9mIHRoZSBsYXN0IGFjY3VtdWxhdGlvbiB1cGRhdGUuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIEdldEFjY3VtdWxhdGVkVGltZXN0YW1wKCkgaW50NjQgeyByZXR1cm4gZS5hY2N1bXVsYXRlZFRpbWVzdGFtcCB9CgovLyBHZXRDbGFpbWVkUmV3YXJkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIHJld2FyZHMgYWxyZWFkeSBjbGFpbWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGNsYWltZWQgcmV3YXJkIGFtb3VudCBpbiB0aGUgc21hbGxlc3QgdG9rZW4gdW5pdC4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRTdGF0ZSkgR2V0Q2xhaW1lZFJld2FyZEFtb3VudCgpIGludDY0IHsgcmV0dXJuIGUuY2xhaW1lZFJld2FyZEFtb3VudCB9CgovLyBHZXRDbGFpbWVkVGltZXN0YW1wIHJldHVybnMgd2hlbiByZXdhcmRzIHdlcmUgbGFzdCBjbGFpbWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgb2YgdGhlIGxhc3QgY2xhaW0uCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIEdldENsYWltZWRUaW1lc3RhbXAoKSBpbnQ2NCB7IHJldHVybiBlLmNsYWltZWRUaW1lc3RhbXAgfQoKLy8gR2V0U3Rha2VkQW1vdW50IHJldHVybnMgdGhlIGFtb3VudCBjdXJyZW50bHkgc3Rha2VkIGZvciB0aGlzIHN0YXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHN0YWtlZCB0b2tlbiBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIEdldFN0YWtlZEFtb3VudCgpIGludDY0IHsgcmV0dXJuIGUuc3Rha2VkQW1vdW50IH0KCi8qIFNldHRlcnMgKi8KLy8gU2V0UmV3YXJkRGVidFgxMjggcmVwbGFjZXMgdGhlIHJld2FyZCBkZWJ0IHdpdGggYSBjb3BpZWQgZml4ZWQtcG9pbnQgdmFsdWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByZXdhcmREZWJ0WDEyODogcmV3YXJkIGRlYnQgaW4gdGhlIHByb3RvY29sJ3MgMTI4LWJpdCBmaXhlZC1wb2ludCBzY2FsZS4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRTdGF0ZSkgU2V0UmV3YXJkRGVidFgxMjgocmV3YXJkRGVidFgxMjggKnUyNTYuVWludCkgewoJZS5yZXdhcmREZWJ0WDEyOCA9IHUyNTYuWmVybygpLlNldChyZXdhcmREZWJ0WDEyOCkKfQoKLy8gU2V0QWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgcmVwbGFjZXMgdGhlIHVuY2xhaW1lZCBhY2N1bXVsYXRlZCByZXdhcmQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYWNjdW11bGF0ZWRSZXdhcmRBbW91bnQ6IGFjY3VtdWxhdGVkIHJld2FyZCBpbiB0aGUgc21hbGxlc3QgdG9rZW4gdW5pdC4KZnVuYyAoZSAqRW1pc3Npb25SZXdhcmRTdGF0ZSkgU2V0QWNjdW11bGF0ZWRSZXdhcmRBbW91bnQoYWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgaW50NjQpIHsKCWUuYWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgPSBhY2N1bXVsYXRlZFJld2FyZEFtb3VudAp9CgovLyBTZXRBY2N1bXVsYXRlZFRpbWVzdGFtcCByZWNvcmRzIHRoZSBsYXRlc3QgcmV3YXJkIGFjY3VtdWxhdGlvbiB0aW1lc3RhbXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhY2N1bXVsYXRlZFRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBmb3IgdGhlIGFjY3VtdWxhdGlvbiB1cGRhdGUuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIFNldEFjY3VtdWxhdGVkVGltZXN0YW1wKGFjY3VtdWxhdGVkVGltZXN0YW1wIGludDY0KSB7CgllLmFjY3VtdWxhdGVkVGltZXN0YW1wID0gYWNjdW11bGF0ZWRUaW1lc3RhbXAKfQoKLy8gU2V0Q2xhaW1lZFJld2FyZEFtb3VudCByZXBsYWNlcyB0aGUgdG90YWwgY2xhaW1lZCByZXdhcmQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2xhaW1lZFJld2FyZEFtb3VudDogY2xhaW1lZCByZXdhcmQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIFNldENsYWltZWRSZXdhcmRBbW91bnQoY2xhaW1lZFJld2FyZEFtb3VudCBpbnQ2NCkgewoJZS5jbGFpbWVkUmV3YXJkQW1vdW50ID0gY2xhaW1lZFJld2FyZEFtb3VudAp9CgovLyBTZXRDbGFpbWVkVGltZXN0YW1wIHJlY29yZHMgdGhlIGxhdGVzdCByZXdhcmQgY2xhaW0gdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY2xhaW1lZFRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBmb3IgdGhlIGNsYWltLgpmdW5jIChlICpFbWlzc2lvblJld2FyZFN0YXRlKSBTZXRDbGFpbWVkVGltZXN0YW1wKGNsYWltZWRUaW1lc3RhbXAgaW50NjQpIHsKCWUuY2xhaW1lZFRpbWVzdGFtcCA9IGNsYWltZWRUaW1lc3RhbXAKfQoKLy8gU2V0U3Rha2VkQW1vdW50IHJlcGxhY2VzIHRoZSBjdXJyZW50IHN0YWtlZCBhbW91bnQuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFrZWRBbW91bnQ6IHN0YWtlZCB0b2tlbiBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQuCmZ1bmMgKGUgKkVtaXNzaW9uUmV3YXJkU3RhdGUpIFNldFN0YWtlZEFtb3VudChzdGFrZWRBbW91bnQgaW50NjQpIHsKCWUuc3Rha2VkQW1vdW50ID0gc3Rha2VkQW1vdW50Cn0KGs0CCgplcnJvcnMuZ25vEr4CcGFja2FnZSBzdGFrZXIKCi8vIEVyclNwb29mZWRSZWFsbSBpcyByZXR1cm5lZCBieSBzdG9yZSBTZXQqIG1ldGhvZHMgd2hlbiB0aGUgc3VwcGxpZWQgcmVhbG0KLy8gdG9rZW4gZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUgKHJsbS5Jc0N1cnJlbnQoKSBpcyBmYWxzZSksCi8vIHJlamVjdGluZyBzcG9vZmVkIG9yIHN0YWxlIHJlYWxtIHRva2VucyBiZWZvcmUgYW55IHdyaXRlIGlzIHBlcmZvcm1lZC4KY29uc3QgRXJyU3Bvb2ZlZFJlYWxtID0gInJsbSBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZSIKGtcEChBnZXR0ZXJfdXRpbHMuZ25vEsIEcGFja2FnZSBzdGFrZXIKCmZ1bmMgY2xvbmVJbnQ2NFNsaWNlKHNyYyBbXWludDY0KSBbXWludDY0IHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCWNsb25lZCA6PSBtYWtlKFtdaW50NjQsIGxlbihzcmMpKQoJY29weShjbG9uZWQsIHNyYykKCXJldHVybiBjbG9uZWQKfQoKZnVuYyBjbG9uZVN0cmluZ0ludDY0TWFwKHNyYyBtYXBbc3RyaW5nXWludDY0KSBtYXBbc3RyaW5nXWludDY0IHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCWNsb25lZCA6PSBtYWtlKG1hcFtzdHJpbmddaW50NjQsIGxlbihzcmMpKQoJZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2Ugc3JjIHsKCQljbG9uZWRba2V5XSA9IHZhbHVlCgl9CglyZXR1cm4gY2xvbmVkCn0KCmZ1bmMgY2xvbmVEZWxlZ2F0aW9uV2l0aGRyYXdzKHNyYyBbXURlbGVnYXRpb25XaXRoZHJhdykgW11EZWxlZ2F0aW9uV2l0aGRyYXcgewoJaWYgc3JjID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJY2xvbmVkIDo9IG1ha2UoW11EZWxlZ2F0aW9uV2l0aGRyYXcsIGxlbihzcmMpKQoJY29weShjbG9uZWQsIHNyYykKCXJldHVybiBjbG9uZWQKfQoanlYKC2dldHRlcnMuZ25vEo5WcGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKCXJvdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvcm90cmVlL3YwIgopCgovLyBHZXRUb3RhbHhHbnNTdXBwbHkgcmV0dXJucyB0b3RhbCB4R05TIHN1cHBseSwgaW5jbHVkaW5nIGxhdW5jaHBhZC1oZWxkIHhHTlMuCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgeEdOUyBzdXBwbHksIGluY2x1ZGluZyB4R05TIGhlbGQgYnkgbGF1bmNocGFkIHByb2plY3RzLgpmdW5jIEdldFRvdGFseEduc1N1cHBseSgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRvdGFseEduc1N1cHBseSgpCn0KCi8vIEdldFRvdGFsRGVsZWdhdGVkIHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBvZiBHTlMgZGVsZWdhdGVkLgovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRvdGFsIEdOUyBhbW91bnQgZGVsZWdhdGVkIGFjcm9zcyBhbGwgZGVsZWdhdG9ycy4KZnVuYyBHZXRUb3RhbERlbGVnYXRlZCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRvdGFsRGVsZWdhdGVkKCkKfQoKLy8gR2V0VG90YWxMb2NrZWRBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgYW1vdW50IG9mIEdOUyBsb2NrZWQgaW4gdW5kZWxlZ2F0aW9uLgovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRvdGFsIEdOUyBhbW91bnQgY3VycmVudGx5IGxvY2tlZCBpbiB1bmRlbGVnYXRpb24gd2l0aGRyYXdhbHMuCmZ1bmMgR2V0VG90YWxMb2NrZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUb3RhbExvY2tlZEFtb3VudCgpCn0KCi8vIEdldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCByZXR1cm5zIHRoZSB1bmRlbGVnYXRpb24gbG9ja3VwIHBlcmlvZCBpbiBzZWNvbmRzLgovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGNvbmZpZ3VyZWQgdW5kZWxlZ2F0aW9uIGxvY2t1cCBkdXJhdGlvbiBpbiBzZWNvbmRzLgpmdW5jIEdldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCgpCn0KCi8vIEdldERlbGVnYXRpb25zIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBldmVyeSBkZWxlZ2F0aW9uLCBrZXllZCBieSB0aGUKLy8gZGVjaW1hbCBzdHJpbmcgZm9ybSBvZiB0aGUgZGVsZWdhdGlvbiBJRC4gQ2FsbGVycyBwYWdpbmF0ZSBpdCB0aGVtc2VsdmVzCi8vIHRocm91Z2ggSXRlcmF0ZUJ5T2Zmc2V0LiBSZWFkaW5nIGFuIGVudHJ5IHlpZWxkcyBhIGNsb25lLCBzbyB0aGUgdmlldyBjYW5ub3QKLy8gbXV0YXRlIHJlYWxtIHN0YXRlLgovLyBSZXR1cm5zOgovLyAgIC0gKnJvdHJlZS5SZWFkT25seVRyZWU6IHJlYWQtb25seSBkZWxlZ2F0aW9uIHZpZXcga2V5ZWQgYnkgZGVjaW1hbCBkZWxlZ2F0aW9uIElEOyBlbnRyeSByZWFkcyByZXR1cm4gY2xvbmVzLgpmdW5jIEdldERlbGVnYXRpb25zKCkgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVsZWdhdGlvbnMoKQp9CgovLyBFeGlzdHNEZWxlZ2F0aW9uIGNoZWNrcyBpZiBhIGRlbGVnYXRpb24gZXhpc3RzLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZGVsZWdhdGlvbklEOiBOdW1lcmljIGlkZW50aWZpZXIgb2YgdGhlIGRlbGVnYXRpb24gdG8gbG9vayB1cC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIGRlbGVnYXRpb24gd2l0aCBkZWxlZ2F0aW9uSUQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgRXhpc3RzRGVsZWdhdGlvbihkZWxlZ2F0aW9uSUQgaW50NjQpIGJvb2wgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuRXhpc3RzRGVsZWdhdGlvbihkZWxlZ2F0aW9uSUQpCn0KCi8vIEdldERlbGVnYXRvckRlbGVnYXRpb25zIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBhIGRlbGVnYXRvcidzIGRlbGVnYXRpb25zLAovLyBrZXllZCBieSBkZWxlZ2F0ZWUgYWRkcmVzcyB3aXRoIHRoYXQgcGFpcidzIGRlbGVnYXRpb24gSURzIGFzIHRoZSB2YWx1ZS4KLy8gUmVhZGluZyBhbiBlbnRyeSB5aWVsZHMgYSBjb3B5IG9mIHRoZSBJRCBzbGljZSwgc28gdGhlIHZpZXcgY2Fubm90IG11dGF0ZQovLyByZWFsbSBzdGF0ZS4gbmlsIGlzIHJldHVybmVkIHdoZW4gdGhlIGRlbGVnYXRvciBoYXMgbm8gZGVsZWdhdGlvbnMuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWxlZ2F0b3I6IEFkZHJlc3Mgd2hvc2UgZGVsZWdhdGlvbnMgc2hvdWxkIGJlIGxpc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpyb3RyZWUuUmVhZE9ubHlUcmVlOiByZWFkLW9ubHkgdmlldyBrZXllZCBieSBkZWxlZ2F0ZWUgYWRkcmVzcywgb3IgbmlsIHdoZW4gZGVsZWdhdG9yIGhhcyBubyBkZWxlZ2F0aW9ucy4KZnVuYyBHZXREZWxlZ2F0b3JEZWxlZ2F0aW9ucyhkZWxlZ2F0b3IgYWRkcmVzcykgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVsZWdhdG9yRGVsZWdhdGlvbnMoZGVsZWdhdG9yKQp9CgovLyBHZXRVc2VyRGVsZWdhdGlvbklEcyByZXR1cm5zIGEgbGlzdCBvZiBkZWxlZ2F0aW9uIElEcyBmb3IgYSBzcGVjaWZpYyBkZWxlZ2F0b3ItZGVsZWdhdGVlIHBhaXIuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWxlZ2F0b3I6IEFkZHJlc3MgdGhhdCBzdXBwbGllZCB0aGUgZGVsZWdhdGlvbi4KLy8gICAtIGRlbGVnYXRlZTogQWRkcmVzcyByZWNlaXZpbmcgdGhhdCBkZWxlZ2F0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gW11pbnQ2NDogZGVsZWdhdGlvbiBJRHMgZm9yIHRoZSBkZWxlZ2F0b3ItZGVsZWdhdGVlIHBhaXI7IHRoZSByZXR1cm5lZCBzbGljZSBpcyBpbmRlcGVuZGVudCBvZiByZWFsbSBzdGF0ZS4KZnVuYyBHZXRVc2VyRGVsZWdhdGlvbklEcyhkZWxlZ2F0b3IgYWRkcmVzcywgZGVsZWdhdGVlIGFkZHJlc3MpIFtdaW50NjQgewoJcmV0dXJuIGNsb25lSW50NjRTbGljZShnZXRJbXBsZW1lbnRhdGlvbigpLkdldFVzZXJEZWxlZ2F0aW9uSURzKGRlbGVnYXRvciwgZGVsZWdhdGVlKSkKfQoKLy8gSGFzRGVsZWdhdGlvblNuYXBzaG90c0tleSByZXR1cm5zIHRydWUgaWYgZGVsZWdhdGlvbiBoaXN0b3J5IGV4aXN0cy4KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBkZWxlZ2F0aW9uIGhpc3RvcnkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gc3RvcmFnZS4KZnVuYyBIYXNEZWxlZ2F0aW9uU25hcHNob3RzS2V5KCkgYm9vbCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5IYXNEZWxlZ2F0aW9uU25hcHNob3RzS2V5KCkKfQoKLy8gR2V0VG90YWxEZWxlZ2F0aW9uQW1vdW50QXRTbmFwc2hvdCByZXR1cm5zIHRvdGFsIGRlbGVnYXRpb24gYXQgYSBVbml4Ci8vIHRpbWVzdGFtcCwgdXNpbmcgdGhlIGxhdGVzdCBoaXN0b3J5IGVudHJ5IGF0IG9yIGJlZm9yZSB0aGF0IHRpbWVzdGFtcC4KLy8gVGhlIGxvb2t1cCBpcyB0aW1lc3RhbXAtYmFzZWQgcmF0aGVyIHRoYW4gYSBibG9jay1oZWlnaHQgc25hcHNob3QuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzbmFwc2hvdFRpbWU6IFVuaXggdGltZXN0YW1wIGF0IG9yIGJlZm9yZSB3aGljaCB0byBzZWxlY3QgdGhlIGxhdGVzdCBhZ2dyZWdhdGUgZGVsZWdhdGlvbiBoaXN0b3J5IGVudHJ5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGFnZ3JlZ2F0ZSBkZWxlZ2F0ZWQgYW1vdW50IHJlY29yZGVkIGF0IG9yIGJlZm9yZSBzbmFwc2hvdFRpbWUuCi8vICAgLSBib29sOiB0cnVlIHdoZW4gYSBxdWFsaWZ5aW5nIGhpc3RvcnkgZW50cnkgZXhpc3RzOyBmYWxzZSB3aGVuIG5vIGVudHJ5IGlzIGF2YWlsYWJsZS4KZnVuYyBHZXRUb3RhbERlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHNuYXBzaG90VGltZSBpbnQ2NCkgKGludDY0LCBib29sKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUb3RhbERlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHNuYXBzaG90VGltZSkKfQoKLy8gR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90IHJldHVybnMgb25lIHVzZXIncyBkZWxlZ2F0aW9uIGF0IGEgVW5peAovLyB0aW1lc3RhbXAsIHVzaW5nIHRoYXQgdXNlcidzIGxhdGVzdCBoaXN0b3J5IGVudHJ5IGF0IG9yIGJlZm9yZSB0aGUgdGltZXN0YW1wLgovLyBUaGUgYm9vbCBpcyBmYWxzZSB3aGVuIG5vIHF1YWxpZnlpbmcgaGlzdG9yeSBlbnRyeSBleGlzdHMuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB1c2VyQWRkcjogRGVsZWdhdG9yIGFkZHJlc3Mgd2hvc2UgaGlzdG9yaWNhbCBkZWxlZ2F0aW9uIGlzIHF1ZXJpZWQuCi8vICAgLSBzbmFwc2hvdFRpbWU6IFVuaXggdGltZXN0YW1wIGF0IG9yIGJlZm9yZSB3aGljaCB0byBzZWxlY3QgdGhlIHVzZXIncyBsYXRlc3QgaGlzdG9yeSBlbnRyeS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB1c2VyJ3MgZGVsZWdhdGVkIGFtb3VudCByZWNvcmRlZCBhdCBvciBiZWZvcmUgc25hcHNob3RUaW1lLgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgcXVhbGlmeWluZyB1c2VyLWhpc3RvcnkgZW50cnkgZXhpc3RzOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHVzZXJBZGRyIGFkZHJlc3MsIHNuYXBzaG90VGltZSBpbnQ2NCkgKGludDY0LCBib29sKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRVc2VyRGVsZWdhdGlvbkFtb3VudEF0U25hcHNob3QodXNlckFkZHIsIHNuYXBzaG90VGltZSkKfQoKLy8gR2V0Q2xhaW1hYmxlUmV3YXJkQnlBZGRyZXNzIHJldHVybnMgY2xhaW1hYmxlIHJld2FyZHMgZm9yIGFuIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhZGRyOiBBZGRyZXNzIHdob3NlIGVtaXNzaW9uIGFuZCBwcm90b2NvbC1mZWUgcmV3YXJkcyBhcmUgcXVlcmllZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBlbWlzc2lvbiByZXdhcmQgYW1vdW50IGF2YWlsYWJsZSB0byBhZGRyLgovLyAgIC0gbWFwW3N0cmluZ11pbnQ2NDogcHJvdG9jb2wtZmVlIHJld2FyZCBhbW91bnRzIGtleWVkIGJ5IHRva2VuIHBhdGguCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IG5vbi1uaWwgd2hlbiByZXdhcmQgc3RhdGUgY2Fubm90IGJlIHJlc29sdmVkIGZvciBhZGRyLgpmdW5jIEdldENsYWltYWJsZVJld2FyZEJ5QWRkcmVzcyhhZGRyIGFkZHJlc3MpIChpbnQ2NCwgbWFwW3N0cmluZ11pbnQ2NCwgZXJyb3IpIHsKCWVtaXNzaW9uUmV3YXJkLCBwcm90b2NvbEZlZXMsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldENsYWltYWJsZVJld2FyZEJ5QWRkcmVzcyhhZGRyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIG5pbCwgZXJyCgl9CglyZXR1cm4gZW1pc3Npb25SZXdhcmQsIGNsb25lU3RyaW5nSW50NjRNYXAocHJvdG9jb2xGZWVzKSwgbmlsCn0KCi8vIEdldENsYWltYWJsZVJld2FyZEJ5TGF1bmNocGFkIHJldHVybnMgY2xhaW1hYmxlIGxhdW5jaHBhZCByZXdhcmRzIGZvciBhbiBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYWRkcjogQWRkcmVzcyB3aG9zZSBsYXVuY2hwYWQgYW5kIHByb3RvY29sLWZlZSByZXdhcmRzIGFyZSBxdWVyaWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGVtaXNzaW9uIHJld2FyZCBhbW91bnQgYXZhaWxhYmxlIHRvIGFkZHIuCi8vICAgLSBtYXBbc3RyaW5nXWludDY0OiBwcm90b2NvbC1mZWUgcmV3YXJkIGFtb3VudHMga2V5ZWQgYnkgdG9rZW4gcGF0aC4KLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2Vzczsgbm9uLW5pbCB3aGVuIHJld2FyZCBzdGF0ZSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGFkZHIuCmZ1bmMgR2V0Q2xhaW1hYmxlUmV3YXJkQnlMYXVuY2hwYWQoYWRkciBhZGRyZXNzKSAoaW50NjQsIG1hcFtzdHJpbmddaW50NjQsIGVycm9yKSB7CgllbWlzc2lvblJld2FyZCwgcHJvdG9jb2xGZWVzLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRDbGFpbWFibGVSZXdhcmRCeUxhdW5jaHBhZChhZGRyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIG5pbCwgZXJyCgl9CglyZXR1cm4gZW1pc3Npb25SZXdhcmQsIGNsb25lU3RyaW5nSW50NjRNYXAocHJvdG9jb2xGZWVzKSwgbmlsCn0KCi8vIEdldENsYWltYWJsZVJld2FyZEJ5UmV3YXJkSUQgcmV0dXJucyBjbGFpbWFibGUgcmV3YXJkIGRldGFpbHMgYnkgcmV3YXJkIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmV3YXJkSUQ6IFJld2FyZC1zdGF0ZSBpZGVudGlmaWVyIHdob3NlIGNsYWltYWJsZSByZXdhcmRzIGFyZSBxdWVyaWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGVtaXNzaW9uIHJld2FyZCBhbW91bnQgYXNzb2NpYXRlZCB3aXRoIHJld2FyZElELgovLyAgIC0gbWFwW3N0cmluZ11pbnQ2NDogcHJvdG9jb2wtZmVlIHJld2FyZCBhbW91bnRzIGtleWVkIGJ5IHRva2VuIHBhdGguCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IG5vbi1uaWwgd2hlbiByZXdhcmRJRCBjYW5ub3QgYmUgcmVzb2x2ZWQuCmZ1bmMgR2V0Q2xhaW1hYmxlUmV3YXJkQnlSZXdhcmRJRChyZXdhcmRJRCBzdHJpbmcpIChpbnQ2NCwgbWFwW3N0cmluZ11pbnQ2NCwgZXJyb3IpIHsKCWVtaXNzaW9uUmV3YXJkLCBwcm90b2NvbEZlZXMsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldENsYWltYWJsZVJld2FyZEJ5UmV3YXJkSUQocmV3YXJkSUQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgbmlsLCBlcnIKCX0KCXJldHVybiBlbWlzc2lvblJld2FyZCwgY2xvbmVTdHJpbmdJbnQ2NE1hcChwcm90b2NvbEZlZXMpLCBuaWwKfQoKLy8gR2V0TGF1bmNocGFkUHJvamVjdERlcG9zaXQgcmV0dXJucyB0aGUgZGVwb3NpdCBhbW91bnQgZm9yIGEgbGF1bmNocGFkIHByb2plY3QuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0QWRkcjogTGF1bmNocGFkIHByb2plY3QgYWRkcmVzcyB3aG9zZSBkZXBvc2l0ZWQgYW1vdW50IGlzIHF1ZXJpZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogcmVjb3JkZWQgbGF1bmNocGFkIHByb2plY3QgZGVwb3NpdCBhbW91bnQuCi8vICAgLSBib29sOiB0cnVlIHdoZW4gYSBkZXBvc2l0IHJlY29yZCBleGlzdHMgZm9yIHByb2plY3RBZGRyOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgR2V0TGF1bmNocGFkUHJvamVjdERlcG9zaXQocHJvamVjdEFkZHIgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldExhdW5jaHBhZFByb2plY3REZXBvc2l0KHByb2plY3RBZGRyKQp9CgovLyBHZXREZWxlZ2F0aW9uV2l0aGRyYXdDb3VudCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVsZWdhdGlvbiB3aXRoZHJhd3MgZm9yIGEgc3BlY2lmaWMgZGVsZWdhdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlbGVnYXRpb25JRDogSWRlbnRpZmllciBvZiB0aGUgZGVsZWdhdGlvbiB3aG9zZSB3aXRoZHJhd2FscyBhcmUgY291bnRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDogbnVtYmVyIG9mIHdpdGhkcmF3YWwgcmVjb3JkcyBhc3NvY2lhdGVkIHdpdGggZGVsZWdhdGlvbklELgpmdW5jIEdldERlbGVnYXRpb25XaXRoZHJhd0NvdW50KGRlbGVnYXRpb25JRCBpbnQ2NCkgaW50IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlbGVnYXRpb25XaXRoZHJhd0NvdW50KGRlbGVnYXRpb25JRCkKfQoKLy8gR2V0RGVsZWdhdGlvbldpdGhkcmF3cyByZXR1cm5zIGEgcGFnaW5hdGVkIGxpc3Qgb2YgZGVsZWdhdGlvbiB3aXRoZHJhd3MgZm9yIGEgc3BlY2lmaWMgZGVsZWdhdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlbGVnYXRpb25JRDogSWRlbnRpZmllciBvZiB0aGUgZGVsZWdhdGlvbiB3aG9zZSB3aXRoZHJhd2FscyBhcmUgcmVxdWVzdGVkLgovLyAgIC0gb2Zmc2V0OiBOdW1iZXIgb2YgbWF0Y2hpbmcgd2l0aGRyYXdhbCByZWNvcmRzIHRvIHNraXAgYmVmb3JlIGNvbGxlY3RpbmcgcmVzdWx0cy4KLy8gICAtIGNvdW50OiBNYXhpbXVtIG51bWJlciBvZiB3aXRoZHJhd2FsIHJlY29yZHMgdG8gcmV0dXJuLgovLwovLyBSZXR1cm5zOgovLyAgIC0gW11EZWxlZ2F0aW9uV2l0aGRyYXc6IHJlcXVlc3RlZCBwYWdlIG9mIHdpdGhkcmF3YWwgcmVjb3JkcywgY29waWVkIGJlZm9yZSByZXR1cm5pbmcuCi8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IG5vbi1uaWwgd2hlbiB0aGUgcmVxdWVzdGVkIGRlbGVnYXRpb24gb3IgcGFnZSBjYW5ub3QgYmUgcmVhZC4KZnVuYyBHZXREZWxlZ2F0aW9uV2l0aGRyYXdzKGRlbGVnYXRpb25JRCBpbnQ2NCwgb2Zmc2V0LCBjb3VudCBpbnQpIChbXURlbGVnYXRpb25XaXRoZHJhdywgZXJyb3IpIHsKCXdpdGhkcmF3cywgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVsZWdhdGlvbldpdGhkcmF3cyhkZWxlZ2F0aW9uSUQsIG9mZnNldCwgY291bnQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCXJldHVybiBjbG9uZURlbGVnYXRpb25XaXRoZHJhd3Mod2l0aGRyYXdzKSwgbmlsCn0KCi8vIEdldENvbGxlY3RhYmxlV2l0aGRyYXdBbW91bnQgcmV0dXJucyB0aGUgY29sbGVjdGFibGUgd2l0aGRyYXcgYW1vdW50IGZvciBhIHNwZWNpZmljIGRlbGVnYXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWxlZ2F0aW9uSUQ6IElkZW50aWZpZXIgb2YgdGhlIGRlbGVnYXRpb24gd2hvc2UgY29sbGVjdGFibGUgYW1vdW50IGlzIHF1ZXJpZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogYW1vdW50IGN1cnJlbnRseSBhdmFpbGFibGUgdG8gY29sbGVjdCBmcm9tIGRlbGVnYXRpb25JRC4KZnVuYyBHZXRDb2xsZWN0YWJsZVdpdGhkcmF3QW1vdW50KGRlbGVnYXRpb25JRCBpbnQ2NCkgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0Q29sbGVjdGFibGVXaXRoZHJhd0Ftb3VudChkZWxlZ2F0aW9uSUQpCn0KCi8vIEdldFByb3RvY29sRmVlQWNjdW11bGF0ZWRYMTI4UGVyU3Rha2UgcmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgcHJvdG9jb2wgZmVlIHBlciBzdGFrZSAoUTEyOCkgZm9yIGEgdG9rZW4gcGF0aC4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBwYXRoIHdob3NlIHByb3RvY29sLWZlZSBhY2N1bXVsYXRvciBpcyBxdWVyaWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKnUyNTYuVWludDogYWNjdW11bGF0ZWQgcHJvdG9jb2wtZmVlIGFtb3VudCBwZXIgdW5pdCBzdGFrZSBpbiBRMTI4IGZpeGVkLXBvaW50IGZvcm0uCmZ1bmMgR2V0UHJvdG9jb2xGZWVBY2N1bXVsYXRlZFgxMjhQZXJTdGFrZSh0b2tlblBhdGggc3RyaW5nKSAqdTI1Ni5VaW50IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3RvY29sRmVlQWNjdW11bGF0ZWRYMTI4UGVyU3Rha2UodG9rZW5QYXRoKS5DbG9uZSgpCn0KCi8vIEdldFByb3RvY29sRmVlQW1vdW50IHJldHVybnMgdGhlIHByb3RvY29sIGZlZSBhbW91bnRzIGZvciBhIHRva2VuIHBhdGguCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gcGF0aCB3aG9zZSBwcm90b2NvbCBmZWVzIGFyZSBxdWVyaWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGFjY3VtdWxhdGVkIHByb3RvY29sLWZlZSBhbW91bnQgZm9yIHRva2VuUGF0aCBpbiB0b2tlbiBiYXNlIHVuaXRzLgpmdW5jIEdldFByb3RvY29sRmVlQW1vdW50KHRva2VuUGF0aCBzdHJpbmcpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3RvY29sRmVlQW1vdW50KHRva2VuUGF0aCkKfQoKLy8gR2V0UHJvdG9jb2xGZWVBY2N1bXVsYXRlZFRpbWVzdGFtcCByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB0aW1lc3RhbXAgZm9yIHByb3RvY29sIGZlZSByZXdhcmRzLgovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHByb3RvY29sLWZlZSBhY2N1bXVsYXRpb24gd2FzIGxhc3QgdXBkYXRlZC4KZnVuYyBHZXRQcm90b2NvbEZlZUFjY3VtdWxhdGVkVGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvdG9jb2xGZWVBY2N1bXVsYXRlZFRpbWVzdGFtcCgpCn0KCi8vIEdldEVtaXNzaW9uQWNjdW11bGF0ZWRYMTI4UGVyU3Rha2UgcmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgZW1pc3Npb24gcGVyIHN0YWtlIChRMTI4KS4KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IGFjY3VtdWxhdGVkIGVtaXNzaW9uIHJld2FyZCBwZXIgdW5pdCBzdGFrZSBpbiBRMTI4IGZpeGVkLXBvaW50IGZvcm0uCmZ1bmMgR2V0RW1pc3Npb25BY2N1bXVsYXRlZFgxMjhQZXJTdGFrZSgpICp1MjU2LlVpbnQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RW1pc3Npb25BY2N1bXVsYXRlZFgxMjhQZXJTdGFrZSgpLkNsb25lKCkKfQoKLy8gR2V0RW1pc3Npb25EaXN0cmlidXRlZEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBkaXN0cmlidXRlZCBlbWlzc2lvbiBhbW91bnQuCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgZW1pc3Npb24gYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHN0YWtlcnMuCmZ1bmMgR2V0RW1pc3Npb25EaXN0cmlidXRlZEFtb3VudCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEVtaXNzaW9uRGlzdHJpYnV0ZWRBbW91bnQoKQp9CgovLyBHZXRFbWlzc2lvbkFjY3VtdWxhdGVkVGltZXN0YW1wIHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHRpbWVzdGFtcCBmb3IgZW1pc3Npb24gcmV3YXJkcy4KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCBlbWlzc2lvbiBhY2N1bXVsYXRpb24gd2FzIGxhc3QgdXBkYXRlZC4KZnVuYyBHZXRFbWlzc2lvbkFjY3VtdWxhdGVkVGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RW1pc3Npb25BY2N1bXVsYXRlZFRpbWVzdGFtcCgpCn0KGkQKC2dub21vZC50b21sEjVtb2R1bGUgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2dvdi9zdGFrZXIiCmdubyA9ICIwLjkiChqaEwoebGF1bmNocGFkX3Byb2plY3RfZGVwb3NpdHMuZ25vEvcScGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgopCgovLyBMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMgbWFuYWdlcyBkZXBvc2l0IGFtb3VudHMgZm9yIGxhdW5jaHBhZCBwcm9qZWN0cy4KLy8gSXQgdHJhY2tzIHRoZSB0b3RhbCBzdGFrZWQgYW1vdW50IGZvciBlYWNoIHByb2plY3QgaWRlbnRpZmllZCBieSBvd25lciBhZGRyZXNzLgp0eXBlIExhdW5jaHBhZFByb2plY3REZXBvc2l0cyBzdHJ1Y3QgewoJLy8gZGVwb3NpdHMgbWFwcyBvd25lciBhZGRyZXNzIHRvIGRlcG9zaXQgYW1vdW50CglkZXBvc2l0cyAqYnB0cmVlLkJQVHJlZSAvLyBzdHJpbmcgLT4gaW50NjQKfQoKLy8gTmV3TGF1bmNocGFkUHJvamVjdERlcG9zaXRzIGNyZWF0ZXMgYW4gZW1wdHkgb3duZXItdG8tZGVwb3NpdCB0cmVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkxhdW5jaHBhZFByb2plY3REZXBvc2l0czogZGVwb3NpdCBtYW5hZ2VyIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdHJlZS4KZnVuYyBOZXdMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMoKSAqTGF1bmNocGFkUHJvamVjdERlcG9zaXRzIHsKCXJldHVybiAmTGF1bmNocGFkUHJvamVjdERlcG9zaXRzewoJCWRlcG9zaXRzOiBicHRyZWUuTmV3QlBUcmVlTigxNiksCgl9Cn0KCi8vIEdldERlcG9zaXRzIHJldHVybnMgdGhlIG93bmVyLXRvLWRlcG9zaXQgdHJlZSBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogdHJlZSBrZXllZCBieSBvd25lciBhZGRyZXNzIHN0cmluZyBhbmQgc3RvcmluZyBpbnQ2NCBhbW91bnRzLgpmdW5jIChscGQgKkxhdW5jaHBhZFByb2plY3REZXBvc2l0cykgR2V0RGVwb3NpdHMoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gbHBkLmRlcG9zaXRzCn0KCi8vIFNldERlcG9zaXRzIHJlcGxhY2VzIHRoZSBvd25lci10by1kZXBvc2l0IHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0czogdHJlZSBrZXllZCBieSBvd25lciBhZGRyZXNzIHN0cmluZyBhbmQgc3RvcmluZyBpbnQ2NCBhbW91bnRzLgpmdW5jIChscGQgKkxhdW5jaHBhZFByb2plY3REZXBvc2l0cykgU2V0RGVwb3NpdHMoZGVwb3NpdHMgKmJwdHJlZS5CUFRyZWUpIHsKCWxwZC5kZXBvc2l0cyA9IGRlcG9zaXRzCn0KCi8vIEdldERlcG9zaXQgbG9va3MgdXAgYSBwcm9qZWN0J3MgZGVwb3NpdCBieSBvd25lciBhZGRyZXNzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gb3duZXJBZGRyZXNzOiBvd25lciBhZGRyZXNzIHN0cmluZyB1c2VkIGFzIHRoZSBkZXBvc2l0IGtleS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBzdG9yZWQgZGVwb3NpdCBhbW91bnQgaW4gdGhlIHNtYWxsZXN0IHRva2VuIHVuaXQsIG9yIHplcm8gd2hlbiBhYnNlbnQuCi8vICAgLSBib29sOiB0cnVlIHdoZW4gYW4gaW50NjQgZGVwb3NpdCBpcyBzdG9yZWQgZm9yIHRoZSBvd25lci4KZnVuYyAobHBkICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMpIEdldERlcG9zaXQob3duZXJBZGRyZXNzIHN0cmluZykgKGludDY0LCBib29sKSB7CglkZXBvc2l0IDo9IGxwZC5kZXBvc2l0cy5HZXQob3duZXJBZGRyZXNzKQoJaWYgZGVwb3NpdCA9PSBuaWwgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJYW1vdW50LCBvayA6PSBkZXBvc2l0LihpbnQ2NCkKCXJldHVybiBhbW91bnQsIG9rCn0KCi8vIFNldERlcG9zaXQgc3RvcmVzIG9yIHJlcGxhY2VzIGFuIG93bmVyJ3MgZGVwb3NpdCBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBvd25lckFkZHJlc3M6IG93bmVyIGFkZHJlc3Mgc3RyaW5nIHVzZWQgYXMgdGhlIGRlcG9zaXQga2V5LgovLyAgIC0gYW1vdW50OiBkZXBvc2l0IGFtb3VudCBpbiB0aGUgc21hbGxlc3QgdG9rZW4gdW5pdC4KZnVuYyAobHBkICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMpIFNldERlcG9zaXQob3duZXJBZGRyZXNzIHN0cmluZywgYW1vdW50IGludDY0KSB7CglscGQuZGVwb3NpdHMuU2V0KG93bmVyQWRkcmVzcywgYW1vdW50KQp9CgovLyBSZW1vdmVEZXBvc2l0IHJlbW92ZXMgYW4gb3duZXIncyBkZXBvc2l0IGVudHJ5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gb3duZXJBZGRyZXNzOiBvd25lciBhZGRyZXNzIHN0cmluZyB3aG9zZSBkZXBvc2l0IGVudHJ5IHNob3VsZCBiZSByZW1vdmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGFuIGVudHJ5IHdhcyByZW1vdmVkOyBmYWxzZSB3aGVuIG5vIGVudHJ5IGV4aXN0ZWQuCmZ1bmMgKGxwZCAqTGF1bmNocGFkUHJvamVjdERlcG9zaXRzKSBSZW1vdmVEZXBvc2l0KG93bmVyQWRkcmVzcyBzdHJpbmcpIGJvb2wgewoJXywgb2sgOj0gbHBkLmRlcG9zaXRzLlJlbW92ZShvd25lckFkZHJlc3MpCglyZXR1cm4gb2sKfQoalkQKH3Byb3RvY29sX2ZlZV9yZXdhcmRfbWFuYWdlci5nbm8S8kNwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIFByb3RvY29sRmVlUmV3YXJkTWFuYWdlciBkaXN0cmlidXRlcyBwcm90b2NvbCBmZWVzIHRvIHN0YWtlcnMuCi8vCi8vIFByb3RvY29sIGZlZXMgYXJyaXZlIGluIG1hbnkgdG9rZW5zLCBzbyB0aGUgbWFuYWdlciBrZWVwcyBvbmUgYWNjdW11bGF0b3IgcGVyIHRva2VuCi8vIGluc3RlYWQgb2YgYSBzaW5nbGUgb25lLiBBIHN0YWtlIGNoYW5nZSBuZXZlciB0b3VjaGVzIHRob3NlIGFjY3VtdWxhdG9yczogaXQgYWR2YW5jZXMKLy8gdGhlIGFjY3J1YWwgZXBvY2gsIHJlY29yZHMgdGhlIHRvdGFsIHN0YWtlIGluIGZvcmNlIGZyb20gdGhhdCBlcG9jaCwgYW5kIGFwcGVuZHMgb25lCi8vIGV2ZW50IGZvciBhbiBvcmRpbmFyeSBhZGQvcmVtb3ZlLiBSZWRlbGVnYXRlIHBlcmZvcm1zIGEgcmVtb3ZlIHBsdXMgYW4gYWRkIGFuZAovLyB0aGVyZWZvcmUgYXBwZW5kcyB0d28gZXZlbnRzLiBUaGUgcGVyLXRva2VuIHdvcmsgaGFwcGVucyB3aGVuIGEgdG9rZW4gaXMgY29sbGVjdGVkLAovLyBzbyBzdGFrZS1jaGFuZ2UgY29zdCBkb2VzIG5vdCBkZXBlbmQgb24gaG93IG1hbnkgdG9rZW5zIGV2ZXIgY29sbGVjdGVkIGEgZmVlLgp0eXBlIFByb3RvY29sRmVlUmV3YXJkTWFuYWdlciBzdHJ1Y3QgewoJLy8gcmV3YXJkU3RhdGVzIG1hcHMgYSByZXdhcmQgSUQgdG8gdGhlIFByb3RvY29sRmVlUmV3YXJkU3RhdGUgdHJhY2tpbmcgdGhhdCBzdGFrZXIKCXJld2FyZFN0YXRlcyAqYnB0cmVlLkJQVHJlZSAvLyByZXdhcmRJRCAtPiAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZQoJLy8gdG9rZW5BY2N1bXVsYXRvcnMgbWFwcyBhIHRva2VuIHBhdGggdG8gaXRzIFByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcgoJdG9rZW5BY2N1bXVsYXRvcnMgKmJwdHJlZS5CUFRyZWUgLy8gdG9rZW5QYXRoIC0+ICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IKCS8vIGN1cnJlbnRFcG9jaCBpcyB0aGUgYWNjcnVhbCBlcG9jaCBpbiBmb3JjZSwgbWlycm9yZWQgZnJvbSBwcm90b2NvbF9mZWUKCWN1cnJlbnRFcG9jaCBpbnQ2NAoJLy8gdG90YWxTdGFrZWRBbW91bnQgaXMgdGhlIHRvdGFsIGFtb3VudCBjdXJyZW50bHkgc3Rha2VkCgl0b3RhbFN0YWtlZEFtb3VudCBpbnQ2NAoJLy8gdG90YWxTdGFrZWRIaXN0b3J5IHJlY29yZHMgdGhlIHRvdGFsIHN0YWtlZCBhbW91bnQgaW4gZm9yY2UgZnJvbSBlYWNoIGVwb2NoCgl0b3RhbFN0YWtlZEhpc3RvcnkgKlVpbnRUcmVlIC8vIGVwb2NoIC0+IGludDY0CgkvLyBhY2N1bXVsYXRlZFRpbWVzdGFtcCBpcyB0aGUgbGFzdCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGFjY3J1YWwgc3RhdGUgbW92ZWQ6IGEgZm9sZCBvciBhIHN0YWtlIGNoYW5nZQoJYWNjdW11bGF0ZWRUaW1lc3RhbXAgaW50NjQKfQoKLy8gTmV3UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcjogbmV3IHByb3RvY29sIGZlZSByZXdhcmQgbWFuYWdlciBpbnN0YW5jZQpmdW5jIE5ld1Byb3RvY29sRmVlUmV3YXJkTWFuYWdlcigpICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIgewoJdG90YWxTdGFrZWRIaXN0b3J5IDo9IE5ld1VpbnRUcmVlKCkKCXRvdGFsU3Rha2VkSGlzdG9yeS5TZXQoMCwgaW50NjQoMCkpCgoJcmV0dXJuICZQcm90b2NvbEZlZVJld2FyZE1hbmFnZXJ7CgkJcmV3YXJkU3RhdGVzOiAgICAgICAgIGJwdHJlZS5OZXdCUFRyZWVOKDE2KSwKCQl0b2tlbkFjY3VtdWxhdG9yczogICAgYnB0cmVlLk5ld0JQVHJlZU4oMTYpLAoJCWN1cnJlbnRFcG9jaDogICAgICAgICAwLAoJCXRvdGFsU3Rha2VkQW1vdW50OiAgICAwLAoJCXRvdGFsU3Rha2VkSGlzdG9yeTogICB0b3RhbFN0YWtlZEhpc3RvcnksCgkJYWNjdW11bGF0ZWRUaW1lc3RhbXA6IDAsCgl9Cn0KCi8qIEdldHRlcnMgKi8KCi8vIEdldFJld2FyZFN0YXRlIHJldHJpZXZlcyB0aGUgcmV3YXJkIHN0YXRlIGlkZW50aWZpZWQgYnkgcmV3YXJkSUQuCi8vIE1pc3NpbmcgSURzIHJldHVybiBuaWwgYW5kIGZhbHNlOyBhIHN0b3JlZCB2YWx1ZSBvZiB0aGUgd3JvbmcgdHlwZSByZXR1cm5zCi8vIGFuIGVycm9yLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmV3YXJkSUQ6IGlkZW50aWZpZXIgb2YgdGhlIHN0YWtlciByZXdhcmQgc3RhdGUgdG8gcmV0cmlldmUKLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm90b2NvbEZlZVJld2FyZFN0YXRlOiBzdG9yZWQgcmV3YXJkIHN0YXRlLCBvciBuaWwgd2hlbiByZXdhcmRJRCBpcyBhYnNlbnQgb3IgaW52YWxpZAovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgY29ycmVjdGx5IHR5cGVkIHJld2FyZCBzdGF0ZSB3YXMgZm91bmQKLy8gICAtIGVycm9yOiBuaWwgd2hlbiBhYnNlbnQgb3IgZm91bmQ7IGEgY2FzdCBlcnJvciB3aGVuIHRoZSBzdG9yZWQgdmFsdWUgaGFzIHRoZSB3cm9uZyB0eXBlCmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgR2V0UmV3YXJkU3RhdGUocmV3YXJkSUQgc3RyaW5nKSAoKlByb3RvY29sRmVlUmV3YXJkU3RhdGUsIGJvb2wsIGVycm9yKSB7CglyaSA6PSBwLnJld2FyZFN0YXRlcy5HZXQocmV3YXJkSUQpCglpZiByaSA9PSBuaWwgewoJCXJldHVybiBuaWwsIGZhbHNlLCBuaWwKCX0KCXJzLCBjYXN0T2sgOj0gcmkuKCpQcm90b2NvbEZlZVJld2FyZFN0YXRlKQoJaWYgIWNhc3RPayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UsIHVmbXQuRXJyb3JmKGVyckZhaWxlZFRvQ2FzdFJld2FyZFN0YXRlLCByaSkKCX0KCXJldHVybiBycywgdHJ1ZSwgbmlsCn0KCi8vIEdldFRva2VuQWNjdW11bGF0b3IgcmV0dXJucyB0aGUgYWNjdW11bGF0b3Igb2YgdG9rZW5QYXRoLCBvciBmYWxzZSB3aGVuIHRoZSB0b2tlbgovLyBuZXZlciBoYWQgYSBmZWUgZm9sZGVkIGluLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBwYWNrYWdlIHBhdGggd2hvc2UgcHJvdG9jb2wtZmVlIGFjY3VtdWxhdG9yIGlzIHJlcXVlc3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcjogYWNjdW11bGF0b3IgZm9yIHRva2VuUGF0aCwgb3IgbmlsIHdoZW4gbm9uZSBleGlzdHMKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0b2tlblBhdGggaGFzIGEgZm9sZGVkLWZlZSBhY2N1bXVsYXRvcgpmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpIEdldFRva2VuQWNjdW11bGF0b3IodG9rZW5QYXRoIHN0cmluZykgKCpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IsIGJvb2wpIHsKCWFpIDo9IHAudG9rZW5BY2N1bXVsYXRvcnMuR2V0KHRva2VuUGF0aCkKCWlmIGFpID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCWFjY3VtdWxhdG9yLCBjYXN0T2sgOj0gYWkuKCpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IpCglpZiAhY2FzdE9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHRva2VuIGFjY3VtdWxhdG9yOiAlVCIsIGFpKSkKCX0KCXJldHVybiBhY2N1bXVsYXRvciwgdHJ1ZQp9CgovLyBHZXRUb2tlblBhdGhzIHJldHVybnMgZXZlcnkgdG9rZW4gcGF0aCB0aGF0IGhhZCBhIGZlZSBmb2xkZWQgaW4sIGluIGtleSBvcmRlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFtdc3RyaW5nOiB0b2tlbiBwYXRocyBwcmVzZW50IGluIHRoZSBhY2N1bXVsYXRvciB0cmVlLCBvcmRlcmVkIGJ5IHRyZWUga2V5CmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgR2V0VG9rZW5QYXRocygpIFtdc3RyaW5nIHsKCXRva2VuUGF0aHMgOj0gbWFrZShbXXN0cmluZywgMCwgcC50b2tlbkFjY3VtdWxhdG9ycy5TaXplKCkpCglwLnRva2VuQWNjdW11bGF0b3JzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsKCQl0b2tlblBhdGhzID0gYXBwZW5kKHRva2VuUGF0aHMsIGtleSkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gdG9rZW5QYXRocwp9CgovLyBHZXRBY2N1bXVsYXRlZFByb3RvY29sRmVlWDEyOFBlclN0YWtlIHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIGZlZSBwZXIgc3Rha2Ugb2YgdG9rZW5QYXRoCi8vIChzY2FsZWQgYnkgMl4xMjgpLCBvciBuaWwgd2hlbiB0aGUgdG9rZW4gbmV2ZXIgaGFkIGEgZmVlIGZvbGRlZCBpbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGFja2FnZSBwYXRoIHdob3NlIGFjY3VtdWxhdGVkIHBlci1zdGFrZSBmZWUgaXMgcmVxdWVzdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqdTI1Ni5VaW50OiBhY2N1bXVsYXRlZCBmZWUgcGVyIHN0YWtlIHNjYWxlZCBieSAyXjEyOCwgb3IgbmlsIHdoZW4gdG9rZW5QYXRoIGhhcyBubyBhY2N1bXVsYXRvcgpmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpIEdldEFjY3VtdWxhdGVkUHJvdG9jb2xGZWVYMTI4UGVyU3Rha2UodG9rZW5QYXRoIHN0cmluZykgKnUyNTYuVWludCB7CglhY2N1bXVsYXRvciwgb2sgOj0gcC5HZXRUb2tlbkFjY3VtdWxhdG9yKHRva2VuUGF0aCkKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIGFjY3VtdWxhdG9yLkdldEFjY3VtdWxhdGVkWDEyOFBlclN0YWtlKCkKfQoKLy8gR2V0UHJvdG9jb2xGZWVBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgZmVlIGFtb3VudCBmb2xkZWQgaW4gZm9yIHRva2VuUGF0aC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGFja2FnZSBwYXRoIHdob3NlIGZvbGRlZCBwcm90b2NvbC1mZWUgYW1vdW50IGlzIHJlcXVlc3RlZAovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRvdGFsIGZlZSBhbW91bnQgZm9sZGVkIGZvciB0b2tlblBhdGgsIG9yIHplcm8gd2hlbiBubyBhY2N1bXVsYXRvciBleGlzdHMKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyKSBHZXRQcm90b2NvbEZlZUFtb3VudCh0b2tlblBhdGggc3RyaW5nKSBpbnQ2NCB7CglhY2N1bXVsYXRvciwgb2sgOj0gcC5HZXRUb2tlbkFjY3VtdWxhdG9yKHRva2VuUGF0aCkKCWlmICFvayB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBhY2N1bXVsYXRvci5HZXRQcm90b2NvbEZlZUFtb3VudCgpCn0KCi8vIEdldEN1cnJlbnRFcG9jaCByZXR1cm5zIHRoZSBhY2NydWFsIGVwb2NoIGN1cnJlbnRseSBpbiBmb3JjZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBjdXJyZW50IHByb3RvY29sLWZlZSBhY2NydWFsIGVwb2NoCmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgR2V0Q3VycmVudEVwb2NoKCkgaW50NjQgewoJcmV0dXJuIHAuY3VycmVudEVwb2NoCn0KCi8vIEdldFRvdGFsU3Rha2VkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBjdXJyZW50bHkgc3Rha2VkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGN1cnJlbnQgdG90YWwgc3Rha2VkIGFtb3VudApmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpIEdldFRvdGFsU3Rha2VkQW1vdW50KCkgaW50NjQgewoJcmV0dXJuIHAudG90YWxTdGFrZWRBbW91bnQKfQoKLy8gR2V0VG90YWxTdGFrZWRBbW91bnRBdCByZXR1cm5zIHRoZSB0b3RhbCBzdGFrZWQgYW1vdW50IGluIGZvcmNlIGR1cmluZyBlcG9jaCwKLy8gdXNpbmcgdGhlIGxhdGVzdCByZWNvcmRlZCBzdGFrZSBhbW91bnQgYXQgb3IgYmVmb3JlIHRoYXQgZXBvY2guCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBlcG9jaDogYWNjcnVhbCBlcG9jaCB3aG9zZSBlZmZlY3RpdmUgdG90YWwgc3Rha2UgaXMgcmVxdWVzdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgc3Rha2UgcmVjb3JkZWQgYXQgb3IgYmVmb3JlIGVwb2NoLCBvciB6ZXJvIGZvciBhIG5lZ2F0aXZlIGVwb2NoCmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgR2V0VG90YWxTdGFrZWRBbW91bnRBdChlcG9jaCBpbnQ2NCkgaW50NjQgewoJaWYgZXBvY2ggPCAwIHsKCQlyZXR1cm4gMAoJfQoKCXRvdGFsU3Rha2VkQW1vdW50IDo9IGludDY0KDApCglwLnRvdGFsU3Rha2VkSGlzdG9yeS5SZXZlcnNlSXRlcmF0ZSgwLCBlcG9jaCwgZnVuYyhfIGludDY0LCB2YWx1ZSBhbnkpIGJvb2wgewoJCWFtb3VudCwgY2FzdE9rIDo9IHZhbHVlLihpbnQ2NCkKCQlpZiAhY2FzdE9rIHsKCQkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCB0b3RhbCBzdGFrZWQgYW1vdW50OiAlVCIsIHZhbHVlKSkKCQl9CgkJdG90YWxTdGFrZWRBbW91bnQgPSBhbW91bnQKCQlyZXR1cm4gdHJ1ZQoJfSkKCglyZXR1cm4gdG90YWxTdGFrZWRBbW91bnQKfQoKLy8gR2V0QWNjdW11bGF0ZWRUaW1lc3RhbXAgcmV0dXJucyB0aGUgbGFzdCB0aW1lc3RhbXAgYXQgd2hpY2ggZmVlIGFjY3J1YWwKLy8gc3RhdGUgbW92ZWQgdGhyb3VnaCBhIGZvbGQgb3Igc3Rha2UgY2hhbmdlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGxhc3QgYWNjdW11bGF0ZWQtc3RhdGUgdXBkYXRlIHRpbWVzdGFtcApmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpIEdldEFjY3VtdWxhdGVkVGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIHAuYWNjdW11bGF0ZWRUaW1lc3RhbXAKfQoKLyogU2V0dGVycyAqLwoKLy8gU2V0UmV3YXJkU3RhdGUgc3RvcmVzIHJld2FyZFN0YXRlIHVuZGVyIHJld2FyZElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmV3YXJkSUQ6IGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlIHN0YWtlciByZXdhcmQgc3RhdGUgaXMgc3RvcmVkCi8vICAgLSByZXdhcmRTdGF0ZTogcmV3YXJkIHN0YXRlIHRvIGFzc29jaWF0ZSB3aXRoIHJld2FyZElECmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgU2V0UmV3YXJkU3RhdGUocmV3YXJkSUQgc3RyaW5nLCByZXdhcmRTdGF0ZSAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgewoJcC5yZXdhcmRTdGF0ZXMuU2V0KHJld2FyZElELCByZXdhcmRTdGF0ZSkKfQoKLy8gU2V0VG9rZW5BY2N1bXVsYXRvciBzdG9yZXMgYWNjdW11bGF0b3IgdW5kZXIgdG9rZW5QYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBwYWNrYWdlIHBhdGggdXNlZCBhcyB0aGUgYWNjdW11bGF0b3Iga2V5Ci8vICAgLSBhY2N1bXVsYXRvcjogcHJvdG9jb2wtZmVlIGFjY3VtdWxhdG9yIHRvIHN0b3JlIGZvciB0b2tlblBhdGgKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyKSBTZXRUb2tlbkFjY3VtdWxhdG9yKHRva2VuUGF0aCBzdHJpbmcsIGFjY3VtdWxhdG9yICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IpIHsKCXAudG9rZW5BY2N1bXVsYXRvcnMuU2V0KHRva2VuUGF0aCwgYWNjdW11bGF0b3IpCn0KCi8vIFNldEN1cnJlbnRFcG9jaCByZWNvcmRzIHRoZSBhY2NydWFsIGVwb2NoIGN1cnJlbnRseSBpbiBmb3JjZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGVwb2NoOiBuZXcgY3VycmVudCBwcm90b2NvbC1mZWUgYWNjcnVhbCBlcG9jaApmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpIFNldEN1cnJlbnRFcG9jaChlcG9jaCBpbnQ2NCkgewoJcC5jdXJyZW50RXBvY2ggPSBlcG9jaAp9CgovLyBTZXRUb3RhbFN0YWtlZEFtb3VudCByZWNvcmRzIHRoZSB0b3RhbCBhbW91bnQgY3VycmVudGx5IHN0YWtlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRvdGFsU3Rha2VkQW1vdW50OiBuZXcgdG90YWwgc3Rha2VkIGFtb3VudApmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpIFNldFRvdGFsU3Rha2VkQW1vdW50KHRvdGFsU3Rha2VkQW1vdW50IGludDY0KSB7CglwLnRvdGFsU3Rha2VkQW1vdW50ID0gdG90YWxTdGFrZWRBbW91bnQKfQoKLy8gU2V0VG90YWxTdGFrZWRBbW91bnRBdCByZWNvcmRzIHRoZSB0b3RhbCBzdGFrZWQgYW1vdW50IGluIGZvcmNlIGZyb20gZXBvY2ggb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBlcG9jaDogZmlyc3QgYWNjcnVhbCBlcG9jaCBhdCB3aGljaCB0b3RhbFN0YWtlZEFtb3VudCBpcyBpbiBmb3JjZQovLyAgIC0gdG90YWxTdGFrZWRBbW91bnQ6IHRvdGFsIHN0YWtlIGFtb3VudCB0byByZWNvcmQgZnJvbSBlcG9jaCBvbndhcmQKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyKSBTZXRUb3RhbFN0YWtlZEFtb3VudEF0KGVwb2NoIGludDY0LCB0b3RhbFN0YWtlZEFtb3VudCBpbnQ2NCkgewoJcC50b3RhbFN0YWtlZEhpc3RvcnkuU2V0KGVwb2NoLCB0b3RhbFN0YWtlZEFtb3VudCkKfQoKLy8gU2V0QWNjdW11bGF0ZWRUaW1lc3RhbXAgcmVjb3JkcyB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIGFjY3J1YWwgc3RhdGUgbGFzdCBtb3ZlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFjY3VtdWxhdGVkVGltZXN0YW1wOiB0aW1lc3RhbXAgdG8gcmVjb3JkIGZvciB0aGUgbGF0ZXN0IGZvbGQgb3Igc3Rha2UgY2hhbmdlCmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgU2V0QWNjdW11bGF0ZWRUaW1lc3RhbXAoYWNjdW11bGF0ZWRUaW1lc3RhbXAgaW50NjQpIHsKCXAuYWNjdW11bGF0ZWRUaW1lc3RhbXAgPSBhY2N1bXVsYXRlZFRpbWVzdGFtcAp9ChrBVAodcHJvdG9jb2xfZmVlX3Jld2FyZF9zdGF0ZS5nbm8Sn1RwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIFByb3RvY29sRmVlUmV3YXJkU3RhdGUgdHJhY2tzIHRoZSBwcm90b2NvbCBmZWUgcmV3YXJkcyBvZiBvbmUgc3Rha2VyLgovLwovLyBPcmRpbmFyeSBzdGFrZSBjaGFuZ2VzIGFwcGVuZCBvbmUgUHJvdG9jb2xGZWVTdGFrZUV2ZW50OyBSZWRlbGVnYXRlIHBlcmZvcm1zCi8vIGEgcmVtb3ZlIHBsdXMgYW4gYWRkIGFuZCBhcHBlbmRzIHR3byBldmVudHMuIEVhY2ggdG9rZW4gaXMgc2V0dGxlZCBvbiBpdHMgb3duCi8vIGZyb20gdGhvc2UgZXZlbnRzLCBzbyB0aGUgc3RhdGUga2VlcHMgYSBwZXItdG9rZW4gY3Vyc29yIGludG8gdGhlIGV2ZW50Ci8vIGhpc3RvcnkgcmF0aGVyIHRoYW4gYSByZXdhcmQgZGVidCBmb3IgZXZlcnkgdG9rZW4gYXQgb25jZS4KdHlwZSBQcm90b2NvbEZlZVJld2FyZFN0YXRlIHN0cnVjdCB7CgkvLyBzdGFrZWRBbW91bnQgaXMgdGhlIGN1cnJlbnQgYW1vdW50IHN0YWtlZAoJc3Rha2VkQW1vdW50IGludDY0CgkvLyBzdGFrZUV2ZW50cyByZWNvcmRzIHRoZSBzdGFrZWQgYW1vdW50IGluIGZvcmNlIGZyb20gZWFjaCBzdGFrZSBjaGFuZ2UsIGJ5IGluZGV4CglzdGFrZUV2ZW50cyAqVWludFRyZWUgLy8gaW5kZXggLT4gKlByb3RvY29sRmVlU3Rha2VFdmVudAoJLy8gc3Rha2VFdmVudENvdW50IGlzIHRoZSBudW1iZXIgb2YgcmVjb3JkZWQgc3Rha2UgZXZlbnRzCglzdGFrZUV2ZW50Q291bnQgaW50NjQKCS8vIHRva2VuU3RhdGVzIG1hcHMgYSB0b2tlbiBwYXRoIHRvIHRoZSBzZXR0bGVtZW50IHN0YXRlIG9mIHRoYXQgdG9rZW4KCXRva2VuU3RhdGVzICpicHRyZWUuQlBUcmVlIC8vIHRva2VuUGF0aCAtPiAqUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlCgkvLyBjbGFpbWVkVGltZXN0YW1wIGlzIHRoZSBsYXN0IHRpbWVzdGFtcCBhdCB3aGljaCBldmVyeSB0b2tlbiB3YXMgY29sbGVjdGVkCgljbGFpbWVkVGltZXN0YW1wIGludDY0Cn0KCi8vIFByb3RvY29sRmVlU3Rha2VFdmVudCBpcyBvbmUgc3Rha2UgY2hhbmdlOiBmcm9tIGVwb2NoIG9uLCBzdGFrZWRBbW91bnQgd2FzIHN0YWtlZC4KdHlwZSBQcm90b2NvbEZlZVN0YWtlRXZlbnQgc3RydWN0IHsKCWVwb2NoICAgICAgICBpbnQ2NAoJc3Rha2VkQW1vdW50IGludDY0Cn0KCi8vIEdldEVwb2NoIHJldHVybnMgdGhlIGFjY3J1YWwgZXBvY2ggZnJvbSB3aGljaCB0aGlzIHN0YWtlIGV2ZW50IGFwcGxpZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogZXBvY2ggYXQgd2hpY2ggdGhlIHN0YWtlIGFtb3VudCBiZWNhbWUgZWZmZWN0aXZlCmZ1bmMgKGUgKlByb3RvY29sRmVlU3Rha2VFdmVudCkgR2V0RXBvY2goKSBpbnQ2NCB7IHJldHVybiBlLmVwb2NoIH0KCi8vIEdldFN0YWtlZEFtb3VudCByZXR1cm5zIHRoZSBzdGFrZSBhbW91bnQgaW4gZm9yY2UgZm9yIHRoaXMgZXZlbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogc3Rha2VkIGFtb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50CmZ1bmMgKGUgKlByb3RvY29sRmVlU3Rha2VFdmVudCkgR2V0U3Rha2VkQW1vdW50KCkgaW50NjQgeyByZXR1cm4gZS5zdGFrZWRBbW91bnQgfQoKLy8gUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlIGlzIHRoZSBzZXR0bGVtZW50IHN0YXRlIG9mIG9uZSB0b2tlbiBmb3Igb25lIHN0YWtlci4KLy8KLy8gU3Rha2UgZXZlbnRzIHVwIHRvIGV2ZW50Q3Vyc29yIGFyZSBmb2xkZWQgaW50byBlYXJuZWRYMTI4LiBUaGUgb3BlbiBzZWdtZW50IHN0YXJ0cwovLyB3aGVyZSB0aGUgbGFzdCBmb2xkZWQgZXZlbnQgbGVmdCB0aGUgYWNjdW11bGF0b3IgKHNlZ21lbnRTdGFydFgxMjgpIHdpdGgKLy8gc2VnbWVudFN0YWtlZEFtb3VudCBzdGFrZWQuCnR5cGUgUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlIHN0cnVjdCB7CgkvLyBldmVudEN1cnNvciBpcyB0aGUgbnVtYmVyIG9mIHN0YWtlIGV2ZW50cyBhbHJlYWR5IGZvbGRlZCBpbgoJZXZlbnRDdXJzb3IgaW50NjQKCS8vIHNlZ21lbnRTdGFrZWRBbW91bnQgaXMgdGhlIGFtb3VudCBzdGFrZWQgZHVyaW5nIHRoZSBvcGVuIHNlZ21lbnQKCXNlZ21lbnRTdGFrZWRBbW91bnQgaW50NjQKCS8vIHNlZ21lbnRTdGFydFgxMjggaXMgdGhlIGFjY3VtdWxhdGVkIGZlZSBwZXIgc3Rha2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBvcGVuIHNlZ21lbnQKCXNlZ21lbnRTdGFydFgxMjggKnUyNTYuVWludAoJLy8gZWFybmVkWDEyOCBpcyB0aGUgcmV3YXJkIGVhcm5lZCBieSBjbG9zZWQgc2VnbWVudHMgYW5kIG5vdCB5ZXQgY29sbGVjdGVkLCBzY2FsZWQgYnkgMl4xMjgKCWVhcm5lZFgxMjggKnUyNTYuVWludAoJLy8gY2xhaW1lZFJld2FyZCBpcyB0aGUgdG90YWwgcmV3YXJkIGNvbGxlY3RlZCBzbyBmYXIKCWNsYWltZWRSZXdhcmQgaW50NjQKfQoKLy8gTmV3UHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSBjcmVhdGVzIGFuIGVtcHR5IHN0YXRlIGZvciBhIHN0YWtlciB3aXRoIG5vIHN0YWtlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKlByb3RvY29sRmVlUmV3YXJkU3RhdGU6IGluaXRpYWxpemVkIHJld2FyZCBzdGF0ZSB3aXRoIGVtcHR5IGV2ZW50IGFuZCB0b2tlbiB0cmVlcwpmdW5jIE5ld1Byb3RvY29sRmVlUmV3YXJkU3RhdGUoKSAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSB7CglyZXR1cm4gJlByb3RvY29sRmVlUmV3YXJkU3RhdGV7CgkJc3Rha2VkQW1vdW50OiAgICAgMCwKCQlzdGFrZUV2ZW50czogICAgICBOZXdVaW50VHJlZSgpLAoJCXN0YWtlRXZlbnRDb3VudDogIDAsCgkJdG9rZW5TdGF0ZXM6ICAgICAgYnB0cmVlLk5ld0JQVHJlZU4oMTYpLAoJCWNsYWltZWRUaW1lc3RhbXA6IDAsCgl9Cn0KCi8vIE5ld1Byb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZSBjcmVhdGVzIHRoZSBzZXR0bGVtZW50IHN0YXRlIG9mIGEgdG9rZW4gd2hvc2Ugb3BlbgovLyBzZWdtZW50IHN0YXJ0cyBhdCB0aGUgZ2l2ZW4gY3Vyc29yLCBzdGFrZSBhbmQgYWNjdW11bGF0b3IgdmFsdWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBldmVudEN1cnNvcjogbnVtYmVyIG9mIHN0YWtlIGV2ZW50cyBhbHJlYWR5IGZvbGRlZCBpbnRvIHRoaXMgdG9rZW4gc3RhdGUKLy8gICAtIHNlZ21lbnRTdGFrZWRBbW91bnQ6IHN0YWtlIGFtb3VudCBpbiBmb3JjZSBkdXJpbmcgdGhlIG9wZW4gc2VnbWVudAovLyAgIC0gc2VnbWVudFN0YXJ0WDEyODogYWNjdW11bGF0ZWQgZmVlLXBlci1zdGFrZSB2YWx1ZSBhdCB0aGUgb3BlbiBzZWdtZW50IHN0YXJ0LCBzY2FsZWQgYnkgMl4xMjgKLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm90b2NvbEZlZVRva2VuUmV3YXJkU3RhdGU6IHRva2VuIHNldHRsZW1lbnQgc3RhdGUgd2l0aCB6ZXJvIGNsb3NlZC1zZWdtZW50IGVhcm5pbmdzIGFuZCBjbGFpbWVkIHJld2FyZApmdW5jIE5ld1Byb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZShldmVudEN1cnNvciBpbnQ2NCwgc2VnbWVudFN0YWtlZEFtb3VudCBpbnQ2NCwgc2VnbWVudFN0YXJ0WDEyOCAqdTI1Ni5VaW50KSAqUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlIHsKCXJldHVybiAmUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlewoJCWV2ZW50Q3Vyc29yOiAgICAgICAgIGV2ZW50Q3Vyc29yLAoJCXNlZ21lbnRTdGFrZWRBbW91bnQ6IHNlZ21lbnRTdGFrZWRBbW91bnQsCgkJc2VnbWVudFN0YXJ0WDEyODogICAgdTI1Ni5aZXJvKCkuU2V0KHNlZ21lbnRTdGFydFgxMjgpLAoJCWVhcm5lZFgxMjg6ICAgICAgICAgIHUyNTYuWmVybygpLAoJCWNsYWltZWRSZXdhcmQ6ICAgICAgIDAsCgl9Cn0KCi8qIFByb3RvY29sRmVlUmV3YXJkU3RhdGUgZ2V0dGVycyAqLwoKLy8gR2V0U3Rha2VkQW1vdW50IHJldHVybnMgdGhlIGN1cnJlbnQgc3Rha2UgYW1vdW50IHRyYWNrZWQgZm9yIHRoZSBzdGFrZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogY3VycmVudCBzdGFrZWQgYW1vdW50CmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkU3RhdGUpIEdldFN0YWtlZEFtb3VudCgpIGludDY0IHsKCXJldHVybiBwLnN0YWtlZEFtb3VudAp9CgovLyBHZXRTdGFrZUV2ZW50Q291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0YWtlLWNoYW5nZSBldmVudHMgcmVjb3JkZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogY291bnQgb2YgaW5kZXhlZCBzdGFrZSBldmVudHMKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgR2V0U3Rha2VFdmVudENvdW50KCkgaW50NjQgewoJcmV0dXJuIHAuc3Rha2VFdmVudENvdW50Cn0KCi8vIEdldFN0YWtlRXZlbnQgcmV0dXJucyB0aGUgaW5kZXhlZCBzdGFrZSBldmVudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluZGV4OiB6ZXJvLWJhc2VkIHN0YWtlLWV2ZW50IGluZGV4Ci8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvdG9jb2xGZWVTdGFrZUV2ZW50OiBldmVudCBhdCBpbmRleCwgb3IgbmlsIHdoZW4gbm8gZXZlbnQgaXMgc3RvcmVkIHRoZXJlCi8vICAgLSBib29sOiB0cnVlIHdoZW4gYW4gZXZlbnQgZXhpc3RzIGF0IGluZGV4OyBmYWxzZSB3aGVuIHRoZSBpbmRleCBpcyBhYnNlbnQKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgR2V0U3Rha2VFdmVudChpbmRleCBpbnQ2NCkgKCpQcm90b2NvbEZlZVN0YWtlRXZlbnQsIGJvb2wpIHsKCWVpLCBvayA6PSBwLnN0YWtlRXZlbnRzLkdldChpbmRleCkKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCWV2ZW50LCBjYXN0T2sgOj0gZWkuKCpQcm90b2NvbEZlZVN0YWtlRXZlbnQpCglpZiAhY2FzdE9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHN0YWtlIGV2ZW50OiAlVCIsIGVpKSkKCX0KCXJldHVybiBldmVudCwgdHJ1ZQp9CgovLyBHZXRUb2tlblN0YXRlIHJldHVybnMgdGhlIHNldHRsZW1lbnQgc3RhdGUgb2YgdG9rZW5QYXRoLCBvciBmYWxzZSB3aGVuIHRoZSB0b2tlbiB3YXMKLy8gbmV2ZXIgc2V0dGxlZCBmb3IgdGhpcyBzdGFrZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IHJlZ2lzdGVyZWQgdG9rZW4gcGF0aCB3aG9zZSBwZXItc3Rha2VyIHNldHRsZW1lbnQgc3RhdGUgaXMgcmVxdWVzdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlOiB0b2tlbiBzZXR0bGVtZW50IHN0YXRlLCBvciBuaWwgd2hlbiBpdCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0b2tlblBhdGggaGFzIGEgc3RvcmVkIHNldHRsZW1lbnQgc3RhdGUsIG90aGVyd2lzZSBmYWxzZQpmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZFN0YXRlKSBHZXRUb2tlblN0YXRlKHRva2VuUGF0aCBzdHJpbmcpICgqUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlLCBib29sKSB7Cgl0aSA6PSBwLnRva2VuU3RhdGVzLkdldCh0b2tlblBhdGgpCglpZiB0aSA9PSBuaWwgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9Cgl0b2tlblN0YXRlLCBjYXN0T2sgOj0gdGkuKCpQcm90b2NvbEZlZVRva2VuUmV3YXJkU3RhdGUpCglpZiAhY2FzdE9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHRva2VuIHJld2FyZCBzdGF0ZTogJVQiLCB0aSkpCgl9CglyZXR1cm4gdG9rZW5TdGF0ZSwgdHJ1ZQp9CgovLyBHZXRUb2tlblBhdGhzIHJldHVybnMgZXZlcnkgdG9rZW4gcGF0aCBzZXR0bGVkIGZvciB0aGlzIHN0YWtlciwgaW4ga2V5IG9yZGVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gW11zdHJpbmc6IHRva2VuIHBhdGhzIHdpdGggc3RvcmVkIHNldHRsZW1lbnQgc3RhdGUsIG9yZGVyZWQgYnkgdGhlIHVuZGVybHlpbmcgdHJlZSBrZXlzCmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkU3RhdGUpIEdldFRva2VuUGF0aHMoKSBbXXN0cmluZyB7Cgl0b2tlblBhdGhzIDo9IG1ha2UoW11zdHJpbmcsIDAsIHAudG9rZW5TdGF0ZXMuU2l6ZSgpKQoJcC50b2tlblN0YXRlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJdG9rZW5QYXRocyA9IGFwcGVuZCh0b2tlblBhdGhzLCBrZXkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIHRva2VuUGF0aHMKfQoKLy8gR2V0Q2xhaW1lZFJld2FyZCByZXR1cm5zIHRoZSB0b3RhbCByZXdhcmQgb2YgdG9rZW5QYXRoIGNvbGxlY3RlZCBzbyBmYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IHRva2VuIHBhdGggd2hvc2UgYWNjdW11bGF0ZWQgY2xhaW1lZCByZXdhcmQgaXMgcmVxdWVzdGVkCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgcmV3YXJkIGNvbGxlY3RlZCBmb3IgdG9rZW5QYXRoLCBvciB6ZXJvIHdoZW4gbm8gdG9rZW4gc3RhdGUgZXhpc3RzCmZ1bmMgKHAgKlByb3RvY29sRmVlUmV3YXJkU3RhdGUpIEdldENsYWltZWRSZXdhcmQodG9rZW5QYXRoIHN0cmluZykgaW50NjQgewoJdG9rZW5TdGF0ZSwgb2sgOj0gcC5HZXRUb2tlblN0YXRlKHRva2VuUGF0aCkKCWlmICFvayB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB0b2tlblN0YXRlLkdldENsYWltZWRSZXdhcmQoKQp9CgovLyBHZXRDbGFpbWVkVGltZXN0YW1wIHJldHVybnMgdGhlIGxhc3QgdGltZXN0YW1wIGF0IHdoaWNoIGFsbCB0b2tlbiByZXdhcmRzIHdlcmUgY29sbGVjdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIHJlY29yZGVkIGZvciB0aGUgbW9zdCByZWNlbnQgYWxsLXRva2VuIGNvbGxlY3Rpb24KZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgR2V0Q2xhaW1lZFRpbWVzdGFtcCgpIGludDY0IHsKCXJldHVybiBwLmNsYWltZWRUaW1lc3RhbXAKfQoKLyogUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSBzZXR0ZXJzICovCgovLyBTZXRTdGFrZWRBbW91bnQgdXBkYXRlcyB0aGUgY3VycmVudCBzdGFrZSBhbW91bnQgdHJhY2tlZCBmb3IgdGhlIHN0YWtlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YWtlZEFtb3VudDogbmV3IGN1cnJlbnQgc3Rha2VkIGFtb3VudApmdW5jIChwICpQcm90b2NvbEZlZVJld2FyZFN0YXRlKSBTZXRTdGFrZWRBbW91bnQoc3Rha2VkQW1vdW50IGludDY0KSB7CglwLnN0YWtlZEFtb3VudCA9IHN0YWtlZEFtb3VudAp9CgovLyBBcHBlbmRTdGFrZUV2ZW50IHJlY29yZHMgdGhhdCBzdGFrZWRBbW91bnQgaXMgc3Rha2VkIGZyb20gZXBvY2ggb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBlcG9jaDogYWNjcnVhbCBlcG9jaCBhdCB3aGljaCB0aGlzIHN0YWtlIGFtb3VudCBiZWNvbWVzIGVmZmVjdGl2ZQovLyAgIC0gc3Rha2VkQW1vdW50OiBzdGFrZSBhbW91bnQgaW4gZm9yY2UgZnJvbSBlcG9jaCBvbndhcmQKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgQXBwZW5kU3Rha2VFdmVudChlcG9jaCBpbnQ2NCwgc3Rha2VkQW1vdW50IGludDY0KSB7CglwLnN0YWtlRXZlbnRzLlNldChwLnN0YWtlRXZlbnRDb3VudCwgJlByb3RvY29sRmVlU3Rha2VFdmVudHsKCQllcG9jaDogICAgICAgIGVwb2NoLAoJCXN0YWtlZEFtb3VudDogc3Rha2VkQW1vdW50LAoJfSkKCXAuc3Rha2VFdmVudENvdW50KysKfQoKLy8gU2V0VG9rZW5TdGF0ZSBzdG9yZXMgdGhlIHNldHRsZW1lbnQgc3RhdGUgZm9yIGEgdG9rZW4gcGF0aC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGF0aCB1c2VkIGFzIHRoZSBzZXR0bGVtZW50LXN0YXRlIGtleQovLyAgIC0gdG9rZW5TdGF0ZTogcGVyLXRva2VuIHNldHRsZW1lbnQgc3RhdGUgdG8gc3RvcmUKZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgU2V0VG9rZW5TdGF0ZSh0b2tlblBhdGggc3RyaW5nLCB0b2tlblN0YXRlICpQcm90b2NvbEZlZVRva2VuUmV3YXJkU3RhdGUpIHsKCXAudG9rZW5TdGF0ZXMuU2V0KHRva2VuUGF0aCwgdG9rZW5TdGF0ZSkKfQoKLy8gU2V0Q2xhaW1lZFRpbWVzdGFtcCByZWNvcmRzIHRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggYWxsIHRva2VuIHJld2FyZHMgd2VyZSBjb2xsZWN0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjbGFpbWVkVGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBvZiB0aGUgYWxsLXRva2VuIGNvbGxlY3Rpb24KZnVuYyAocCAqUHJvdG9jb2xGZWVSZXdhcmRTdGF0ZSkgU2V0Q2xhaW1lZFRpbWVzdGFtcChjbGFpbWVkVGltZXN0YW1wIGludDY0KSB7CglwLmNsYWltZWRUaW1lc3RhbXAgPSBjbGFpbWVkVGltZXN0YW1wCn0KCi8qIFByb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzICovCgovLyBHZXRFdmVudEN1cnNvciByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3Rha2UgZXZlbnRzIGFscmVhZHkgZm9sZGVkIGZvciB0aGlzIHRva2VuLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGNvdW50IG9mIGZvbGRlZCBzdGFrZSBldmVudHMKZnVuYyAodCAqUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlKSBHZXRFdmVudEN1cnNvcigpIGludDY0IHsKCXJldHVybiB0LmV2ZW50Q3Vyc29yCn0KCi8vIEdldFNlZ21lbnRTdGFrZWRBbW91bnQgcmV0dXJucyB0aGUgc3Rha2UgYW1vdW50IGluIHRoZSBvcGVuIHNlZ21lbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogc3Rha2UgYW1vdW50IHVzZWQgd2hpbGUgc2V0dGxpbmcgdGhlIG9wZW4gc2VnbWVudApmdW5jICh0ICpQcm90b2NvbEZlZVRva2VuUmV3YXJkU3RhdGUpIEdldFNlZ21lbnRTdGFrZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gdC5zZWdtZW50U3Rha2VkQW1vdW50Cn0KCi8vIEdldFNlZ21lbnRTdGFydFgxMjggcmV0dXJucyB0aGUgYWNjdW11bGF0b3IgdmFsdWUgYXQgdGhlIG9wZW4gc2VnbWVudCBzdGFydC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IGZlZS1wZXItc3Rha2UgYWNjdW11bGF0b3IgYXQgc2VnbWVudCBzdGFydCwgc2NhbGVkIGJ5IDJeMTI4CmZ1bmMgKHQgKlByb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZSkgR2V0U2VnbWVudFN0YXJ0WDEyOCgpICp1MjU2LlVpbnQgewoJcmV0dXJuIHQuc2VnbWVudFN0YXJ0WDEyOAp9CgovLyBHZXRFYXJuZWRYMTI4IHJldHVybnMgY2xvc2VkLXNlZ21lbnQgZWFybmluZ3MgYXdhaXRpbmcgY29sbGVjdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IHVuY2xhaW1lZCByZXdhcmQgYWNjdW11bGF0b3Igc2NhbGVkIGJ5IDJeMTI4CmZ1bmMgKHQgKlByb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZSkgR2V0RWFybmVkWDEyOCgpICp1MjU2LlVpbnQgewoJcmV0dXJuIHQuZWFybmVkWDEyOAp9CgovLyBHZXRDbGFpbWVkUmV3YXJkIHJldHVybnMgdGhlIHRvdGFsIHJld2FyZCBjb2xsZWN0ZWQgZm9yIHRoaXMgdG9rZW4gc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogY3VtdWxhdGl2ZSBjb2xsZWN0ZWQgcmV3YXJkIGFtb3VudApmdW5jICh0ICpQcm90b2NvbEZlZVRva2VuUmV3YXJkU3RhdGUpIEdldENsYWltZWRSZXdhcmQoKSBpbnQ2NCB7CglyZXR1cm4gdC5jbGFpbWVkUmV3YXJkCn0KCi8vIFNldFNlZ21lbnQgbW92ZXMgdGhlIG9wZW4gc2VnbWVudDogZXZlbnRzIHVwIHRvIGV2ZW50Q3Vyc29yIGFyZSBmb2xkZWQsIGFuZCB0aGUKLy8gc2VnbWVudCBzdGFydHMgYXQgc2VnbWVudFN0YXJ0WDEyOCB3aXRoIHNlZ21lbnRTdGFrZWRBbW91bnQgc3Rha2VkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZXZlbnRDdXJzb3I6IG51bWJlciBvZiBzdGFrZSBldmVudHMgZm9sZGVkIGludG8gdGhlIG5ldyBzZWdtZW50Ci8vICAgLSBzZWdtZW50U3Rha2VkQW1vdW50OiBzdGFrZSBhbW91bnQgaW4gZm9yY2UgZm9yIHRoZSBuZXcgb3BlbiBzZWdtZW50Ci8vICAgLSBzZWdtZW50U3RhcnRYMTI4OiBmZWUtcGVyLXN0YWtlIGFjY3VtdWxhdG9yIGF0IHRoZSBuZXcgc2VnbWVudCBzdGFydCwgc2NhbGVkIGJ5IDJeMTI4CmZ1bmMgKHQgKlByb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZSkgU2V0U2VnbWVudChldmVudEN1cnNvciBpbnQ2NCwgc2VnbWVudFN0YWtlZEFtb3VudCBpbnQ2NCwgc2VnbWVudFN0YXJ0WDEyOCAqdTI1Ni5VaW50KSB7Cgl0LmV2ZW50Q3Vyc29yID0gZXZlbnRDdXJzb3IKCXQuc2VnbWVudFN0YWtlZEFtb3VudCA9IHNlZ21lbnRTdGFrZWRBbW91bnQKCXQuc2VnbWVudFN0YXJ0WDEyOCA9IHUyNTYuWmVybygpLlNldChzZWdtZW50U3RhcnRYMTI4KQp9CgovLyBTZXRFYXJuZWRYMTI4IHJlcGxhY2VzIHRoZSBjbG9zZWQtc2VnbWVudCBlYXJuaW5ncyBhY2N1bXVsYXRvci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGVhcm5lZFgxMjg6IHVuY2xhaW1lZCBlYXJuaW5ncyBhY2N1bXVsYXRvciBzY2FsZWQgYnkgMl4xMjgKZnVuYyAodCAqUHJvdG9jb2xGZWVUb2tlblJld2FyZFN0YXRlKSBTZXRFYXJuZWRYMTI4KGVhcm5lZFgxMjggKnUyNTYuVWludCkgewoJdC5lYXJuZWRYMTI4ID0gdTI1Ni5aZXJvKCkuU2V0KGVhcm5lZFgxMjgpCn0KCi8vIFNldENsYWltZWRSZXdhcmQgcmVwbGFjZXMgdGhlIGN1bXVsYXRpdmUgY29sbGVjdGVkIHJld2FyZCBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjbGFpbWVkUmV3YXJkOiB0b3RhbCByZXdhcmQgY29sbGVjdGVkIGZvciB0aGlzIHRva2VuIHN0YXRlCmZ1bmMgKHQgKlByb3RvY29sRmVlVG9rZW5SZXdhcmRTdGF0ZSkgU2V0Q2xhaW1lZFJld2FyZChjbGFpbWVkUmV3YXJkIGludDY0KSB7Cgl0LmNsYWltZWRSZXdhcmQgPSBjbGFpbWVkUmV3YXJkCn0KGtEjCiJwcm90b2NvbF9mZWVfdG9rZW5fYWNjdW11bGF0b3IuZ25vEqojcGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIFByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvciB0cmFja3MgdGhlIGFjY3VtdWxhdGVkIHByb3RvY29sIGZlZSBwZXIgc3Rha2Ugb2Ygb25lIHRva2VuLgovLwovLyBGZWVzIGFyZSBmb2xkZWQgaW4gcGVyIGFjY3J1YWwgZXBvY2gsIGVhY2ggYWdhaW5zdCB0aGUgdG90YWwgc3Rha2UgaW4gZm9yY2UgZHVyaW5nCi8vIHRoYXQgZXBvY2guIFRoZSB2YWx1ZSBhZnRlciBmb2xkaW5nIGVhY2ggZXBvY2ggaXMga2VwdCBpbiBoaXN0b3J5IHNvIHRoYXQgYSBzdGFrZXIncwovLyByZXdhcmQgY2FuIGJlIHNldHRsZWQgbGF0ZXIgYWdhaW5zdCB0aGUgYWNjdW11bGF0b3IgYXMgaXQgc3Rvb2QgYXQgYW55IGVwb2NoLgp0eXBlIFByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvciBzdHJ1Y3QgewoJLy8gYWNjdW11bGF0ZWRYMTI4UGVyU3Rha2UgaXMgdGhlIGxhdGVzdCBhY2N1bXVsYXRlZCBmZWUgcGVyIHN0YWtlLCBzY2FsZWQgYnkgMl4xMjgKCWFjY3VtdWxhdGVkWDEyOFBlclN0YWtlICp1MjU2LlVpbnQKCS8vIGhpc3RvcnkgbWFwcyBhbiBlcG9jaCB0byB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYWZ0ZXIgdGhhdCBlcG9jaCdzIGZlZXMgd2VyZSBmb2xkZWQKCWhpc3RvcnkgKlVpbnRUcmVlIC8vIGVwb2NoIC0+ICp1MjU2LlVpbnQKCS8vIGZpcnN0RXBvY2ggaXMgdGhlIGZpcnN0IGVwb2NoIGEgZmVlIHdhcyBmb2xkZWQgZm9yLCBvciAtMSB3aGVuIG5vbmUgd2FzCglmaXJzdEVwb2NoIGludDY0CgkvLyBmb2xkZWRFcG9jaCBpcyB0aGUgbGFzdCBlcG9jaCB3aG9zZSBmZWVzIGFyZSBrbm93biB0byBiZSBmdWxseSBmb2xkZWQsIG9yIC0xCglmb2xkZWRFcG9jaCBpbnQ2NAoJLy8gcHJvdG9jb2xGZWVBbW91bnQgaXMgdGhlIHRvdGFsIGZlZSBhbW91bnQgZm9sZGVkIGluCglwcm90b2NvbEZlZUFtb3VudCBpbnQ2NAp9CgovLyBOZXdQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IgY3JlYXRlcyBhbiBlbXB0eSBhY2N1bXVsYXRvciB3aXRoIG5vIGZvbGRlZAovLyBlcG9jaHMgb3IgcHJvdG9jb2wgZmVlcyByZWNvcmRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3I6IGFjY3VtdWxhdG9yIGluaXRpYWxpemVkIHdpdGggemVybyB2YWx1ZXMgYW5kCi8vICAgICBlbXB0eSBlcG9jaCBoaXN0b3J5LgpmdW5jIE5ld1Byb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcigpICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IgewoJcmV0dXJuICZQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3J7CgkJYWNjdW11bGF0ZWRYMTI4UGVyU3Rha2U6IHUyNTYuWmVybygpLAoJCWhpc3Rvcnk6ICAgICAgICAgICAgICAgICBOZXdVaW50VHJlZSgpLAoJCWZpcnN0RXBvY2g6ICAgICAgICAgICAgICAtMSwKCQlmb2xkZWRFcG9jaDogICAgICAgICAgICAgLTEsCgkJcHJvdG9jb2xGZWVBbW91bnQ6ICAgICAgIDAsCgl9Cn0KCi8qIEdldHRlcnMgKi8KCi8vIEdldEFjY3VtdWxhdGVkWDEyOFBlclN0YWtlIHJldHVybnMgdGhlIGxhdGVzdCBhY2N1bXVsYXRlZCBwcm90b2NvbCBmZWUgcGVyIHN0YWtlLAovLyBzY2FsZWQgYnkgMl4xMjguCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqdTI1Ni5VaW50OiBsYXRlc3QgYWNjdW11bGF0ZWQgZmVlLXBlci1zdGFrZSB2YWx1ZSBpbiBRMTI4IGZpeGVkLXBvaW50IGZvcm0uCmZ1bmMgKGEgKlByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcikgR2V0QWNjdW11bGF0ZWRYMTI4UGVyU3Rha2UoKSAqdTI1Ni5VaW50IHsKCXJldHVybiBhLmFjY3VtdWxhdGVkWDEyOFBlclN0YWtlCn0KCi8vIEdldEFjY3VtdWxhdGVkWDEyOFBlclN0YWtlQXQgcmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYWZ0ZXIgdGhlIGZlZXMgb2YgdGhlCi8vIGxhdGVzdCBmb2xkZWQgZXBvY2ggYXQgb3IgYmVmb3JlIGVwb2NoLCBvciB6ZXJvIHdoZW4gbm8gZmVlIHdhcyBmb2xkZWQgYnkgdGhlbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGVwb2NoOiBhY2NydWFsIGVwb2NoIHdob3NlIGxhdGVzdCBwb3N0LWZvbGQgdmFsdWUgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKnUyNTYuVWludDogYWNjdW11bGF0ZWQgZmVlIHBlciBzdGFrZSBpbiBRMTI4IGZpeGVkLXBvaW50IGZvcm0sIG9yIHplcm8KLy8gICAgIHdoZW4gbm8gZmVlIHdhcyBmb2xkZWQgYnkgZXBvY2guCmZ1bmMgKGEgKlByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcikgR2V0QWNjdW11bGF0ZWRYMTI4UGVyU3Rha2VBdChlcG9jaCBpbnQ2NCkgKnUyNTYuVWludCB7CglpZiBlcG9jaCA8IDAgewoJCXJldHVybiB1MjU2Llplcm8oKQoJfQoKCWFjY3VtdWxhdGVkIDo9IHUyNTYuWmVybygpCglhLmhpc3RvcnkuUmV2ZXJzZUl0ZXJhdGUoMCwgZXBvY2gsIGZ1bmMoXyBpbnQ2NCwgdmFsdWUgYW55KSBib29sIHsKCQlzdG9yZWQsIGNhc3RPayA6PSB2YWx1ZS4oKnUyNTYuVWludCkKCQlpZiAhY2FzdE9rIHsKCQkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCBhY2N1bXVsYXRlZCB2YWx1ZTogJVQiLCB2YWx1ZSkpCgkJfQoJCWFjY3VtdWxhdGVkID0gc3RvcmVkCgkJcmV0dXJuIHRydWUKCX0pCgoJcmV0dXJuIGFjY3VtdWxhdGVkCn0KCi8vIEdldEZpcnN0RXBvY2ggcmV0dXJucyB0aGUgZmlyc3QgZXBvY2ggZm9yIHdoaWNoIGEgZmVlIHdhcyBmb2xkZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogZmlyc3QgZm9sZGVkIGVwb2NoLCBvciAtMSB3aGVuIG5vIGZlZSBoYXMgYmVlbiBmb2xkZWQuCmZ1bmMgKGEgKlByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcikgR2V0Rmlyc3RFcG9jaCgpIGludDY0IHsKCXJldHVybiBhLmZpcnN0RXBvY2gKfQoKLy8gR2V0Rm9sZGVkRXBvY2ggcmV0dXJucyB0aGUgbGFzdCBlcG9jaCBrbm93biB0byBiZSBmdWxseSBmb2xkZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogbGFzdCBmdWxseSBmb2xkZWQgZXBvY2gsIG9yIC0xIHdoZW4gbm8gZXBvY2ggaXMgZnVsbHkgZm9sZGVkLgpmdW5jIChhICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IpIEdldEZvbGRlZEVwb2NoKCkgaW50NjQgewoJcmV0dXJuIGEuZm9sZGVkRXBvY2gKfQoKLy8gR2V0UHJvdG9jb2xGZWVBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgcHJvdG9jb2wgZmVlIGFtb3VudCBmb2xkZWQgaW50byB0aGUKLy8gYWNjdW11bGF0b3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG90YWwgZmVlIGFtb3VudCBmb2xkZWQgZm9yIHRoaXMgdG9rZW4uCmZ1bmMgKGEgKlByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcikgR2V0UHJvdG9jb2xGZWVBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gYS5wcm90b2NvbEZlZUFtb3VudAp9CgovKiBTZXR0ZXJzICovCgovLyBTZXRBY2N1bXVsYXRlZFgxMjhQZXJTdGFrZUF0IHN0b3JlcyB2YWx1ZSBhcyB0aGUgYWNjdW11bGF0ZWQgYW1vdW50IGFmdGVyIGVwb2NoJ3MKLy8gZmVlcyBhbmQgbWFrZXMgaXQgdGhlIGxhdGVzdCB2YWx1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGVwb2NoOiBlcG9jaCB3aG9zZSBwb3N0LWZvbGQgYWNjdW11bGF0b3IgdmFsdWUgaXMgYmVpbmcgc3RvcmVkLgovLyAgIC0gdmFsdWU6IGFjY3VtdWxhdGVkIGZlZS1wZXItc3Rha2UgdmFsdWUgaW4gUTEyOCBmaXhlZC1wb2ludCBmb3JtLgpmdW5jIChhICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IpIFNldEFjY3VtdWxhdGVkWDEyOFBlclN0YWtlQXQoZXBvY2ggaW50NjQsIHZhbHVlICp1MjU2LlVpbnQpIHsKCXN0b3JlZCA6PSB1MjU2Llplcm8oKS5TZXQodmFsdWUpCglhLmFjY3VtdWxhdGVkWDEyOFBlclN0YWtlID0gc3RvcmVkCglhLmhpc3RvcnkuU2V0KGVwb2NoLCBzdG9yZWQpCglpZiBhLmZpcnN0RXBvY2ggPCAwIHx8IGVwb2NoIDwgYS5maXJzdEVwb2NoIHsKCQlhLmZpcnN0RXBvY2ggPSBlcG9jaAoJfQp9CgovLyBTZXRGb2xkZWRFcG9jaCByZWNvcmRzIHRoZSBsYXN0IGVwb2NoIHdob3NlIHByb3RvY29sIGZlZXMgYXJlIGZ1bGx5IGZvbGRlZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGVwb2NoOiBsYXRlc3QgZnVsbHkgZm9sZGVkIGFjY3J1YWwgZXBvY2guCmZ1bmMgKGEgKlByb3RvY29sRmVlVG9rZW5BY2N1bXVsYXRvcikgU2V0Rm9sZGVkRXBvY2goZXBvY2ggaW50NjQpIHsKCWEuZm9sZGVkRXBvY2ggPSBlcG9jaAp9CgovLyBTZXRQcm90b2NvbEZlZUFtb3VudCByZWNvcmRzIHRoZSB0b3RhbCBwcm90b2NvbCBmZWUgYW1vdW50IGZvbGRlZCBzbyBmYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIGZvbGRlZCBwcm90b2NvbCBmZWUgYW1vdW50IGZvciB0aGlzIHRva2VuLgpmdW5jIChhICpQcm90b2NvbEZlZVRva2VuQWNjdW11bGF0b3IpIFNldFByb3RvY29sRmVlQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJYS5wcm90b2NvbEZlZUFtb3VudCA9IGFtb3VudAp9ChrbPAoJcHJveHkuZ25vEs08cGFja2FnZSBzdGFrZXIKCi8vIERlbGVnYXRpb24gb3BlcmF0aW9ucwoKLy8gRGVsZWdhdGUgZGVsZWdhdGVzIEdOUyB0byBhIGRlbGVnYXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0bzogZGVsZWdhdGVlIGFkZHJlc3MgdGhhdCByZWNlaXZlcyB2b3RpbmcgcG93ZXIKLy8gICAtIGFtb3VudDogcG9zaXRpdmUgR05TIGFtb3VudCB0byBkZWxlZ2F0ZSBhbmQgY29udmVydCB0byB4R05TIHZvdGluZyBwb3dlcgovLyAgIC0gcmVmZXJyZXI6IG9wdGlvbmFsIHJlZmVycmFsIGlkZW50aWZpZXIgdG8gcmVnaXN0ZXIgZm9yIHJld2FyZCB0cmFja2luZwovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVsZWdhdGVkQW1vdW50OiBUaGUgYW1vdW50IG9mIEdOUyBkZWxlZ2F0ZWQgYW5kIG1pcnJvcmVkIGFzIHhHTlMuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIEdvdlN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBEZWxlZ2F0ZShjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCwgcmVmZXJyZXIgc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5EZWxlZ2F0ZSgwLCBjdXIsIHRvLCBhbW91bnQsIHJlZmVycmVyKQp9CgovLyBVbmRlbGVnYXRlIHVuZGVsZWdhdGVzIHhHTlMgZnJvbSB0aGUgZXhpc3RpbmcgZGVsZWdhdGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIGZyb206IGRlbGVnYXRlZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIGNhbGxlciByZW1vdmVzIGRlbGVnYXRpb24KLy8gICAtIGFtb3VudDogcG9zaXRpdmUgeEdOUyBhbW91bnQgdG8gbW92ZSBpbnRvIHVuZGVsZWdhdGlvbiBsb2NrdXAKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogVGhlIGFtb3VudCBvZiBHTlMgbW92ZWQgaW50byB1bmRlbGVnYXRpb24gbG9ja3VwLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBVbmRlbGVnYXRlKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzLCBhbW91bnQgaW50NjQpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlVuZGVsZWdhdGUoMCwgY3VyLCBmcm9tLCBhbW91bnQpCn0KCi8vIFJlZGVsZWdhdGUgcmVkZWxlZ2F0ZXMgeEdOUyBmcm9tIHRoZSBleGlzdGluZyBkZWxlZ2F0ZSB0byBhbm90aGVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBkZWxlZ2F0ZWU6IGN1cnJlbnQgZGVsZWdhdGVlIGFkZHJlc3Mgd2hvc2Ugdm90aW5nIHBvd2VyIGlzIHJlZHVjZWQKLy8gICAtIG5ld0RlbGVnYXRlZTogZGVzdGluYXRpb24gYWRkcmVzcyB0aGF0IHJlY2VpdmVzIHRoZSByZWRlbGVnYXRlZCB2b3RpbmcgcG93ZXIKLy8gICAtIGFtb3VudDogcG9zaXRpdmUgeEdOUyBhbW91bnQgdG8gbW92ZSB3aXRob3V0IGEgdXNlci1mYWNpbmcgbG9ja3VwCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZWRlbGVnYXRlZEFtb3VudDogVGhlIGFtb3VudCBtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IGRlbGVnYXRlZSB0byB0aGUgbmV3IGRlbGVnYXRlZS4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292U3Rha2VyIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFJlZGVsZWdhdGUoY3VyIHJlYWxtLCBkZWxlZ2F0ZWUsIG5ld0RlbGVnYXRlZSBhZGRyZXNzLCBhbW91bnQgaW50NjQpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlJlZGVsZWdhdGUoMCwgY3VyLCBkZWxlZ2F0ZWUsIG5ld0RlbGVnYXRlZSwgYW1vdW50KQp9CgovLyBDb2xsZWN0VW5kZWxlZ2F0ZWRHbnMgY29sbGVjdHMgdGhlIGFtb3VudCBvZiB0aGUgdW5kZWxlZ2F0ZWQgR05TLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IEdOUyBhbW91bnQgcmVsZWFzZWQgdG8gdGhlIGNhbGxlciBhZnRlciBlbGlnaWJsZSB1bmRlbGVnYXRpb24gd2l0aGRyYXdhbHMgYXJlIGNvbGxlY3RlZAovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0VW5kZWxlZ2F0ZWRHbnMoY3VyIHJlYWxtKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Db2xsZWN0VW5kZWxlZ2F0ZWRHbnMoMCwgY3VyKQp9CgovLyBSZXdhcmQgb3BlcmF0aW9ucwoKLy8gQ29sbGVjdFJld2FyZCBjbGFpbXMgdGhlIGNhbGxlcidzIEdOUyBlbWlzc2lvbiByZXdhcmQgYW5kIGFsbCBrbm93bgovLyBwcm90b2NvbC1mZWUgdG9rZW4gcmV3YXJkcy4KLy8KLy8gVGhlIGFsbC10b2tlbiBwYXRoIGZvbGRzIGFuZCBzZXR0bGVzIGV2ZXJ5IGtub3duIHRva2VuLiBJdCBpcyBub3QgYQovLyBzaW5nbGUtY3VycmVudC14R05TLWJhbGFuY2UgZm9ybXVsYS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0UmV3YXJkKGN1ciByZWFsbSkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5Db2xsZWN0UmV3YXJkKDAsIGN1cikKfQoKLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkIGNsYWltcyB0aGUgY2FsbGVyJ3MgYWNjdW11bGF0ZWQgR05TIGVtaXNzaW9uIHJld2FyZC4KLy8KLy8gVGhlIGNhbGwgaXMgc3ViamVjdCB0byB0aGUgd2l0aGRyYXdhbCBoYWx0IGFuZCB0cmFuc2ZlcnMgR05TIHdoZW4gYSByZXdhcmQKLy8gaXMgYXZhaWxhYmxlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RFbWlzc2lvblJld2FyZChjdXIgcmVhbG0pIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdEVtaXNzaW9uUmV3YXJkKDAsIGN1cikKfQoKLy8gQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkIGNsYWltcyBhY2N1bXVsYXRlZCBwcm90b2NvbC1mZWUgcmV3YXJkcyBmb3Igb25lCi8vIHJlZ2lzdGVyZWQgdG9rZW4gcGF0aC4gRm9sZGluZyBhbmQgc2V0dGxlbWVudCBhcmUgYm91bmRlZCBwZXIgY2FsbDsgYW55Ci8vIHJlbWFpbmluZyBidWNrZXRzIG9yIHN0YWtlIGV2ZW50cyBhcmUgY29sbGVjdGVkIGJ5IGEgbGF0ZXIgY2FsbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdG9rZW5QYXRoOiByZWdpc3RlcmVkIHRva2VuIHBhdGggd2hvc2UgYWNjdW11bGF0ZWQgcHJvdG9jb2wtZmVlIHJld2FyZCBpcyBjbGFpbWVkCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RQcm90b2NvbEZlZVJld2FyZChjdXIgcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkKDAsIGN1ciwgdG9rZW5QYXRoKQp9CgovLyBDb2xsZWN0UmV3YXJkRnJvbUxhdW5jaFBhZCBjbGFpbXMgYm90aCBHTlMgZW1pc3Npb24gYW5kIHByb3RvY29sLWZlZSByZXdhcmRzCi8vIGZvciBhIHJlZ2lzdGVyZWQgbGF1bmNocGFkIHByb2plY3Qgd2FsbGV0LiBPbmx5IHRoZSBsYXVuY2hwYWQgY29udHJhY3QgbWF5Ci8vIGNhbGwgdGhpcyBlbnRyeSBwb2ludC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdG86IHJlZ2lzdGVyZWQgbGF1bmNocGFkIHByb2plY3Qgd2FsbGV0IHRoYXQgcmVjZWl2ZXMgYm90aCByZXdhcmQgc3RyZWFtcwovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0UmV3YXJkRnJvbUxhdW5jaFBhZChjdXIgcmVhbG0sIHRvIGFkZHJlc3MpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdFJld2FyZEZyb21MYXVuY2hQYWQoMCwgY3VyLCB0bykKfQoKLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkRnJvbUxhdW5jaFBhZCBjbGFpbXMgb25seSBhY2N1bXVsYXRlZCBHTlMgZW1pc3Npb24KLy8gcmV3YXJkcyBmb3IgYSByZWdpc3RlcmVkIGxhdW5jaHBhZCBwcm9qZWN0IHdhbGxldC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdG86IHJlZ2lzdGVyZWQgbGF1bmNocGFkIHByb2plY3Qgd2FsbGV0IHdob3NlIGVtaXNzaW9uIHJld2FyZCBpcyBjbGFpbWVkCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RFbWlzc2lvblJld2FyZEZyb21MYXVuY2hQYWQoY3VyIHJlYWxtLCB0byBhZGRyZXNzKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLkNvbGxlY3RFbWlzc2lvblJld2FyZEZyb21MYXVuY2hQYWQoMCwgY3VyLCB0bykKfQoKLy8gQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkRnJvbUxhdW5jaFBhZCBjbGFpbXMgb25lIHRva2VuIHBhdGggb2YgYWNjdW11bGF0ZWQKLy8gcHJvdG9jb2wtZmVlIHJld2FyZHMgZm9yIGEgcmVnaXN0ZXJlZCBsYXVuY2hwYWQgcHJvamVjdCB3YWxsZXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHRvOiByZWdpc3RlcmVkIGxhdW5jaHBhZCBwcm9qZWN0IHdhbGxldCB3aG9zZSBwcm90b2NvbC1mZWUgcmV3YXJkIGlzIGNsYWltZWQKLy8gICAtIHRva2VuUGF0aDogcmVnaXN0ZXJlZCB0b2tlbiBwYXRoIHdob3NlIGFjY3VtdWxhdGVkIHByb3RvY29sLWZlZSByZXdhcmQgaXMgY2xhaW1lZAovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0UHJvdG9jb2xGZWVSZXdhcmRGcm9tTGF1bmNoUGFkKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgdG9rZW5QYXRoIHN0cmluZykgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5Db2xsZWN0UHJvdG9jb2xGZWVSZXdhcmRGcm9tTGF1bmNoUGFkKDAsIGN1ciwgdG8sIHRva2VuUGF0aCkKfQoKLy8gU2V0QW1vdW50QnlQcm9qZWN0V2FsbGV0IGFkanVzdHMgbGF1bmNocGFkLWJhY2tlZCBzdGFrZSBhbmQgeEdOUyBhY2NvdW50aW5nIGZvciBhIHByb2plY3Qgd2FsbGV0LgovLyBPbmx5IGNhbGxhYmxlIGJ5IGxhdW5jaHBhZCBjb250cmFjdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gYWRkcjogcmVnaXN0ZXJlZCBwcm9qZWN0IHdhbGxldCB3aG9zZSBsYXVuY2hwYWQtYmFja2VkIHN0YWtlIGlzIGFkanVzdGVkCi8vICAgLSBhbW91bnQ6IHN0YWtlIGFtb3VudCBkZWx0YSBwYXNzZWQgdG8gdGhlIGxhdW5jaHBhZCByZXdhcmQgYWNjb3VudGluZwovLyAgIC0gYWRkOiB0cnVlIHRvIGFkZCBzdGFrZSBhbmQgbWludCB4R05TOyBmYWxzZSB0byByZW1vdmUgc3Rha2UgYW5kIGJ1cm4geEdOUwovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBHb3ZTdGFrZXIgaGFsdCBzY29wZSBpcyBhY3RpdmUgd2hlbiBhZGQgaXMgdHJ1ZSwgb3Igd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlIHdoZW4gYWRkIGlzIGZhbHNlLgpmdW5jIFNldEFtb3VudEJ5UHJvamVjdFdhbGxldChjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcywgYW1vdW50IGludDY0LCBhZGQgYm9vbCkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5TZXRBbW91bnRCeVByb2plY3RXYWxsZXQoMCwgY3VyLCBhZGRyLCBhbW91bnQsIGFkZCkKfQoKLy8gQWRtaW4gZnVuY3Rpb25zCgovLyBDbGVhblN0YWtlckRlbGVnYXRpb25TbmFwc2hvdEJ5QWRtaW4gcmVtb3ZlcyBvbGQgZGVsZWdhdGlvbiBzbmFwc2hvdHMgZm9yIHRoZQovLyB0b3RhbCBoaXN0b3J5IGFuZCB0aGUgdXNlciBoaXN0b3J5IG9mIGEgc2luZ2xlIHRhcmdldCBhZGRyZXNzLgovLyBPbmx5IGNhbGxhYmxlIGJ5IGFkbWluLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0aHJlc2hvbGQ6IFVuaXggdGltZXN0YW1wIGN1dG9mZiBmb3IgcmVtb3ZpbmcgZWxpZ2libGUgb2xkIGRlbGVnYXRpb24gaGlzdG9yeQovLyAgIC0gdGFyZ2V0OiB1c2VyIGFkZHJlc3Mgd2hvc2UgZGVsZWdhdGlvbiBoaXN0b3J5IHRvIGNsZWFuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIEdvdlN0YWtlciBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDbGVhblN0YWtlckRlbGVnYXRpb25TbmFwc2hvdEJ5QWRtaW4oY3VyIHJlYWxtLCB0aHJlc2hvbGQgaW50NjQsIHRhcmdldCBhZGRyZXNzKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLkNsZWFuU3Rha2VyRGVsZWdhdGlvblNuYXBzaG90QnlBZG1pbigwLCBjdXIsIHRocmVzaG9sZCwgdGFyZ2V0KQp9CgovLyBTZXRVbkRlbGVnYXRpb25Mb2NrdXBQZXJpb2RCeUFkbWluIHNldHMgdGhlIHVuZGVsZWdhdGlvbiBsb2NrdXAgcGVyaW9kLgovLyBPbmx5IGNhbGxhYmxlIGJ5IGFkbWluLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwZXJpb2Q6IG5vbi1uZWdhdGl2ZSB1bmRlbGVnYXRpb24gbG9ja3VwIGR1cmF0aW9uIGluIHNlY29uZHMKLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgR292U3Rha2VyIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFNldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZEJ5QWRtaW4oY3VyIHJlYWxtLCBwZXJpb2QgaW50NjQpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuU2V0VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kQnlBZG1pbigwLCBjdXIsIHBlcmlvZCkKfQoarAEKCnJlbmRlci5nbm8SnQFwYWNrYWdlIHN0YWtlcgoKLy8gUmVuZGVyIGRlbGVnYXRlcyB3ZWIgcmVuZGVyaW5nIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuUmVuZGVyKHBhdGgpCn0KGtMLCglzdGF0ZS5nbm8SxQtwYWNrYWdlIHN0YWtlcgoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJXyAiZ25vLmxhbmQvci9nbm9zd2FwL3JiYWMvdjEiIC8vIGluaXRpYWxpemUgcmVhZGFibGUgY29udHJhY3Qgcm9sZShzKQoKCSJnbm8ubGFuZC9wL2dub3N3YXAvc3RvcmUvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3ZlcnNpb25fbWFuYWdlci92MSIKKQoKdmFyICgKCS8vIFBhY2thZ2UtaW5pdCByZWFkcyB1c2UgY2hhaW4vcnVudGltZS91bnNhZmUuQ3VycmVudFJlYWxtIGJlY2F1c2UgdGhlcmUKCS8vIGlzIG5vIGBjdXIgcmVhbG1gIGluIHNjb3BlIGF0IHBhY2thZ2UtaW5pdGlhbGl6YXRpb24gdGltZS4gVGhlIHZhbHVlcwoJLy8gY2FwdHVyZWQgaGVyZSBkZXNjcmliZSB0aGUgZ292L3N0YWtlciByZWFsbSBpdHNlbGYsIG5vdCBhbnkgY2FsbGVyLgoJY3VycmVudEFkZHJlc3MgYWRkcmVzcwoJZG9tYWluUGF0aCAgICAgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2dvdi9zdGFrZXIiCgoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCgoJdmVyc2lvbk1hbmFnZXIgdmVyc2lvbl9tYW5hZ2VyLlZlcnNpb25NYW5hZ2VyCglpbXBsZW1lbnRhdGlvbiBJR292U3Rha2VyCikKCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsKCWN1cnJlbnRBZGRyZXNzID0gY3VyLkFkZHJlc3MoKQoKCS8vIEluaXRpYWxpemUgS1ZTdG9yZQoJa3ZTdG9yZSA9IHN0b3JlLk5ld0tWU3RvcmUoY3VycmVudEFkZHJlc3MpCgoJLy8gQ3JlYXRlIFZlcnNpb25NYW5hZ2VyCgl2ZXJzaW9uTWFuYWdlciA9IHZlcnNpb25fbWFuYWdlci5OZXdWZXJzaW9uTWFuYWdlcihkb21haW5QYXRoLCBrdlN0b3JlLCBpbml0aWFsaXplRG9tYWluU3RvcmUpCglpbXBsZW1lbnRhdGlvbiA9IG5pbAp9CgpmdW5jIGluaXRpYWxpemVEb21haW5TdG9yZShfIGludCwgcmxtIHJlYWxtLCBrdlN0b3JlIHN0b3JlLktWU3RvcmUpIGFueSB7CglyZXR1cm4gTmV3R292U3Rha2VyU3RvcmUoa3ZTdG9yZSkKfQoKLy8gZ2V0SW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgY3VycmVudCBhY3RpdmUgaW1wbGVtZW50YXRpb24KZnVuYyBnZXRJbXBsZW1lbnRhdGlvbigpIElHb3ZTdGFrZXIgewoJaWYgaW1wbGVtZW50YXRpb24gPT0gbmlsIHsKCQlwYW5pYygiaW1wbGVtZW50YXRpb24gaXMgbm90IGluaXRpYWxpemVkIikKCX0KCXJldHVybiBpbXBsZW1lbnRhdGlvbgp9CgpmdW5jIHVwZGF0ZUltcGxlbWVudGF0aW9uKCkgZXJyb3IgewoJcmVzdWx0IDo9IHZlcnNpb25NYW5hZ2VyLkdldEN1cnJlbnRJbXBsZW1lbnRhdGlvbigpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW1wbGVtZW50YXRpb24gaXMgbm90IGluaXRpYWxpemVkIikKCX0KCglpbXBsLCBvayA6PSByZXN1bHQuKElHb3ZTdGFrZXIpCglpZiAhb2sgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsIGlzIG5vdCBhbiBJR292U3Rha2VyIikKCX0KCglpbXBsZW1lbnRhdGlvbiA9IGltcGwKCglyZXR1cm4gbmlsCn0KGviYAQoJc3RvcmUuZ25vEumYAXBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgKAoJImVycm9ycyIKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIFN0b3JhZ2Uga2V5IGNvbnN0YW50cwpjb25zdCAoCgkvLyBCYXNpYyBjb25maWd1cmF0aW9uCglTdG9yZUtleVVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCA9ICJ1bkRlbGVnYXRpb25Mb2NrdXBQZXJpb2QiCglTdG9yZUtleVRvdGFsRGVsZWdhdGVkQW1vdW50ICAgICA9ICJ0b3RhbERlbGVnYXRlZEFtb3VudCIKCVN0b3JlS2V5VG90YWxMb2NrZWRBbW91bnQgICAgICAgID0gInRvdGFsTG9ja2VkQW1vdW50IgoKCS8vIENvdW50ZXJzCglTdG9yZUtleURlbGVnYXRpb25OZXh0SUQgPSAiZGVsZWdhdGlvbk5leHRJRCIKCgkvLyBDb21wbGV4IGRhdGEgc3RydWN0dXJlcwoJU3RvcmVLZXlEZWxlZ2F0aW9ucyAgICAgICAgICAgID0gImRlbGVnYXRpb25zIiAgICAgICAgICAgIC8vIEJQVHJlZSBvZiBkZWxlZ2F0aW9ucwoJU3RvcmVLZXlUb3RhbERlbGVnYXRpb25IaXN0b3J5ID0gInRvdGFsRGVsZWdhdGlvbkhpc3RvcnkiIC8vIFVpbnRUcmVlOiB0aW1lc3RhbXAgLT4gaW50NjQgKGN1bXVsYXRpdmUgdG90YWwpCglTdG9yZUtleVVzZXJEZWxlZ2F0aW9uSGlzdG9yeSAgPSAidXNlckRlbGVnYXRpb25IaXN0b3J5IiAgLy8gQlBUcmVlOiBhZGRyZXNzIC0+ICpVaW50VHJlZVt0aW1lc3RhbXAgLT4gaW50NjRdCgoJLy8gTWFuYWdlciBzdGF0ZXMKCVN0b3JlS2V5RW1pc3Npb25SZXdhcmRNYW5hZ2VyICAgID0gImVtaXNzaW9uUmV3YXJkTWFuYWdlciIKCVN0b3JlS2V5UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyID0gInByb3RvY29sRmVlUmV3YXJkTWFuYWdlciIKCVN0b3JlS2V5RGVsZWdhdGlvbk1hbmFnZXIgICAgICAgID0gImRlbGVnYXRpb25NYW5hZ2VyIgoJU3RvcmVLZXlMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMgPSAibGF1bmNocGFkUHJvamVjdERlcG9zaXRzIgopCgovLyBnb3ZTdGFrZXJTdG9yZSBpcyB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgSUdvdlN0YWtlclN0b3JlCnR5cGUgZ292U3Rha2VyU3RvcmUgc3RydWN0IHsKCWt2U3RvcmUgc3RvcmUuS1ZTdG9yZQp9Cgp2YXIgXyBJR292U3Rha2VyU3RvcmUgPSAoKmdvdlN0YWtlclN0b3JlKShuaWwpCgovLyBOZXdHb3ZTdGFrZXJTdG9yZSBjcmVhdGVzIGEgbmV3IGdvdmVybmFuY2Ugc3Rha2VyIHN0b3JlIGluc3RhbmNlIGJhY2tlZCBieSBrdlN0b3JlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0ga3ZTdG9yZTogS2V5LXZhbHVlIHN0b3JlIHVzZWQgdG8gcGVyc2lzdCBnb3Zlcm5hbmNlIHN0YWtlciBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIElHb3ZTdGFrZXJTdG9yZTogc3RvcmUgaW1wbGVtZW50YXRpb24gdGhhdCByZWFkcyBhbmQgd3JpdGVzIHRoZSBzdXBwbGllZCBLViBzdG9yZS4KZnVuYyBOZXdHb3ZTdGFrZXJTdG9yZShrdlN0b3JlIHN0b3JlLktWU3RvcmUpIElHb3ZTdGFrZXJTdG9yZSB7CglyZXR1cm4gJmdvdlN0YWtlclN0b3JlewoJCWt2U3RvcmU6IGt2U3RvcmUsCgl9Cn0KCi8vIEJhc2ljIGNvbmZpZ3VyYXRpb24gbWV0aG9kcwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSB1bmRlbGVnYXRpb24gbG9ja3VwLXBlcmlvZCBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzVW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kKQp9CgovLyBHZXRVbkRlbGVnYXRpb25Mb2NrdXBQZXJpb2QgcmV0dXJucyB0aGUgY29uZmlndXJlZCB1bmRlbGVnYXRpb24gbG9ja3VwIHBlcmlvZCBpbiBzZWNvbmRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGxvY2t1cCBkdXJhdGlvbiBpbiBzZWNvbmRzOyBwYW5pY3MgaWYgdGhlIHN0b3JlZCB2YWx1ZSBpcyB1bmF2YWlsYWJsZSBvciBub3QgaW50NjQuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBHZXRVbkRlbGVnYXRpb25Mb2NrdXBQZXJpb2QoKSBpbnQ2NCB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXBlcmlvZCwgb2sgOj0gcmVzdWx0LihpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gcGVyaW9kCn0KCi8vIFNldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCBzdG9yZXMgdGhlIHVuZGVsZWdhdGlvbiBsb2NrdXAgcGVyaW9kLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBwZXJpb2Q6IFVuZGVsZWdhdGlvbiBsb2NrdXAgZHVyYXRpb24gaW4gc2Vjb25kcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2VzczsgRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSBlcnJvci4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIFNldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZChfIGludCwgcmxtIHJlYWxtLCBwZXJpb2QgaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kLCBwZXJpb2QpCn0KCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHRvdGFsIGRlbGVnYXRlZC1hbW91bnQga2V5IGlzIHByZXNlbnQgaW4gc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEhhc1RvdGFsRGVsZWdhdGVkQW1vdW50U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5VG90YWxEZWxlZ2F0ZWRBbW91bnQpCn0KCi8vIEdldFRvdGFsRGVsZWdhdGVkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBjdXJyZW50bHkgZGVsZWdhdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IGFnZ3JlZ2F0ZSBkZWxlZ2F0ZWQgYW1vdW50OyBwYW5pY3MgaWYgdGhlIHN0b3JlZCB2YWx1ZSBpcyB1bmF2YWlsYWJsZSBvciBub3QgaW50NjQuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBHZXRUb3RhbERlbGVnYXRlZEFtb3VudCgpIGludDY0IHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlUb3RhbERlbGVnYXRlZEFtb3VudCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglhbW91bnQsIG9rIDo9IHJlc3VsdC4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIGludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGFtb3VudAp9CgovLyBTZXRUb3RhbERlbGVnYXRlZEFtb3VudCBzdG9yZXMgdGhlIGFnZ3JlZ2F0ZSBkZWxlZ2F0ZWQgYW1vdW50LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBhbW91bnQ6IEFnZ3JlZ2F0ZSBhbW91bnQgb2YgR05TIGRlbGVnYXRlZCBhY3Jvc3MgYWxsIGRlbGVnYXRvcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgZXJyb3IuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBTZXRUb3RhbERlbGVnYXRlZEFtb3VudChfIGludCwgcmxtIHJlYWxtLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VG90YWxEZWxlZ2F0ZWRBbW91bnQsIGFtb3VudCkKfQoKLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgdG90YWwgbG9ja2VkLWFtb3VudCBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzVG90YWxMb2NrZWRBbW91bnRTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlUb3RhbExvY2tlZEFtb3VudCkKfQoKLy8gR2V0VG90YWxMb2NrZWRBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgYW1vdW50IGxvY2tlZCBpbiB1bmRlbGVnYXRpb24gd2l0aGRyYXdhbHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogYWdncmVnYXRlIGxvY2tlZCBhbW91bnQ7IHBhbmljcyBpZiB0aGUgc3RvcmVkIHZhbHVlIGlzIHVuYXZhaWxhYmxlIG9yIG5vdCBpbnQ2NC4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldFRvdGFsTG9ja2VkQW1vdW50KCkgaW50NjQgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVRvdGFsTG9ja2VkQW1vdW50KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWFtb3VudCwgb2sgOj0gcmVzdWx0LihpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gYW1vdW50Cn0KCi8vIFNldFRvdGFsTG9ja2VkQW1vdW50IHN0b3JlcyB0aGUgYWdncmVnYXRlIGFtb3VudCBsb2NrZWQgaW4gdW5kZWxlZ2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBhbW91bnQ6IEFnZ3JlZ2F0ZSBHTlMgYW1vdW50IGN1cnJlbnRseSBsb2NrZWQgaW4gdW5kZWxlZ2F0aW9uIHdpdGhkcmF3YWxzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzOyBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIGVycm9yLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgU2V0VG90YWxMb2NrZWRBbW91bnQoXyBpbnQsIHJsbSByZWFsbSwgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVRvdGFsTG9ja2VkQW1vdW50LCBhbW91bnQpCn0KCi8vIERlbGVnYXRpb24gbWFuYWdlbWVudCBtZXRob2RzCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGRlbGVnYXRpb25zIHRyZWUga2V5IGlzIHByZXNlbnQgaW4gc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEhhc0RlbGVnYXRpb25zU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RGVsZWdhdGlvbnMpCn0KCi8vIFNldERlbGVnYXRpb25zIHJlcGxhY2VzIHRoZSBwZXJzaXN0ZWQgZGVsZWdhdGlvbiB0cmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBkZWxlZ2F0aW9uczogQlBUcmVlIGNvbnRhaW5pbmcgZGVsZWdhdGlvbiByZWNvcmRzIGtleWVkIGJ5IGRlY2ltYWwgZGVsZWdhdGlvbiBJRC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2VzczsgRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSBlcnJvci4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIFNldERlbGVnYXRpb25zKF8gaW50LCBybG0gcmVhbG0sIGRlbGVnYXRpb25zICpicHRyZWUuQlBUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleURlbGVnYXRpb25zLCBkZWxlZ2F0aW9ucykKfQoKLy8gSGFzRGVsZWdhdGlvbiByZXBvcnRzIHdoZXRoZXIgYSBkZWxlZ2F0aW9uIHdpdGggaWQgZXhpc3RzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaWQ6IE51bWVyaWMgZGVsZWdhdGlvbiBpZGVudGlmaWVyIGNvbnZlcnRlZCB0byB0aGUgdHJlZSdzIGRlY2ltYWwtc3RyaW5nIGtleS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIGRlbGVnYXRpb24gcmVjb3JkIGV4aXN0cyBmb3IgaWQsIGZhbHNlIHdoZW4gdGhlIGtleSBpcyBhYnNlbnQuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBIYXNEZWxlZ2F0aW9uKGlkIGludDY0KSBib29sIHsKCWRlbGVnYXRpb25zIDo9IHMuR2V0QWxsRGVsZWdhdGlvbnMoKQoJcmV0dXJuIGRlbGVnYXRpb25zLkdldCh1dGlscy5JbnQ2NFRvU3RyaW5nKGlkKSkgIT0gbmlsCn0KCi8vIEdldERlbGVnYXRpb24gcmV0cmlldmVzIGEgZGVsZWdhdGlvbiBieSBpZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGlkOiBOdW1lcmljIGRlbGVnYXRpb24gaWRlbnRpZmllciBjb252ZXJ0ZWQgdG8gdGhlIHRyZWUncyBkZWNpbWFsLXN0cmluZyBrZXkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqRGVsZWdhdGlvbjogc3RvcmVkIGRlbGVnYXRpb24sIG9yIG5pbCB3aGVuIG5vIHJlY29yZCBleGlzdHMgZm9yIGlkLgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgZGVsZWdhdGlvbiB3YXMgZm91bmQ7IGZhbHNlIHdoZW4gaWQgaXMgYWJzZW50LgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgR2V0RGVsZWdhdGlvbihpZCBpbnQ2NCkgKCpEZWxlZ2F0aW9uLCBib29sKSB7CglkZWxlZ2F0aW9ucyA6PSBzLkdldEFsbERlbGVnYXRpb25zKCkKCglyZXN1bHQgOj0gZGVsZWdhdGlvbnMuR2V0KHV0aWxzLkludDY0VG9TdHJpbmcoaWQpKQoJaWYgcmVzdWx0ID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCglkZWxlZ2F0aW9uLCBvayA6PSByZXN1bHQuKCpEZWxlZ2F0aW9uKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqRGVsZWdhdGlvbjogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBkZWxlZ2F0aW9uLCB0cnVlCn0KCi8vIFNldERlbGVnYXRpb24gc3RvcmVzIG9uZSBkZWxlZ2F0aW9uIHVuZGVyIGlkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBpZDogTnVtZXJpYyBpZGVudGlmaWVyIHVzZWQgYXMgdGhlIGRlbGVnYXRpb24ncyBkZWNpbWFsLXN0cmluZyB0cmVlIGtleS4KLy8gICAtIGRlbGVnYXRpb246IERlbGVnYXRpb24gcmVjb3JkIHRvIHN0b3JlIGZvciBpZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2VzczsgRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSBlcnJvci4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIFNldERlbGVnYXRpb24oXyBpbnQsIHJsbSByZWFsbSwgaWQgaW50NjQsIGRlbGVnYXRpb24gKkRlbGVnYXRpb24pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglkZWxlZ2F0aW9ucyA6PSBzLkdldEFsbERlbGVnYXRpb25zKCkKCglkZWxlZ2F0aW9ucy5TZXQodXRpbHMuSW50NjRUb1N0cmluZyhpZCksIGRlbGVnYXRpb24pCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGVsZWdhdGlvbnMsIGRlbGVnYXRpb25zKQp9CgovLyBSZW1vdmVEZWxlZ2F0aW9uIGRlbGV0ZXMgdGhlIGRlbGVnYXRpb24gc3RvcmVkIHVuZGVyIGlkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBpZDogTnVtZXJpYyBkZWxlZ2F0aW9uIGlkZW50aWZpZXIgd2hvc2UgZGVjaW1hbC1zdHJpbmcgdHJlZSBlbnRyeSBpcyByZW1vdmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzOyBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIGVycm9yLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgUmVtb3ZlRGVsZWdhdGlvbihfIGludCwgcmxtIHJlYWxtLCBpZCBpbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWRlbGVnYXRpb25zIDo9IHMuR2V0QWxsRGVsZWdhdGlvbnMoKQoKCWRlbGVnYXRpb25zLlJlbW92ZSh1dGlscy5JbnQ2NFRvU3RyaW5nKGlkKSkKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlEZWxlZ2F0aW9ucywgZGVsZWdhdGlvbnMpCn0KCi8vIEdldEFsbERlbGVnYXRpb25zIHJldHVybnMgdGhlIHBlcnNpc3RlZCB0cmVlIG9mIGRlbGVnYXRpb24gcmVjb3JkcyBrZXllZCBieSBkZWNpbWFsIElELgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IGRlbGVnYXRpb24gdHJlZTsgcGFuaWNzIGlmIHN0b3JhZ2UgaXMgdW5hdmFpbGFibGUgb3IgY29udGFpbnMgYSBkaWZmZXJlbnQgdHlwZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldEFsbERlbGVnYXRpb25zKCkgKmJwdHJlZS5CUFRyZWUgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleURlbGVnYXRpb25zKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWRlbGVnYXRpb25zLCBvayA6PSByZXN1bHQuKCpicHRyZWUuQlBUcmVlKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBkZWxlZ2F0aW9ucwp9CgovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBuZXh0LWRlbGVnYXRpb24tSUQgY291bnRlciBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzRGVsZWdhdGlvbkNvdW50ZXJTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlEZWxlZ2F0aW9uTmV4dElEKQp9CgovLyBHZXREZWxlZ2F0aW9uQ291bnRlciByZXR1cm5zIHRoZSBjb3VudGVyIHVzZWQgdG8gYWxsb2NhdGUgZGVsZWdhdGlvbiBJRHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqQ291bnRlcjogcGVyc2lzdGVkIG5leHQtSUQgY291bnRlcjsgcGFuaWNzIGlmIHN0b3JhZ2UgaXMgdW5hdmFpbGFibGUgb3IgY29udGFpbnMgYSBkaWZmZXJlbnQgdHlwZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldERlbGVnYXRpb25Db3VudGVyKCkgKkNvdW50ZXIgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleURlbGVnYXRpb25OZXh0SUQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJY291bnRlciwgb2sgOj0gcmVzdWx0LigqQ291bnRlcikKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gQ291bnRlcjogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBjb3VudGVyCn0KCi8vIFNldERlbGVnYXRpb25Db3VudGVyIHN0b3JlcyB0aGUgY291bnRlciB1c2VkIHRvIGFsbG9jYXRlIGRlbGVnYXRpb24gSURzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBjb3VudGVyOiBDb3VudGVyIGhvbGRpbmcgdGhlIG5leHQgZGVsZWdhdGlvbiBJRC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2VzczsgRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSBlcnJvci4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIFNldERlbGVnYXRpb25Db3VudGVyKF8gaW50LCBybG0gcmVhbG0sIGNvdW50ZXIgKkNvdW50ZXIpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGVsZWdhdGlvbk5leHRJRCwgY291bnRlcikKfQoKLy8gVG90YWwgZGVsZWdhdGlvbiBoaXN0b3J5IG1ldGhvZHMgKHRpbWVzdGFtcCAtPiBpbnQ2NCkKLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgdG90YWwgZGVsZWdhdGlvbi1oaXN0b3J5IGtleSBpcyBwcmVzZW50IGluIHN0b3JhZ2UuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBIYXNUb3RhbERlbGVnYXRpb25IaXN0b3J5U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSkKfQoKLy8gR2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSByZXR1cm5zIHRpbWVzdGFtcC1pbmRleGVkIGFnZ3JlZ2F0ZSBkZWxlZ2F0aW9uIGhpc3RvcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqVWludFRyZWU6IGhpc3RvcnkgbWFwcGluZyBVbml4IHRpbWVzdGFtcHMgdG8gY3VtdWxhdGl2ZSBkZWxlZ2F0ZWQgYW1vdW50czsgcGFuaWNzIG9uIG1pc3Npbmcgb3IgaW52YWxpZCBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgR2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSgpICpVaW50VHJlZSB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgloaXN0b3J5LCBvayA6PSByZXN1bHQuKCpVaW50VHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKlVpbnRUcmVlOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGhpc3RvcnkKfQoKLy8gU2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSBzdG9yZXMgdGltZXN0YW1wLWluZGV4ZWQgYWdncmVnYXRlIGRlbGVnYXRpb24gaGlzdG9yeS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSB3cml0ZSBpcyBhY2NlcHRlZCBvbmx5IHdoZW4gdGhpcyByZWFsbSBpcyBjdXJyZW50LgovLyAgIC0gaGlzdG9yeTogVWludFRyZWUgbWFwcGluZyB0aW1lc3RhbXBzIHRvIGN1bXVsYXRpdmUgdG90YWwgZGVsZWdhdGVkIGFtb3VudHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnJvcjogbmlsIG9uIHN1Y2Nlc3M7IEVyclNwb29mZWRSZWFsbSB3aGVuIHJsbSBpcyBub3QgY3VycmVudCwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgZXJyb3IuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBTZXRUb3RhbERlbGVnYXRpb25IaXN0b3J5KF8gaW50LCBybG0gcmVhbG0sIGhpc3RvcnkgKlVpbnRUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVRvdGFsRGVsZWdhdGlvbkhpc3RvcnksIGhpc3RvcnkpCn0KCi8vIFVzZXIgZGVsZWdhdGlvbiBoaXN0b3J5IG1ldGhvZHMgKGFkZHJlc3MgLT4gKlVpbnRUcmVlW3RpbWVzdGFtcCAtPiBpbnQ2NF0pCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHBlci11c2VyIGRlbGVnYXRpb24taGlzdG9yeSBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzVXNlckRlbGVnYXRpb25IaXN0b3J5U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5VXNlckRlbGVnYXRpb25IaXN0b3J5KQp9CgovLyBHZXRVc2VyRGVsZWdhdGlvbkhpc3RvcnkgcmV0dXJucyB0aGUgYWRkcmVzcy1pbmRleGVkIGRlbGVnYXRpb24taGlzdG9yeSB0cmVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IHRyZWUgbWFwcGluZyBkZWxlZ2F0b3IgYWRkcmVzc2VzIHRvIHRpbWVzdGFtcCBoaXN0b3JpZXM7IHBhbmljcyBvbiBtaXNzaW5nIG9yIGludmFsaWQgc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldFVzZXJEZWxlZ2F0aW9uSGlzdG9yeSgpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlVc2VyRGVsZWdhdGlvbkhpc3RvcnkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaGlzdG9yeSwgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gaGlzdG9yeQp9CgovLyBTZXRVc2VyRGVsZWdhdGlvbkhpc3Rvcnkgc3RvcmVzIHRoZSBhZGRyZXNzLWluZGV4ZWQgZGVsZWdhdGlvbi1oaXN0b3J5IHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgd3JpdGUgaXMgYWNjZXB0ZWQgb25seSB3aGVuIHRoaXMgcmVhbG0gaXMgY3VycmVudC4KLy8gICAtIGhpc3Rvcnk6IEJQVHJlZSBtYXBwaW5nIGRlbGVnYXRvciBhZGRyZXNzZXMgdG8gdGhlaXIgdGltZXN0YW1wLWluZGV4ZWQgaGlzdG9yaWVzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzOyBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIGVycm9yLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgU2V0VXNlckRlbGVnYXRpb25IaXN0b3J5KF8gaW50LCBybG0gcmVhbG0sIGhpc3RvcnkgKmJwdHJlZS5CUFRyZWUpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5VXNlckRlbGVnYXRpb25IaXN0b3J5LCBoaXN0b3J5KQp9CgovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBlbWlzc2lvbi1yZXdhcmQtbWFuYWdlciBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzRW1pc3Npb25SZXdhcmRNYW5hZ2VyU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RW1pc3Npb25SZXdhcmRNYW5hZ2VyKQp9CgovLyBHZXRFbWlzc2lvblJld2FyZE1hbmFnZXIgcmV0dXJucyB0aGUgcGVyc2lzdGVkIGVtaXNzaW9uIHJld2FyZCBtYW5hZ2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKkVtaXNzaW9uUmV3YXJkTWFuYWdlcjogZW1pc3Npb24gcmV3YXJkIGFjY291bnRpbmcgc3RhdGU7IHBhbmljcyBvbiBtaXNzaW5nIG9yIGludmFsaWQgc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldEVtaXNzaW9uUmV3YXJkTWFuYWdlcigpICpFbWlzc2lvblJld2FyZE1hbmFnZXIgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleUVtaXNzaW9uUmV3YXJkTWFuYWdlcikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgltYW5hZ2VyLCBvayA6PSByZXN1bHQuKCpFbWlzc2lvblJld2FyZE1hbmFnZXIpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvICpFbWlzc2lvblJld2FyZE1hbmFnZXI6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gbWFuYWdlcgp9CgovLyBTZXRFbWlzc2lvblJld2FyZE1hbmFnZXIgc3RvcmVzIHRoZSBlbWlzc2lvbiByZXdhcmQgbWFuYWdlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSB3cml0ZSBpcyBhY2NlcHRlZCBvbmx5IHdoZW4gdGhpcyByZWFsbSBpcyBjdXJyZW50LgovLyAgIC0gbWFuYWdlcjogRW1pc3Npb24gcmV3YXJkIGFjY291bnRpbmcgc3RhdGUgdG8gcGVyc2lzdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2VzczsgRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSBlcnJvci4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIFNldEVtaXNzaW9uUmV3YXJkTWFuYWdlcihfIGludCwgcmxtIHJlYWxtLCBtYW5hZ2VyICpFbWlzc2lvblJld2FyZE1hbmFnZXIpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RW1pc3Npb25SZXdhcmRNYW5hZ2VyLCBtYW5hZ2VyKQp9CgovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBwcm90b2NvbC1mZWUgcmV3YXJkLW1hbmFnZXIga2V5IGlzIHByZXNlbnQgaW4gc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEhhc1Byb3RvY29sRmVlUmV3YXJkTWFuYWdlclN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikKfQoKLy8gR2V0UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyIHJldHVybnMgdGhlIHBlcnNpc3RlZCBwcm90b2NvbC1mZWUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyOiBwcm90b2NvbC1mZWUgcmV3YXJkIGFjY291bnRpbmcgc3RhdGU7IHBhbmljcyBvbiBtaXNzaW5nIG9yIGludmFsaWQgc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldFByb3RvY29sRmVlUmV3YXJkTWFuYWdlcigpICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgltYW5hZ2VyLCBvayA6PSByZXN1bHQuKCpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvICpQcm90b2NvbEZlZVJld2FyZE1hbmFnZXI6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gbWFuYWdlcgp9CgovLyBTZXRQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIgc3RvcmVzIHRoZSBwcm90b2NvbC1mZWUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBJbnRlcm5hbCBjYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgd3JpdGUgaXMgYWNjZXB0ZWQgb25seSB3aGVuIHRoaXMgcmVhbG0gaXMgY3VycmVudC4KLy8gICAtIG1hbmFnZXI6IFByb3RvY29sLWZlZSByZXdhcmQgYWNjb3VudGluZyBzdGF0ZSB0byBwZXJzaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzOyBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIGVycm9yLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgU2V0UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyKF8gaW50LCBybG0gcmVhbG0sIG1hbmFnZXIgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcikgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIsIG1hbmFnZXIpCn0KCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGRlbGVnYXRpb24tbWFuYWdlciBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzRGVsZWdhdGlvbk1hbmFnZXJTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlEZWxlZ2F0aW9uTWFuYWdlcikKfQoKLy8gR2V0RGVsZWdhdGlvbk1hbmFnZXIgcmV0dXJucyB0aGUgcGVyc2lzdGVkIGRlbGVnYXRpb24gbWFuYWdlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpEZWxlZ2F0aW9uTWFuYWdlcjogZGVsZWdhdGlvbi1tYW5hZ2VtZW50IHN0YXRlOyBwYW5pY3Mgb24gbWlzc2luZyBvciBpbnZhbGlkIHN0b3JhZ2UuCmZ1bmMgKHMgKmdvdlN0YWtlclN0b3JlKSBHZXREZWxlZ2F0aW9uTWFuYWdlcigpICpEZWxlZ2F0aW9uTWFuYWdlciB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5RGVsZWdhdGlvbk1hbmFnZXIpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJbWFuYWdlciwgb2sgOj0gcmVzdWx0LigqRGVsZWdhdGlvbk1hbmFnZXIpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvICpEZWxlZ2F0aW9uTWFuYWdlcjogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBtYW5hZ2VyCn0KCi8vIFNldERlbGVnYXRpb25NYW5hZ2VyIHN0b3JlcyB0aGUgZGVsZWdhdGlvbiBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogSW50ZXJuYWwgY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHdyaXRlIGlzIGFjY2VwdGVkIG9ubHkgd2hlbiB0aGlzIHJlYWxtIGlzIGN1cnJlbnQuCi8vICAgLSBtYW5hZ2VyOiBEZWxlZ2F0aW9uLW1hbmFnZW1lbnQgc3RhdGUgdG8gcGVyc2lzdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycm9yOiBuaWwgb24gc3VjY2VzczsgRXJyU3Bvb2ZlZFJlYWxtIHdoZW4gcmxtIGlzIG5vdCBjdXJyZW50LCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSBlcnJvci4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIFNldERlbGVnYXRpb25NYW5hZ2VyKF8gaW50LCBybG0gcmVhbG0sIG1hbmFnZXIgKkRlbGVnYXRpb25NYW5hZ2VyKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleURlbGVnYXRpb25NYW5hZ2VyLCBtYW5hZ2VyKQp9CgovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBsYXVuY2hwYWQtcHJvamVjdC1kZXBvc2l0cyBrZXkgaXMgcHJlc2VudCBpbiBzdG9yYWdlLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgSGFzTGF1bmNocGFkUHJvamVjdERlcG9zaXRzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5TGF1bmNocGFkUHJvamVjdERlcG9zaXRzKQp9CgovLyBHZXRMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMgcmV0dXJucyBwZXJzaXN0ZWQgbGF1bmNocGFkIHByb2plY3QgZGVwb3NpdCBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHM6IGxhdW5jaHBhZCBkZXBvc2l0IGFjY291bnRpbmcgc3RhdGU7IHBhbmljcyBvbiBtaXNzaW5nIG9yIGludmFsaWQgc3RvcmFnZS4KZnVuYyAocyAqZ292U3Rha2VyU3RvcmUpIEdldExhdW5jaHBhZFByb2plY3REZXBvc2l0cygpICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleUxhdW5jaHBhZFByb2plY3REZXBvc2l0cykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglkZXBvc2l0cywgb2sgOj0gcmVzdWx0LigqTGF1bmNocGFkUHJvamVjdERlcG9zaXRzKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqTGF1bmNocGFkUHJvamVjdERlcG9zaXRzOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGRlcG9zaXRzCn0KCi8vIFNldExhdW5jaHBhZFByb2plY3REZXBvc2l0cyBzdG9yZXMgbGF1bmNocGFkIHByb2plY3QgZGVwb3NpdCBzdGF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IEludGVybmFsIGNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSB3cml0ZSBpcyBhY2NlcHRlZCBvbmx5IHdoZW4gdGhpcyByZWFsbSBpcyBjdXJyZW50LgovLyAgIC0gZGVwb3NpdHM6IExhdW5jaHBhZCBwcm9qZWN0IGRlcG9zaXQgYWNjb3VudGluZyBzdGF0ZSB0byBwZXJzaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyb3I6IG5pbCBvbiBzdWNjZXNzOyBFcnJTcG9vZmVkUmVhbG0gd2hlbiBybG0gaXMgbm90IGN1cnJlbnQsIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIGVycm9yLgpmdW5jIChzICpnb3ZTdGFrZXJTdG9yZSkgU2V0TGF1bmNocGFkUHJvamVjdERlcG9zaXRzKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXRzICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5TGF1bmNocGFkUHJvamVjdERlcG9zaXRzLCBkZXBvc2l0cykKfQoaqyEKCHRyZWUuZ25vEp4hcGFja2FnZSBzdGFrZXIKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gVWludFRyZWUgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIEJQVHJlZSBmb3Igc3RvcmluZyBub24tbmVnYXRpdmUgaW50NjQga2V5cyBhcwovLyBvcmRlcmVkIHN0cmluZ3MuIERlcGVuZGluZyBvbiB0aGUgY2FsbGVyLCBrZXlzIHJlcHJlc2VudCBVbml4IHRpbWVzdGFtcHMsCi8vIGFjY3J1YWwgZXBvY2hzLCBvciBzdGFrZS1ldmVudCBpbmRleGVzLgovLwovLyBTaW5jZSBrZXlzIGFyZSBpbnQ2NCB2YWx1ZXMsIHRoZXkgYXJlIGNvbnZlcnRlZCB0byB1aW50NjQtY29tcGF0aWJsZSBzdHJpbmdzLgovLwovLyBNZXRob2RzOgovLyAtIEdldDogUmV0cmlldmVzIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLW5lZ2F0aXZlIGludDY0IGtleS4KLy8gLSBzZXQ6IFN0b3JlcyBhIHZhbHVlIHdpdGggYSBub24tbmVnYXRpdmUgaW50NjQga2V5LgovLyAtIEhhczogQ2hlY2tzIGlmIGEgbm9uLW5lZ2F0aXZlIGludDY0IGtleSBleGlzdHMgaW4gdGhlIHRyZWUuCi8vIC0gcmVtb3ZlOiBSZW1vdmVzIGEgbm9uLW5lZ2F0aXZlIGludDY0IGtleSBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUuCi8vIC0gSXRlcmF0ZTogSXRlcmF0ZXMgb3ZlciBrZXlzIGFuZCB2YWx1ZXMgaW4gYSByYW5nZS4KLy8gLSBSZXZlcnNlSXRlcmF0ZTogSXRlcmF0ZXMgaW4gcmV2ZXJzZSBvcmRlciBvdmVyIGtleXMgYW5kIHZhbHVlcyBpbiBhIHJhbmdlLgp0eXBlIFVpbnRUcmVlIHN0cnVjdCB7Cgl0cmVlICpicHRyZWUuQlBUcmVlIC8vIG5vbi1uZWdhdGl2ZSBpbnQ2NCBrZXkgLT4gYW55Cn0KCi8vIE5ld1VpbnRUcmVlIGNyZWF0ZXMgYSBuZXcgVWludFRyZWUgaW5zdGFuY2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqVWludFRyZWU6IG5ldyB0cmVlIGJhY2tlZCBieSBhbiBlbXB0eSBvcmRlcmVkIEJQVHJlZQpmdW5jIE5ld1VpbnRUcmVlKCkgKlVpbnRUcmVlIHsKCXJldHVybiAmVWludFRyZWV7CgkJdHJlZTogYnB0cmVlLk5ld0JQVHJlZU4oNjQpLAoJfQp9CgovLyBHZXQgbG9va3MgdXAgYSB2YWx1ZSBieSBpdHMgbm9uLW5lZ2F0aXZlIGludDY0IGtleS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGtleTogbm9uLW5lZ2F0aXZlIGludDY0IGtleSBlbmNvZGVkIGZvciB0aGUgb3JkZXJlZCB0cmVlIGxvb2t1cDsgYSBuZWdhdGl2ZSBrZXkgcGFuaWNzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbnk6IHZhbHVlIHN0b3JlZCBhdCBrZXksIG9yIG5pbCB3aGVuIG5vIGVudHJ5IGV4aXN0cwovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGtleSBoYXMgYW4gZW50cnk7IGZhbHNlIHdoZW4gYWJzZW50CmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBHZXQoa2V5IGludDY0KSAoYW55LCBib29sKSB7Cgl2IDo9IHNlbGYudHJlZS5HZXQoZW5jb2RlSW50NjQoa2V5KSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoJcmV0dXJuIHYsIHRydWUKfQoKLy8gU2V0IGFzc29jaWF0ZXMgYSB2YWx1ZSB3aXRoIGEgbm9uLW5lZ2F0aXZlIGludDY0IGtleSwgcmVwbGFjaW5nIGFueSBleGlzdGluZwovLyB2YWx1ZSBhdCB0aGF0IGtleS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGtleTogbm9uLW5lZ2F0aXZlIGludDY0IGtleSB0byBlbmNvZGUgYW5kIHN0b3JlOyBhIG5lZ2F0aXZlIGtleSBwYW5pY3MKLy8gICAtIHZhbHVlOiB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCBrZXkKZnVuYyAoc2VsZiAqVWludFRyZWUpIFNldChrZXkgaW50NjQsIHZhbHVlIGFueSkgewoJc2VsZi50cmVlLlNldChlbmNvZGVJbnQ2NChrZXkpLCB2YWx1ZSkKfQoKLy8gSGFzIGNoZWNrcyB3aGV0aGVyIGEgbm9uLW5lZ2F0aXZlIGludDY0IGtleSBpcyBwcmVzZW50IGluIHRoZSB0cmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0ga2V5OiBub24tbmVnYXRpdmUgaW50NjQga2V5IHRvIGVuY29kZSBhbmQgdGVzdDsgYSBuZWdhdGl2ZSBrZXkgcGFuaWNzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4ga2V5IGlzIHByZXNlbnQ7IGZhbHNlIHdoZW4gbm8gZW50cnkgaXMgc3RvcmVkIGF0IGtleQpmdW5jIChzZWxmICpVaW50VHJlZSkgSGFzKGtleSBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gc2VsZi50cmVlLkhhcyhlbmNvZGVJbnQ2NChrZXkpKQp9CgovLyBSZW1vdmUgZGVsZXRlcyB0aGUgZW50cnkgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLW5lZ2F0aXZlIGludDY0IGtleSwgaWYgb25lCi8vIGV4aXN0cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGtleTogbm9uLW5lZ2F0aXZlIGludDY0IGtleSB0byBlbmNvZGUgYW5kIHJlbW92ZTsgYSBuZWdhdGl2ZSBrZXkgcGFuaWNzCmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBSZW1vdmUoa2V5IGludDY0KSB7CglzZWxmLnRyZWUuUmVtb3ZlKGVuY29kZUludDY0KGtleSkpCn0KCi8vIEl0ZXJhdGUgdmlzaXRzIGVudHJpZXMgaW4gdGhlIGhhbGYtb3BlbiBbc3RhcnQsIGVuZCkga2V5IHJhbmdlIGluIGFzY2VuZGluZwovLyBvcmRlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YXJ0OiBub24tbmVnYXRpdmUgbG93ZXItYm91bmQga2V5IGZvciB0aGUgaXRlcmF0aW9uIHJhbmdlOyBhIG5lZ2F0aXZlIGJvdW5kIHBhbmljcwovLyAgIC0gZW5kOiBub24tbmVnYXRpdmUgdXBwZXItYm91bmQga2V5IGZvciB0aGUgaXRlcmF0aW9uIHJhbmdlOyBhIG5lZ2F0aXZlIGJvdW5kIHBhbmljcwovLyAgIC0gZm46IGNhbGxiYWNrIHJlY2VpdmluZyBlYWNoIGRlY29kZWQga2V5IGFuZCB2YWx1ZTsgcmV0dXJuIHRydWUgdG8gc3RvcCBpdGVyYXRpb24sIG9yIGZhbHNlIHRvIGNvbnRpbnVlCmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBJdGVyYXRlKHN0YXJ0LCBlbmQgaW50NjQsIGZuIGZ1bmMoa2V5IGludDY0LCB2YWx1ZSBhbnkpIGJvb2wpIHsKCXNlbGYudHJlZS5JdGVyYXRlKGVuY29kZUludDY0KHN0YXJ0KSwgZW5jb2RlSW50NjQoZW5kKSwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXJldHVybiBmbihkZWNvZGVJbnQ2NChrZXkpLCB2YWx1ZSkKCX0pCn0KCi8vIFJldmVyc2VJdGVyYXRlIHZpc2l0cyBlbnRyaWVzIGluIGRlc2NlbmRpbmcgb3JkZXIgb3ZlciB0aGUgaGFsZi1vcGVuCi8vIFtzdGFydCwgZW5kKSBrZXkgcmFuZ2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzdGFydDogbm9uLW5lZ2F0aXZlIGxvd2VyLWJvdW5kIGtleSBmb3IgdGhlIGl0ZXJhdGlvbiByYW5nZTsgYSBuZWdhdGl2ZSBib3VuZCBwYW5pY3MKLy8gICAtIGVuZDogbm9uLW5lZ2F0aXZlIHVwcGVyLWJvdW5kIGtleSBmb3IgdGhlIGl0ZXJhdGlvbiByYW5nZTsgYSBuZWdhdGl2ZSBib3VuZCBwYW5pY3MKLy8gICAtIGZuOiBjYWxsYmFjayByZWNlaXZpbmcgZWFjaCBkZWNvZGVkIGtleSBhbmQgdmFsdWU7IHJldHVybiB0cnVlIHRvIHN0b3AgaXRlcmF0aW9uLCBvciBmYWxzZSB0byBjb250aW51ZQpmdW5jIChzZWxmICpVaW50VHJlZSkgUmV2ZXJzZUl0ZXJhdGUoc3RhcnQsIGVuZCBpbnQ2NCwgZm4gZnVuYyhrZXkgaW50NjQsIHZhbHVlIGFueSkgYm9vbCkgewoJc2VsZi50cmVlLlJldmVyc2VJdGVyYXRlKGVuY29kZUludDY0KHN0YXJ0KSwgZW5jb2RlSW50NjQoZW5kKSwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXJldHVybiBmbihkZWNvZGVJbnQ2NChrZXkpLCB2YWx1ZSkKCX0pCn0KCi8vIFNpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ6IG51bWJlciBvZiBrZXktdmFsdWUgZW50cmllcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSB0cmVlCmZ1bmMgKHNlbGYgKlVpbnRUcmVlKSBTaXplKCkgaW50IHsKCXJldHVybiBzZWxmLnRyZWUuU2l6ZSgpCn0KCmZ1bmMgZW5jb2RlSW50NjQobnVtIGludDY0KSBzdHJpbmcgewoJaWYgbnVtIDwgMCB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJuZWdhdGl2ZSB2YWx1ZSBub3Qgc3VwcG9ydGVkOiAlZCIsIG51bSkpCgl9CglyZXR1cm4gdXRpbHMuRW5jb2RlVWludDY0KHVpbnQ2NChudW0pKQp9CgpmdW5jIGRlY29kZUludDY0KHMgc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gZ25zbWF0aC5TYWZlVWludDY0VG9JbnQ2NCh1dGlscy5EZWNvZGVVaW50NjQocykpCn0KGoPfAQoJdHlwZXMuZ25vEvTeAXBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgKAoJImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoJcm90cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS9yb3RyZWUvdjAiCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgopCgovLyBNYWluIGludGVyZmFjZSB0aGF0IGNvbWJpbmVzIGFsbCBzdWItaW50ZXJmYWNlcwp0eXBlIElHb3ZTdGFrZXIgaW50ZXJmYWNlIHsKCUlHb3ZTdGFrZXJEZWxlZ2F0aW9uCglJR292U3Rha2VyUmV3YXJkCglJR292U3Rha2VyR2V0dGVyCglJR292U3Rha2VyQWRtaW4KCVJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nCn0KCi8vIERlbGVnYXRpb24gb3BlcmF0aW9ucyBpbnRlcmZhY2UKLy8KLy8gTXV0YXRpbmcgbWV0aG9kcyB0YWtlIGBfIGludCwgcmxtIHJlYWxtYCBzbyB0aGUgcmVhbG0gdG9rZW4gaXMgdGhyZWFkZWQKLy8gZnJvbSB0aGUgcHJveHkgZW50cnkgcG9pbnRzIGRvd24gdG8gdGhlIGNyb3NzLXJlYWxtIHRva2VuIHRyYW5zZmVycyBhbmQKLy8gc3RvcmUgd3JpdGVzIHBlcmZvcm1lZCBpbnNpZGUgZWFjaCBpbXBsZW1lbnRhdGlvbi4gVGhlIGBfIGludGAgc2VudGluZWwKLy8gc3VyZmFjZXMgYXQgZXZlcnkgY2FsbCBzaXRlIGFzIGEgbGl0ZXJhbCBgMGAsIG1ha2luZyB0aGUgcmVhbG0gdGhyZWFkaW5nCi8vIHZpc2libGUgdG8gcmVhZGVycy4KdHlwZSBJR292U3Rha2VyRGVsZWdhdGlvbiBpbnRlcmZhY2UgewoJLy8gTWFpbiBkZWxlZ2F0aW9uIG9wZXJhdGlvbnMKCS8vIERlbGVnYXRlIG1vdmVzIEdOUyBpbnRvIGRlbGVnYXRpb24gYW5kIGFzc2lnbnMgdGhlIGNvcnJlc3BvbmRpbmcgeEdOUyB2b3RpbmcgcG93ZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgaW1wbGVtZW50YXRpb24gY2FsbAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdmFsaWRhdGVkIGJlZm9yZSB0b2tlbiB0cmFuc2ZlcnMgYW5kIHN0YXRlIHVwZGF0ZXMKCS8vICAgLSB0bzogYWRkcmVzcyB0aGF0IHJlY2VpdmVzIHRoZSBkZWxlZ2F0ZWQgdm90aW5nIHBvd2VyCgkvLyAgIC0gYW1vdW50OiBwb3NpdGl2ZSBHTlMgYW1vdW50IHRvIGRlbGVnYXRlCgkvLyAgIC0gcmVmZXJyZXI6IG9wdGlvbmFsIHJlZmVycmFsIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWxlZ2F0aW9uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogYW1vdW50IGRlbGVnYXRlZCBhbmQgcmVwcmVzZW50ZWQgYXMgeEdOUwoJRGVsZWdhdGUoXyBpbnQsIHJsbSByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0LCByZWZlcnJlciBzdHJpbmcpIGludDY0CgkvLyBVbmRlbGVnYXRlIHJlbW92ZXMgdm90aW5nIHBvd2VyIGZyb20gYW4gZXhpc3RpbmcgZGVsZWdhdGVlIGFuZCBzdGFydHMgdGhlCgkvLyB1bmRlbGVnYXRpb24gbG9ja3VwIGZvciB0aGUgcmV0dXJuZWQgR05TLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwIGZvciB0aGUgZm9yd2FyZGVkIGltcGxlbWVudGF0aW9uIGNhbGwKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHZhbGlkYXRlZCBiZWZvcmUgdG9rZW4gYW5kIHN0YXRlIHVwZGF0ZXMKCS8vICAgLSBmcm9tOiBkZWxlZ2F0ZWUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSBjYWxsZXIgcmVtb3ZlcyBkZWxlZ2F0aW9uCgkvLyAgIC0gYW1vdW50OiBwb3NpdGl2ZSB4R05TIGFtb3VudCB0byB1bmRlbGVnYXRlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogYW1vdW50IG1vdmVkIGZyb20gYWN0aXZlIGRlbGVnYXRpb24gaW50byB1bmRlbGVnYXRpb24gbG9ja3VwCglVbmRlbGVnYXRlKF8gaW50LCBybG0gcmVhbG0sIGZyb20gYWRkcmVzcywgYW1vdW50IGludDY0KSBpbnQ2NAoJLy8gUmVkZWxlZ2F0ZSBtb3ZlcyB2b3RpbmcgcG93ZXIgZnJvbSBvbmUgZGVsZWdhdGVlIHRvIGFub3RoZXIgd2l0aG91dCBhCgkvLyB1c2VyLWZhY2luZyB1bmRlbGVnYXRpb24gbG9ja3VwLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwIGZvciB0aGUgZm9yd2FyZGVkIGltcGxlbWVudGF0aW9uIGNhbGwKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHZhbGlkYXRlZCBiZWZvcmUgdG9rZW4gYW5kIHN0YXRlIHVwZGF0ZXMKCS8vICAgLSBkZWxlZ2F0ZWU6IGN1cnJlbnQgZGVsZWdhdGVlIGFkZHJlc3Mgd2hvc2UgZGVsZWdhdGlvbiBpcyByZWR1Y2VkCgkvLyAgIC0gbmV3RGVsZWdhdGVlOiBkZXN0aW5hdGlvbiBhZGRyZXNzIHRoYXQgcmVjZWl2ZXMgdGhlIHJlZGVsZWdhdGVkIGFtb3VudAoJLy8gICAtIGFtb3VudDogcG9zaXRpdmUgeEdOUyBhbW91bnQgdG8gbW92ZSBiZXR3ZWVuIGRlbGVnYXRlZXMKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBhbW91bnQgbW92ZWQgZnJvbSB0aGUgY3VycmVudCBkZWxlZ2F0ZWUgdG8gdGhlIG5ldyBkZWxlZ2F0ZWUKCVJlZGVsZWdhdGUoXyBpbnQsIHJsbSByZWFsbSwgZGVsZWdhdGVlLCBuZXdEZWxlZ2F0ZWUgYWRkcmVzcywgYW1vdW50IGludDY0KSBpbnQ2NAoJLy8gQ29sbGVjdFVuZGVsZWdhdGVkR25zIHJlbGVhc2VzIEdOUyB3aG9zZSB1bmRlbGVnYXRpb24gbG9ja3VwIGhhcyBleHBpcmVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwIGZvciB0aGUgZm9yd2FyZGVkIGltcGxlbWVudGF0aW9uIGNhbGwKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHZhbGlkYXRlZCBiZWZvcmUgdG9rZW4gYW5kIHN0YXRlIHVwZGF0ZXMKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBhbW91bnQgb2YgdW5sb2NrZWQgR05TIGNvbGxlY3RlZCBieSB0aGUgY2FsbGVyCglDb2xsZWN0VW5kZWxlZ2F0ZWRHbnMoXyBpbnQsIHJsbSByZWFsbSkgaW50NjQKfQoKLy8gUmV3YXJkIG1hbmFnZW1lbnQgaW50ZXJmYWNlCnR5cGUgSUdvdlN0YWtlclJld2FyZCBpbnRlcmZhY2UgewoJLy8gUmV3YXJkIGNvbGxlY3Rpb24KCS8vIENvbGxlY3RSZXdhcmQgc2V0dGxlcyB0aGUgY2FsbGVyJ3MgR05TIGVtaXNzaW9uIGFuZCBhbGwga25vd24gcHJvdG9jb2wtZmVlCgkvLyB0b2tlbiByZXdhcmRzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwIGZvciB0aGUgZm9yd2FyZGVkIGltcGxlbWVudGF0aW9uIGNhbGwKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHZhbGlkYXRlZCBiZWZvcmUgcmV3YXJkIHRyYW5zZmVycyBhbmQgc3RhdGUgdXBkYXRlcwoJQ29sbGVjdFJld2FyZChfIGludCwgcmxtIHJlYWxtKQoJLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkIHNldHRsZXMgb25seSB0aGUgY2FsbGVyJ3MgYWNjdW11bGF0ZWQgR05TIGVtaXNzaW9uIHJld2FyZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBpbXBsZW1lbnRhdGlvbiBjYWxsCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB2YWxpZGF0ZWQgYmVmb3JlIHJld2FyZCB0cmFuc2ZlciBhbmQgc3RhdGUgdXBkYXRlcwoJQ29sbGVjdEVtaXNzaW9uUmV3YXJkKF8gaW50LCBybG0gcmVhbG0pCgkvLyBDb2xsZWN0UHJvdG9jb2xGZWVSZXdhcmQgc2V0dGxlcyBvbmUgcmVnaXN0ZXJlZCBwcm90b2NvbC1mZWUgdG9rZW4gcmV3YXJkCgkvLyBmb3IgdGhlIGNhbGxlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBpbXBsZW1lbnRhdGlvbiBjYWxsCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB2YWxpZGF0ZWQgYmVmb3JlIHJld2FyZCB0cmFuc2ZlciBhbmQgc3RhdGUgdXBkYXRlcwoJLy8gICAtIHRva2VuUGF0aDogcmVnaXN0ZXJlZCB0b2tlbiBwYXRoIHdob3NlIGFjY3VtdWxhdGVkIHJld2FyZCBpcyBzZXR0bGVkCglDb2xsZWN0UHJvdG9jb2xGZWVSZXdhcmQoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykKCS8vIENvbGxlY3RSZXdhcmRGcm9tTGF1bmNoUGFkIHNldHRsZXMgYm90aCByZXdhcmQgc3RyZWFtcyBmb3IgYSByZWdpc3RlcmVkCgkvLyBsYXVuY2hwYWQgcHJvamVjdCB3YWxsZXQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgaW1wbGVtZW50YXRpb24gY2FsbAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdmFsaWRhdGVkIGJlZm9yZSBsYXVuY2hwYWQgYXV0aG9yaXphdGlvbiBhbmQgcmV3YXJkIHRyYW5zZmVycwoJLy8gICAtIHRvOiByZWdpc3RlcmVkIGxhdW5jaHBhZCBwcm9qZWN0IHdhbGxldCB0aGF0IHJlY2VpdmVzIHRoZSByZXdhcmRzCglDb2xsZWN0UmV3YXJkRnJvbUxhdW5jaFBhZChfIGludCwgcmxtIHJlYWxtLCB0byBhZGRyZXNzKQoJLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkRnJvbUxhdW5jaFBhZCBzZXR0bGVzIG9ubHkgdGhlIGVtaXNzaW9uIHJld2FyZCBmb3IgYQoJLy8gcmVnaXN0ZXJlZCBsYXVuY2hwYWQgcHJvamVjdCB3YWxsZXQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgaW1wbGVtZW50YXRpb24gY2FsbAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdmFsaWRhdGVkIGJlZm9yZSBsYXVuY2hwYWQgYXV0aG9yaXphdGlvbiBhbmQgcmV3YXJkIHRyYW5zZmVyCgkvLyAgIC0gdG86IHJlZ2lzdGVyZWQgbGF1bmNocGFkIHByb2plY3Qgd2FsbGV0IHRoYXQgcmVjZWl2ZXMgdGhlIGVtaXNzaW9uIHJld2FyZAoJQ29sbGVjdEVtaXNzaW9uUmV3YXJkRnJvbUxhdW5jaFBhZChfIGludCwgcmxtIHJlYWxtLCB0byBhZGRyZXNzKQoJLy8gQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkRnJvbUxhdW5jaFBhZCBzZXR0bGVzIG9uZSBwcm90b2NvbC1mZWUgdG9rZW4gcmV3YXJkCgkvLyBmb3IgYSByZWdpc3RlcmVkIGxhdW5jaHBhZCBwcm9qZWN0IHdhbGxldC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBpbXBsZW1lbnRhdGlvbiBjYWxsCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIGN1cnJlbnQgcmVhbG0gY29udGV4dCB2YWxpZGF0ZWQgYmVmb3JlIGxhdW5jaHBhZCBhdXRob3JpemF0aW9uIGFuZCByZXdhcmQgdHJhbnNmZXIKCS8vICAgLSB0bzogcmVnaXN0ZXJlZCBsYXVuY2hwYWQgcHJvamVjdCB3YWxsZXQgdGhhdCByZWNlaXZlcyB0aGUgdG9rZW4gcmV3YXJkCgkvLyAgIC0gdG9rZW5QYXRoOiByZWdpc3RlcmVkIHRva2VuIHBhdGggd2hvc2UgYWNjdW11bGF0ZWQgcmV3YXJkIGlzIHNldHRsZWQKCUNvbGxlY3RQcm90b2NvbEZlZVJld2FyZEZyb21MYXVuY2hQYWQoXyBpbnQsIHJsbSByZWFsbSwgdG8gYWRkcmVzcywgdG9rZW5QYXRoIHN0cmluZykKCS8vIFNldEFtb3VudEJ5UHJvamVjdFdhbGxldCBhZGp1c3RzIHRoZSBsYXVuY2hwYWQtYmFja2VkIHN0YWtlIGFtb3VudCBhbmQKCS8vIGNvcnJlc3BvbmRpbmcgeEdOUyBiYWxhbmNlIGZvciBhIHByb2plY3Qgd2FsbGV0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwIGZvciB0aGUgZm9yd2FyZGVkIGltcGxlbWVudGF0aW9uIGNhbGwKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHZhbGlkYXRlZCBiZWZvcmUgbGF1bmNocGFkIGF1dGhvcml6YXRpb24gYW5kIHN0YXRlIHVwZGF0ZXMKCS8vICAgLSBhZGRyOiBwcm9qZWN0IHdhbGxldCBhZGRyZXNzIHdob3NlIGxhdW5jaHBhZC1iYWNrZWQgc3Rha2UgaXMgYWRqdXN0ZWQKCS8vICAgLSBhbW91bnQ6IHN0YWtlIGFtb3VudCBkZWx0YSBwYXNzZWQgdG8gdGhlIGxhdW5jaHBhZCByZXdhcmQgYWNjb3VudGluZwoJLy8gICAtIGFkZDogdHJ1ZSB0byBhZGQgc3Rha2UgYW5kIG1pbnQgeEdOUzsgZmFsc2UgdG8gcmVtb3ZlIHN0YWtlIGFuZCBidXJuIHhHTlMKCVNldEFtb3VudEJ5UHJvamVjdFdhbGxldChfIGludCwgcmxtIHJlYWxtLCBhZGRyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCwgYWRkIGJvb2wpCn0KCi8vIEdldHRlciBpbnRlcmZhY2UgZm9yIHJlYWQgb3BlcmF0aW9ucwp0eXBlIElHb3ZTdGFrZXJHZXR0ZXIgaW50ZXJmYWNlIHsKCS8vIFN0b3JlIGRhdGEgZ2V0dGVycwoJLy8gR2V0VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kIHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgdW5kZWxlZ2F0aW9uIGNvb2xkb3duLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IHVuZGVsZWdhdGlvbiBsb2NrdXAgZHVyYXRpb24gaW4gc2Vjb25kcwoJR2V0VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kKCkgaW50NjQKCgkvLyBEZWxlZ2F0aW9uIGdldHRlcnMKCS8vIEdldFRvdGFseEduc1N1cHBseSByZXR1cm5zIHRvdGFsIHhHTlMgc3VwcGx5LCBpbmNsdWRpbmcgeEdOUyBoZWxkIGJ5IHRoZQoJLy8gbGF1bmNocGFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IHRvdGFsIHhHTlMgc3VwcGx5IHVzZWQgYXMgdGhlIGdvdmVybmFuY2UgcXVvcnVtIGJhc2UKCUdldFRvdGFseEduc1N1cHBseSgpIGludDY0CgkvLyBHZXRUb3RhbERlbGVnYXRlZCByZXR1cm5zIHRoZSBhbW91bnQgY3VycmVudGx5IGRlbGVnYXRlZCBmb3IgZ292ZXJuYW5jZQoJLy8gdm90aW5nIHBvd2VyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IHRvdGFsIGFjdGl2ZSBkZWxlZ2F0ZWQgeEdOUyBhbW91bnQKCUdldFRvdGFsRGVsZWdhdGVkKCkgaW50NjQKCS8vIEdldFRvdGFsTG9ja2VkQW1vdW50IHJldHVybnMgR05TIGhlbGQgYnkgdGhlIHN0YWtlciBjb250cmFjdCBmb3IgYWN0aXZlCgkvLyBkZWxlZ2F0aW9ucyBhbmQgbm90LXlldC1jb2xsZWN0ZWQgdW5kZWxlZ2F0aW9ucy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB0b3RhbCBsb2NrZWQgR05TIGFtb3VudAoJR2V0VG90YWxMb2NrZWRBbW91bnQoKSBpbnQ2NAoJLy8gR2V0RGVsZWdhdGlvbnMgcmV0dXJucyBhIHJlYWQtb25seSB0cmVlIG9mIGFsbCBkZWxlZ2F0aW9ucyBrZXllZCBieSB0aGVpcgoJLy8gZGVjaW1hbC1zdHJpbmcgSURzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKnJvdHJlZS5SZWFkT25seVRyZWU6IHJlYWQtb25seSBkZWxlZ2F0aW9uIGluZGV4IHdob3NlIGVudHJpZXMgYXJlIGNsb25lZCBmb3IgY2FsbGVycwoJR2V0RGVsZWdhdGlvbnMoKSAqcm90cmVlLlJlYWRPbmx5VHJlZQoJLy8gRXhpc3RzRGVsZWdhdGlvbiBjaGVja3Mgd2hldGhlciBhIGRlbGVnYXRpb24gcmVjb3JkIGV4aXN0cy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGRlbGVnYXRpb25JRDogdW5pcXVlIGRlbGVnYXRpb24gaWRlbnRpZmllciB0byBsb29rIHVwCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBib29sOiB0cnVlIHdoZW4gZGVsZWdhdGlvbklEIGhhcyBhIHN0b3JlZCByZWNvcmQ7IGZhbHNlIG90aGVyd2lzZQoJRXhpc3RzRGVsZWdhdGlvbihkZWxlZ2F0aW9uSUQgaW50NjQpIGJvb2wKCS8vIEdldERlbGVnYXRvckRlbGVnYXRpb25zIHJldHVybnMgYSByZWFkLW9ubHkgdHJlZSBmb3Igb25lIGRlbGVnYXRvciwga2V5ZWQKCS8vIGJ5IGRlbGVnYXRlZSBhZGRyZXNzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVsZWdhdG9yOiBhZGRyZXNzIHdob3NlIGRlbGVnYXRlZSBtYXBwaW5ncyBhcmUgcmVxdWVzdGVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSAqcm90cmVlLlJlYWRPbmx5VHJlZTogZGVsZWdhdGVlLXRvLWRlbGVnYXRpb24tSUQgdHJlZSwgb3IgbmlsIHdoZW4gdGhlIGRlbGVnYXRvciBoYXMgbm8gZGVsZWdhdGlvbnMKCUdldERlbGVnYXRvckRlbGVnYXRpb25zKGRlbGVnYXRvciBhZGRyZXNzKSAqcm90cmVlLlJlYWRPbmx5VHJlZQoJLy8gR2V0VXNlckRlbGVnYXRpb25JRHMgcmV0dXJucyBkZWxlZ2F0aW9uIElEcyBmb3Igb25lIGRlbGVnYXRvci1kZWxlZ2F0ZWUKCS8vIHBhaXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBkZWxlZ2F0b3I6IGFkZHJlc3MgdGhhdCBvd25zIHRoZSBkZWxlZ2F0aW9uCgkvLyAgIC0gZGVsZWdhdGVlOiBhZGRyZXNzIHJlY2VpdmluZyB0aGUgZGVsZWdhdGlvbgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gW11pbnQ2NDogc3RvcmVkIGRlbGVnYXRpb24gSURzIGZvciB0aGUgcGFpciwgb3IgYW4gZW1wdHkgbGlzdCB3aGVuIG5vbmUgZXhpc3QKCUdldFVzZXJEZWxlZ2F0aW9uSURzKGRlbGVnYXRvciBhZGRyZXNzLCBkZWxlZ2F0ZWUgYWRkcmVzcykgW11pbnQ2NAoJLy8gSGFzRGVsZWdhdGlvblNuYXBzaG90c0tleSByZXBvcnRzIHdoZXRoZXIgdG90YWwgZGVsZWdhdGlvbiBoaXN0b3J5IGhhcwoJLy8gYmVlbiBpbml0aWFsaXplZCBpbiBzdG9yYWdlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSB0b3RhbCBkZWxlZ2F0aW9uIGhpc3Rvcnkgc3RvcmUga2V5IGV4aXN0czsgZmFsc2Ugb3RoZXJ3aXNlCglIYXNEZWxlZ2F0aW9uU25hcHNob3RzS2V5KCkgYm9vbAoJLy8gR2V0VG90YWxEZWxlZ2F0aW9uQW1vdW50QXRTbmFwc2hvdCBmaW5kcyB0aGUgbGF0ZXN0IHRvdGFsIGRlbGVnYXRpb24KCS8vIGhpc3RvcnkgdmFsdWUgYXQgb3IgYmVmb3JlIGEgVW5peCB0aW1lc3RhbXAuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBzbmFwc2hvdFRpbWU6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRvIHJlc29sdmUgaGlzdG9yaWNhbCB0b3RhbCBkZWxlZ2F0aW9uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogdG90YWwgZGVsZWdhdGVkIGFtb3VudCBmcm9tIHRoZSBsYXRlc3QgcXVhbGlmeWluZyBoaXN0b3J5IGVudHJ5CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgcXVhbGlmeWluZyBoaXN0b3J5IGVudHJ5IGV4aXN0czsgZmFsc2Ugd2hlbiBoaXN0b3J5IGhhcyBubyBzdWNoIGVudHJ5CglHZXRUb3RhbERlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHNuYXBzaG90VGltZSBpbnQ2NCkgKGludDY0LCBib29sKQoJLy8gR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90IGZpbmRzIG9uZSB1c2VyJ3MgbGF0ZXN0IGRlbGVnYXRpb24KCS8vIGhpc3RvcnkgdmFsdWUgYXQgb3IgYmVmb3JlIGEgVW5peCB0aW1lc3RhbXAuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSB1c2VyQWRkcjogdXNlcidzIGFkZHJlc3Mgd2hvc2UgZGVsZWdhdGlvbiBoaXN0b3J5IGlzIHNlYXJjaGVkCgkvLyAgIC0gc25hcHNob3RUaW1lOiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0byByZXNvbHZlIHRoZSB1c2VyJ3MgaGlzdG9yaWNhbCBkZWxlZ2F0aW9uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogdXNlcidzIGRlbGVnYXRlZCBhbW91bnQgZnJvbSB0aGUgbGF0ZXN0IHF1YWxpZnlpbmcgaGlzdG9yeSBlbnRyeQoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIHF1YWxpZnlpbmcgaGlzdG9yeSBlbnRyeSBleGlzdHM7IGZhbHNlIG90aGVyd2lzZQoJR2V0VXNlckRlbGVnYXRpb25BbW91bnRBdFNuYXBzaG90KHVzZXJBZGRyIGFkZHJlc3MsIHNuYXBzaG90VGltZSBpbnQ2NCkgKGludDY0LCBib29sKQoKCS8vIFJld2FyZCBnZXR0ZXJzCgkvLyBHZXRDbGFpbWFibGVSZXdhcmRCeUFkZHJlc3MgY29tcHV0ZXMgY3VycmVudCBjbGFpbWFibGUgZW1pc3Npb24gYW5kCgkvLyBwcm90b2NvbC1mZWUgcmV3YXJkcyBmb3IgYW4gYWRkcmVzcyByZXdhcmQgSUQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBhZGRyOiBzdGFrZXIgYWRkcmVzcyB3aG9zZSByZXdhcmQgSUQgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IGNsYWltYWJsZSBHTlMgZW1pc3Npb24gcmV3YXJkIGFtb3VudAoJLy8gICAtIG1hcFtzdHJpbmddaW50NjQ6IGNsYWltYWJsZSBwcm90b2NvbC1mZWUgYW1vdW50cyBrZXllZCBieSB0b2tlbiBwYXRoCgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIGJvdGggcmV3YXJkIHN0cmVhbXMgYXJlIGNvbXB1dGVkOyBvdGhlcndpc2UgdGhlIHJld2FyZC1hY2NvdW50aW5nIGVycm9yCglHZXRDbGFpbWFibGVSZXdhcmRCeUFkZHJlc3MoYWRkciBhZGRyZXNzKSAoaW50NjQsIG1hcFtzdHJpbmddaW50NjQsIGVycm9yKQoJLy8gR2V0Q2xhaW1hYmxlUmV3YXJkQnlMYXVuY2hwYWQgY29tcHV0ZXMgcmV3YXJkcyBmb3IgYSBsYXVuY2hwYWQgcHJvamVjdAoJLy8gd2FsbGV0J3MgbGF1bmNocGFkLXNwZWNpZmljIHJld2FyZCBJRC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGFkZHI6IHJlZ2lzdGVyZWQgbGF1bmNocGFkIHByb2plY3Qgd2FsbGV0IGFkZHJlc3MKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBjbGFpbWFibGUgR05TIGVtaXNzaW9uIHJld2FyZCBhbW91bnQKCS8vICAgLSBtYXBbc3RyaW5nXWludDY0OiBjbGFpbWFibGUgcHJvdG9jb2wtZmVlIGFtb3VudHMga2V5ZWQgYnkgdG9rZW4gcGF0aAoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBib3RoIHJld2FyZCBzdHJlYW1zIGFyZSBjb21wdXRlZDsgb3RoZXJ3aXNlIHRoZSByZXdhcmQtYWNjb3VudGluZyBlcnJvcgoJR2V0Q2xhaW1hYmxlUmV3YXJkQnlMYXVuY2hwYWQoYWRkciBhZGRyZXNzKSAoaW50NjQsIG1hcFtzdHJpbmddaW50NjQsIGVycm9yKQoJLy8gR2V0Q2xhaW1hYmxlUmV3YXJkQnlSZXdhcmRJRCBjb21wdXRlcyBjdXJyZW50IHJld2FyZHMgZm9yIGFuIGV4cGxpY2l0CgkvLyByZXdhcmQgaWRlbnRpZmllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHJld2FyZElEOiBzdGFrZXIgb3IgbGF1bmNocGFkIHJld2FyZC1zdGF0ZSBpZGVudGlmaWVyCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogY2xhaW1hYmxlIEdOUyBlbWlzc2lvbiByZXdhcmQgYW1vdW50CgkvLyAgIC0gbWFwW3N0cmluZ11pbnQ2NDogY2xhaW1hYmxlIHByb3RvY29sLWZlZSBhbW91bnRzIGtleWVkIGJ5IHRva2VuIHBhdGgKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gYm90aCByZXdhcmQgc3RyZWFtcyBhcmUgY29tcHV0ZWQ7IG90aGVyd2lzZSB0aGUgcmV3YXJkLWFjY291bnRpbmcgZXJyb3IKCUdldENsYWltYWJsZVJld2FyZEJ5UmV3YXJkSUQocmV3YXJkSUQgc3RyaW5nKSAoaW50NjQsIG1hcFtzdHJpbmddaW50NjQsIGVycm9yKQoKCS8vIExhdW5jaHBhZCBnZXR0ZXJzCgkvLyBHZXRMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdCByZXR1cm5zIGEgcHJvamVjdCdzIHJlY29yZGVkIGxhdW5jaHBhZCBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdEFkZHI6IHByb2plY3QgYWRkcmVzcyBpZGVudGlmaWVyIHVzZWQgdG8gZGVyaXZlIHRoZSBsYXVuY2hwYWQgcmV3YXJkIGtleQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IHN0b3JlZCBwcm9qZWN0IGRlcG9zaXQgYW1vdW50CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIGEgZGVwb3NpdCByZWNvcmQgZXhpc3RzIGZvciBwcm9qZWN0QWRkcjsgZmFsc2Ugb3RoZXJ3aXNlCglHZXRMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdChwcm9qZWN0QWRkciBzdHJpbmcpIChpbnQ2NCwgYm9vbCkKCgkvLyBXaXRoZHJhdyBnZXR0ZXJzCgkvLyBHZXREZWxlZ2F0aW9uV2l0aGRyYXdDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGVuZGluZyB3aXRoZHJhd2FsCgkvLyByZWNvcmRzIGF0dGFjaGVkIHRvIGEgZGVsZWdhdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGRlbGVnYXRpb25JRDogZGVsZWdhdGlvbiB3aG9zZSB3aXRoZHJhd2FsIGxpc3QgaXMgY291bnRlZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50OiBudW1iZXIgb2Ygd2l0aGRyYXdhbCByZWNvcmRzLCBvciAwIHdoZW4gdGhlIGRlbGVnYXRpb24gaXMgYWJzZW50CglHZXREZWxlZ2F0aW9uV2l0aGRyYXdDb3VudChkZWxlZ2F0aW9uSUQgaW50NjQpIGludAoJLy8gR2V0RGVsZWdhdGlvbldpdGhkcmF3cyByZXR1cm5zIGEgc2xpY2Ugb2YgYSBkZWxlZ2F0aW9uJ3Mgd2l0aGRyYXdhbCBsaXN0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVsZWdhdGlvbklEOiBkZWxlZ2F0aW9uIHdob3NlIHdpdGhkcmF3YWxzIGFyZSByZXF1ZXN0ZWQKCS8vICAgLSBvZmZzZXQ6IG5vbi1uZWdhdGl2ZSB6ZXJvLWJhc2VkIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB3aXRoZHJhd2FsIGxpc3QKCS8vICAgLSBjb3VudDogbm9uLW5lZ2F0aXZlIG1heGltdW0gbnVtYmVyIG9mIHdpdGhkcmF3YWxzIHRvIGluY2x1ZGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIFtdRGVsZWdhdGlvbldpdGhkcmF3OiB3aXRoZHJhd2FscyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlLCBvciBhbiBlbXB0eSBzbGljZSB3aGVuIHRoZSBkZWxlZ2F0aW9uIG9yIHJhbmdlIGlzIGFic2VudAoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiB0aGUgbG9va3VwIGNvbXBsZXRlczsgYW4gdW5rbm93biBkZWxlZ2F0aW9uIHlpZWxkcyBhbiBlbXB0eSBzbGljZQoJR2V0RGVsZWdhdGlvbldpdGhkcmF3cyhkZWxlZ2F0aW9uSUQgaW50NjQsIG9mZnNldCwgY291bnQgaW50KSAoW11EZWxlZ2F0aW9uV2l0aGRyYXcsIGVycm9yKQoJLy8gR2V0Q29sbGVjdGFibGVXaXRoZHJhd0Ftb3VudCBzdW1zIGFsbCB3aXRoZHJhd2FsIGFtb3VudHMgY3VycmVudGx5CgkvLyBjb2xsZWN0YWJsZSBmb3IgYSBkZWxlZ2F0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVsZWdhdGlvbklEOiBkZWxlZ2F0aW9uIHdob3NlIGV4cGlyZWQgd2l0aGRyYXdhbHMgYXJlIHN1bW1lZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IHRvdGFsIEdOUyBhbW91bnQgY29sbGVjdGFibGUgbm93LCBvciAwIHdoZW4gbm9uZSBpcyBjb2xsZWN0YWJsZQoJR2V0Q29sbGVjdGFibGVXaXRoZHJhd0Ftb3VudChkZWxlZ2F0aW9uSUQgaW50NjQpIGludDY0CgoJLy8gUHJvdG9jb2wgZmVlIHJld2FyZCBnZXR0ZXJzCgkvLyBHZXRQcm90b2NvbEZlZUFjY3VtdWxhdGVkWDEyOFBlclN0YWtlIHJldHVybnMgdGhlIHBlci1zdGFrZSBwcm90b2NvbC1mZWUKCS8vIGFjY3VtdWxhdG9yIGZvciBhIHRva2VuIHBhdGgsIHNjYWxlZCBieSAyXjEyOC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRva2VuUGF0aDogcmVnaXN0ZXJlZCB0b2tlbiBwYXRoIHdob3NlIGFjY3VtdWxhdG9yIGlzIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICp1aW50MjU2LlVpbnQ6IFExMjgtc2NhbGVkIGFjY3VtdWxhdGVkIGZlZSBwZXIgc3Rha2UsIHplcm8gd2hlbiB0aGUgdG9rZW4gaGFzIG5vIGZvbGRlZCBmZWUKCUdldFByb3RvY29sRmVlQWNjdW11bGF0ZWRYMTI4UGVyU3Rha2UodG9rZW5QYXRoIHN0cmluZykgKnVpbnQyNTYuVWludAoJLy8gR2V0UHJvdG9jb2xGZWVBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgcHJvdG9jb2wgZmVlIGZvbGRlZCBmb3IgYSB0b2tlbgoJLy8gcGF0aC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRva2VuUGF0aDogcmVnaXN0ZXJlZCB0b2tlbiBwYXRoIHdob3NlIGZvbGRlZCBmZWUgYW1vdW50IGlzIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB0b3RhbCBmb2xkZWQgcHJvdG9jb2wtZmVlIGFtb3VudCwgb3IgMCB3aGVuIHRoZSB0b2tlbiBoYXMgbm8gYWNjdW11bGF0b3IKCUdldFByb3RvY29sRmVlQW1vdW50KHRva2VuUGF0aCBzdHJpbmcpIGludDY0CgkvLyBHZXRQcm90b2NvbEZlZUFjY3VtdWxhdGVkVGltZXN0YW1wIHJldHVybnMgdGhlIGxhc3QgdGltZXN0YW1wIGF0IHdoaWNoCgkvLyBwcm90b2NvbC1mZWUgYWNjcnVhbCBzdGF0ZSBhZHZhbmNlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiBVbml4IHRpbWVzdGFtcCBvZiB0aGUgbGF0ZXN0IHByb3RvY29sLWZlZSBhY2N1bXVsYXRpb24gdXBkYXRlCglHZXRQcm90b2NvbEZlZUFjY3VtdWxhdGVkVGltZXN0YW1wKCkgaW50NjQKCgkvLyBFbWlzc2lvbiByZXdhcmQgZ2V0dGVycwoJLy8gR2V0RW1pc3Npb25BY2N1bXVsYXRlZFgxMjhQZXJTdGFrZSByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCBHTlMgZW1pc3Npb24KCS8vIHJld2FyZCBwZXIgc3Rha2UsIHNjYWxlZCBieSAyXjEyOC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICp1aW50MjU2LlVpbnQ6IFExMjgtc2NhbGVkIGFjY3VtdWxhdGVkIGVtaXNzaW9uIHBlciBzdGFrZQoJR2V0RW1pc3Npb25BY2N1bXVsYXRlZFgxMjhQZXJTdGFrZSgpICp1aW50MjU2LlVpbnQKCS8vIEdldEVtaXNzaW9uRGlzdHJpYnV0ZWRBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgR05TIGVtaXNzaW9uIGRpc3RyaWJ1dGVkCgkvLyB0aHJvdWdoIHRoZSBzdGFrZXIgcmV3YXJkIG1hbmFnZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogY3VtdWxhdGl2ZSBkaXN0cmlidXRlZCBHTlMgZW1pc3Npb24gYW1vdW50CglHZXRFbWlzc2lvbkRpc3RyaWJ1dGVkQW1vdW50KCkgaW50NjQKCS8vIEdldEVtaXNzaW9uQWNjdW11bGF0ZWRUaW1lc3RhbXAgcmV0dXJucyB0aGUgbGFzdCB0aW1lc3RhbXAgYXQgd2hpY2gKCS8vIGVtaXNzaW9uIHJld2FyZCBhY2NydWFsIHN0YXRlIGFkdmFuY2VkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IFVuaXggdGltZXN0YW1wIG9mIHRoZSBsYXRlc3QgZW1pc3Npb24gYWNjdW11bGF0aW9uIHVwZGF0ZQoJR2V0RW1pc3Npb25BY2N1bXVsYXRlZFRpbWVzdGFtcCgpIGludDY0Cn0KCi8vIEFkbWluIGludGVyZmFjZSBmb3IgYWRtaW5pc3RyYXRpdmUgZnVuY3Rpb25zCnR5cGUgSUdvdlN0YWtlckFkbWluIGludGVyZmFjZSB7CgkvLyBDbGVhblN0YWtlckRlbGVnYXRpb25TbmFwc2hvdEJ5QWRtaW4gcmVtb3ZlcyBkZWxlZ2F0aW9uLWhpc3RvcnkgZW50cmllcwoJLy8gb2xkZXIgdGhhbiBhIHZhbGlkYXRlZCB0aW1lc3RhbXAgY3V0b2ZmLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwIGZvciB0aGUgZm9yd2FyZGVkIGltcGxlbWVudGF0aW9uIGNhbGwKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHZhbGlkYXRlZCBiZWZvcmUgYWRtaW5pc3RyYXRpdmUgc3RhdGUgdXBkYXRlcwoJLy8gICAtIHNuYXBzaG90VGltZTogVW5peCB0aW1lc3RhbXAgY3V0b2ZmIGJlZm9yZSB3aGljaCBlbGlnaWJsZSBoaXN0b3J5IGVudHJpZXMgYXJlIHJlbW92ZWQKCS8vICAgLSB0YXJnZXQ6IGFkZHJlc3Mgd2hvc2UgdXNlciBkZWxlZ2F0aW9uIGhpc3RvcnkgaXMgY2xlYW5lZAoJQ2xlYW5TdGFrZXJEZWxlZ2F0aW9uU25hcHNob3RCeUFkbWluKF8gaW50LCBybG0gcmVhbG0sIHNuYXBzaG90VGltZSBpbnQ2NCwgdGFyZ2V0IGFkZHJlc3MpCgkvLyBTZXRVbkRlbGVnYXRpb25Mb2NrdXBQZXJpb2RCeUFkbWluIHVwZGF0ZXMgdGhlIGR1cmF0aW9uIHVzZWQgYnkgZnV0dXJlCgkvLyB1bmRlbGVnYXRpb24gd2l0aGRyYXdhbHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgaW1wbGVtZW50YXRpb24gY2FsbAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgdmFsaWRhdGVkIGJlZm9yZSB0aGUgYWRtaW5pc3RyYXRpdmUgc3RvcmUgd3JpdGUKCS8vICAgLSBwZXJpb2Q6IG5vbi1uZWdhdGl2ZSB1bmRlbGVnYXRpb24gbG9ja3VwIGR1cmF0aW9uIGluIHNlY29uZHMKCVNldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZEJ5QWRtaW4oXyBpbnQsIHJsbSByZWFsbSwgcGVyaW9kIGludDY0KQp9CgovLyBJR292U3Rha2VyU3RvcmUgbWlycm9ycyB0aGUgbXV0YXRpbmctbWV0aG9kIHJlYWxtLXRocmVhZGluZyBjb252ZW50aW9uIHVzZWQKLy8gYnkgdGhlIHB1YmxpYyBJR292U3Rha2VyKiBpbnRlcmZhY2VzIGFib3ZlLiBTZXR0ZXJzIHRha2UgYF8gaW50LCBybG0gcmVhbG1gCi8vIHNvIEtWLXN0b3JlIHdyaXRlcyBleGVjdXRlIHVuZGVyIHRoZSBwcm94eSByZWFsbSDigJQgdGhlIG9ubHkgYWRkcmVzcyB3aXRoCi8vIHdyaXRlIGFjY2VzcyB0byB0aGUgc2hhcmVkIHN0b3JlLgp0eXBlIElHb3ZTdGFrZXJTdG9yZSBpbnRlcmZhY2UgewoJLy8gQmFzaWMgY29uZmlndXJhdGlvbgoJLy8gSGFzVW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBsb2NrdXAgZHVyYXRpb24gaXMgaW5pdGlhbGl6ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHVuZGVsZWdhdGlvbiBsb2NrdXAgcGVyaW9kIHN0b3JlIGtleSBleGlzdHMKCUhhc1VuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZFN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kIHJldHVybnMgdGhlIHBlcnNpc3RlZCB1bmRlbGVnYXRpb24gbG9ja3VwIGR1cmF0aW9uLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW50NjQ6IGNvbmZpZ3VyZWQgbG9ja3VwIGR1cmF0aW9uIGluIHNlY29uZHMKCUdldFVuRGVsZWdhdGlvbkxvY2t1cFBlcmlvZCgpIGludDY0CgkvLyBTZXRVbkRlbGVnYXRpb25Mb2NrdXBQZXJpb2QgcGVyc2lzdHMgdGhlIHVuZGVsZWdhdGlvbiBsb2NrdXAgZHVyYXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIHBlcmlvZDogbG9ja3VwIGR1cmF0aW9uIGluIHNlY29uZHMKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBzdG9yZWQ7IG90aGVyd2lzZSB0aGUgS1Ytc3RvcmUgZXJyb3IsIGluY2x1ZGluZyBhIHNwb29mZWQgcmVhbG0gY29udGV4dAoJU2V0VW5EZWxlZ2F0aW9uTG9ja3VwUGVyaW9kKF8gaW50LCBybG0gcmVhbG0sIHBlcmlvZCBpbnQ2NCkgZXJyb3IKCgkvLyBIYXNUb3RhbERlbGVnYXRlZEFtb3VudFN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0b3RhbCBhY3RpdmUgZGVsZWdhdGlvbiBpcyBpbml0aWFsaXplZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgdG90YWwgZGVsZWdhdGVkIGFtb3VudCBzdG9yZSBrZXkgZXhpc3RzCglIYXNUb3RhbERlbGVnYXRlZEFtb3VudFN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0VG90YWxEZWxlZ2F0ZWRBbW91bnQgcmV0dXJucyB0aGUgcGVyc2lzdGVkIHRvdGFsIGFjdGl2ZSBkZWxlZ2F0aW9uIGFtb3VudC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGludDY0OiB0b3RhbCBkZWxlZ2F0ZWQgeEdOUyBhbW91bnQKCUdldFRvdGFsRGVsZWdhdGVkQW1vdW50KCkgaW50NjQKCS8vIFNldFRvdGFsRGVsZWdhdGVkQW1vdW50IHBlcnNpc3RzIHRoZSB0b3RhbCBhY3RpdmUgZGVsZWdhdGlvbiBhbW91bnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIGFtb3VudDogdG90YWwgYWN0aXZlIGRlbGVnYXRlZCB4R05TIGFtb3VudCB0byBzdG9yZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHN0b3JlZDsgb3RoZXJ3aXNlIHRoZSBLVi1zdG9yZSBlcnJvciwgaW5jbHVkaW5nIGEgc3Bvb2ZlZCByZWFsbSBjb250ZXh0CglTZXRUb3RhbERlbGVnYXRlZEFtb3VudChfIGludCwgcmxtIHJlYWxtLCBhbW91bnQgaW50NjQpIGVycm9yCgoJLy8gSGFzVG90YWxMb2NrZWRBbW91bnRTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdG90YWwgbG9ja2VkIEdOUyBpcyBpbml0aWFsaXplZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgdG90YWwgbG9ja2VkIGFtb3VudCBzdG9yZSBrZXkgZXhpc3RzCglIYXNUb3RhbExvY2tlZEFtb3VudFN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0VG90YWxMb2NrZWRBbW91bnQgcmV0dXJucyB0aGUgcGVyc2lzdGVkIHRvdGFsIEdOUyBoZWxkIGJ5IHRoZSBzdGFrZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBpbnQ2NDogdG90YWwgbG9ja2VkIEdOUyBhbW91bnQKCUdldFRvdGFsTG9ja2VkQW1vdW50KCkgaW50NjQKCS8vIFNldFRvdGFsTG9ja2VkQW1vdW50IHBlcnNpc3RzIHRoZSB0b3RhbCBsb2NrZWQgR05TIGFtb3VudC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSB3cml0ZQoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgYnkgdGhlIEtWIHN0b3JlCgkvLyAgIC0gYW1vdW50OiB0b3RhbCBsb2NrZWQgR05TIGFtb3VudCB0byBzdG9yZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHN0b3JlZDsgb3RoZXJ3aXNlIHRoZSBLVi1zdG9yZSBlcnJvciwgaW5jbHVkaW5nIGEgc3Bvb2ZlZCByZWFsbSBjb250ZXh0CglTZXRUb3RhbExvY2tlZEFtb3VudChfIGludCwgcmxtIHJlYWxtLCBhbW91bnQgaW50NjQpIGVycm9yCgoJLy8gRGVsZWdhdGlvbiBtYW5hZ2VtZW50CgkvLyBIYXNEZWxlZ2F0aW9uIHJlcG9ydHMgd2hldGhlciBhIGRlbGVnYXRpb24gcmVjb3JkIGV4aXN0cyBmb3IgYW4gSUQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBpZDogZGVsZWdhdGlvbiBpZGVudGlmaWVyIHRvIGxvb2sgdXAKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIGRlbGVnYXRpb24gaXMgc3RvcmVkIHVuZGVyIGlkOyBmYWxzZSBvdGhlcndpc2UKCUhhc0RlbGVnYXRpb24oaWQgaW50NjQpIGJvb2wKCS8vIEdldERlbGVnYXRpb24gcmV0cmlldmVzIG9uZSBkZWxlZ2F0aW9uIHJlY29yZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGlkOiBkZWxlZ2F0aW9uIGlkZW50aWZpZXIgdG8gbG9vayB1cAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKkRlbGVnYXRpb246IHN0b3JlZCBkZWxlZ2F0aW9uIHBvaW50ZXIsIG9yIG5pbCB3aGVuIGlkIGlzIGFic2VudAoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiBhIGRlbGVnYXRpb24gcmVjb3JkIGV4aXN0cyBhbmQgaGFzIHRoZSBleHBlY3RlZCB0eXBlOyBmYWxzZSBvdGhlcndpc2UKCUdldERlbGVnYXRpb24oaWQgaW50NjQpICgqRGVsZWdhdGlvbiwgYm9vbCkKCS8vIFNldERlbGVnYXRpb24gc3RvcmVzIGEgZGVsZWdhdGlvbiB1bmRlciBpdHMgaWRlbnRpZmllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSB3cml0ZQoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgYnkgdGhlIEtWIHN0b3JlCgkvLyAgIC0gaWQ6IGRlbGVnYXRpb24gaWRlbnRpZmllciB1c2VkIGFzIHRoZSBzdG9yYWdlIGtleQoJLy8gICAtIGRlbGVnYXRpb246IGRlbGVnYXRpb24gcmVjb3JkIHRvIHN0b3JlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gc3RvcmVkOyBvdGhlcndpc2UgdGhlIEtWLXN0b3JlIGVycm9yLCBpbmNsdWRpbmcgYSBzcG9vZmVkIHJlYWxtIGNvbnRleHQKCVNldERlbGVnYXRpb24oXyBpbnQsIHJsbSByZWFsbSwgaWQgaW50NjQsIGRlbGVnYXRpb24gKkRlbGVnYXRpb24pIGVycm9yCgkvLyBSZW1vdmVEZWxlZ2F0aW9uIGRlbGV0ZXMgYSBkZWxlZ2F0aW9uIHJlY29yZCBhbmQgaXRzIHN0b3JhZ2UgZW50cnkuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIGlkOiBkZWxlZ2F0aW9uIGlkZW50aWZpZXIgdG8gcmVtb3ZlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gdGhlIHN0b3JlIHdyaXRlIHN1Y2NlZWRzOyBvdGhlcndpc2UgdGhlIEtWLXN0b3JlIGVycm9yLCBpbmNsdWRpbmcgYSBzcG9vZmVkIHJlYWxtIGNvbnRleHQKCVJlbW92ZURlbGVnYXRpb24oXyBpbnQsIHJsbSByZWFsbSwgaWQgaW50NjQpIGVycm9yCgoJLy8gSGFzRGVsZWdhdGlvbnNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIGFsbC1kZWxlZ2F0aW9ucyB0cmVlIGlzIGluaXRpYWxpemVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBkZWxlZ2F0aW9ucyBzdG9yZSBrZXkgZXhpc3RzCglIYXNEZWxlZ2F0aW9uc1N0b3JlS2V5KCkgYm9vbAoJLy8gU2V0RGVsZWdhdGlvbnMgcmVwbGFjZXMgdGhlIHBlcnNpc3RlZCBhbGwtZGVsZWdhdGlvbnMgdHJlZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSB3cml0ZQoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgYnkgdGhlIEtWIHN0b3JlCgkvLyAgIC0gZGVsZWdhdGlvbnM6IEJQVHJlZSBjb250YWluaW5nIGRlbGVnYXRpb24gcmVjb3JkcyBrZXllZCBieSBkZWxlZ2F0aW9uIElECgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gc3RvcmVkOyBvdGhlcndpc2UgdGhlIEtWLXN0b3JlIGVycm9yLCBpbmNsdWRpbmcgYSBzcG9vZmVkIHJlYWxtIGNvbnRleHQKCVNldERlbGVnYXRpb25zKF8gaW50LCBybG0gcmVhbG0sIGRlbGVnYXRpb25zICpicHRyZWUuQlBUcmVlKSBlcnJvcgoJLy8gR2V0QWxsRGVsZWdhdGlvbnMgcmV0dXJucyB0aGUgcGVyc2lzdGVkIHRyZWUgY29udGFpbmluZyBldmVyeSBkZWxlZ2F0aW9uLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKmJwdHJlZS5CUFRyZWU6IGFsbC1kZWxlZ2F0aW9ucyB0cmVlIGtleWVkIGJ5IGRlY2ltYWwtc3RyaW5nIGRlbGVnYXRpb24gSUQKCUdldEFsbERlbGVnYXRpb25zKCkgKmJwdHJlZS5CUFRyZWUKCgkvLyBIYXNEZWxlZ2F0aW9uQ291bnRlclN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgbmV4dC1kZWxlZ2F0aW9uLUlEIGNvdW50ZXIgaXMgaW5pdGlhbGl6ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGRlbGVnYXRpb24gY291bnRlciBzdG9yZSBrZXkgZXhpc3RzCglIYXNEZWxlZ2F0aW9uQ291bnRlclN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0RGVsZWdhdGlvbkNvdW50ZXIgcmV0dXJucyB0aGUgcGVyc2lzdGVkIGNvdW50ZXIgdXNlZCB0byBhbGxvY2F0ZSBkZWxlZ2F0aW9uIElEcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpDb3VudGVyOiBtdXRhYmxlIGRlbGVnYXRpb24tSUQgY291bnRlcgoJR2V0RGVsZWdhdGlvbkNvdW50ZXIoKSAqQ291bnRlcgoJLy8gU2V0RGVsZWdhdGlvbkNvdW50ZXIgcGVyc2lzdHMgdGhlIGRlbGVnYXRpb24tSUQgY291bnRlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSB3cml0ZQoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgYnkgdGhlIEtWIHN0b3JlCgkvLyAgIC0gY291bnRlcjogZGVsZWdhdGlvbi1JRCBjb3VudGVyIHRvIHN0b3JlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnJvcjogbmlsIHdoZW4gc3RvcmVkOyBvdGhlcndpc2UgdGhlIEtWLXN0b3JlIGVycm9yLCBpbmNsdWRpbmcgYSBzcG9vZmVkIHJlYWxtIGNvbnRleHQKCVNldERlbGVnYXRpb25Db3VudGVyKF8gaW50LCBybG0gcmVhbG0sIGNvdW50ZXIgKkNvdW50ZXIpIGVycm9yCgoJLy8gVG90YWwgZGVsZWdhdGlvbiBoaXN0b3J5ICh0aW1lc3RhbXAgLT4gaW50NjQpCgkvLyBIYXNUb3RhbERlbGVnYXRpb25IaXN0b3J5U3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIGN1bXVsYXRpdmUgdG90YWwgZGVsZWdhdGlvbiBoaXN0b3J5IGlzIGluaXRpYWxpemVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSB0b3RhbC1kZWxlZ2F0aW9uLWhpc3Rvcnkgc3RvcmUga2V5IGV4aXN0cwoJSGFzVG90YWxEZWxlZ2F0aW9uSGlzdG9yeVN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSByZXR1cm5zIHRpbWVzdGFtcC1rZXllZCBjdW11bGF0aXZlIHRvdGFsIGRlbGVnYXRpb24gaGlzdG9yeS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpVaW50VHJlZTogdG90YWwgZGVsZWdhdGlvbiBoaXN0b3J5IHRyZWUgbWFwcGluZyBVbml4IHRpbWVzdGFtcHMgdG8gaW50NjQgYW1vdW50cwoJR2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSgpICpVaW50VHJlZQoJLy8gU2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeSBwZXJzaXN0cyB0aW1lc3RhbXAta2V5ZWQgY3VtdWxhdGl2ZSB0b3RhbCBkZWxlZ2F0aW9uIGhpc3RvcnkuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIGhpc3Rvcnk6IHRpbWVzdGFtcC10by10b3RhbC1kZWxlZ2F0aW9uIHRyZWUgdG8gc3RvcmUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBzdG9yZWQ7IG90aGVyd2lzZSB0aGUgS1Ytc3RvcmUgZXJyb3IsIGluY2x1ZGluZyBhIHNwb29mZWQgcmVhbG0gY29udGV4dAoJU2V0VG90YWxEZWxlZ2F0aW9uSGlzdG9yeShfIGludCwgcmxtIHJlYWxtLCBoaXN0b3J5ICpVaW50VHJlZSkgZXJyb3IKCgkvLyBVc2VyIGRlbGVnYXRpb24gaGlzdG9yeSAoYWRkcmVzcyAtPiAqVWludFRyZWVbdGltZXN0YW1wIC0+IGludDY0XSkKCS8vIEhhc1VzZXJEZWxlZ2F0aW9uSGlzdG9yeVN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciBwZXItdXNlciBkZWxlZ2F0aW9uIGhpc3RvcnkgaXMgaW5pdGlhbGl6ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIHVzZXItZGVsZWdhdGlvbi1oaXN0b3J5IHN0b3JlIGtleSBleGlzdHMKCUhhc1VzZXJEZWxlZ2F0aW9uSGlzdG9yeVN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0VXNlckRlbGVnYXRpb25IaXN0b3J5IHJldHVybnMgdGhlIGNvbXBvc2l0ZS1rZXllZCBwZXItdXNlciBkZWxlZ2F0aW9uIGhpc3RvcnkgdHJlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpicHRyZWUuQlBUcmVlOiBoaXN0b3J5IHRyZWUga2V5ZWQgYnkgYWRkcmVzcyBhbmQgdGltZXN0YW1wCglHZXRVc2VyRGVsZWdhdGlvbkhpc3RvcnkoKSAqYnB0cmVlLkJQVHJlZQoJLy8gU2V0VXNlckRlbGVnYXRpb25IaXN0b3J5IHBlcnNpc3RzIHRoZSBjb21wb3NpdGUta2V5ZWQgcGVyLXVzZXIgZGVsZWdhdGlvbiBoaXN0b3J5IHRyZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIGhpc3Rvcnk6IGFkZHJlc3MtYW5kLXRpbWVzdGFtcCBkZWxlZ2F0aW9uIGhpc3RvcnkgdHJlZSB0byBzdG9yZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHN0b3JlZDsgb3RoZXJ3aXNlIHRoZSBLVi1zdG9yZSBlcnJvciwgaW5jbHVkaW5nIGEgc3Bvb2ZlZCByZWFsbSBjb250ZXh0CglTZXRVc2VyRGVsZWdhdGlvbkhpc3RvcnkoXyBpbnQsIHJsbSByZWFsbSwgaGlzdG9yeSAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCgkvLyBNYW5hZ2VyIHN0YXRlcwoJLy8gSGFzRW1pc3Npb25SZXdhcmRNYW5hZ2VyU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBlbWlzc2lvbiByZXdhcmQgbWFuYWdlciBpcyBpbml0aWFsaXplZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgZW1pc3Npb24gcmV3YXJkIG1hbmFnZXIgc3RvcmUga2V5IGV4aXN0cwoJSGFzRW1pc3Npb25SZXdhcmRNYW5hZ2VyU3RvcmVLZXkoKSBib29sCgkvLyBHZXRFbWlzc2lvblJld2FyZE1hbmFnZXIgcmV0dXJucyB0aGUgcGVyc2lzdGVkIGVtaXNzaW9uIHJld2FyZCBtYW5hZ2VyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKkVtaXNzaW9uUmV3YXJkTWFuYWdlcjogZW1pc3Npb24gcmV3YXJkIGFjY291bnRpbmcgbWFuYWdlcgoJR2V0RW1pc3Npb25SZXdhcmRNYW5hZ2VyKCkgKkVtaXNzaW9uUmV3YXJkTWFuYWdlcgoJLy8gU2V0RW1pc3Npb25SZXdhcmRNYW5hZ2VyIHBlcnNpc3RzIHRoZSBlbWlzc2lvbiByZXdhcmQgbWFuYWdlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSB3cml0ZQoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgYnkgdGhlIEtWIHN0b3JlCgkvLyAgIC0gbWFuYWdlcjogZW1pc3Npb24gcmV3YXJkIG1hbmFnZXIgc3RhdGUgdG8gc3RvcmUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBzdG9yZWQ7IG90aGVyd2lzZSB0aGUgS1Ytc3RvcmUgZXJyb3IsIGluY2x1ZGluZyBhIHNwb29mZWQgcmVhbG0gY29udGV4dAoJU2V0RW1pc3Npb25SZXdhcmRNYW5hZ2VyKF8gaW50LCBybG0gcmVhbG0sIG1hbmFnZXIgKkVtaXNzaW9uUmV3YXJkTWFuYWdlcikgZXJyb3IKCgkvLyBIYXNQcm90b2NvbEZlZVJld2FyZE1hbmFnZXJTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgcHJvdG9jb2wtZmVlIHJld2FyZCBzdGF0ZSBpcyBpbml0aWFsaXplZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgcHJvdG9jb2wtZmVlIHJld2FyZCBtYW5hZ2VyIHN0b3JlIGtleSBleGlzdHMKCUhhc1Byb3RvY29sRmVlUmV3YXJkTWFuYWdlclN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyIHJldHVybnMgdGhlIHBlcnNpc3RlZCBwcm90b2NvbC1mZWUgcmV3YXJkIG1hbmFnZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSAqUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyOiBwcm90b2NvbC1mZWUgcmV3YXJkIGFjY291bnRpbmcgbWFuYWdlcgoJR2V0UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyKCkgKlByb3RvY29sRmVlUmV3YXJkTWFuYWdlcgoJLy8gU2V0UHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyIHBlcnNpc3RzIHRoZSBwcm90b2NvbC1mZWUgcmV3YXJkIG1hbmFnZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIG1hbmFnZXI6IHByb3RvY29sLWZlZSByZXdhcmQgbWFuYWdlciBzdGF0ZSB0byBzdG9yZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHN0b3JlZDsgb3RoZXJ3aXNlIHRoZSBLVi1zdG9yZSBlcnJvciwgaW5jbHVkaW5nIGEgc3Bvb2ZlZCByZWFsbSBjb250ZXh0CglTZXRQcm90b2NvbEZlZVJld2FyZE1hbmFnZXIoXyBpbnQsIHJsbSByZWFsbSwgbWFuYWdlciAqUHJvdG9jb2xGZWVSZXdhcmRNYW5hZ2VyKSBlcnJvcgoKCS8vIEhhc0RlbGVnYXRpb25NYW5hZ2VyU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIGRlbGVnYXRpb24tbWFuYWdlciBzdGF0ZSBpcyBpbml0aWFsaXplZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGJvb2w6IHRydWUgd2hlbiB0aGUgZGVsZWdhdGlvbiBtYW5hZ2VyIHN0b3JlIGtleSBleGlzdHMKCUhhc0RlbGVnYXRpb25NYW5hZ2VyU3RvcmVLZXkoKSBib29sCgkvLyBHZXREZWxlZ2F0aW9uTWFuYWdlciByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgZGVsZWdhdGlvbiBtYW5hZ2VyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gKkRlbGVnYXRpb25NYW5hZ2VyOiBkZWxlZ2F0aW9uLXRvLWFkZHJlc3MgaW5kZXggbWFuYWdlcgoJR2V0RGVsZWdhdGlvbk1hbmFnZXIoKSAqRGVsZWdhdGlvbk1hbmFnZXIKCS8vIFNldERlbGVnYXRpb25NYW5hZ2VyIHBlcnNpc3RzIHRoZSBkZWxlZ2F0aW9uIG1hbmFnZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAgZm9yIHRoZSBmb3J3YXJkZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgY3VycmVudCByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBLViBzdG9yZQoJLy8gICAtIG1hbmFnZXI6IGRlbGVnYXRpb24gbWFuYWdlciBzdGF0ZSB0byBzdG9yZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyb3I6IG5pbCB3aGVuIHN0b3JlZDsgb3RoZXJ3aXNlIHRoZSBLVi1zdG9yZSBlcnJvciwgaW5jbHVkaW5nIGEgc3Bvb2ZlZCByZWFsbSBjb250ZXh0CglTZXREZWxlZ2F0aW9uTWFuYWdlcihfIGludCwgcmxtIHJlYWxtLCBtYW5hZ2VyICpEZWxlZ2F0aW9uTWFuYWdlcikgZXJyb3IKCgkvLyBIYXNMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgbGF1bmNocGFkIHByb2plY3QgZGVwb3NpdHMgYXJlIGluaXRpYWxpemVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBsYXVuY2hwYWQtcHJvamVjdC1kZXBvc2l0cyBzdG9yZSBrZXkgZXhpc3RzCglIYXNMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHNTdG9yZUtleSgpIGJvb2wKCS8vIEdldExhdW5jaHBhZFByb2plY3REZXBvc2l0cyByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgbGF1bmNocGFkIHByb2plY3QgZGVwb3NpdCBzdGF0ZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHM6IHByb2plY3QtYWRkcmVzcy10by1kZXBvc2l0IHN0YXRlCglHZXRMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMoKSAqTGF1bmNocGFkUHJvamVjdERlcG9zaXRzCgkvLyBTZXRMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMgcGVyc2lzdHMgbGF1bmNocGFkIHByb2plY3QgZGVwb3NpdCBzdGF0ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMCBmb3IgdGhlIGZvcndhcmRlZCBzdG9yZSB3cml0ZQoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBjdXJyZW50IHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgYnkgdGhlIEtWIHN0b3JlCgkvLyAgIC0gZGVwb3NpdHM6IGxhdW5jaHBhZCBwcm9qZWN0IGRlcG9zaXQgc3RhdGUgdG8gc3RvcmUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycm9yOiBuaWwgd2hlbiBzdG9yZWQ7IG90aGVyd2lzZSB0aGUgS1Ytc3RvcmUgZXJyb3IsIGluY2x1ZGluZyBhIHNwb29mZWQgcmVhbG0gY29udGV4dAoJU2V0TGF1bmNocGFkUHJvamVjdERlcG9zaXRzKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXRzICpMYXVuY2hwYWRQcm9qZWN0RGVwb3NpdHMpIGVycm9yCn0KGqQSCgt1cGdyYWRlLmdubxKUEnBhY2thZ2Ugc3Rha2VyCgppbXBvcnQgKAoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIFJlZ2lzdGVySW5pdGlhbGl6ZXIgcmVnaXN0ZXJzIGFuIGltcGxlbWVudGF0aW9uIGluaXRpYWxpemVyIGZvciB0aGlzIHJlYWxtLgovLyBFYWNoIGltcGxlbWVudGF0aW9uIHZlcnNpb24gY2FsbHMgaXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGUgY2FsbGJhY2sKLy8gcmVjZWl2ZXMgdGhlIGN1cnJlbnQgcmVhbG0gY29udGV4dCBhbmQgc2hhcmVkIGdvdi9zdGFrZXIgc3RvcmUgc28gaXQgY2FuCi8vIGNvbnN0cnVjdCB0aGUgdmVyc2lvbmVkIGltcGxlbWVudGF0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0KLy8gICAtIGluaXRpYWxpemVyOiBjYWxsYmFjayBpbnZva2VkIHdpdGggZGlzY3JpbWluYXRvciAwLCB2YWxpZGF0ZWQgcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0LCBhbmQgSUdvdlN0YWtlclN0b3JlLCByZXR1cm5pbmcgdGhlIGltcGxlbWVudGF0aW9uCmZ1bmMgUmVnaXN0ZXJJbml0aWFsaXplcihjdXIgcmVhbG0sIGluaXRpYWxpemVyIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgZ292U3Rha2VyU3RvcmUgSUdvdlN0YWtlclN0b3JlKSBJR292U3Rha2VyKSB7CgkvLyBgY3VyYCBjYXB0dXJlZCBoZXJlIGlzIHRoZSBnb3Yvc3Rha2VyIGNyb3NzaW5nIGZyYW1lLiBUaGUgd3JhcHBpbmcKCS8vIGNsb3N1cmUgZm9yd2FyZHMgaXQgdG8gdGhlIHYxIGluaXRpYWxpemVyIHNvIGFueSBzdG9yZSB3cml0ZXMgdGhlCgkvLyBpbml0aWFsaXplciBwZXJmb3JtcyBydW4gdW5kZXIgdGhlIHByb3h5J3MgaWRlbnRpdHkgcmF0aGVyIHRoYW4gdGhlCgkvLyB2ZXJzaW9uIHBhY2thZ2Uncywgd2hpY2ggd291bGQgZmFpbCB0aGUga3ZTdG9yZSBBQ0wuCglpbml0aWFsaXplckZ1bmMgOj0gZnVuYyhfIGludCwgcmxtIHJlYWxtLCBkb21haW5TdG9yZSBhbnkpIGFueSB7CgkJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJCWN1cnJlbnRHb3ZTdGFrZXJTdG9yZSwgb2sgOj0gZG9tYWluU3RvcmUuKElHb3ZTdGFrZXJTdG9yZSkKCQlpZiAhb2sgewoJCQlwYW5pYygiZG9tYWluU3RvcmUgaXMgbm90IGFuIElHb3ZTdGFrZXJTdG9yZSIpCgkJfQoKCQlyZXR1cm4gaW5pdGlhbGl6ZXIoMCwgcmxtLCBjdXJyZW50R292U3Rha2VyU3RvcmUpCgl9CgoJZXJyIDo9IHZlcnNpb25NYW5hZ2VyLlJlZ2lzdGVySW5pdGlhbGl6ZXIoMCwgY3VyLCBpbml0aWFsaXplckZ1bmMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJZXJyID0gdXBkYXRlSW1wbGVtZW50YXRpb24oKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBVcGdyYWRlSW1wbCB1cGdyYWRlcyB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIHRvIHBhY2thZ2VQYXRoLgovLyBPbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtCi8vICAgLSBwYWNrYWdlUGF0aDogcGFja2FnZSBwYXRoIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIHRvIGFjdGl2YXRlCmZ1bmMgVXBncmFkZUltcGwoY3VyIHJlYWxtLCBwYWNrYWdlUGF0aCBzdHJpbmcpIHsKCS8vIENoZWNrIGFkbWluIG9yIGdvdmVybmFuY2UgcGVybWlzc2lvbgoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UocHJldi5BZGRyZXNzKCkpCgoJZXJyIDo9IHZlcnNpb25NYW5hZ2VyLkNoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgcGFja2FnZVBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJZXJyID0gdXBkYXRlSW1wbGVtZW50YXRpb24oKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBHZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoIHJldHVybnMgdGhlIHBhY2thZ2UgcGF0aCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBhY2thZ2VQYXRoOiBwYWNrYWdlIHBhdGggb2YgdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbgpmdW5jIEdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGgoKSBzdHJpbmcgewoJcmV0dXJuIHZlcnNpb25NYW5hZ2VyLkdldEN1cnJlbnRQYWNrYWdlUGF0aCgpCn0KGhsKCHV0aWwuZ25vEg9wYWNrYWdlIHN0YWtlcgoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEwiovPjGARILMjA4NjA1dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQGbkoC00kr8y8v6dFvyJHzwxm/nhVd8bEm2Do+fGCqbjcfG6afjCCqsityyUuF8R6j8WIH/xE8+9ECUjMQ+XrSQaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data