{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "hfIluWgE9JWcmaEDExNSYTgMhrmBGBLICZRMxVQR83c=",
    "height": "186167",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "94700344",
      "GasUsed": "63133563"
    },
    "tx": "Cuz0AgoML3ZtLm1fYWRkcGtnEtr0AgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKd9AIKB2J1ZGdldHMSO2duby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9idWRnZXRzGu/yAgoLYnVkZ2V0cy5nbm8S3vICLy8gUmVhbG0gYnVkZ2V0cyBpcyBhIGRlbGVnYXRlZC1idWRnZXQgdHJlYXN1cnkgaW4gR05PVDogYW4gb3duZXIgZnVuZHMgYQovLyBwb29sLCBncmFudHMgbmFtZWQgZGVsZWdhdGVzIGEgc3RhbmRpbmcsIHJhdGUtbGltaXRlZCwgcmV2b2NhYmxlCi8vIGF1dGhvcml0eSB0byBzcGVuZCBmcm9tIGl0LCBhbmQgZWFjaCBkZWxlZ2F0ZSB0aGVuIGRyYXdzIHdpdGhpbiB0aGF0Ci8vIGF1dGhvcml0eSB3aXRoIG5vIGZ1cnRoZXIgYXBwcm92YWwgZnJvbSBhbnlvbmUuCi8vCi8vIFdIWSBUSElTIEVYSVNUUyAoc2VlIERJU0NPVkVSWS5tZCk6IGV2ZXJ5IGRpc2J1cnNlbWVudCBwYXRoIG9uIGVpdGhlcgovLyBsaXZlIGNoYWluIGlzIG9uZSBvZiB0aHJlZSBzaGFwZXMg4oCUIGEgZnJlc2ggZ3JvdXAgZGVjaXNpb24gcGVyIHNwZW5kCi8vICh0aGlzIHBvcnRmb2xpbydzIHRyZWFzdXJ5X2JvYXJkLCBnbm8ubGFuZCdzIHIvZ292L2Rhby90cmVhc3VyeSwgdGhlCi8vIG1haW5uZXQgYnViYmxldHJlYXN1cnkpLCBhIGZpeGVkIHNjaGVkdWxlICh2ZXN0aW5nKSwgb3IgYSBwdWxsIGFnYWluc3QKLy8gYW4gYWxyZWFkeS1zZXR0bGVkIGVudGl0bGVtZW50IChmZWVfc3BsaXQsIHJldnNoYXJlLCBjcm93ZGZ1bmQsCi8vIHN1YnNjcmlwdGlvbnMpLiBOb25lIG9mIHRoZW0gbGV0cyBvbmUgcGFydHkgc3BlbmQgYW5vdGhlcidzIG1vbmV5IGF0Ci8vIGl0cyBvd24gZGlzY3JldGlvbiB3aXRoaW4gYSBib3VuZC4gVGhhdCBpcyB0aGUgZ2FwLCBhbmQKLy8gYnViYmxldHJlYXN1cnkg4oCUIGEgcmVhbCBtYWlubmV0IHRyZWFzdXJ5IHRoYXQgaGFuZC1yb2xsZWQgYSBzbGlkaW5nCi8vIHNwZW5kIHdpbmRvdyBpbnNpZGUgdGhlIHJlYWxtLCB3aXRoIGV2ZXJ5IHNwZW5kIHN0aWxsIGEgdG9rZW4taG9sZGVyCi8vIHByb3Bvc2FsIOKAlCBpcyB0aGUgZXZpZGVuY2Ugc29tZW9uZSB3YW50ZWQgaXQuCi8vCi8vIEl0IGlzIGFsc28sIGRlbGliZXJhdGVseSwgdGhlIEZJUlNUIENPTlNVTUVSIG9mIHNwZW5kYm9vayBvbiBhbnkKLy8gY2hhaW4uIEEgcHJpbWl0aXZlIHdpdGggbm8gY29uc3VtZXIgaGFzIHR3byBwcm9wZXJ0aWVzIHVucHJvdmVuIG5vCi8vIG1hdHRlciBob3cgbWFueSB1bml0IHRlc3RzIHBhc3M6IHRoYXQgaXRzIEFQSSBpcyB1c2FibGUgZnJvbSBhIHJlYWxtLAovLyBhbmQgdGhhdCBpdHMgc3RhdGUgc3Vydml2ZXMgYWNyb3NzIHRyYW5zYWN0aW9ucy4gT25seSBhIHJlYWxtIGNhbgovLyBhbnN3ZXIgZWl0aGVyLCBhbmQgdGhpcyBvbmUgaXMgdGhlIGFuc3dlci4KLy8KLy8gQ09NUE9TSVRJT046IHNwZW5kaW5nIGF1dGhvcml0eSBpcyBkZWxlZ2F0ZWQgZW50aXJlbHkgdG8gc3BlbmRib29rCi8vIChhbmNob3JlZCB3aW5kb3dzLCBsaWZldGltZSBjYXBzLCBleHBpcnksIG9uZS1zaWRlZCBhbWVuZG1lbnRzLAovLyByZXZvY2F0aW9uKSwgY29pbiBtb3ZlbWVudCB0byBjb2luaW8sIHBlci1kZWxlZ2F0ZSBjcmVkaXQgYW5kIHRoZSBmZWUKLy8gcG90IHRvIGZlZWxlZGdlciwgb3JkZXJlZCBzdG9yYWdlIHRvIHAvbnQvYXZsL3YwLCBhbmQgZnJlZS10ZXh0IHJlbmRlcgovLyBvdXRwdXQgdG8gcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MC4gVGhpcyByZWFsbSBvd25zIG9ubHkgdGhlIHBvb2wKLy8gYWNjb3VudGluZywgdGhlIGdyYW50IHJlY29yZHMsIGFuZCB0aGUgc29sdmVuY3kgcnVsZS4KLy8KLy8gIyBXaGF0IGEgYnVkZ2V0IGlzLCBhbmQgd2hhdCBpdCBpcyBub3QKLy8KLy8gQSBidWRnZXQgaXMgQVVUSE9SSVRZLCBub3QgYSByZXNlcnZhdGlvbi4gVGhyZWUgZ3JhbnRzIG9mIDEwMCBhZ2FpbnN0Ci8vIGEgcG9vbCBvZiAxMDAgYXJlIGFsbCB0aHJlZSB2YWxpZCwgYW5kIHRoZSBmaXJzdCBkZWxlZ2F0ZSB0byBkcmF3IGdldHMKLy8gdGhlIG1vbmV5LiBUaGlzIGlzIG5vdCBhIGRlZmVjdCB0byBiZSBmaXhlZCBieSByZXNlcnZpbmcgZnVuZHM6IGEKLy8gcmVzZXJ2YXRpb24gd291bGQgbWFrZSBhbiBvd25lciB1bmFibGUgdG8gZ3JhbnQgYSBzdGFuZGluZyBhbGxvd2FuY2UKLy8gd2l0aG91dCBwcmUtY29tbWl0dGluZyB0aGUgY2FwaXRhbCwgd2hpY2ggaXMgdGhlIHdob2xlIGNvbnZlbmllbmNlCi8vIGJlaW5nIGJvdWdodC4gV2hhdCB0aGUgcmVhbG0gZ3VhcmFudGVlcyBpbnN0ZWFkIGlzIHRoYXQgaXQgbmV2ZXIKLy8gUFJPTUlTRVMgd2hhdCBpdCBkb2VzIG5vdCBIT0xEOgovLwovLwlEcmF3IHJlZnVzZXMgdW5sZXNzIGFtb3VudCA8PSB0aGUgb3duZXIncyBvd24gdW5zcGVudCBwb29sLgovLwovLyBTbyBhIGRlbGVnYXRlIGlzIHRvbGQgIm5vIiBhdCBkcmF3IHRpbWUgcmF0aGVyIHRoYW4gY3JlZGl0ZWQgd2l0aAovLyBzb21ldGhpbmcgdW5jbGFpbWFibGUuIFRoZSBwb29sIGlzIHRoZSBzb2x2ZW5jeSBib3VuZCBhbmQgaXQgaXMKLy8gcGVyLW93bmVyLCB3aGljaCBpcyBzdHJpY3RseSBzdHJvbmdlciB0aGFuIGEgcmVhbG0td2lkZSBjaGVjazogb25lCi8vIG93bmVyJ3MgZ3JhbnRzIGNhbiBuZXZlciByZWFjaCBhbm90aGVyIG93bmVyJ3MgZnVuZHMuCi8vCi8vICMgQ3JlZGl0LCB0aGVuIHB1bGwKLy8KLy8gRHJhdyBtb3ZlcyBub3RoaW5nLiBJdCBjb25zdW1lcyB0aGUgYWxsb3dhbmNlLCBkZWJpdHMgdGhlIG93bmVyJ3MKLy8gcG9vbCwgYW5kIGNyZWRpdHMgdGhlIGRlbGVnYXRlIGluIHRoZSBsZWRnZXI7IHRoZSBkZWxlZ2F0ZSB0aGVuIHNpZ25zCi8vIGEgc2VwYXJhdGUgQ2xhaW0gdG8gcmVjZWl2ZSB0aGUgY29pbnMuIFRoaXMgaXMgbm90IHJpdHVhbC4gSWYgRHJhdwovLyBwYWlkIG91dCBkaXJlY3RseSwgYSBmYWlsaW5nIHBheW91dCBpbnNpZGUgdGhlIHNhbWUgdHJhbnNhY3Rpb24gd291bGQKLy8gbGVhdmUgYSBjb25zdW1lZCBhbGxvd2FuY2Ugd2l0aCBubyBtb25leSBkZWxpdmVyZWQsIG9yIGZvcmNlIHRoZQovLyBhbGxvd2FuY2UgY29uc3VtcHRpb24gdG8gaGFwcGVuIGFmdGVyIGFuIGVmZmVjdCDigJQgYW5kIHNwZW5kYm9vaydzIG93bgovLyBjb25zdW1lciBjb250cmFjdCBpdGVtIDMgc2F5cyBzdGF0ZSBmaXJzdCwgZWZmZWN0IHNlY29uZCwgZm9yIGV4YWN0bHkKLy8gdGhhdCByZWFzb24uIFNwbGl0dGluZyBpdCBhbHNvIG1lYW5zIGEgZGVsZWdhdGUgY2FuIGRyYXcgcmVwZWF0ZWRseQovLyBhbmQgY2xhaW0gb25jZSwgd2hpY2ggaXMgY2hlYXBlciB0aGFuIGNsYWltaW5nIHBlciBkcmF3LgovLwovLyAjIExJRkVDWUNMRQovLwovLwlGdW5kIChvd25lciwgK3NlbmQpICAgICAgIDogYWRkcyByZWFsIGNvaW5zIHRvIHRoZSBjYWxsZXIncyBvd24gcG9vbC4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFueW9uZSBtYXkgZnVuZDsgZnVuZGluZyBtYWtlcyB5b3UgYW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyLiBNaW5pbXVtIE1pbkZ1bmRpbmcuCi8vCVdpdGhkcmF3UG9vbCAob3duZXIpICAgICAgOiBwdWxscyB1bnNwZW50IHBvb2wgYmFjayBvdXQsIGFueSBhbW91bnQsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgdGltZS4gU2VlICJ0aGUgb3duZXIgY2FuIGFsd2F5cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmUiIGJlbG93LgovLwlXaXRoZHJhd1Bvb2xBbGwgKG93bmVyKSAgIDogdGhlIHdob2xlIHBvb2wuCi8vCUdyYW50IChvd25lcikgICAgICAgICAgICAgOiBvcGVucyBvbmUgc3BlbmRib29rIGFsbG93YW5jZSBmb3Igb25lCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSBhbmQgcmV0dXJucyB0aGUgZ3JhbnQgaWQuIFRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdyBmZWUgaXMgc25hcHNob3R0ZWQgaGVyZS4KLy8JQW1lbmQgKG93bmVyKSAgICAgICAgICAgICA6IGNoYW5nZXMgdGhlIGdyYW50J3MgdGVybXMuIFRpZ2h0ZXItb3ItCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCBhcHBsaWVzIG5vdzsgbG9vc2VyIHdhaXRzIGZvciB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgd2luZG93IGJvdW5kYXJ5LiBQZXJpb2RMZW5ndGggaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVCBhIHBhcmFtZXRlciDigJQgc3BlbmRib29rIG1ha2VzIGl0Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW11dGFibGUgYW5kIHRoaXMgcmVhbG0gbWFrZXMgdGhhdAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbC4KLy8JUmV2b2tlIChvd25lcikgICAgICAgICAgICA6IGltbWVkaWF0ZSwgYW5kIHRoZSBpZCBpcyBuZXZlciByZXVzZWQuCi8vCURyYXcgKERFTEVHQVRFKSAgICAgICAgICAgOiBjb25zdW1lcyBhdXRob3JpdHksIGRlYml0cyB0aGUgcG9vbCwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRpdHMgdGhlIGRlbGVnYXRlIG5ldCBvZiB0aGUgZmVlLgovLwlDbGFpbSAoREVMRUdBVEUpICAgICAgICAgIDogcGF5cyB0aGUgZGVsZWdhdGUncyB3aG9sZSBjcmVkaXQgb3V0LgovLwlSZWFwIChBTllPTkUpICAgICAgICAgICAgIDogcmVtb3ZlcyBhbiBFWFBJUkVEIGdyYW50LCBmcmVlaW5nIGl0cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC4gUGVybWlzc2lvbmxlc3MgYmVjYXVzZSBhbiBleHBpcmVkCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UgY2FuIGF1dGhvcml6ZSBub3RoaW5nLCBzbwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZyBmcm9tIGFueW9uZS4KLy8JV2l0aGRyYXdGZWVzIChBTllPTkUpICAgICA6IHBheXMgdGhlIGZlZSBwb3QgdG8gdGhlIGNvbXBpbGUtdGltZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVlQ29sbGVjdG9yLiBGaXhlZCBkZXN0aW5hdGlvbiwgc28KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3RlZXIuCi8vCVN3ZWVwU3VycGx1cyAoQU5ZT05FKSAgICAgOiBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgRmVlQ29sbGVjdG9yLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgdG91Y2hpbmcgdHJhY2tlZCBsaWFiaWxpdGllcy4KLy8KLy8gIyBUaGUgb3duZXIgY2FuIGFsd2F5cyBsZWF2ZSwgYW5kIHRoYXQgaXMgdGhlIGRlc2lnbgovLwovLyBXaXRoZHJhd1Bvb2wgaGFzIG5vIGxvY2ssIG5vIG5vdGljZSBwZXJpb2QsIGFuZCBubyBjaGVjayBhZ2FpbnN0Ci8vIG91dHN0YW5kaW5nIGdyYW50cy4gQW4gb3duZXIgY2FuIGVtcHR5IHRoZSBwb29sIHVuZGVyIGEgbGl2ZSBncmFudCBhbmQKLy8gdGhlIGRlbGVnYXRlJ3MgbmV4dCBEcmF3IHdpbGwgZmFpbCBvbiBzb2x2ZW5jeS4gVGhpcyBpcyBzdGF0ZWQgcGxhaW5seQovLyByYXRoZXIgdGhhbiBidXJpZWQ6IHRoZSBtb25leSBpcyB0aGUgb3duZXIncywgUmV2b2tlIGlzIHRoZSBjbGVhbiB3YXkKLy8gdG8gZW5kIGEgcmVsYXRpb25zaGlwLCBhbmQgYSByZWFsbSB0aGF0IGNvdWxkIHRyYXAgYW4gb3duZXIncyBjYXBpdGFsCi8vIGJlaGluZCBhIGdyYW50IHRoZXkgcmVncmV0IHdvdWxkIGJlIGEgd29yc2UgcmVhbG0uIEEgZGVsZWdhdGUgd2hvCi8vIG5lZWRzIGEgZ3VhcmFudGVlIG9mIGZ1bmRzIGRvZXMgbm90IHdhbnQgYSBidWRnZXQg4oCUIHRoZXkgd2FudCBlc2Nyb3csCi8vIHdoaWNoIGlzIGEgZGlmZmVyZW50IGFydGlmYWN0LgovLwovLyBXaGF0IHRoZSBvd25lciBDQU5OT1QgZG8gaXMgdW5kbyB3b3JrIGFscmVhZHkgYXV0aG9yaXplZDogY3JlZGl0Ci8vIGFscmVhZHkgZHJhd24gaW50byB0aGUgbGVkZ2VyIGlzIHRoZSBkZWxlZ2F0ZSdzLCBhbmQgUmV2b2tlIGRvZXMgbm90Ci8vIGNsYXcgaXQgYmFjay4gUmV2b2tpbmcgYSBncmFudCBlbmRzIGZ1dHVyZSBhdXRob3JpdHkgb25seS4KLy8KLy8gIyBUSEUgRkVFLCBwcmVjaXNlbHkKLy8KLy8gZmVlQnBzIGlzIHNuYXBzaG90dGVkIGludG8gdGhlIGdyYW50IGF0IEdyYW50IHRpbWUgZnJvbSB0aGUKLy8gY29tcGlsZS10aW1lIERyYXdGZWVCcHMsIHNvIGEgZGVsZWdhdGUncyB0ZXJtcyBhcmUgZml4ZWQgd2hlbiB0aGUKLy8gZ3JhbnQgaXMgY3JlYXRlZCBhbmQgdmlzaWJsZSBpbiBHcmFudEluZm8gZnJvbSB0aGF0IG1vbWVudC4gVGhlIGZlZSBpcwovLyBjaGFyZ2VkIE9OQ0UgcGVyIGRyYXcsIG9uIHRoZSBncm9zcyBhbW91bnQsIHdpdGggZmVlbGVkZ2VyJ3MgZmxvb3IKLy8gcm91bmRpbmcgKHJvdW5kaW5nIGZhdm9ycyB0aGUgZGVsZWdhdGUpLiBUaGUgb3duZXIncyBwb29sIGlzIGRlYml0ZWQKLy8gdGhlIEdST1NTIGFtb3VudCBhbmQgdGhlIGRlbGVnYXRlIGlzIGNyZWRpdGVkIHRoZSBuZXQg4oCUIHRoZSBmZWUgaXMKLy8gcGFpZCBieSB0aGUgb3duZXIgb3V0IG9mIHRoZSBidWRnZXQsIG5vdCB0YWtlbiBvdXQgb2YgdGhlIGRlbGVnYXRlJ3MKLy8gYXV0aG9yaXR5LCBzbyBhIGdyYW50IG9mIFBlclBlcmlvZCBtZWFucyBQZXJQZXJpb2Qgb2YgdGhlIG93bmVyJ3MKLy8gbW9uZXkgbGVhdmVzIHRoZSBwb29sIHBlciB3aW5kb3csIHdoaWNoIGlzIHRoZSBmaWd1cmUgYW4gb3duZXIKLy8gYWN0dWFsbHkgY2FyZXMgYWJvdXQgYm91bmRpbmcuIFRoZSBsZWRnZXIgaXMgY29uc3RydWN0ZWQgd2l0aCB0aGUKLy8gY29tcGlsZS10aW1lIE1heEZlZUJwcyBjYXAsIHNvIGEgZmVlIGFib3ZlIHRoZSBjYXAgaXMgcmVmdXNlZCBieSB0aGUKLy8gcHJpbWl0aXZlLCBub3QgYnkgYSBjaGVjayBpbiB0aGlzIGZpbGUuIFRoZXJlIGlzIG5vIGZlZSBvbiBmdW5kaW5nLCBvbgovLyB3aXRoZHJhd2luZyBhbiB1bnNwZW50IHBvb2wsIG9yIG9uIGNsYWltaW5nLgovLwovLyAjIFRIRVJFIElTIE5PIEFETUlOCi8vCi8vIFRoZSBmZWUgcmF0ZSwgdGhlIGZlZSBjb2xsZWN0b3IsIGV2ZXJ5IGJvdW5kIGFuZCBldmVyeSBjYXAgYXJlCi8vIGNvbXBpbGUtdGltZSBjb25zdGFudHMuIE5vIGFkZHJlc3MgY2FuIGNoYW5nZSB0ZXJtcywgcGF1c2UgdGhlIHJlYWxtLAovLyB0b3VjaCBhIHBvb2wgaXQgZGlkIG5vdCBmdW5kLCBvciBtb3ZlIGEgZ3JhbnQgaXQgZGlkIG5vdCBjcmVhdGUuIFRoZQovLyBkZXBsb3llciBoYXMgbm8gcHJpdmlsZWdlIG9mIGFueSBraW5kIGFmdGVyIGRlcGxveW1lbnQuCi8vCi8vICMgTU9ORVRBUlkgSU5WQVJJQU5UIChjb25zZXJ2YXRpb24pCi8vCi8vIExldCBIIGJlIHRoZSB1Z25vdCBoZWxkIGF0IHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBQIHRoZSBzdW0gb2YgYWxsCi8vIG93bmVyIHBvb2xzICh0cmFja2VkIE8oMSkgYXMgdG90YWxQb29sZWQpLCBMIHRoZSBsZWRnZXIncyBsaWFiaWxpdGllcwovLyAodW5jbGFpbWVkIGRlbGVnYXRlIGNyZWRpdCBwbHVzIHRoZSBmZWUgcG90KSwgYW5kIFMgPj0gMCB0aGUKLy8gb3V0LW9mLWJhbmQgc3VycGx1czoKLy8KLy8JSCA9PSBQICsgTCArIFMKLy8KLy8gRXZlcnkgdHJhbnNpdGlvbiBtb3ZlcyB2YWx1ZSBiZXR3ZWVuIGV4YWN0bHkgdHdvIHRlcm1zIGluc2lkZSBvbmUKLy8gdHJhbnNhY3Rpb24uIEZ1bmQgcmFpc2VzIEggYW5kIFAgdG9nZXRoZXIgKGNvaW5pby5SZWNlaXZlIGlzIHRoZQovLyByZWNlaXB0LWd1YXJhbnRlZWQgc2hhcGUpLiBXaXRoZHJhd1Bvb2wgZGViaXRzIFAgYmVmb3JlIHRoZSBpZGVudGljYWwKLy8gYW1vdW50IGxlYXZlcyBILiBEcmF3IG1vdmVzIGdyb3NzIG91dCBvZiBQIGFuZCBpbnRvIEwsIHNwbGl0IGludG8gdGhlCi8vIGRlbGVnYXRlJ3MgY3JlZGl0IGFuZCB0aGUgZmVlIOKAlCBIIGRvZXMgbm90IG1vdmUgYXQgYWxsLCB3aGljaCBpcyB3aHkKLy8gRHJhdyBoYXMgbm8gcGF5b3V0IHRvIGZhaWwuIENsYWltIGFuZCBXaXRoZHJhd0ZlZXMgZGViaXQgTCBiZWZvcmUKLy8gdGhlaXIgcGF5b3V0LiBBbnkgcGFuaWMgYWJvcnRzIHRoZSB3aG9sZSB0cmFuc2FjdGlvbjsgdGhpcyByZWFsbSBuZXZlcgovLyBpc3N1ZXMgb3IgcmVtb3ZlcyBjb2lucy4KLy8KLy8gIyBPTkxZIEdOT1QgSVMgQUNDRVBURUQKLy8KLy8gRnVuZCByZWplY3RzIGFueSBlbnZlbG9wZSB0aGF0IGlzIG5vdCBleGFjdGx5IG9uZSBwb3NpdGl2ZSB1Z25vdCBjb2luCi8vIChjb2luaW8uUmVjZWl2ZSkuIEV2ZXJ5IG90aGVyIGVudHJ5cG9pbnQgcmVqZWN0cyBhdHRhY2hlZCBjb2lucwovLyBvdXRyaWdodCByYXRoZXIgdGhhbiBjb252ZXJ0aW5nIHRoZW0gaW50byBzd2VlcGFibGUgc3VycGx1cy4KLy8KLy8gIyBBVVRIT1JJWkFUSU9OCi8vCi8vIEV2ZXJ5IGlkZW50aXR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgY3Jvc3NpbmcgZW50cnlwb2ludCdzCi8vIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS4gTm8gZnVuY3Rpb24gdGFrZXMgYSBjYWxsZXIgaWRlbnRpdHkgYXMgYQovLyBwYXJhbWV0ZXIsIHNvIGZ1bmRpbmcgYW5vdGhlciBvd25lcidzIHBvb2wsIGRyYXdpbmcgYW5vdGhlciBkZWxlZ2F0ZSdzCi8vIGJ1ZGdldCwgY2xhaW1pbmcgYW5vdGhlciBkZWxlZ2F0ZSdzIGNyZWRpdCwgb3IgYW1lbmRpbmcgYSBncmFudCB5b3UgZG8KLy8gbm90IG93biBpcyBpbXBvc3NpYmxlIGJ5IGNvbnN0cnVjdGlvbi4gVGhpcyBpcyBzcGVuZGJvb2sgY29uc3VtZXIKLy8gY29udHJhY3QgaXRlbSAyLCBjbG9zZWQgc3RydWN0dXJhbGx5LgovLwovLyBUaGUgY2xvY2sgaXMgcnVudGltZS5DaGFpbkhlaWdodCgpLCBuZXZlciBhbiBhcmd1bWVudC4gVGhhdCBpcwovLyBzcGVuZGJvb2sgY29uc3VtZXIgY29udHJhY3QgaXRlbSAxOiBhIHJlYWxtIHRoYXQgbGV0IGEgY2FsbGVyIGNob29zZQovLyBgbm93YCB3b3VsZCBoYXZlIGhhbmRlZCB0aGUgZGVsZWdhdGUgdGhlIHBvd2VyIHRvIHJvbGwgdGhlIHdpbmRvdyBhdAovLyB3aWxsLCBkZWZlYXRpbmcgZXZlcnkgY2FwIGluIHRoZSBwcmltaXRpdmUuCi8vCi8vICMgU1RPUkFHRQovLwovLyBBIHBvb2wgZW50cnkgaXMgcGFpZCBmb3IgYnkgdGhlIG93bmVyJ3Mgb3duIGZ1bmRpbmcgdHJhbnNhY3Rpb247IGEKLy8gZ3JhbnQgcmVjb3JkIGFuZCBpdHMgYWxsb3dhbmNlIGJ5IHRoZSBvd25lcidzIEdyYW50LiBSZXZva2UgYW5kIFJlYXAKLy8gYm90aCByZW1vdmUgdGhlIGdyYW50IHJlY29yZCBhbmQgdGhlIGFsbG93YW5jZSBpbiB0aGUgc2FtZSBjYWxsLCBhbmQKLy8gdGhlIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCB0byB0aGUgdHJhbnNhY3Rpb24gdGhhdAovLyBmcmVlcyBpdCDigJQgd2hpY2ggaXMgdGhlIHN0YW5kaW5nIGluY2VudGl2ZSB0byBjYWxsIFJlYXAgb24gc29tZW9uZQovLyBlbHNlJ3MgZXhwaXJlZCBncmFudC4KcGFja2FnZSBidWRnZXRzCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY29pbmlvIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3NwZW5kYm9vayIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBSZWFsbVBhdGggaXMgdGhpcyByZWFsbSdzIG93biBwYXRoLCB1c2VkIHRvIGJ1aWxkIFJlbmRlciBsaW5rcy4KY29uc3QgUmVhbG1QYXRoID0gIi9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYnVkZ2V0cyIKCi8vIERlbm9tIGlzIHRoZSBvbmx5IGFzc2V0IHRoaXMgcmVhbG0gaG9sZHMuCmNvbnN0IERlbm9tID0gInVnbm90IgoKLy8gTWF4RmVlQnBzIGlzIHRoZSBoYXJkIGNlaWxpbmcgb24gYW55IGRyYXcgZmVlIHRoaXMgcmVhbG0gY291bGQgZXZlcgovLyBjaGFyZ2UsIGVuZm9yY2VkIGJ5IHRoZSBmZWVsZWRnZXIgdGhlIHJlYWxtIGlzIGNvbnN0cnVjdGVkIHdpdGgg4oCUIGEKLy8gZmVlQnBzIGFib3ZlIGl0IGlzIHJlZnVzZWQgYnkgdGhlIHByaW1pdGl2ZSdzIG93biB2YWxpZGF0aW9uLCBub3QgYnkgYQovLyBjaGVjayBpbiB0aGlzIGZpbGUuIDUwMCBicHMgPSA1JS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoNTAwKQoKLy8gRHJhd0ZlZUJwcyBpcyB0aGUgZmVlIGFjdHVhbGx5IHNuYXBzaG90dGVkIGludG8gZXZlcnkgZ3JhbnQ6IDEwMCBicHMgPQovLyAxJSwgY2hhcmdlZCBvbmNlIHBlciBkcmF3IG9uIHRoZSBncm9zcyBhbW91bnQsIGZsb29yLXJvdW5kZWQgaW4gdGhlCi8vIGRlbGVnYXRlJ3MgZmF2b3IuIFRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBsaXZlIGZlZSBpbiB0aGlzIHBvcnRmb2xpbwovLyAoZmVlX3NwbGl0LCBjcm93ZGZ1bmQpIGlzIGFsc28gMSUuCmNvbnN0IERyYXdGZWVCcHMgPSBpbnQ2NCgxMDApCgovLyBGZWVDb2xsZWN0b3IgcmVjZWl2ZXMgd2l0aGRyYXduIGZlZXMgYW5kIHN3ZXB0IHN1cnBsdXMuIENvbXBpbGUtdGltZQovLyBjb25zdGFudDogdGhlcmUgaXMgbm8gc2V0dGVyIGFuZCBubyB0cmFuc2ZlciBwYXRoLiBJdCBpcyB0aGUgZGVwbG95aW5nCi8vIG5hbWVzcGFjZSdzIGFkZHJlc3Mg4oCUIHN0YXRlZCBwbGFpbmx5OiB0aGUgb3BlcmF0b3Igb2YgdGhpcyByZWFsbS4KY29uc3QgRmVlQ29sbGVjdG9yID0gYWRkcmVzcygiZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMyIpCgovLyBNaW5GdW5kaW5nIGtlZXBzIGR1c3QgcG9vbHMgb3V0OiAxIEdOT1QgcGVyIEZ1bmQgY2FsbC4KY29uc3QgTWluRnVuZGluZyA9IGludDY0KDFfMDAwXzAwMCkKCi8vIE1pblBlclBlcmlvZCBpcyB0aGUgc21hbGxlc3QgcGVyLXdpbmRvdyBjYXAgYSBncmFudCBtYXkgY2FycnkuIEl0Ci8vIGV4aXN0cyBzbyBhIGdyYW50IGNhbm5vdCBiZSBjcmVhdGVkIHRoYXQgbm8gZHJhdyBjb3VsZCBldmVyIHNhdGlzZnksCi8vIGFuZCBpdCBpcyB0aGUgT05MWSBsb3dlciBib3VuZCBpbiB0aGUgZHJhdyBwYXRoIOKAlCB0aGVyZSBpcwovLyBkZWxpYmVyYXRlbHkgbm8gbWluaW11bSBEcmF3IGFtb3VudCwgYmVjYXVzZSBhIG1pbmltdW0gZHJhdyBhYm92ZSBhCi8vIGdyYW50J3MgUGVyUGVyaW9kIHdvdWxkIG1ha2UgdGhlIGdyYW50IHNpbGVudGx5IHVuZHJhd2FibGUuCmNvbnN0IE1pblBlclBlcmlvZCA9IGludDY0KDFfMDAwKQoKLy8gTWluUGVyaW9kQmxvY2tzIGlzIHRoZSBzaG9ydGVzdCByb2xsaW5nIHdpbmRvdyBhIGdyYW50IG1heSB1c2UuIEEKLy8gd2luZG93IG9mIGEgaGFuZGZ1bCBvZiBibG9ja3MgaXMgYSByYXRlLCBub3QgYSBidWRnZXQsIGFuZCBpdCBtYWtlcwovLyBQZXJQZXJpb2QgbWVhbmluZ2xlc3MgYXMgYSBib3VuZCBvbiB3b3JzdC1jYXNlIGxvc3MuIEEgcGVyaW9kTGVuZ3RoIG9mCi8vIDAgaXMgc3RpbGwgYWNjZXB0ZWQgYW5kIG1lYW5zIE9ORSBMSUZFVElNRSBXSU5ET1cgdGhhdCBuZXZlciByZWZpbGxzCi8vIChzcGVuZGJvb2sncyBvd24gc2VtYW50aWNzKS4KY29uc3QgTWluUGVyaW9kQmxvY2tzID0gaW50NjQoMTAwKQoKLy8gTWF4TGl2ZUdyYW50cyBjYXBzIHNpbXVsdGFuZW91c2x5IGxpdmUgZ3JhbnRzLCB2aWEgc3BlbmRib29rJ3Mgb3duCi8vIGNvbnN0cnVjdGlvbiBib3VuZC4gR3JhbnQgaXMgcGVybWlzc2lvbmxlc3MgdG8gYW55b25lIHdpdGggYSBmdW5kZWQKLy8gcG9vbCwgc28gdGhlIGNhcCBpcyBleGhhdXN0aWJsZSBpbiBwcmluY2lwbGUsIGFuZCB0aGF0IEFWQUlMQUJJTElUWQovLyBCT1VORCBpcyBkb2N1bWVudGVkIHJhdGhlciB0aGFuIGhpZGRlbi4KLy8KLy8gSXQgaXMgZG9jdW1lbnRlZCBoZXJlIGluIGl0cyBDT1JSRUNURUQgZm9ybS4gQW4gZWFybGllciB2ZXJzaW9uIG9mCi8vIHRoaXMgY29tbWVudCBjbGFpbWVkIHRoZSBtaXRpZ2F0aW9uIHdhcyAiTWF4R3JhbnRzUGVyT3duZXIgcGx1cyB0aGUKLy8gY29zdCBvZiBiZWNvbWluZyBhbiBvd25lciBhdCBhbGwgKE1pbkZ1bmRpbmcgcGVyIHBvb2wpLCBhbmQgUmVhcCBpcwovLyBwZXJtaXNzaW9ubGVzcyBzbyBleHBpcmVkIGdyYW50cyBjYW5ub3QgYWNjdW11bGF0ZSIuIEFuIGFkdmVyc2FyaWFsCi8vIGF1ZGl0IChmaW5kaW5nIFkxLCBESVNDT1ZFUlkubWQgwqcgOSkgc2hvd2VkIEJPVEggSEFMVkVTIHdlcmUgZmFsc2UuIEEKLy8gd3JvbmcgbWl0aWdhdGlvbiBpcyB3b3JzZSB0aGFuIGFuIGFja25vd2xlZGdlZCBib3VuZCwgYmVjYXVzZSBhIHJlYWRlcgovLyBzaXplcyB0aGUgcmlzayBmcm9tIGl0IGFuZCBzdG9wcyBsb29raW5nOgovLwovLyAgIC0gTWluRnVuZGluZyBpcyBOT1QgYSBjYXBpdGFsIGJvdW5kLiBUaGUgZnVuZGVkLXBvb2wgcmVxdWlyZW1lbnQgaXMKLy8gICAgIGNoZWNrZWQgYXQgR3JhbnQgdGltZSBvbmx5LCBhbmQgV2l0aGRyYXdQb29sIGhhcyBubyBsb2NrLCBzbyBvbmUKLy8gICAgIGFkZHJlc3MgZnVuZHMgYSBwb29sLCBvcGVucyBNYXhHcmFudHNQZXJPd25lciBncmFudHMsIHdpdGhkcmF3cwovLyAgICAgdGhlIHBvb2wgaW4gZnVsbCwgYW5kIHRoZSBncmFudHMgc3Vydml2ZSBob2xkaW5nIHRoZWlyIHNsb3RzLgovLyAgICAgVGVzdE93bmVyQ2FuQWx3YXlzTGVhdmUgcGlucyBleGFjdGx5IHRoYXQgc2VxdWVuY2UsIGFzIGludGVuZGVkCi8vICAgICBiZWhhdmlvciDigJQgdGhlIGF0dGFjayBpcyBidWlsdCBvdXQgb2YgYSBkb2N1bWVudGVkIGZlYXR1cmUuCi8vICAgLSBSZWFwIGlzIGluZXJ0IGFnYWluc3QgaXQuIFJlYXAgcmVxdWlyZXMgc3BlbmRib29rJ3MgSXNFeHBpcmVkLAovLyAgICAgd2hpY2ggaXMgbmV2ZXIgdHJ1ZSBmb3IgZXhwaXJlc0F0ID09IDAsIHNvIGFuIGF0dGFja2VyIG9taXRzIHRoZQovLyAgICAgZXhwaXJ5IGFuZCBubyB0aGlyZCBwYXJ0eSBjYW4gcmVtb3ZlIHRoZSBncmFudC4KLy8KLy8gV2hhdCB0aGUgY29zdCBBQ1RVQUxMWSBpczogZ2FzIGZvciBvbmUgRnVuZCwgTWF4R3JhbnRzUGVyT3duZXIgR3JhbnRzCi8vIGFuZCBvbmUgV2l0aGRyYXdQb29sQWxsIHBlciBhZGRyZXNzIOKAlCBhYm91dCBNYXhMaXZlR3JhbnRzKjE3LzE2Ci8vIHRyYW5zYWN0aW9ucyB0byBmaWxsIHRoZSBjYXAg4oCUIHBsdXMgdGhlIHN0b3JhZ2UgZGVwb3NpdCBvbiBldmVyeSBncmFudAovLyByZWNvcmQsIHdoaWNoIHRoZSBjaGFpbiBob2xkcyBmb3IgYXMgbG9uZyBhcyB0aGUgZ3JhbnQgZG9lcyBhbmQKLy8gcmVmdW5kcyBvbmx5IHdoZW4gaXQgaXMgcmVtb3ZlZC4gVGhhdCBpcyByZWFsIGFuZCB1bnJlY292ZXJhYmxlIHdoaWxlCi8vIHRoZSBncmllZiBsYXN0cy4gSXQgaXMgbm90IHRoZSBsb2NrZWQgcG9vbCBjYXBpdGFsIHRoZSBvbGQgY29tbWVudAovLyBwcm9taXNlZCwgYW5kIGl0IGlzIHByaWNlZCBpbiBnYXMgYW5kIHN0b3JhZ2UgcmF0aGVyIHRoYW4gaW4gY2FwaXRhbC4KLy8KLy8gTm8gY2FwaXRhbCBib3VuZCB3YXMgYWRkZWQsIGJlY2F1c2UgdGhlIG9idmlvdXMgb25lIGRvZXMgbm90IHdvcmsuCi8vIFJlcXVpcmluZyBhbiBvd25lciB3aXRoIGxpdmUgZ3JhbnRzIHRvIHJldGFpbiBNaW5GdW5kaW5nIGlzIGRlZmVhdGVkCi8vIGZvciB0aGUgcHJpY2Ugb2YgdGhlIGRyYXcgZmVlOiBub3RoaW5nIGZvcmJpZHMgZ3JhbnRpbmcgdG8gWU9VUlNFTEYsCi8vIHNvIHRoZSBhdHRhY2tlciBkcmF3cyBpdHMgb3duIHBvb2wgdG8gemVybyB0aHJvdWdoIGl0cyBvd24gZ3JhbnQgYW5kCi8vIENsYWltcyB0aGUgY3JlZGl0IGJhY2ssIHJlY292ZXJpbmcgYWxsIGJ1dCBEcmF3RmVlQnBzIG9mIGl0IHdoaWxlIHRoZQovLyByZXRlbnRpb24gcnVsZSBzdGlsbCByZWFkcyBhcyBzYXRpc2ZpZWQuIENsb3NpbmcgVEhBVCB3b3VsZCBtZWFuCi8vIGJvdW5kaW5nIERyYXcgYmVsb3cgTWluRnVuZGluZyDigJQgdGhlIHJlYWxtIHJlZnVzaW5nIHRvIGxldCBhIGRlbGVnYXRlCi8vIHNwZW5kIHRoZSBidWRnZXQsIHdoaWNoIGlzIHRoZSBmZWF0dXJlLiBUaGUgcmVtYWluaW5nIGFsdGVybmF0aXZlLCBhCi8vIG5vbi1yZWZ1bmRhYmxlIHBlci1ncmFudCBmZWUsIHRheGVzIGV2ZXJ5IGhvbmVzdCBvd25lciB0byBwcmljZSBhCi8vIGdyaWVmLCBhbmQgYXQgYSBmZWUgaGlnaCBlbm91Z2ggdG8gZGV0ZXIgb25lIGl0IGlzIGEgdGVudGggb2YKLy8gTWluRnVuZGluZyBwZXIgZ3JhbnQuCi8vCi8vIFRoZSBibGFzdCByYWRpdXMgaXMgbmFycm93IGFuZCB0aGF0IGlzIHRoZSByZWFzb24gdGhpcyBpcyBkaXNjbG9zZWQKLy8gcmF0aGVyIHRoYW4gcmVkZXNpZ25lZDogYSBmdWxsIGJvb2sgYmxvY2tzIE5FVyBncmFudHMgb25seS4gRXZlcnkKLy8gZXhpc3RpbmcgZ3JhbnQsIHBvb2wsIGRyYXcsIGNyZWRpdCBhbmQgY2xhaW0ga2VlcHMgd29ya2luZywgbm8gdmFsdWUKLy8gaXMgYXQgcmlzaywgYW5kIGFueSBvd25lciBjYW4gZnJlZSB0aGVpciBvd24gc2xvdHMgd2l0aCBSZXZva2UuCi8vCi8vIFRoZSBmaWd1cmUgd2FzIDEwMjQgdW50aWwgdGhhdCBhdWRpdCwgYW5kIDEwMjQgd2FzIGNvbnNlcnZhdGl2ZSByYXRoZXIKLy8gdGhhbiBtZWFzdXJlZDogbm90aGluZyBpbiB0aGlzIHJlYWxtIGl0ZXJhdGVzIHRoZSBib29rIChSZW5kZXIgaXMKLy8gYm91bmRlZCBieSBNYXhSZW5kZXJSb3dzLCBldmVyeSB3cml0ZSBwYXRoIGlzIGEgc2luZ2xlIGF2bCBsb29rdXApIGFuZAovLyBhIGdyYW50IHJlY29yZCdzIHN0b3JhZ2UgaXMgcGFpZCBmb3IgYnkgd2hvZXZlciBjcmVhdGVzIGl0LgovLyBRdWFkcnVwbGluZyBpdCBxdWFkcnVwbGVzIHRoZSBjb3N0IG9mIGZpbGxpbmcgdGhlIGNhcCBhbmQgY29zdHMgYW4KLy8gaG9uZXN0IG93bmVyIG5vdGhpbmcuIHNwZW5kYm9vaydzIG93biBNYXhMaXZlTGltaXQgaXMgMTAwMDAuCmNvbnN0IE1heExpdmVHcmFudHMgPSA0MDk2CgovLyBNYXhHcmFudHNQZXJPd25lciBib3VuZHMgaG93IG11Y2ggb2YgdGhlIGdsb2JhbCBjYXAgb25lIG93bmVyIGNhbgovLyBvY2N1cHkuIHNwZW5kYm9vaydzIG93biBwYWNrYWdlIGRvY3VtZW50YXRpb24gbmFtZXMgdGhpcyBhcyB0aGUgZ2FwIGEKLy8gY29uc3VtaW5nIHJlYWxtIG11c3QgY2xvc2Ug4oCUICJtYXhMaXZlIGlzIGEgc2luZ2xlIGdsb2JhbCBmaWd1cmUsIHNvCi8vIGFueSBvd25lciBwZXJtaXR0ZWQgdG8gT3BlbiBjYW4gZXhoYXVzdCBpdCBhbmQgbG9jayBvdXQgdGhlIHJlc3Qg4oCmCi8vIHRoZSBjb25zdW1pbmcgcmVhbG0gZGVjaWRlcyB3aG8gbWF5IE9wZW4sIGFuZCBhIEJvb2sgc2hhcmVkIGFjcm9zcwovLyBtdXR1YWxseSB1bnRydXN0aW5nIG93bmVycyBuZWVkcyBpdHMgb3duIHBlci1vd25lciBjYXAgb24gdG9wIG9mIHRoaXMKLy8gb25lLiIgVGhpcyBpcyB0aGF0IGNhcC4gKHBlcm1pc3Npb25fcmVnaXN0cnkgZmluZGluZyBSMSBpcyB0aGUgc2FtZQovLyBsZXNzb24gZnJvbSB0aGlzIHBvcnRmb2xpbydzIG93biBoaXN0b3J5LikKY29uc3QgTWF4R3JhbnRzUGVyT3duZXIgPSBpbnQ2NCgxNikKCi8vIE1heExhYmVsTGVuIGJvdW5kcyB0aGUgZ3JhbnQncyBmcmVlLXRleHQgbGFiZWwsIHdoaWNoIGlzIHNhbml0aXplZAovLyBiZWZvcmUgcmVhY2hpbmcgbWFya2Rvd24uCmNvbnN0IE1heExhYmVsTGVuID0gNjQKCi8vIE1heFJlbmRlclJvd3MgYm91bmRzIHRoZSBncmFudCBsaXN0IG9uIHRoZSBpbmRleCBwYWdlLgpjb25zdCBNYXhSZW5kZXJSb3dzID0gMjAKCnR5cGUgZ3JhbnQgc3RydWN0IHsKCWlkICAgICAgICBpbnQ2NAoJb3duZXIgICAgIGFkZHJlc3MKCXNwZW5kZXIgICBhZGRyZXNzCglhbGxvd0lEICAgdWludDY0IC8vIHRoZSBzcGVuZGJvb2sgYWxsb3dhbmNlIGJhY2tpbmcgdGhpcyBncmFudAoJZmVlQnBzICAgIGludDY0ICAvLyBzbmFwc2hvdHRlZCBhdCBHcmFudAoJbGFiZWwgICAgIHN0cmluZwoJY3JlYXRlZEF0IGludDY0CgoJZHJhd24gaW50NjQgLy8gbGlmZXRpbWUgZ3Jvc3MgZHJhd24gdW5kZXIgdGhpcyBncmFudAoJZHJhd3MgaW50NjQgLy8gbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgZHJhd3MKfQoKdmFyICgKCXNlbGYgYWRkcmVzcwoKCS8vIGdyYW50cyBob2xkcyBvbmUgcmVjb3JkIHBlciBsaXZlIGdyYW50LiBSZXZva2UgYW5kIFJlYXAgcmVtb3ZlIHRoZQoJLy8gcmVjb3JkOyBpZHMgYXJlIG5ldmVyIHJldXNlZC4KCWdyYW50cyA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpIC0+ICpncmFudAoJbmV4dElEIGludDY0CgoJLy8gcG9vbHMgaXMgZWFjaCBvd25lcidzIHVuc3BlbnQgZnVuZGVkIGJhbGFuY2U6CgkvLyBhZGRyZXNzIHN0cmluZyAtPiBpbnQ2NCAoPiAwKS4gVGhpcyBpcyB0aGUgUCB0ZXJtLgoJcG9vbHMgPSBhdmwuTmV3VHJlZSgpCgoJLy8gb3BlbkJ5T3duZXIgdHJhY2tzIGVhY2ggb3duZXIncyBsaXZlIGdyYW50IGNvdW50OgoJLy8gYWRkcmVzcyBzdHJpbmcgLT4gaW50NjQgKD4gMCkuCglvcGVuQnlPd25lciA9IGF2bC5OZXdUcmVlKCkKCgkvLyB0b3RhbFBvb2xlZCBpcyB0aGUgUCB0ZXJtIG9mIEggPT0gUCArIEwgKyBTLCBtYWludGFpbmVkIE8oMSkuCgl0b3RhbFBvb2xlZCBpbnQ2NAoKCS8vIGxpZmV0aW1lIGNvdW50ZXJzLCByZW5kZXJlZCBmb3Igb3BlcmF0b3JzLgoJbGlmZXRpbWVGdW5kZWQgICBpbnQ2NAoJbGlmZXRpbWVEcmF3biAgICBpbnQ2NCAvLyBncm9zcywgYmVmb3JlIHRoZSBmZWUKCWxpZmV0aW1lQ2xhaW1lZCAgaW50NjQgLy8gbmV0LCBwYWlkIHRvIGRlbGVnYXRlcwoJbGlmZXRpbWVSZXR1cm5lZCBpbnQ2NCAvLyB1bnNwZW50IHBvb2wgd2l0aGRyYXduIGJ5IG93bmVycwoKCS8vIGxlZGdlciBob2xkcyBlYWNoIGRlbGVnYXRlJ3MgdW5jbGFpbWVkIGNyZWRpdCBhbmQgdGhlIGZlZSBwb3QuIEl0cwoJLy8gTGlhYmlsaXRpZXMoKSBpcyB0aGUgTCB0ZXJtIGFuZCB0aGUgcmVzZXJ2ZSBTd2VlcFN1cnBsdXMgcHJvdGVjdHMuCglsZWRnZXIgPSBmZWVsZWRnZXIuTXVzdE5ldyhNYXhGZWVCcHMpCgoJLy8gYm9vayBob2xkcyBvbmUgbGl2ZSBhbGxvd2FuY2UgcGVyIGxpdmUgZ3JhbnQuIEV2ZXJ5IGJvdW5kIG9uCgkvLyBhdXRob3JpdHkg4oCUIHdpbmRvd3MsIGNhcHMsIGV4cGlyeSwgYW1lbmRtZW50IGRpcmVjdGlvbiDigJQgaXMgdGhlCgkvLyBwcmltaXRpdmUncywgbm90IHRoaXMgZmlsZSdzLgoJYm9vayA9IHNwZW5kYm9vay5NdXN0TmV3KE1heExpdmVHcmFudHMpCikKCmZ1bmMgaW5pdCgpIHsKCXNlbGYgPSB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpCn0KCi8vIHJlamVjdFN0cmF5U2VuZCBhYm9ydHMgd2hlbiBjb2lucyBhcmUgYXR0YWNoZWQgdG8gYSBub24tcGF5YWJsZSBjYWxsLgovLyBUaGlzIHJlYWxtIGhvbGRzIGZ1bmRzLCBzbyBhIHN0cmF5IHNlbmQgd291bGQgYmVjb21lIHN3ZWVwYWJsZQovLyBzdXJwbHVzLCBzaWxlbnRseSBjb252ZXJ0aW5nIGEgdXNlcidzIGNvaW5zIGludG8gb3BlcmF0b3IgZnVuZHMuCi8vIEFib3J0aW5nIHJldmVydHMgdGhlIHRyYW5zZmVyIGluc3RlYWQuIEd1YXJkZWQgb24gSXNVc2VyQ2FsbCwgbm90Ci8vIElzVXNlciwgYmVjYXVzZSBhIE1zZ1J1biBlcGhlbWVyYWwgY2FuIGNvbnN1bWUgdGhlIE9yaWdpblNlbmQgZW52ZWxvcGUKLy8gYmVmb3JlIGZvcndhcmRpbmcgY29udHJvbDsgZm9yIGEgcmVhbG0tcm91dGVkIGNhbGwgdGhlIGVudmVsb3BlIGxhbmRzCi8vIGF0IHRoZSBpbnRlcm1lZGlhcnksIHNvIHRoZXJlIGlzIG5vdGhpbmcgaGVyZSB0byByZWplY3QgYW5kIHRoZSBndWFyZAovLyBkZWxpYmVyYXRlbHkgZmFpbHMgb3BlbiAoY3Jvd2RmdW5kIGFuZCB0cmVhc3VyeV9ib2FyZCBkb2N1bWVudCB0aGUKLy8gc2FtZSBzY29wZSkuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJLy8gRXZlcnkgY2FsbCBzaXRlIGZvcndhcmRzIGEgY3Jvc3NpbmcgZW50cnlwb2ludCdzIG93biBsaXZlIGN1ciwKCQkvLyBzbyB0aGlzIGNhbm5vdCBmaXJlIHRvZGF5OyBpdCBleGlzdHMgc28gYSBmdXR1cmUgcmVmYWN0b3IgdGhhdAoJCS8vIGhhbmRzIHRoaXMgZ3VhcmQgYSBzdGFsZSByZWFsbSB2YWx1ZSBmYWlscyBjbG9zZWQsIG5vdCBvcGVuCgkJLy8gKGNvaW5pbyBuYW1lcyBJc0N1cnJlbnQgYXMgdGhlIGd1YXJkIHNlY29uZGFyeSByZWFsbQoJCS8vIHBhcmFtZXRlcnMgcmVxdWlyZSwgYW5kIHRoaXMgaGVscGVyIGZvbGxvd3MgdGhhdCBkaXNjaXBsaW5lKS4KCQlwYW5pYygiYnVkZ2V0czogcmVhbG0gY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudCIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpID4gMCB7CgkJcGFuaWMoInRoaXMgZW50cnlwb2ludCBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgovLyAtLS0gdGhlIHBvb2wgLS0tCgovLyBGdW5kIGFkZHMgdGhlIGF0dGFjaGVkIGNvaW5zIHRvIHRoZSBjYWxsZXIncyBvd24gcG9vbC4gRGlyZWN0IEVPQQovLyBjYWxscyB3aXRoIC1zZW5kIG9ubHkgKHRoZSByZWNlaXB0LWd1YXJhbnRlZWQgc2hhcGUpOyBleGFjdGx5IG9uZQovLyBwb3NpdGl2ZSB1Z25vdCBjb2luLCBhdCBsZWFzdCBNaW5GdW5kaW5nLiBBbnlvbmUgbWF5IGZ1bmQ7IGZ1bmRpbmcgaXMKLy8gd2hhdCBtYWtlcyBhbiBhZGRyZXNzIGFuIG93bmVyLgpmdW5jIEZ1bmQoY3VyIHJlYWxtKSBpbnQ2NCB7Cglvd25lciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCglpZiBhbW91bnQgPCBNaW5GdW5kaW5nIHsKCQlwYW5pYygiZnVuZCBhdCBsZWFzdCAiICsgaXRvYShNaW5GdW5kaW5nKSArIERlbm9tKQoJfQoJa2V5IDo9IG93bmVyLlN0cmluZygpCgoJbmV3UG9vbCwgb2sgOj0gY2hlY2tlZEFkZChwb29sT2Yoa2V5KSwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygicG9vbCB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdUb3RhbCwgb2sgOj0gY2hlY2tlZEFkZCh0b3RhbFBvb2xlZCwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygidG90YWwgcG9vbGVkIHdvdWxkIG92ZXJmbG93IikKCX0KCW5ld0xpZmV0aW1lLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lRnVuZGVkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBmdW5kZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoKCXNldFBvb2woa2V5LCBuZXdQb29sKQoJdG90YWxQb29sZWQgPSBuZXdUb3RhbAoJbGlmZXRpbWVGdW5kZWQgPSBuZXdMaWZldGltZQoKCWNoYWluLkVtaXQoIkZ1bmRlZCIsICJvd25lciIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicG9vbCIsIGl0b2EobmV3UG9vbCkpCglyZXR1cm4gbmV3UG9vbAp9CgovLyBXaXRoZHJhd1Bvb2wgcmV0dXJucyBwYXJ0IG9mIHRoZSBjYWxsZXIncyB1bnNwZW50IHBvb2wgYW5kIHJlcG9ydHMgdGhlCi8vIHBvb2wgUkVNQUlOSU5HIGFmdGVyd2FyZHMuIFRoZXJlIGlzIG5vIGxvY2sgYW5kIG5vIGNoZWNrIGFnYWluc3QKLy8gb3V0c3RhbmRpbmcgZ3JhbnRzOiB0aGUgbW9uZXkgaXMgdGhlIG93bmVyJ3MsIGFuZCBhIGRlbGVnYXRlJ3MKLy8gYXV0aG9yaXR5IGlzIG5vdCBhIGNsYWltIG9uIGl0IChzZWUgdGhlIHBhY2thZ2UgZG9jLCAidGhlIG93bmVyIGNhbgovLyBhbHdheXMgbGVhdmUiKS4gUmV2b2tlIGlzIHRoZSBjbGVhbiB3YXkgdG8gZW5kIGEgZ3JhbnQuCmZ1bmMgV2l0aGRyYXdQb29sKGN1ciByZWFsbSwgYW1vdW50IGludDY0KSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCXJldHVybiBwYXlPdXRQb29sKGN1ciwgb3duZXIsIGFtb3VudCkKfQoKLy8gV2l0aGRyYXdQb29sQWxsIHJldHVybnMgdGhlIGNhbGxlcidzIGVudGlyZSB1bnNwZW50IHBvb2wgYW5kIHJlcG9ydHMgdGhlCi8vIGFtb3VudCBXSVRIRFJBV04uCi8vCi8vIFRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZSB0d28gd2l0aGRyYXcgZW50cnlwb2ludHMgYXJlIGRlbGliZXJhdGVseQovLyBhc3ltbWV0cmljLCB3aGljaCBpcyB3b3J0aCBuYW1pbmcgcmF0aGVyIHRoYW4gbGV0dGluZyBhIGNhbGxlciBkaXNjb3ZlcjoKLy8gZWFjaCByZXR1cm5zIHRoZSBmaWd1cmUgaXRzIGNhbGxlciBkb2VzIG5vdCBhbHJlYWR5IGhhdmUuIFdpdGhkcmF3UG9vbAovLyB3YXMgdG9sZCB0aGUgYW1vdW50IGFuZCB3YW50cyB0byBrbm93IHdoYXQgaXMgbGVmdDsgV2l0aGRyYXdQb29sQWxsCi8vIGtub3dzIHdoYXQgaXMgbGVmdCAobm90aGluZykgYW5kIHdhbnRzIHRvIGtub3cgd2hhdCBpdCBnb3QuIFJldHVybmluZwovLyB0aGUgcmVtYWluZGVyIGhlcmUgd291bGQgaGFuZCBldmVyeSBjYWxsZXIgYSBjb25zdGFudCAwLgpmdW5jIFdpdGhkcmF3UG9vbEFsbChjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCA6PSBwb29sT2Yob3duZXIuU3RyaW5nKCkpCglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIHBvb2wgdG8gd2l0aGRyYXciKQoJfQoJcGF5T3V0UG9vbChjdXIsIG93bmVyLCBhbW91bnQpCglyZXR1cm4gYW1vdW50Cn0KCi8vIHBheU91dFBvb2wgaXMgdGhlIHNoYXJlZCBkZWJpdC10aGVuLXNlbmQgcGF0aDogdGhlIHBvb2wgYW5kIHRoZSBQIHRlcm0KLy8gYXJlIHJlZHVjZWQgYmVmb3JlIHRoZSBpZGVudGljYWwgYW1vdW50IGxlYXZlcyB0aGUgcmVhbG0KLy8gKGNoZWNrcy1lZmZlY3RzLWludGVyYWN0aW9ucykuCmZ1bmMgcGF5T3V0UG9vbChjdXIgcmVhbG0sIG93bmVyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgaW50NjQgewoJa2V5IDo9IG93bmVyLlN0cmluZygpCglwb29sIDo9IHBvb2xPZihrZXkpCglpZiBhbW91bnQgPiBwb29sIHsKCQlwYW5pYygiYW1vdW50IGV4Y2VlZHMgcG9vbCIpCgl9CgluZXdSZXR1cm5lZCwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZVJldHVybmVkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSByZXR1cm5lZCB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJc2V0UG9vbChrZXksIHBvb2wtYW1vdW50KQoJdG90YWxQb29sZWQgLT0gYW1vdW50CglsaWZldGltZVJldHVybmVkID0gbmV3UmV0dXJuZWQKCgljb2luaW8uUGF5b3V0KDAsIGN1ciwgb3duZXIsIERlbm9tLCBhbW91bnQpCgoJY2hhaW4uRW1pdCgiUG9vbFdpdGhkcmF3biIsICJvd25lciIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicG9vbCIsIGl0b2EocG9vbC1hbW91bnQpKQoJcmV0dXJuIHBvb2wgLSBhbW91bnQKfQoKLy8gLS0tIGdyYW50cyAtLS0KCi8vIEdyYW50IG9wZW5zIGEgc3RhbmRpbmcgc3BlbmRpbmcgYXV0aG9yaXR5IGZvciBvbmUgZGVsZWdhdGUgYW5kIHJldHVybnMKLy8gdGhlIGdyYW50IGlkLiBUaGUgY2FsbGVyIGJlY29tZXMgdGhlIGdyYW50J3Mgb3duZXIgYW5kIG11c3QgYWxyZWFkeQovLyBoYXZlIGEgZnVuZGVkIHBvb2wg4oCUIG5vdCBiZWNhdXNlIHRoZSBncmFudCByZXNlcnZlcyBhbnl0aGluZyAoaXQgZG9lcwovLyBub3QpLCBidXQgYmVjYXVzZSBhIGdyYW50IGZyb20gYW4gYWRkcmVzcyB0aGF0IGhhcyBuZXZlciBmdW5kZWQKLy8gYW55dGhpbmcgaXMgYSBwcm9taXNlIHdpdGggbm90aGluZyBiZWhpbmQgaXQsIGFuZCB0aGlzIHJlYWxtIGRlY2xpbmVzCi8vIHRvIHJlY29yZCBvbmUuCi8vCi8vIFRlcm1zLCBhbGwgaW4gdGhlIGNoYWluJ3Mgb3duIHVuaXRzOgovLwovLwlwZXJQZXJpb2QgICAgdGhlIGNhcCBwZXIgd2luZG93LCBhdCBsZWFzdCBNaW5QZXJQZXJpb2QuIFJlcXVpcmVkLgovLwlwZXJpb2RMZW5ndGggYmxvY2tzIHBlciB3aW5kb3cuIDAgbWVhbnMgT05FIExJRkVUSU1FIFdJTkRPVyB0aGF0Ci8vCSAgICAgICAgICAgICBuZXZlciByZWZpbGxzOyBvdGhlcndpc2UgYXQgbGVhc3QgTWluUGVyaW9kQmxvY2tzLgovLwl0b3RhbCAgICAgICAgbGlmZXRpbWUgY2FwIGFjcm9zcyBldmVyeSB3aW5kb3cuIDAgbWVhbnMgdW5saW1pdGVkLgovLwlleHBpcmVzQXQgICAgYWJzb2x1dGUgYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIGF1dGhvcml0eSBlbmRzLiAwIG1lYW5zCi8vCSAgICAgICAgICAgICBubyBleHBpcnkuCi8vCi8vIEV2ZXJ5IGJvdW5kIGFib3ZlIGV4Y2VwdCB0aGUgdHdvIHJlYWxtIG1pbmltdW1zIGlzIHZhbGlkYXRlZCBhbmQKLy8gZW5mb3JjZWQgYnkgc3BlbmRib29rLCBhbmQgYW4gaW52YWxpZCBjb21iaW5hdGlvbiBzdXJmYWNlcyBhcyB0aGF0Ci8vIHBhY2thZ2UncyBvd24gc2VudGluZWwgZXJyb3IuCmZ1bmMgR3JhbnQoY3VyIHJlYWxtLCBzcGVuZGVyIGFkZHJlc3MsIGxhYmVsIHN0cmluZywKCXBlclBlcmlvZCwgcGVyaW9kTGVuZ3RoLCB0b3RhbCwgZXhwaXJlc0F0IGludDY0KSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJLy8gVGhlIGxvd2VyY2FzZSBjbGF1c2UgaXMgbG9hZC1iZWFyaW5nLCBub3QgZGVjb3JhdGlvbiwgYW5kIHRoZSByZWFzb24KCS8vIHdhcyBtZWFzdXJlZCBvbiB0aGlzIHRvb2xjaGFpbiByYXRoZXIgdGhhbiBhcmd1ZWQ6IGFkZHJlc3MuSXNWYWxpZCgpCgkvLyBkZWZlcnMgdG8gY3J5cHRvLkFkZHJlc3NGcm9tQmVjaDMyLCB3aG9zZSBkZWNvZGVyIGxvd2VyY2FzZXMgdGhlCgkvLyBpbnB1dCBCRUZPUkUgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bSwgc28gaXQgcmV0dXJucyB0cnVlIGZvciB0aGUKCS8vIGFsbC11cHBlcmNhc2Ugc3BlbGxpbmcgb2YgYSB2YWxpZCBhZGRyZXNzLiBIZXJlIHRoZSBoYXphcmQgaXMgbm90IGEKCS8vIGRvdWJsZSBjb3VudCAoYXMgaW4gZmVlX3NwbGl0L3YyIGFuZCB0cmVhc3VyeV9ib2FyZCwgd2hlcmUgdGhlCgkvLyBhZGRyZXNzIHdhcyBhIHZvdGUtYmVhcmluZyBrZXkpIGJ1dCBhIEJSSUNLRUQgR1JBTlQ6IERyYXcKCS8vIGF1dGhlbnRpY2F0ZXMgYWdhaW5zdCBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIHdoaWNoIGlzIGFsd2F5cwoJLy8gY2Fub25pY2FsLCBzbyBhbiB1cHBlcmNhc2Utc3BlbGxlZCBkZWxlZ2F0ZSBjb3VsZCBuZXZlciBkcmF3LCB3aGlsZQoJLy8gdGhlIGdyYW50IHN0aWxsIG9jY3VwaWVkIGEgTWF4R3JhbnRzUGVyT3duZXIgc2xvdCBhbmQgYSBzdG9yYWdlCgkvLyBkZXBvc2l0LiBUaGUgY2hlY2sgaXMgY29tcGxldGUgYXMgd2VsbCBhcyBuZWNlc3Nhcnkg4oCUIHRoYXQgZGVjb2RlcgoJLy8gcmVqZWN0cyBtaXhlZCBjYXNlIG91dHJpZ2h0LCBzbyBhIHZhbGlkIGFkZHJlc3MgaGFzIGV4YWN0bHkgdHdvCgkvLyBzcGVsbGluZ3MgYW5kIHJlamVjdGluZyBldmVyeSBub24tbG93ZXIgb25lIGxlYXZlcyBwcmVjaXNlbHkgdGhlCgkvLyBjYW5vbmljYWwgb25lLgoJaWYgIXNwZW5kZXIuSXNWYWxpZCgpIHx8IHN0cmluZyhzcGVuZGVyKSAhPSBzdHJpbmdzLlRvTG93ZXIoc3RyaW5nKHNwZW5kZXIpKSB7CgkJcGFuaWMoInNwZW5kZXIgaXMgbm90IGEgdmFsaWQgYWRkcmVzcyBpbiBjYW5vbmljYWwgKGxvd2VyY2FzZSkgZm9ybSIpCgl9CglpZiBsZW4obGFiZWwpID4gTWF4TGFiZWxMZW4gewoJCXBhbmljKCJsYWJlbCBleGNlZWRzICIgKyBzdHJjb252Lkl0b2EoTWF4TGFiZWxMZW4pICsgIiBieXRlcyIpCgl9CglpZiBwZXJQZXJpb2QgPCBNaW5QZXJQZXJpb2QgewoJCXBhbmljKCJwZXJQZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QZXJQZXJpb2QpICsgRGVub20pCgl9CglpZiBwZXJpb2RMZW5ndGggIT0gMCAmJiBwZXJpb2RMZW5ndGggPCBNaW5QZXJpb2RCbG9ja3MgewoJCXBhbmljKCJwZXJpb2RMZW5ndGggbXVzdCBiZSAwIChsaWZldGltZSkgb3IgYXQgbGVhc3QgIiArCgkJCWl0b2EoTWluUGVyaW9kQmxvY2tzKSArICIgYmxvY2tzIikKCX0KCglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCWlmIHBvb2xPZihrZXkpID09IDAgewoJCXBhbmljKCJmdW5kIGEgcG9vbCBiZWZvcmUgZ3JhbnRpbmciKQoJfQoJaWYgb3duZXJPcGVuKGtleSkgPj0gTWF4R3JhbnRzUGVyT3duZXIgewoJCXBhbmljKCJvd25lciBhbHJlYWR5IGhhcyAiICsgaXRvYShNYXhHcmFudHNQZXJPd25lcikgKyAiIGxpdmUgZ3JhbnRzIikKCX0KCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglhbGxvd0lELCBlcnIgOj0gYm9vay5PcGVuKGtleSwgc3BlbmRlci5TdHJpbmcoKSwgbm93LCBzcGVuZGJvb2suVGVybXN7CgkJUGVyUGVyaW9kOiAgICBwZXJQZXJpb2QsCgkJUGVyaW9kTGVuZ3RoOiBwZXJpb2RMZW5ndGgsCgkJVG90YWw6ICAgICAgICB0b3RhbCwKCQlFeHBpcmVzQXQ6ICAgIGV4cGlyZXNBdCwKCX0pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaWQgOj0gbmV4dElEICsgMQoJbmV4dElEID0gaWQKCWdyYW50cy5TZXQocGFkSUQoaWQpLCAmZ3JhbnR7CgkJaWQ6ICAgICAgICBpZCwKCQlvd25lcjogICAgIG93bmVyLAoJCXNwZW5kZXI6ICAgc3BlbmRlciwKCQlhbGxvd0lEOiAgIGFsbG93SUQsCgkJZmVlQnBzOiAgICBEcmF3RmVlQnBzLAoJCWxhYmVsOiAgICAgbGFiZWwsCgkJY3JlYXRlZEF0OiBub3csCgl9KQoJc2V0T3duZXJPcGVuKGtleSwgb3duZXJPcGVuKGtleSkrMSkKCgljaGFpbi5FbWl0KCJHcmFudGVkIiwgImlkIiwgaXRvYShpZCksICJvd25lciIsIGtleSwKCQkic3BlbmRlciIsIHNwZW5kZXIuU3RyaW5nKCksICJwZXJQZXJpb2QiLCBpdG9hKHBlclBlcmlvZCksCgkJInBlcmlvZExlbmd0aCIsIGl0b2EocGVyaW9kTGVuZ3RoKSwgInRvdGFsIiwgaXRvYSh0b3RhbCksCgkJImV4cGlyZXNBdCIsIGl0b2EoZXhwaXJlc0F0KSwgImZlZUJwcyIsIGl0b2EoRHJhd0ZlZUJwcykpCglyZXR1cm4gaWQKfQoKLy8gQW1lbmQgY2hhbmdlcyBhIGdyYW50J3MgdGVybXMuIE93bmVyIG9ubHkuIFRoZSByZXR1cm5lZCBib29sIHJlcG9ydHMKLy8gd2hldGhlciB0aGUgbmV3IHRlcm1zIGFyZSBpbiBmb3JjZSBOT1cgKGEgdGlnaHRlci1vci1lcXVhbCBhbWVuZG1lbnQpCi8vIG9yIHF1ZXVlZCBmb3IgdGhlIG5leHQgd2luZG93IGJvdW5kYXJ5IChhIGxvb3NlciBvbmUpIOKAlCBzcGVuZGJvb2sncwovLyBvbmUtc2lkZWQgcnVsZSwgYW5kIHRoZSBkaXN0aW5jdGlvbiB3b3J0aCBrbm93aW5nLgovLwovLyBwZXJpb2RMZW5ndGggaXMgTk9UIGEgcGFyYW1ldGVyLiBzcGVuZGJvb2sgbWFrZXMgaXQgaW1tdXRhYmxlIGJlY2F1c2UKLy8gbW92aW5nIGl0IHdvdWxkIG1vdmUgZXZlcnkgZnV0dXJlIGJvdW5kYXJ5LCB3aGljaCBpcyBhbiBlbmxhcmdlbWVudAovLyB2ZWN0b3Igd2VhcmluZyBhIGRpZmZlcmVudCBoYXQ7IHRoaXMgcmVhbG0gcmVhZHMgdGhlIGdyYW50J3Mgb3duCi8vIHBlcmlvZExlbmd0aCBhbmQgcGFzc2VzIGl0IHVuY2hhbmdlZCwgc28gY2hhbmdpbmcgaXQgaXMgbm90IG1lcmVseQovLyByZWZ1c2VkLCBpdCBpcyB1bmV4cHJlc3NpYmxlLgpmdW5jIEFtZW5kKGN1ciByZWFsbSwgaWQgaW50NjQsIHBlclBlcmlvZCwgdG90YWwsIGV4cGlyZXNBdCBpbnQ2NCkgYm9vbCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglnIDo9IG11c3RHZXQoaWQpCglpZiBvd25lciAhPSBnLm93bmVyIHsKCQlwYW5pYygib3duZXIgb25seSIpCgl9CglpZiBwZXJQZXJpb2QgPCBNaW5QZXJQZXJpb2QgewoJCXBhbmljKCJwZXJQZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QZXJQZXJpb2QpICsgRGVub20pCgl9CgoJYSwgZXJyIDo9IGJvb2suR2V0KGcuYWxsb3dJRCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWFwcGxpZWQsIGVyciA6PSBib29rLkFtZW5kKGcuYWxsb3dJRCwgb3duZXIuU3RyaW5nKCksIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCQlzcGVuZGJvb2suVGVybXN7CgkJCVBlclBlcmlvZDogICAgcGVyUGVyaW9kLAoJCQlQZXJpb2RMZW5ndGg6IGEuVGVybXMuUGVyaW9kTGVuZ3RoLCAvLyBpbW11dGFibGUKCQkJVG90YWw6ICAgICAgICB0b3RhbCwKCQkJRXhwaXJlc0F0OiAgICBleHBpcmVzQXQsCgkJfSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljaGFpbi5FbWl0KCJBbWVuZGVkIiwgImlkIiwgaXRvYShnLmlkKSwgIm93bmVyIiwgb3duZXIuU3RyaW5nKCksCgkJInBlclBlcmlvZCIsIGl0b2EocGVyUGVyaW9kKSwgInRvdGFsIiwgaXRvYSh0b3RhbCksCgkJImV4cGlyZXNBdCIsIGl0b2EoZXhwaXJlc0F0KSwgImFwcGxpZWQiLCBib29sc3RyKGFwcGxpZWQpKQoJcmV0dXJuIGFwcGxpZWQKfQoKLy8gUmV2b2tlIGVuZHMgYSBncmFudCBpbW1lZGlhdGVseS4gT3duZXIgb25seS4gVGhlIGlkIGlzIG5ldmVyIHJldXNlZCwKLy8gc28gYSByZXZva2VkIGdyYW50IGNhbm5vdCBiZSByZXN1cnJlY3RlZCBhbmQgYSBsYXRlciBEcmF3IGFnYWluc3QgaXQKLy8gZmFpbHMgYXMgdW5rbm93bi4KLy8KLy8gUmV2b2tpbmcgZG9lcyBOT1QgY2xhdyBiYWNrIGNyZWRpdCB0aGUgZGVsZWdhdGUgaGFzIGFscmVhZHkgZHJhd24g4oCUCi8vIHRoYXQgaXMgdGhlaXJzIGFuZCBzdGF5cyBjbGFpbWFibGUuIFJldm9rZSBlbmRzIGZ1dHVyZSBhdXRob3JpdHkuCmZ1bmMgUmV2b2tlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWcgOj0gbXVzdEdldChpZCkKCWlmIG93bmVyICE9IGcub3duZXIgewoJCXBhbmljKCJvd25lciBvbmx5IikKCX0KCS8vIE93bmVyLWdhdGVkIHR3aWNlIG9uIHB1cnBvc2U6IHRoZSBjaGVjayBhYm92ZSBpcyBmb3IgdGhlIGVycm9yCgkvLyBtZXNzYWdlLCB0aGUgcHJpbWl0aXZlJ3MgaXMgdGhlIGF1dGhvcml0YXRpdmUgb25lLgoJaWYgZXJyIDo9IGJvb2suUmV2b2tlKGcuYWxsb3dJRCwgb3duZXIuU3RyaW5nKCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cglkcm9wKGcpCgoJY2hhaW4uRW1pdCgiUmV2b2tlZCIsICJpZCIsIGl0b2EoZy5pZCksICJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJzcGVuZGVyIiwgZy5zcGVuZGVyLlN0cmluZygpLCAiZHJhd24iLCBpdG9hKGcuZHJhd24pKQp9CgovLyBSZWFwIHJlbW92ZXMgYSBncmFudCB3aG9zZSBhdXRob3JpdHkgaGFzIEVYUElSRUQsIGZyZWVpbmcgaXRzIHNsb3QgYW5kCi8vIGl0cyBzdG9yYWdlLiBBbnlvbmUgbWF5IGNhbGwgaXQsIGFuZCB0aGUgcmVhc29uaW5nIGlzIHNwZW5kYm9vaydzIG93bjoKLy8gYW4gZXhwaXJlZCBhbGxvd2FuY2UgY2FuIG5ldmVyIGF1dGhvcml6ZSBhbm90aGVyIGRyYXcsIHNvIHJlbW92aW5nIGl0Ci8vIHRha2VzIG5vdGhpbmcgZnJvbSB0aGUgb3duZXIgYW5kIGdyYW50cyBub3RoaW5nIHRvIHRoZSBjYWxsZXIuIFRoZQovLyBjaGFpbiByZWZ1bmRzIHRoZSBmcmVlZCBzdG9yYWdlIGRlcG9zaXQgdG8gdGhlIHJlYXBpbmcgdHJhbnNhY3Rpb24sCi8vIHdoaWNoIGlzIHRoZSBzdGFuZGluZyBpbmNlbnRpdmUuCi8vCi8vIEEgZ3JhbnQgd2l0aCBubyBleHBpcnkgY2FuIG5ldmVyIGJlIHJlYXBlZDsgb25seSBpdHMgb3duZXIgY2FuIGVuZCBpdC4KZnVuYyBSZWFwKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglnIDo9IG11c3RHZXQoaWQpCglpZiBlcnIgOj0gYm9vay5SZWFwKGcuYWxsb3dJRCwgcnVudGltZS5DaGFpbkhlaWdodCgpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJZHJvcChnKQoKCWNoYWluLkVtaXQoIlJlYXBlZCIsICJpZCIsIGl0b2EoZy5pZCksICJvd25lciIsIGcub3duZXIuU3RyaW5nKCksCgkJImJ5IiwgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLlN0cmluZygpKQp9CgovLyAtLS0gZHJhd2luZyAtLS0KCi8vIERyYXcgc3BlbmRzIGFtb3VudCBmcm9tIHRoZSBncmFudCdzIGJ1ZGdldC4gREVMRUdBVEUgT05MWTogdGhlIHNwZW5kZXIKLy8gaXMgdGhlIGNhbGxpbmcgYWRkcmVzcywgbmV2ZXIgYW4gYXJndW1lbnQuIE5vdGhpbmcgaXMgcGFpZCBvdXQgaGVyZSDigJQKLy8gdGhlIGRlbGVnYXRlIGlzIGNyZWRpdGVkIG5ldCBvZiB0aGUgZmVlIGFuZCBjbGFpbXMgc2VwYXJhdGVseS4KLy8KLy8gVGhyZWUgdGhpbmdzIG11c3QgYWxsIGhvbGQgYW5kIHRoZXkgZmFpbCBpbiB0aGlzIG9yZGVyLCB3aGljaCBtYXR0ZXJzOgovLyB0aGUgY2FsbGVyIG11c3QgYmUgdGhlIGdyYW50J3MgZGVsZWdhdGUgYW5kIHRoZSBhbW91bnQgbXVzdCBiZSB3aXRoaW4KLy8gZXZlcnkgc3BlbmRib29rIGJvdW5kICh3aW5kb3cgY2FwLCBsaWZldGltZSBjYXAsIGV4cGlyeSwgc3RhcnQpOyBhbmQKLy8gdGhlIG93bmVyJ3MgcG9vbCBtdXN0IGNvdmVyIHRoZSBHUk9TUyBhbW91bnQuIFRoZSBzb2x2ZW5jeSBjaGVjayBydW5zCi8vIEJFRk9SRSB0aGUgYWxsb3dhbmNlIGlzIGNvbnN1bWVkLCBzbyBhIGRyYXcgcmVmdXNlZCBmb3IgaW5zb2x2ZW5jeQovLyBsZWF2ZXMgdGhlIGJ1ZGdldCB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gYnVybmluZyB3aW5kb3cgY2FwYWNpdHkgb24gYQovLyBkcmF3IHRoYXQgZGlkIG5vdCBoYXBwZW4uCmZ1bmMgRHJhdyhjdXIgcmVhbG0sIGlkIGludDY0LCBhbW91bnQgaW50NjQpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzcGVuZGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJZyA6PSBtdXN0R2V0KGlkKQoJaWYgc3BlbmRlciAhPSBnLnNwZW5kZXIgewoJCXBhbmljKCJkZWxlZ2F0ZSBvbmx5IikKCX0KCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJfQoKCW93bmVyS2V5IDo9IGcub3duZXIuU3RyaW5nKCkKCXBvb2wgOj0gcG9vbE9mKG93bmVyS2V5KQoJaWYgYW1vdW50ID4gcG9vbCB7CgkJLy8gQSBidWRnZXQgaXMgYXV0aG9yaXR5LCBub3QgYSByZXNlcnZhdGlvbiAocGFja2FnZSBkb2MpLiBUaGUKCQkvLyBob25lc3QgZmFpbHVyZSBpcyBoZXJlLCBhdCBkcmF3IHRpbWUsIHJhdGhlciB0aGFuIGEgY3JlZGl0IHRoZQoJCS8vIGRlbGVnYXRlIGNvdWxkIG5vdCBjbGFpbS4KCQlwYW5pYygib3duZXIncyBwb29sIGNhbm5vdCBjb3ZlciB0aGlzIGRyYXciKQoJfQoKCS8vIEF1dGhvcml0eS4gc3BlbmRib29rIGNoZWNrcyBldmVyeSBib3VuZCBhbmQgQ09OU1VNRVMgdGhlIGFsbG93YW5jZQoJLy8gaW4gdGhpcyBvbmUgY2FsbCwgYmVmb3JlIHJldHVybmluZzsgb24gYW55IGVycm9yIG5vdGhpbmcgaXMKCS8vIGNvbnN1bWVkLiBJdHMgc2VudGluZWwgZXJyb3JzIG5hbWUgdGhlIHJlYXNvbi4KCWlmIGVyciA6PSBib29rLlNwZW5kKGcuYWxsb3dJRCwgc3BlbmRlci5TdHJpbmcoKSwKCQlydW50aW1lLkNoYWluSGVpZ2h0KCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgluZXdEcmF3biwgb2sgOj0gY2hlY2tlZEFkZChnLmRyYXduLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJncmFudCBkcmF3biB0b3RhbCB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdMaWZldGltZSwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZURyYXduLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBkcmF3biB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJLy8gTW92ZSB0aGUgZ3Jvc3Mgb3V0IG9mIFAgYW5kIGludG8gTC4gSCBkb2VzIG5vdCBtb3ZlLCB3aGljaCBpcyB3aHkKCS8vIHRoaXMgdHJhbnNpdGlvbiBoYXMgbm8gcGF5b3V0IHRvIGZhaWwuCglzZXRQb29sKG93bmVyS2V5LCBwb29sLWFtb3VudCkKCXRvdGFsUG9vbGVkIC09IGFtb3VudAoJY3JlZGl0ZWQsIGZlZSA6PSBsZWRnZXIuTXVzdERlcG9zaXQoc3BlbmRlci5TdHJpbmcoKSwgYW1vdW50LCBnLmZlZUJwcykKCWcuZHJhd24gPSBuZXdEcmF3bgoJZy5kcmF3cysrCglsaWZldGltZURyYXduID0gbmV3TGlmZXRpbWUKCgljaGFpbi5FbWl0KCJEcmF3biIsICJpZCIsIGl0b2EoZy5pZCksICJzcGVuZGVyIiwgc3BlbmRlci5TdHJpbmcoKSwKCQkiZ3Jvc3MiLCBpdG9hKGFtb3VudCksICJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLCAiZmVlIiwgaXRvYShmZWUpLAoJCSJwb29sIiwgaXRvYShwb29sLWFtb3VudCkpCglyZXR1cm4gY3JlZGl0ZWQKfQoKLy8gQ2xhaW0gcGF5cyB0aGUgY2FsbGVyJ3MgZW50aXJlIGFjY3J1ZWQgY3JlZGl0IG91dC4gREVMRUdBVEUgT05MWTogdGhlCi8vIGFjY291bnQgaXMgdGhlIGNhbGxpbmcgYWRkcmVzcy4gQ3JlZGl0IGZyb20gYSBncmFudCB0aGF0IGhhcyBzaW5jZQovLyBiZWVuIHJldm9rZWQsIGV4cGlyZWQgb3IgcmVhcGVkIGlzIHN0aWxsIGNsYWltYWJsZSDigJQgaXQgd2FzIGVhcm5lZAovLyB1bmRlciBhIGxpdmUgYXV0aG9yaXR5IGFuZCB0aGlzIHJlYWxtIGRvZXMgbm90IHJldmlzaXQgdGhhdC4KZnVuYyBDbGFpbShjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglhY2NvdW50IDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJa2V5IDo9IGFjY291bnQuU3RyaW5nKCkKCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoa2V5KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBjcmVkaXQgdG8gY2xhaW0iKQoJfQoJbmV3Q2xhaW1lZCwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZUNsYWltZWQsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIGNsYWltZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbGlmZXRpbWVDbGFpbWVkID0gbmV3Q2xhaW1lZAoKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBhY2NvdW50LCBEZW5vbSwgYW1vdW50KQoKCWNoYWluLkVtaXQoIkNsYWltZWQiLCAiYWNjb3VudCIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKCXJldHVybiBhbW91bnQKfQoKLy8gLS0tIGZlZXMgYW5kIHN1cnBsdXMgLS0tCgovLyBXaXRoZHJhd0ZlZXMgcGF5cyB0aGUgZW50aXJlIGFjY3J1ZWQgZmVlIHBvdCB0byB0aGUgY29tcGlsZS10aW1lCi8vIEZlZUNvbGxlY3Rvci4gQW55b25lIG1heSBjYWxsIGl0OiB0aGUgZGVzdGluYXRpb24gaXMgZml4ZWQsIHNvIHRoZXJlCi8vIGlzIG5vdGhpbmcgZm9yIGEgY2FsbGVyIHRvIHN0ZWVyLgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglmZWVzIDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgZmVlcyA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBGZWVDb2xsZWN0b3IsIERlbm9tLCBmZWVzKQoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoZmVlcykpCglyZXR1cm4gZmVlcwp9CgovLyBTd2VlcFN1cnBsdXMgc2VuZHMgb3V0LW9mLWJhbmQgY29pbnMgdG8gdGhlIEZlZUNvbGxlY3RvcjogZm9yIHRoZSBwb29sCi8vIGRlbm9tLCBldmVyeXRoaW5nIGFib3ZlIHRyYWNrZWQgbGlhYmlsaXRpZXM7IGZvciBhbnkgZm9yZWlnbiBkZW5vbSwKLy8gdGhlIGZ1bGwgYmFsYW5jZS4gT3duZXIgcG9vbHMsIGRlbGVnYXRlIGNyZWRpdCBhbmQgdGhlIGZlZSBwb3QgYXJlCi8vIHVudG91Y2hhYmxlIGJ5IGNvbnN0cnVjdGlvbiAoY29pbmlvLlN3ZWVwIHJlZnVzZXMgdG8gZGlwIGJlbG93IHRoZQovLyByZXNlcnZlKS4gQW55b25lIG1heSBjYWxsIGl0LgovLwovLyBXaXRoIG5vdGhpbmcgb3V0IG9mIGJhbmQgdGhpcyBBQk9SVFMgKCJjb2luaW86IG5vIHN1cnBsdXMgdG8gc3dlZXAgZm9yCi8vIDxkZW5vbT4iKSByYXRoZXIgdGhhbiByZXR1cm5pbmcgMC4gVGhhdCBpcyB0aGUgcHJpbWl0aXZlJ3MgY2hvaWNlIGFuZAovLyB0aGUgcmlnaHQgb25lOiBhIHN3ZWVwIGlzIGEgdHJhbnNmZXIsIGFuZCBhIHRyYW5zZmVyIG9mIG5vdGhpbmcgdGhhdAovLyByZXBvcnRzIHN1Y2Nlc3MgaXMgaG93IGEgY2FsbGVyIGNvbWVzIHRvIGJlbGlldmUgYSBiYWxhbmNlIHdhcyBtb3ZlZC4KZnVuYyBTd2VlcFN1cnBsdXMoY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglyZXNlcnZlIDo9IGludDY0KDApCglpZiBkZW5vbSA9PSBEZW5vbSB7CgkJcmVzZXJ2ZSA9IExpYWJpbGl0aWVzKCkKCX0KCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIEZlZUNvbGxlY3RvciwgZGVub20sIHJlc2VydmUpCgljaGFpbi5FbWl0KCJTd2VwdCIsICJkZW5vbSIsIGRlbm9tLCAidG8iLCBGZWVDb2xsZWN0b3IuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2Eoc3dlcHQpKQoJcmV0dXJuIHN3ZXB0Cn0KCi8vIC0tLSB2aWV3cyAtLS0KCi8vIEdyYW50SW5mbyByZXR1cm5zIGEgZ3JhbnQncyBwYXJ0aWVzIGFuZCB0aGUgdGVybXMgY3VycmVudGx5IHJlY29yZGVkCi8vIGZvciBpdC4gcGVyUGVyaW9kIHJlZmxlY3RzIGEgdGlnaHRlbmluZyBhbWVuZG1lbnQgaW1tZWRpYXRlbHk7IGEKLy8gcXVldWVkIGxvb3NlbmluZyBzaG93cyBpbiBQZW5kaW5nVGVybXMgdW50aWwgaXRzIGJvdW5kYXJ5IGFycml2ZXMuCmZ1bmMgR3JhbnRJbmZvKGlkIGludDY0KSAob3duZXIsIHNwZW5kZXIgYWRkcmVzcywgcGVyUGVyaW9kLCBwZXJpb2RMZW5ndGgsCgl0b3RhbCwgZXhwaXJlc0F0LCBhbmNob3IsIGNyZWF0ZWRBdCwgZmVlQnBzIGludDY0KSB7CglnIDo9IG11c3RHZXQoaWQpCglhIDo9IG11c3RBbGxvd2FuY2UoZykKCXJldHVybiBnLm93bmVyLCBnLnNwZW5kZXIsIGEuVGVybXMuUGVyUGVyaW9kLCBhLlRlcm1zLlBlcmlvZExlbmd0aCwKCQlhLlRlcm1zLlRvdGFsLCBhLlRlcm1zLkV4cGlyZXNBdCwgYS5BbmNob3IsIGcuY3JlYXRlZEF0LCBnLmZlZUJwcwp9CgovLyBHcmFudFVzYWdlIHJldHVybnMgYSBncmFudCdzIGNvbnN1bXB0aW9uIEFUIFRIRSBDVVJSRU5UIEhFSUdIVDogd2hhdCB0aGUKLy8gd2luZG93IHRoZSBjaGFpbiBpcyBpbiByaWdodCBub3cgaGFzIHNwZW50LCB0aGUgbGlmZXRpbWUgZ3Jvc3MsIHRoYXQKLy8gd2luZG93J3MgaW5kZXgsIGFuZCBob3cgbWFueSBkcmF3cyB0aGVyZSBoYXZlIGJlZW4uCi8vCi8vIFRoZSB0d28gd2luZG93IGZpZ3VyZXMgYXJlIGNvbXB1dGVkIHJhdGhlciB0aGFuIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZQovLyByZWNvcmQsIGFuZCB0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB3aW5kb3dBdCBiZWxvdzogYSB3aW5kb3cgdGhhdCBoYXMKLy8gcm9sbGVkIHdpdGggbm8gZHJhdyBzaW5jZSBsZWF2ZXMgQWxsb3dhbmNlLldpbmRvd0luZGV4IG5hbWluZyBhIHdpbmRvdwovLyB0aGUgY2hhaW4gaGFzIGFscmVhZHkgbGVmdCwgYW5kIEFsbG93YW5jZS5TcGVudFdpbmRvdyBob2xkaW5nIHRoZQovLyBwcmV2aW91cyB3aW5kb3cncyBzcGVuZC4gc3BlbnRUb3RhbCBhbmQgZHJhd3MgYXJlIGN1bXVsYXRpdmUgYW5kIG5ldmVyCi8vIGdvIHN0YWxlLgpmdW5jIEdyYW50VXNhZ2UoaWQgaW50NjQpIChzcGVudFdpbmRvdywgc3BlbnRUb3RhbCwgd2luZG93SW5kZXgsIGRyYXdzIGludDY0KSB7CglnIDo9IG11c3RHZXQoaWQpCglhIDo9IG11c3RBbGxvd2FuY2UoZykKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCXJldHVybiBzcGVudEluV2luZG93KGEsIG5vdyksIGEuU3BlbnRUb3RhbCwgd2luZG93QXQoYSwgbm93KSwgZy5kcmF3cwp9CgovLyBHcmFudExhYmVsIHJldHVybnMgYSBncmFudCdzIHJhdyBsYWJlbCAodW5zYW5pdGl6ZWQ6IGNhbGxlcnMgcmVuZGVyaW5nCi8vIGl0IGludG8gbWFya2Rvd24gbXVzdCBzYW5pdGl6ZSwgYXMgdGhpcyByZWFsbSdzIFJlbmRlciBkb2VzKS4KZnVuYyBHcmFudExhYmVsKGlkIGludDY0KSBzdHJpbmcgeyByZXR1cm4gbXVzdEdldChpZCkubGFiZWwgfQoKLy8gUmVtYWluaW5nIGlzIHRoZSBBVVRIT1JJVFkgZmlndXJlOiB3aGF0IHRoZSBncmFudCdzIHRlcm1zIHBlcm1pdCByaWdodAovLyBub3csIGlnbm9yaW5nIHdoZXRoZXIgdGhlIG93bmVyJ3MgcG9vbCBjYW4gY292ZXIgaXQuCmZ1bmMgUmVtYWluaW5nKGlkIGludDY0KSBpbnQ2NCB7CglnIDo9IG11c3RHZXQoaWQpCglyZXR1cm4gYm9vay5SZW1haW5pbmcoZy5hbGxvd0lELCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCn0KCi8vIERyYXdhYmxlIGlzIHRoZSBIT05FU1QgZmlndXJlLCBhbmQgdGhlIG9uZSBhIGRlbGVnYXRlIHNob3VsZCByZWFkOiB0aGUKLy8gbGVzc2VyIG9mIHdoYXQgdGhlIGdyYW50IGF1dGhvcml6ZXMgYW5kIHdoYXQgdGhlIG93bmVyJ3MgcG9vbCBob2xkcy4KLy8gVGhpcyBkaXN0aW5jdGlvbiBpcyB0aGUgcmVhbG0ncyBvd24g4oCUIHNwZW5kYm9vayBib3VuZHMgcGVybWlzc2lvbiBhbmQKLy8gc2F5cyBzbywgbmV2ZXIgc29sdmVuY3kuCmZ1bmMgRHJhd2FibGUoaWQgaW50NjQpIGludDY0IHsKCWcgOj0gbXVzdEdldChpZCkKCWF1dGhvcml6ZWQgOj0gYm9vay5SZW1haW5pbmcoZy5hbGxvd0lELCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCglwb29sIDo9IHBvb2xPZihnLm93bmVyLlN0cmluZygpKQoJaWYgcG9vbCA8IGF1dGhvcml6ZWQgewoJCXJldHVybiBwb29sCgl9CglyZXR1cm4gYXV0aG9yaXplZAp9CgovLyBQZW5kaW5nVGVybXMgcmV0dXJucyBhIHF1ZXVlZCBsb29zZW5pbmcgYW1lbmRtZW50IGFuZCB3aGV0aGVyIHRoZXJlIGlzCi8vIG9uZS4gQW4gYW1lbmRtZW50IGlzIHF1ZXVlZCBvbmx5IHdoZW4gaXQgd291bGQgd2lkZW4gdGhlIGxpdmUgd2luZG93LAovLyBhbmQgaXQgdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeS4KZnVuYyBQZW5kaW5nVGVybXMoaWQgaW50NjQpIChwZXJQZXJpb2QsIHRvdGFsLCBleHBpcmVzQXQgaW50NjQsIHBlbmRpbmcgYm9vbCkgewoJYSA6PSBtdXN0QWxsb3dhbmNlKG11c3RHZXQoaWQpKQoJaWYgIWEuSGFzUGVuZGluZyB7CgkJcmV0dXJuIDAsIDAsIDAsIGZhbHNlCgl9CglyZXR1cm4gYS5QZW5kaW5nLlBlclBlcmlvZCwgYS5QZW5kaW5nLlRvdGFsLCBhLlBlbmRpbmcuRXhwaXJlc0F0LCB0cnVlCn0KCi8vIElzRXhwaXJlZCByZXBvcnRzIHdoZXRoZXIgYSBncmFudCdzIGF1dGhvcml0eSBoYXMgbGFwc2VkLCB3aGljaCBpcwovLyBhbHNvIHRoZSBjb25kaXRpb24gdW5kZXIgd2hpY2ggYW55b25lIG1heSBSZWFwIGl0LgpmdW5jIElzRXhwaXJlZChpZCBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gbXVzdEFsbG93YW5jZShtdXN0R2V0KGlkKSkuSXNFeHBpcmVkKHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKfQoKLy8gUG9vbE9mIHJldHVybnMgYW4gb3duZXIncyB1bnNwZW50IHBvb2wuCmZ1bmMgUG9vbE9mKGFkZHIgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gcG9vbE9mKGFkZHIuU3RyaW5nKCkpIH0KCi8vIENyZWRpdE9mIHJldHVybnMgYSBkZWxlZ2F0ZSdzIGRyYXduLWJ1dC11bmNsYWltZWQgY3JlZGl0LgpmdW5jIENyZWRpdE9mKGFkZHIgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihhZGRyLlN0cmluZygpKSB9CgovLyBHcmFudHNPZiByZXR1cm5zIGhvdyBtYW55IGxpdmUgZ3JhbnRzIGFuIG93bmVyIGN1cnJlbnRseSBob2xkcy4KZnVuYyBHcmFudHNPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIG93bmVyT3BlbihhZGRyLlN0cmluZygpKSB9CgovLyBOdW1HcmFudHMgcmV0dXJucyBob3cgbWFueSBncmFudHMgaGF2ZSBldmVyIGJlZW4gY3JlYXRlZC4gSWRzIGFyZQovLyBuZXZlciByZXVzZWQsIHNvIHRoaXMgb25seSBncm93cy4KZnVuYyBOdW1HcmFudHMoKSBpbnQ2NCB7IHJldHVybiBuZXh0SUQgfQoKLy8gTGl2ZUdyYW50cyByZXR1cm5zIGhvdyBtYW55IGdyYW50cyBhcmUgY3VycmVudGx5IGxpdmUsIGZyb20gdGhlCi8vIHByaW1pdGl2ZSdzIG93biBjb3VudC4KZnVuYyBMaXZlR3JhbnRzKCkgaW50NjQgeyByZXR1cm4gaW50NjQoYm9vay5Db3VudCgpKSB9CgovLyBUb3RhbFBvb2xlZCByZXR1cm5zIHRoZSBQIHRlcm06IHVuc3BlbnQgb3duZXIgZnVuZHMuCmZ1bmMgVG90YWxQb29sZWQoKSBpbnQ2NCB7IHJldHVybiB0b3RhbFBvb2xlZCB9CgovLyBVbmNsYWltZWRDcmVkaXQgcmV0dXJucyB0aGUgZGVsZWdhdGVzJyBzaGFyZSBvZiB0aGUgTCB0ZXJtLgpmdW5jIFVuY2xhaW1lZENyZWRpdCgpIGludDY0IHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQoKLy8gRmVlc0FjY3J1ZWQgcmV0dXJucyB0aGUgZmVlIHBvdDogY2hhcmdlZCwgbm90IHlldCB3aXRoZHJhd24uCmZ1bmMgRmVlc0FjY3J1ZWQoKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSB9CgovLyBMaWFiaWxpdGllcyByZXR1cm5zIFAgKyBMIOKAlCBldmVyeXRoaW5nIHRoaXMgcmVhbG0gb3dlcy4KZnVuYyBMaWFiaWxpdGllcygpIGludDY0IHsgcmV0dXJuIHRvdGFsUG9vbGVkICsgbGVkZ2VyLkxpYWJpbGl0aWVzKCkgfQoKLy8gSGVsZCByZXR1cm5zIEg6IHRoZSB1Z25vdCBhY3R1YWxseSBhdCB0aGlzIHJlYWxtJ3MgYWRkcmVzcy4KZnVuYyBIZWxkKCkgaW50NjQgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gU3VycGx1cyByZXR1cm5zIEggLSAoUCArIEwpIOKAlCBvdXQtb2YtYmFuZCBjb2lucywgc3dlZXBhYmxlLgpmdW5jIFN1cnBsdXMoKSBpbnQ2NCB7IHJldHVybiBIZWxkKCkgLSBMaWFiaWxpdGllcygpIH0KCi8vIEFkZHJlc3MgcmV0dXJucyB0aGlzIHJlYWxtJ3Mgb3duIGFkZHJlc3MuCmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgeyByZXR1cm4gc2VsZiB9CgovLyBIZWlnaHQgcmV0dXJucyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQ6IHRoZSBjbG9jayBldmVyeSB3aW5kb3cgYW5kCi8vIGV4cGlyeSBpcyBtZWFzdXJlZCBhZ2FpbnN0LCBhbmQgdGhlIG9uZSBubyBjYWxsZXIgY2FuIGNob29zZS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIHJlbmRlciAtLS0KCi8vIFJlbmRlciBzaG93cyB0aGUgcmVhbG0gYXQgIiIgYW5kIGEgZ3JhbnQgcGFnZSBhdCAiPGlkPiIuIExhYmVscyBhcmUKLy8gZnJlZSB0ZXh0IGFuZCBwYXNzIHRocm91Z2ggdGhlIGVjb3N5c3RlbSBzYW5pdGl6ZXIgYmVmb3JlIGhpdHRpbmcKLy8gbWFya2Rvd24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCAhPSAiIiB7CgkJcmV0dXJuIHJlbmRlckdyYW50KHBhdGgpCgl9Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgloZWxkIDo9IEhlbGQoKQoJbGlhYiA6PSBMaWFiaWxpdGllcygpCgljb25zZXJ2YXRpb24gOj0gIk9LIgoJaWYgaGVsZCA8IGxpYWIgewoJCWNvbnNlcnZhdGlvbiA9ICJWSU9MQVRFRCIKCX0KCglvdXQgOj0gIiMgQnVkZ2V0c1xuXG4iCglvdXQgKz0gIkRlbGVnYXRlZCBzcGVuZGluZyBpbiBHTk9ULiBGdW5kIGEgcG9vbCwgZ3JhbnQgYSBkZWxlZ2F0ZSBhICIgKwoJCSJzdGFuZGluZyByYXRlLWxpbWl0ZWQgYXV0aG9yaXR5IG92ZXIgaXQsIGFuZCB0aGV5IGRyYXcgd2l0aGluICIgKwoJCSJ0aGF0IGJvdW5kIHdpdGhvdXQgYXNraW5nIGFueW9uZS4gUmV2b2NhYmxlIGltbWVkaWF0ZWx5OyB0aGUgIiArCgkJIndpbmRvd3MgYXJlIGFuY2hvcmVkLCBzbyBub2JvZHkgcmVzZXRzIGEgY2FwIGJ5IGNob29zaW5nIHdoZW4gIiArCgkJInRvIGNhbGwuXG5cbiIKCW91dCArPSAiIyMgVGVybXMgKGZpeGVkIGF0IGRlcGxveTsgbm8gYWRtaW4sIG5vIHNldHRlcnMpXG5cbiIKCW91dCArPSAiLSBkcmF3IGZlZTogIiArIGJwcyhEcmF3RmVlQnBzKSArICIgb2YgdGhlIGdyb3NzIGRyYXcsIHBhaWQgZnJvbSB0aGUgb3duZXIncyBidWRnZXQgKGhhcmQgY2FwICIgKyBicHMoTWF4RmVlQnBzKSArICIpXG4iCglvdXQgKz0gIi0gbm8gZmVlIG9uIGZ1bmRpbmcsIG9uIHdpdGhkcmF3aW5nIGFuIHVuc3BlbnQgcG9vbCwgb3Igb24gY2xhaW1pbmdcbiIKCW91dCArPSAiLSBtaW5pbXVtIGZ1bmRpbmc6ICIgKyBpdG9hKE1pbkZ1bmRpbmcpICsgRGVub20gKyAiIHBlciBjYWxsXG4iCglvdXQgKz0gIi0gbWluaW11bSBwZXItd2luZG93IGNhcDogIiArIGl0b2EoTWluUGVyUGVyaW9kKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIHdpbmRvdyBsZW5ndGg6IDAgKG9uZSBsaWZldGltZSB3aW5kb3cpIG9yIGF0IGxlYXN0ICIgKyBpdG9hKE1pblBlcmlvZEJsb2NrcykgKyAiIGJsb2Nrc1xuIgoJb3V0ICs9ICItIGxpdmUgZ3JhbnRzOiAiICsgaXRvYShMaXZlR3JhbnRzKCkpICsgIiBvZiAiICsgc3RyY29udi5JdG9hKE1heExpdmVHcmFudHMpICsKCQkiIChwZXIgb3duZXI6ICIgKyBpdG9hKE1heEdyYW50c1Blck93bmVyKSArICIpXG4iCglvdXQgKz0gIi0gY3VycmVudCBoZWlnaHQ6ICIgKyBpdG9hKG5vdykgKyAiXG5cbiIKCW91dCArPSAiIyMgQWNjb3VudGluZyAoSCA9PSBQICsgTCArIFMpXG5cbiIKCW91dCArPSAiLSBwb29sZWQgKFApOiAiICsgaXRvYSh0b3RhbFBvb2xlZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSB1bmNsYWltZWQgZGVsZWdhdGUgY3JlZGl0OiAiICsgaXRvYShsZWRnZXIuVXNlcnNUb3RhbCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGZlZSBwb3Q6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGhlbGQgKEgpOiAiICsgaXRvYShoZWxkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIHN1cnBsdXMgKFMpOiAiICsgaXRvYShoZWxkLWxpYWIpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gY29uc2VydmF0aW9uOiAiICsgY29uc2VydmF0aW9uICsgIlxuIgoJb3V0ICs9ICItIGxpZmV0aW1lIGZ1bmRlZCAvIGRyYXduIC8gY2xhaW1lZCAvIHJldHVybmVkOiAiICsKCQlpdG9hKGxpZmV0aW1lRnVuZGVkKSArICIgLyAiICsgaXRvYShsaWZldGltZURyYXduKSArICIgLyAiICsKCQlpdG9hKGxpZmV0aW1lQ2xhaW1lZCkgKyAiIC8gIiArIGl0b2EobGlmZXRpbWVSZXR1cm5lZCkgKyBEZW5vbSArICJcblxuIgoJb3V0ICs9ICIjIyBMaXZlIGdyYW50c1xuXG4iCglpZiBncmFudHMuU2l6ZSgpID09IDAgewoJCW91dCArPSAiTm9uZSB5ZXQuIEZ1bmQgYSBwb29sLCB0aGVuIEdyYW50IGEgZGVsZWdhdGUuXG4iCgl9IGVsc2UgewoJCXNob3duIDo9IDAKCQlleHBpcmVkIDo9IDAKCQlncmFudHMuUmV2ZXJzZUl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJCWcgOj0gdi4oKmdyYW50KQoJCQlhLCBhZXJyIDo9IGJvb2suR2V0KGcuYWxsb3dJRCkKCQkJc3RhdGUgOj0gImxpdmUiCgkJCWlmIGFlcnIgIT0gbmlsIHsKCQkJCXN0YXRlID0gIm1pc3NpbmciCgkJCX0gZWxzZSBpZiBhLklzRXhwaXJlZChub3cpIHsKCQkJCXN0YXRlID0gImV4cGlyZWQgKHJlYXBhYmxlKSIKCQkJCWV4cGlyZWQrKwoJCQl9CgkJCW91dCArPSAiLSBbIyIgKyBpdG9hKGcuaWQpICsgIl0oIiArIFJlYWxtUGF0aCArICI6IiArIGl0b2EoZy5pZCkgKwoJCQkJIikgWyIgKyBzdGF0ZSArICJdICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGxhYmVsT3IoZykpICsKCQkJCSIg4oCUIGRyYXdhYmxlICIgKyBpdG9hKERyYXdhYmxlKGcuaWQpKSArIERlbm9tICsgIlxuIgoJCQlzaG93bisrCgkJCXJldHVybiBzaG93biA+PSBNYXhSZW5kZXJSb3dzCgkJfSkKCQlpZiBzaG93biA8IGdyYW50cy5TaXplKCkgewoJCQlvdXQgKz0gIlxuPiBbIU5PVEVdXG4+IFNob3dpbmcgdGhlICIgKyBzdHJjb252Lkl0b2Eoc2hvd24pICsKCQkJCSIgbW9zdCByZWNlbnQgb2YgIiArIHN0cmNvbnYuSXRvYShncmFudHMuU2l6ZSgpKSArCgkJCQkiIGxpdmUgZ3JhbnRzICgiICsgaXRvYShuZXh0SUQpICsKCQkJCSIgZXZlciBjcmVhdGVkOyByZXZva2VkIGFuZCByZWFwZWQgcmVjb3JkcyBhcmUgcmVtb3ZlZCkuICIgKwoJCQkJIlVzZSBHcmFudEluZm8oaWQpIGZvciBhbnkgc3BlY2lmaWMgZ3JhbnQuXG4iCgkJfQoJCWlmIGV4cGlyZWQgPiAwIHsKCQkJb3V0ICs9ICJcbiMjIEtlZXBlciB3b3JrXG5cbkFueW9uZSBtYXkgUmVhcChpZCkgYW4gZXhwaXJlZCBncmFudCAiICsKCQkJCSJ0byBmcmVlIGl0cyBzbG90IGFuZCByZWNsYWltIGl0cyBzdG9yYWdlIGRlcG9zaXQ6ICIgKwoJCQkJc3RyY29udi5JdG9hKGV4cGlyZWQpICsgIiBvZiB0aGUgZ3JhbnRzIGFib3ZlIGFyZSByZWFwYWJsZS5cbiIKCQl9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyR3JhbnQocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocGF0aCwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gaW52YWxpZCBncmFudCBpZFxuIgoJfQoJdiA6PSBncmFudHMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiB1bmtub3duIGdyYW50IGlkIChuZXZlciBjcmVhdGVkLCBvciByZXZva2VkL3JlYXBlZClcbiIKCX0KCWcgOj0gdi4oKmdyYW50KQoJYSwgZ2VyciA6PSBib29rLkdldChnLmFsbG93SUQpCglpZiBnZXJyICE9IG5pbCB7CgkJLy8gVW5yZWFjaGFibGU6IGRyb3AoKSByZW1vdmVzIHRoZSByZWNvcmQgYW5kIHRoZSBhbGxvd2FuY2UKCQkvLyB0b2dldGhlciwgaW4gb25lIGNhbGwuIFJlbmRlcmVkIHJhdGhlciB0aGFuIHBhbmlja2VkIHNvIGEKCQkvLyBjb3JydXB0ZWQgcGFpciBpcyB2aXNpYmxlIGluc3RlYWQgb2YgYnJlYWtpbmcgdGhlIHBhZ2UuCgkJcmV0dXJuICI+IFshQ0FVVElPTl1cbj4gZ3JhbnQgIyIgKyBpdG9hKGcuaWQpICsKCQkJIiBoYXMgbm8gYmFja2luZyBhbGxvd2FuY2U7IHRoaXMgaXMgYSBidWcuIFJlYXNvbjogIiArCgkJCXNhbml0aXplLklubGluZVRleHQoZ2Vyci5FcnJvcigpKSArICJcbiIKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCglvdXQgOj0gIiMgR3JhbnQgIyIgKyBpdG9hKGcuaWQpCglpZiBnLmxhYmVsICE9ICIiIHsKCQlvdXQgKz0gIjogIiArIHNhbml0aXplLklubGluZVRleHQoZy5sYWJlbCkKCX0KCW91dCArPSAiXG5cbiIKCW91dCArPSAiLSBvd25lcjogYCIgKyBnLm93bmVyLlN0cmluZygpICsgImBcbiIKCW91dCArPSAiLSBkZWxlZ2F0ZTogYCIgKyBnLnNwZW5kZXIuU3RyaW5nKCkgKyAiYFxuIgoJb3V0ICs9ICItIHBlci13aW5kb3cgY2FwOiAiICsgaXRvYShhLlRlcm1zLlBlclBlcmlvZCkgKyBEZW5vbSArICJcbiIKCWlmIGEuVGVybXMuUGVyaW9kTGVuZ3RoID09IDAgewoJCW91dCArPSAiLSB3aW5kb3c6IG9uZSBsaWZldGltZSB3aW5kb3c7IHRoZSBjYXAgbmV2ZXIgcmVmaWxsc1xuIgoJfSBlbHNlIHsKCQlvdXQgKz0gIi0gd2luZG93OiAiICsgaXRvYShhLlRlcm1zLlBlcmlvZExlbmd0aCkgKwoJCQkiIGJsb2NrcywgYW5jaG9yZWQgYXQgIiArIGl0b2EoYS5BbmNob3IpICsKCQkJIiAobm93IGluIHdpbmRvdyAiICsgaXRvYSh3aW5kb3dBdChhLCBub3cpKSArICIpXG4iCgl9CglpZiBhLlRlcm1zLlRvdGFsID09IDAgewoJCW91dCArPSAiLSBsaWZldGltZSBjYXA6IG5vbmVcbiIKCX0gZWxzZSB7CgkJb3V0ICs9ICItIGxpZmV0aW1lIGNhcDogIiArIGl0b2EoYS5UZXJtcy5Ub3RhbCkgKyBEZW5vbSArCgkJCSIgKCIgKyBpdG9hKGEuU3BlbnRUb3RhbCkgKyAiIHVzZWQpXG4iCgl9CglpZiBhLlRlcm1zLkV4cGlyZXNBdCA9PSAwIHsKCQlvdXQgKz0gIi0gZXhwaXJ5OiBub25lIChvbmx5IHRoZSBvd25lciBjYW4gZW5kIGl0KVxuIgoJfSBlbHNlIHsKCQlvdXQgKz0gIi0gZXhwaXJ5OiBibG9jayAiICsgaXRvYShhLlRlcm1zLkV4cGlyZXNBdCkgKyAiXG4iCgl9CglvdXQgKz0gIi0gZHJhdyBmZWU6ICIgKyBicHMoZy5mZWVCcHMpICsgIiAoc25hcHNob3R0ZWQgYXQgZ3JhbnQgdGltZSlcbiIKCW91dCArPSAiLSBzcGVudCB0aGlzIHdpbmRvdzogIiArIGl0b2Eoc3BlbnRJbldpbmRvdyhhLCBub3cpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGRyYXduIGluIHRvdGFsOiAiICsgaXRvYShnLmRyYXduKSArIERlbm9tICsgIiBvdmVyICIgKwoJCWl0b2EoZy5kcmF3cykgKyAiIGRyYXdzXG4iCglvdXQgKz0gIi0gY3JlYXRlZCBhdCBibG9jazogIiArIGl0b2EoZy5jcmVhdGVkQXQpICsgIlxuIgoJb3V0ICs9ICItIGN1cnJlbnQgaGVpZ2h0OiAiICsgaXRvYShub3cpICsgIlxuXG4iCgoJYXV0aG9yaXplZCA6PSBhLlJlbWFpbmluZyhub3cpCglwb29sIDo9IHBvb2xPZihnLm93bmVyLlN0cmluZygpKQoJb3V0ICs9ICIjIyBXaGF0IGNhbiBiZSBkcmF3biByaWdodCBub3dcblxuIgoJb3V0ICs9ICItIGF1dGhvcml6ZWQgYnkgdGhlIHRlcm1zOiAiICsgaXRvYShhdXRob3JpemVkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIG93bmVyJ3MgdW5zcGVudCBwb29sOiAiICsgaXRvYShwb29sKSArIERlbm9tICsgIlxuIgoJZHJhd2FibGUgOj0gYXV0aG9yaXplZAoJaWYgcG9vbCA8IGRyYXdhYmxlIHsKCQlkcmF3YWJsZSA9IHBvb2wKCX0KCW91dCArPSAiLSAqKmRyYXdhYmxlOiAiICsgaXRvYShkcmF3YWJsZSkgKyBEZW5vbSArICIqKiAodGhlIGxlc3NlciBvZiB0aGUgdHdvKVxuXG4iCgoJc3dpdGNoIHsKCWNhc2UgYS5Jc0V4cGlyZWQobm93KToKCQlvdXQgKz0gIlRoaXMgZ3JhbnQgaGFzICoqZXhwaXJlZCoqLiBBbnlvbmUgbWF5IFJlYXAoIiArIGl0b2EoZy5pZCkgKwoJCQkiKSB0byBmcmVlIGl0cyBzbG90IGFuZCByZWNsYWltIGl0cyBzdG9yYWdlIGRlcG9zaXQuXG4iCgljYXNlIGRyYXdhYmxlID09IDAgJiYgYXV0aG9yaXplZCA9PSAwOgoJCW91dCArPSAiTm90aGluZyBhdXRob3JpemVkIGF0IHRoaXMgaGVpZ2h0IOKAlCB0aGUgd2luZG93IGNhcCBpcyBzcGVudCwgIiArCgkJCSJ0aGUgbGlmZXRpbWUgY2FwIGlzIHJlYWNoZWQsIG9yIHRoZSBncmFudCBoYXMgbm90IHN0YXJ0ZWQuXG4iCgljYXNlIGRyYXdhYmxlID09IDA6CgkJb3V0ICs9ICJBdXRob3JpemVkIGJ1dCAqKm5vdCBmdW5kZWQqKjogdGhlIG93bmVyJ3MgcG9vbCBjYW5ub3QgY292ZXIgIiArCgkJCSJhIGRyYXcuIEEgYnVkZ2V0IGlzIGF1dGhvcml0eSwgbm90IGEgcmVzZXJ2YXRpb24uXG4iCglkZWZhdWx0OgoJCW91dCArPSAiVGhlIGRlbGVnYXRlIG1heSBEcmF3KCIgKyBpdG9hKGcuaWQpICsgIiwgYW1vdW50KSB1cCB0byB0aGUgIiArCgkJCSJkcmF3YWJsZSBmaWd1cmUsIHRoZW4gQ2xhaW0oKSB0byByZWNlaXZlIGl0LlxuIgoJfQoJaWYgYS5IYXNQZW5kaW5nIHsKCQlvdXQgKz0gIlxuPiBbIU5PVEVdXG4+IEEgKipsb29zZXIqKiBhbWVuZG1lbnQgaXMgcXVldWVkIGFuZCB0YWtlcyAiICsKCQkJImVmZmVjdCBhdCB0aGUgbmV4dCB3aW5kb3cgYm91bmRhcnk6IHBlci13aW5kb3cgY2FwICIgKwoJCQlpdG9hKGEuUGVuZGluZy5QZXJQZXJpb2QpICsgRGVub20gKyAiLCBsaWZldGltZSBjYXAgIiArCgkJCWl0b2EoYS5QZW5kaW5nLlRvdGFsKSArICIsIGV4cGlyeSAiICsgaXRvYShhLlBlbmRpbmcuRXhwaXJlc0F0KSArCgkJCSIgKDAgbWVhbnMgbm9uZSkuIFVudGlsIHRoZW4gdGhlIHRlcm1zIGFib3ZlIGFyZSB3aGF0IGdvdmVybi5cbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIGludGVybmFscyAtLS0KCmZ1bmMgbXVzdEdldChpZCBpbnQ2NCkgKmdyYW50IHsKCXYgOj0gZ3JhbnRzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gZ3JhbnQgaWQiKQoJfQoJcmV0dXJuIHYuKCpncmFudCkKfQoKLy8gbXVzdEFsbG93YW5jZSBmZXRjaGVzIHRoZSBzcGVuZGJvb2sgYWxsb3dhbmNlIGJlaGluZCBhIGdyYW50LiBUaGUgcGFpcgovLyBpcyBjcmVhdGVkIGFuZCByZW1vdmVkIHRvZ2V0aGVyLCBzbyBhIG1pc3NpbmcgYWxsb3dhbmNlIGlzIGEgYnVnIGluCi8vIHRoaXMgcmVhbG0gcmF0aGVyIHRoYW4gYSB1c2VyIGVycm9yLCBhbmQgaXQgcGFuaWNzIHJhdGhlciB0aGFuCi8vIHJlcG9ydGluZyBhIHplcm8gdmFsdWUgdGhhdCBhIHJlYWRlciB3b3VsZCB0YWtlIGZvciAibm8gYXV0aG9yaXR5Ii4KZnVuYyBtdXN0QWxsb3dhbmNlKGcgKmdyYW50KSBzcGVuZGJvb2suQWxsb3dhbmNlIHsKCWEsIGVyciA6PSBib29rLkdldChnLmFsbG93SUQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYQp9CgovLyB3aW5kb3dBdCByZXR1cm5zIHRoZSBhbmNob3JlZCB3aW5kb3cgaW5kZXggY29udGFpbmluZyBub3csIGFuZAovLyBzcGVudEluV2luZG93IHdoYXQgdGhhdCB3aW5kb3cgaGFzIHNwZW50LgovLwovLyBUaGVzZSBkdXBsaWNhdGUgYSBsaW5lIG9mIHNwZW5kYm9vaywgYW5kIHRoZSBkdXBsaWNhdGlvbiBpcyBkZWxpYmVyYXRlLAovLyBib3VuZGVkLCBhbmQgd29ydGgganVzdGlmeWluZyBiZWNhdXNlIHRoZSBwcmltaXRpdmUncyBvd24gYXQoKSBjb21tZW50Ci8vIHdhcm5zIGFnYWluc3QgZXhhY3RseSB0aGlzLiBXaGF0IGlzIE5PVCByZWltcGxlbWVudGVkIGlzIHRoZSBwYXJ0IHRoYXQKLy8gd2FybmluZyBpcyBhYm91dDogd2hpY2ggdGVybXMgYXJlIGluIGZvcmNlIGFmdGVyIGEgYm91bmRhcnksIGFuZAovLyB0aGVyZWZvcmUgZXZlcnkgYXV0aG9yaXR5IGZpZ3VyZSB0aGlzIHJlYWxtIHJlcG9ydHMg4oCUIFJlbWFpbmluZyBhbmQKLy8gRHJhd2FibGUgYm90aCBjYWxsIHRocm91Z2ggdG8gdGhlIHByaW1pdGl2ZSwgYW5kIG5vdGhpbmcgaGVyZSBzZWNvbmQtCi8vIGd1ZXNzZXMgdGhlbS4KLy8KLy8gV2hhdCBpcyBjb3BpZWQgaXMgcHVyZSBpbmRleCBhcml0aG1ldGljIG92ZXIgdGhyZWUgRVhQT1JURUQgZmllbGRzIHBsdXMKLy8gdGhlIGFscmVhZHktZG9jdW1lbnRlZCBmYWN0IHRoYXQgdGhlIGluLXdpbmRvdyBzcGVuZCBSRVNFVFMgcmF0aGVyIHRoYW4KLy8gY2Fycmllcy4gVGhlIGFsdGVybmF0aXZlIGlzIHdvcnNlIHRoYW4gdGhlIGR1cGxpY2F0aW9uOiBBbGxvd2FuY2UncwovLyBXaW5kb3dJbmRleCBhbmQgU3BlbnRXaW5kb3cgYXJlIHRoZSBsYXN0LVdSSVRURU4gcGFpciwgc28gYmV0d2VlbiBhCi8vIGJvdW5kYXJ5IGFuZCB0aGUgbmV4dCBkcmF3IHRoZXkgZGVzY3JpYmUgYSB3aW5kb3cgdGhlIGNoYWluIGhhcyBsZWZ0LCBhbmQKLy8gYSBSZW5kZXIgcHVibGlzaGluZyB0aGVtIHdvdWxkIHByaW50ICJzcGVudCB0aGlzIHdpbmRvdzogMTAwMDAwIgovLyBpbW1lZGlhdGVseSBhYm92ZSAiYXV0aG9yaXplZCBieSB0aGUgdGVybXM6IDEwMDAwMCIuCi8vCi8vIFRoZSB0d28gYXJlIHBpbm5lZCB0byB0aGUgcHJpbWl0aXZlIGJ5IFRlc3RXaW5kb3dSZWZpbGxzQXRBbmNob3JlZEJvdW5kYXJ5Ci8vIHJhdGhlciB0aGFuIGJ5IGluc3BlY3Rpb246IGl0IGRyYXdzIGFmdGVyIGNyb3NzaW5nIGEgYm91bmRhcnkgYW5kIGFzc2VydHMKLy8gc3BlbnRXaW5kb3cgZXF1YWxzIHRoYXQgZHJhdywgd2hpY2ggY2FuIG9ubHkgaG9sZCBpZiB3aW5kb3dBdCBhZ3JlZWQgd2l0aAovLyBzcGVuZGJvb2sncyBvd24gaW5kZXggYXQgdGhlIG1vbWVudCBvZiB0aGUgd3JpdGUuCmZ1bmMgd2luZG93QXQoYSBzcGVuZGJvb2suQWxsb3dhbmNlLCBub3cgaW50NjQpIGludDY0IHsKCWlmIGEuVGVybXMuUGVyaW9kTGVuZ3RoID09IDAgfHwgbm93IDwgYS5BbmNob3IgewoJCXJldHVybiAwCgl9CglyZXR1cm4gKG5vdyAtIGEuQW5jaG9yKSAvIGEuVGVybXMuUGVyaW9kTGVuZ3RoCn0KCmZ1bmMgc3BlbnRJbldpbmRvdyhhIHNwZW5kYm9vay5BbGxvd2FuY2UsIG5vdyBpbnQ2NCkgaW50NjQgewoJaWYgd2luZG93QXQoYSwgbm93KSAhPSBhLldpbmRvd0luZGV4IHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGEuU3BlbnRXaW5kb3cKfQoKLy8gZHJvcCByZW1vdmVzIGEgZ3JhbnQgcmVjb3JkIGFuZCBkZWNyZW1lbnRzIGl0cyBvd25lcidzIGxpdmUgY291bnQuIFRoZQovLyBhbGxvd2FuY2UgaXRzZWxmIGlzIHJlbW92ZWQgYnkgdGhlIHNwZW5kYm9vayBjYWxsIHRoYXQgcHJlY2VkZXMgZXZlcnkKLy8gY2FsbGVyIG9mIHRoaXMgaGVscGVyLgpmdW5jIGRyb3AoZyAqZ3JhbnQpIHsKCWdyYW50cy5SZW1vdmUocGFkSUQoZy5pZCkpCglkZWNPd25lck9wZW4oZy5vd25lci5TdHJpbmcoKSkKfQoKZnVuYyBsYWJlbE9yKGcgKmdyYW50KSBzdHJpbmcgewoJaWYgZy5sYWJlbCA9PSAiIiB7CgkJcmV0dXJuICIobm8gbGFiZWwpIgoJfQoJcmV0dXJuIGcubGFiZWwKfQoKZnVuYyBwb29sT2Yoa2V5IHN0cmluZykgaW50NjQgewoJdiA6PSBwb29scy5HZXQoa2V5KQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdi4oaW50NjQpCn0KCmZ1bmMgc2V0UG9vbChrZXkgc3RyaW5nLCBuIGludDY0KSB7CglpZiBuIDw9IDAgewoJCXBvb2xzLlJlbW92ZShrZXkpCgkJcmV0dXJuCgl9Cglwb29scy5TZXQoa2V5LCBuKQp9CgpmdW5jIG93bmVyT3BlbihrZXkgc3RyaW5nKSBpbnQ2NCB7Cgl2IDo9IG9wZW5CeU93bmVyLkdldChrZXkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2LihpbnQ2NCkKfQoKZnVuYyBzZXRPd25lck9wZW4oa2V5IHN0cmluZywgbiBpbnQ2NCkgewoJaWYgbiA8PSAwIHsKCQlvcGVuQnlPd25lci5SZW1vdmUoa2V5KQoJCXJldHVybgoJfQoJb3BlbkJ5T3duZXIuU2V0KGtleSwgbikKfQoKZnVuYyBkZWNPd25lck9wZW4oa2V5IHN0cmluZykgeyBzZXRPd25lck9wZW4oa2V5LCBvd25lck9wZW4oa2V5KS0xKSB9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CgpmdW5jIGJvb2xzdHIoYiBib29sKSBzdHJpbmcgewoJaWYgYiB7CgkJcmV0dXJuICJ0cnVlIgoJfQoJcmV0dXJuICJmYWxzZSIKfQoKLy8gYnBzIHJlbmRlcnMgYSBiYXNpcy1wb2ludCBmaWd1cmUgYXMgYSBodW1hbiBwZXJjZW50YWdlLCBleGFjdGx5LgpmdW5jIGJwcyhuIGludDY0KSBzdHJpbmcgewoJd2hvbGUgOj0gbiAvIDEwMAoJZnJhYyA6PSBuICUgMTAwCglpZiBmcmFjID09IDAgewoJCXJldHVybiBpdG9hKHdob2xlKSArICIlIgoJfQoJaWYgZnJhYyUxMCA9PSAwIHsKCQlyZXR1cm4gaXRvYSh3aG9sZSkgKyAiLiIgKyBpdG9hKGZyYWMvMTApICsgIiUiCgl9CglwYWQgOj0gIiIKCWlmIGZyYWMgPCAxMCB7CgkJcGFkID0gIjAiCgl9CglyZXR1cm4gaXRvYSh3aG9sZSkgKyAiLiIgKyBwYWQgKyBpdG9hKGZyYWMpICsgIiUiCn0KCi8vIHBhZElEIGVuY29kZXMgYW4gaWQgc28gYXZsJ3MgbGV4aWNhbCBvcmRlciBtYXRjaGVzIG51bWVyaWMgb3JkZXIuCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWNvbnN0IHdpZHRoID0gMjAKCWlmIGxlbihzKSA+PSB3aWR0aCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiB6ZXJvc1s6d2lkdGgtbGVuKHMpXSArIHMKfQoKY29uc3QgemVyb3MgPSAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiCgovLyBjaGVja2VkQWRkIHJldHVybnMgYStiIGFuZCByZXBvcnRzIHdoZXRoZXIgdGhlIGFkZGl0aW9uIGRpZCBub3QKLy8gb3ZlcmZsb3cgaW50NjQuCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXN1bSA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHN1bSA8IGEpIHx8IChiIDwgMCAmJiBzdW0gPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gc3VtLCB0cnVlCn0KGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2J1ZGdldHMiCmdubyA9ICIwLjkiCiINMTAwMDAwMDB1Z25vdBISCPCMqFoSCzE4OTQwMnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkA7SA546jf3T7XB4vtsIOM2zyv9/Im67woDNQFZWytQjBN8HBYb85QO6sKnp94rbPFiq60ltpfW7NHTJQ81OJpyGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}