{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "syud3nSqWXU3wahaRnFe2Z+v8sKmHiIgF5jTUOvfziM=",
    "height": "376441",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "68360350",
      "GasUsed": "45573567"
    },
    "tx": "CrWJAgoML3ZtLm1fYWRkcGtnEqOJAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLmiAIKB3BheXJvbGwSO2duby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9wYXlyb2xsGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3BheXJvbGwiCmdubyA9ICIwLjkiChq4hwIKC3BheXJvbGwuZ25vEqeHAi8vIFBhY2thZ2UgcGF5cm9sbCBpcyBlbXBsb3llci1mdW5kZWQgcmVjdXJyaW5nIHNhbGFyeSBkaXNidXJzZW1lbnQgd2l0aAovLyByZWFsIHVnbm90IGN1c3RvZHkuCi8vCi8vICMgVGhlIG9uZSBpZGVhCi8vCi8vIEFuIGFsbG93YW5jZSByZWZpbGxzOyBhIHNhbGFyeSBBQ0NSVUVTLiBUaGF0IHNpbmdsZSBzZW50ZW5jZSBpcyB3aHkKLy8gdGhpcyByZWFsbSBleGlzdHMgYmVzaWRlIGJ1ZGdldHMgcmF0aGVyIHRoYW4gaW5zaWRlIGl0LgovLwovLyBidWRnZXRzICh0aGlzIHBvcnRmb2xpbywgbGl2ZSBvbiBvbnl4LTEpIGdyYW50cyBhIGRlbGVnYXRlIGEKLy8gcmF0ZS1saW1pdGVkIHNwZW5kaW5nIGF1dGhvcml0eSB0aHJvdWdoIHAvc3BlbmRib29rOiB0aGUgZGVsZWdhdGUgbWF5Ci8vIGRyYXcgYXQgbW9zdCBQZXJQZXJpb2QgcGVyIHdpbmRvdywgYW5kIGEgd2luZG93IHRoYXQgcGFzc2VzIHVudXNlZCBpcwovLyBnb25lLiBVc2UtaXQtb3ItbG9zZS1pdCBpcyBleGFjdGx5IHJpZ2h0IGZvciBhIHNwZW5kaW5nIGF1dGhvcml0eSDigJQgYW4KLy8gdW5zcGVudCBidWRnZXQgaXMgbm90IGEgZGVidC4KLy8KLy8gQSBzYWxhcnkgaXMgdGhlIGR1YWwuIEFuIGVtcGxveWVlIHdobyBkb2VzIG5vdCBjb2xsZWN0IGZvciB0aHJlZQovLyBwZXJpb2RzIGlzIG93ZWQgdGhyZWUgcGVyaW9kcy4gVW5jbGFpbWVkIHBheSBpcyBhIExJQUJJTElUWSBvZiB0aGUKLy8gZW1wbG95ZXIsIG5vdCBhbiBleHBpcmVkIHBlcm1pc3Npb24uIE5vIHJlZmlsbGluZyBwcmltaXRpdmUgY2FuIG1vZGVsCi8vIHRoYXQsIGJlY2F1c2UgdGhlIHdob2xlIHBvaW50IG9mIGEgcmVmaWxsIGlzIHRoYXQgdGhlIHByZXZpb3VzIHdpbmRvdwovLyBpcyBmb3Jnb3R0ZW4uCi8vCi8vIFNvIHRoZSBhcml0aG1ldGljIGhlcmUgaXMgYWNjcnVhbCBhcml0aG1ldGljLCBhbmQgaXQgaXMgdGhlIG9uZQovLyBnZW51aW5lbHkgbmV3IG1lY2hhbmlzbSBpbiB0aGlzIHJlYWxtLiBFdmVyeXRoaW5nIHRoYXQgdG91Y2hlcyBjb2lucwovLyBpcyBkZWxlZ2F0ZWQgdG8gcHJpbWl0aXZlcyB0aGlzIHBvcnRmb2xpbyBoYXMgYWxyZWFkeSBhdWRpdGVkIGFuZCBydW4KLy8gbGl2ZTogcC9jb2luaW8gZm9yIGN1c3RvZHkgYW5kIHBheW91dCBndWFyZHMsIHAvZmVlbGVkZ2VyIGZvcgovLyBwZXItZW1wbG95ZWUgYmFsYW5jZXMgYW5kIHRoZSBsaWFiaWxpdGllcyB0b3RhbC4KLy8KLy8gIyBQYWlkIGluIGFycmVhcnMKLy8KLy8gQSBwZXJpb2QgbXVzdCBDT01QTEVURSBiZWZvcmUgaXQgaXMgb3dlZC4gQXQgdGhlIGluc3RhbnQgYSBwb3NpdGlvbgovLyBzdGFydHMsIG5vdGhpbmcgaXMgZHVlOyB0aGUgZmlyc3QgcGVyaW9kIGJlY29tZXMgcGF5YWJsZSBhdAovLyBTdGFydEhlaWdodCArIFBlcmlvZEJsb2Nrcy4gUGF5aW5nIGluIGFkdmFuY2Ugd291bGQgbWVhbiB0aGUgcmVhbG0KLy8gZGlzYnVyc2luZyBmb3IgdGltZSB0aGF0IGhhcyBub3QgZWxhcHNlZCwgYW5kIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSBvbgovLyBjaGFpbiB0byB0YWtlIGl0IGJhY2sgaWYgdGhlIHBvc2l0aW9uIGVuZHMgZWFybHkuCi8vCi8vIEEgY29uc2VxdWVuY2Ugd29ydGggc3RhdGluZyBwbGFpbmx5OiBhIHBvc2l0aW9uIHdob3NlIFBlcmlvZEJsb2NrcwovLyBuZXZlciBmdWxseSBlbGFwc2VzIGJlZm9yZSBpdCBpcyB0ZXJtaW5hdGVkIHBheXMgTk9USElORy4gVGhhdCBpcyBub3QKLy8gYSByb3VuZGluZyBsb3NzIGhpZGRlbiBpbiB0aGUgaW1wbGVtZW50YXRpb24sIGl0IGlzIHRoZSBhcnJlYXJzIHJ1bGUKLy8gYXBwbGllZCBob25lc3RseSwgYW5kIFRlcm1pbmF0ZSdzIGRvY3VtZW50YXRpb24gcmVwZWF0cyBpdC4KLy8KLy8gIyBBY2NydWFsIGlzIHBlcm1pc3Npb25sZXNzLCBhbmQgd2hvbGUtcGVyaW9kCi8vCi8vIEdubyBoYXMgbm8gYXV0b25vbW91cyBleGVjdXRpb24sIHNvICJyZWN1cnJpbmciIGFsd2F5cyBtZWFucyBzb21lb25lCi8vIHNlbmRzIGEgdHJhbnNhY3Rpb24gbGF0ZXIuIEFjY3J1ZSBtYXkgdGhlcmVmb3JlIGJlIGNhbGxlZCBieSBBTllPTkUg4oCUCi8vIHRoZSBlbXBsb3llZSwgdGhlIGVtcGxveWVyLCBhIGtlZXBlciByZWFsbSwgYSBzdHJhbmdlci4gSXQgZG9lcyBvbmx5Ci8vIHdoYXQgdGhlIGVtcGxveWVyIGFscmVhZHkgY29tbWl0dGVkIHRvIHdoZW4gdGhlIHBvc2l0aW9uIHdhcyBvcGVuZWQsCi8vIGl0IG1vdmVzIGNvaW5zIGZyb20gdGhhdCBlbXBsb3llcidzIG93biBwb29sIHRvIHRoYXQgZW1wbG95ZWUncyBvd24KLy8gbGVkZ2VyIGJhbGFuY2UsIGFuZCB0aGUgY2FsbGVyIHBheXMgdGhlIGdhcy4gVGhlcmUgaXMgbm8gdGhpcmQgcGFydHkKLy8gd2hvIGdhaW5zLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGdyaWVmIHdpdGguIFRoaXMgaXMgYWxzbyB3aGF0IG1ha2VzCi8vIHRoZSByZWFsbSBjb21wb3NhYmxlIHdpdGggdXBrZWVwLCB0aGUgcG9ydGZvbGlvJ3Mga2VlcGVyLWluY2VudGl2ZQovLyByZWFsbS4KLy8KLy8gQWNjcnVhbCBzZXR0bGVzIFdIT0xFIHBlcmlvZHMgb25seS4gSWYgdGhlIHBvb2wgY292ZXJzIHR3byBvZiB0aHJlZQovLyBkdWUgcGVyaW9kcywgdHdvIGFyZSBjcmVkaXRlZCBhbmQgdGhlIHRoaXJkIHN0YXlzIGR1ZSDigJQgaXQgaXMgbm90Ci8vIHBhcnRpYWxseSBwYWlkLCBhbmQgbm8gY2FwYWNpdHkgaXMgYnVybmVkLiBUaGUgcG9vbCBib3VuZHMgSE9XIE1BTlkKLy8gcGVyaW9kcyBjbGVhciwgbmV2ZXIgV0hFVEhFUiBhIHBlcmlvZCBpcyBwYWlkIGluIGZ1bGwuCi8vCi8vICMgU29sdmVuY3ksIGFuZCB0aGUgbGVzc29uIHRha2VuIGZyb20gYnVkZ2V0cwovLwovLyBidWRnZXRzJyBwYWNrYWdlIGRvY3VtZW50YXRpb24gcmVjb3JkcyB0aGF0IGEgYnVkZ2V0IGlzIGF1dGhvcml0eSBhbmQKLy8gbm90IGEgcmVzZXJ2YXRpb246IG92ZXItYXV0aG9yaXphdGlvbiBpcyBsZWdhbCB0aGVyZSwgYW5kIHNvbHZlbmN5IGlzCi8vIGVuZm9yY2VkIHBlci1vd25lciBhdCBkcmF3IHRpbWUuIFRoZSBzYW1lIGNob2ljZSBpcyBtYWRlIGhlcmUgZm9yIHRoZQovLyBzYW1lIHJlYXNvbiwgYW5kIHRoZSBob25lc3QgY29uc2VxdWVuY2UgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaGlkZGVuOgovLwovLwlPUEVOSU5HIEEgUE9TSVRJT04gRE9FUyBOT1QgUkVTRVJWRSBBTlkgQ09JTlMuCi8vCi8vIEFuIGVtcGxveWVyIG1heSBoaXJlIG1vcmUgcGVvcGxlIHRoYW4gdGhlIHBvb2wgY2FuIGV2ZXIgcGF5LiBOb3RoaW5nCi8vIGluIHRoaXMgcmVhbG0gcHJldmVudHMgaXQsIGJlY2F1c2UgYSBmdXR1cmUgZnVuZGluZyB0cmFuc2FjdGlvbiBpcyBhCi8vIHBlcmZlY3RseSBvcmRpbmFyeSB3YXkgdG8gaW50ZW5kIHRvIG1lZXQgYW4gb2JsaWdhdGlvbiwgYW5kIHJlZnVzaW5nCi8vIHRoZSBoaXJlIHdvdWxkIG9ubHkgbW92ZSB0aGUgcHJvYmxlbSB0byB0aGUgbW9tZW50IHRoZSBwb29sIGRpcHMuIFdoYXQKLy8gdGhlIHJlYWxtIGd1YXJhbnRlZXMgaXMgbmFycm93ZXIgYW5kIGNoZWNrYWJsZTogYSBwZXJpb2QgZWl0aGVyIGNsZWFycwovLyBpbiBmdWxsIG9yIHN0YXlzIGR1ZSwgYW5kIG5vIGVtcGxveWVlJ3MgYWNjcnVlZCBsZWRnZXIgYmFsYW5jZSBjYW4gYmUKLy8gcmVkdWNlZCBieSBhbnlvbmUuCi8vCi8vICMgVGhlIG1vbmV0YXJ5IGludmFyaWFudAovLwovLyBUd28gc3RhdGVtZW50cywgYmVjYXVzZSBvbmUgb2YgdGhlbSBpcyBhIGRlY29tcG9zaXRpb24gYW5kIHRoZSBvdGhlciBpcwovLyBhIHNvbHZlbmN5IGNsYWltLCBhbmQgY29sbGFwc2luZyB0aGVtIGlzIGhvdyB0aGUgd3JvbmcgaWRlbnRpdHkgZ2V0cwovLyB3cml0dGVuIGRvd246Ci8vCi8vCUxpYWJpbGl0aWVzKCkgPT0gVG90YWxQb29sZWQoKSArIEFjY3J1ZWRUb3RhbCgpICsgRmVlc0FjY3J1ZWQoKQovLwlIZWxkKCkgICAgICAgID09IExpYWJpbGl0aWVzKCkgKyBTdXJwbHVzKCkKLy8KLy8gTGlhYmlsaXRpZXMoKSBpcyBldmVyeSBjb2luIG93ZWQgdG8gYW55b25lOiB0aGUgZW1wbG95ZXJzJyB1bmFsbG9jYXRlZAovLyBwb29scyBQTFVTIHRoZSBmZWVsZWRnZXIncyBvd24gdG90YWwsIHdoaWNoIGlzIGl0c2VsZiB0aGUgYWNjcnVlZAovLyBlbXBsb3llZSBiYWxhbmNlcyBwbHVzIHRoZSBmZWUgcG90LiBTdXJwbHVzKCkgaXMgY29pbnMgcHVzaGVkIGF0IHRoZQovLyByZWFsbSBvdXRzaWRlIGV2ZXJ5IGVudHJ5cG9pbnQuIEJvdGggbGluZXMgaG9sZCBhZnRlciBldmVyeSBvcGVyYXRpb24KLy8gYW5kIGFyZSBwaW5uZWQgYnkgVGVzdE1vbmV0YXJ5SW52YXJpYW50LiBJdCBpcyB0aGUgc2FtZSBzaGFwZSBidWRnZXRzCi8vIGNhcnJpZXMsIGRlbGliZXJhdGVseTogYSByZWFkZXIgd2hvIGhhcyBjaGVja2VkIG9uZSBjYW4gY2hlY2sgdGhlCi8vIG90aGVyLgovLwovLyBPbmx5IHRoZSBmaXJzdCBsaW5lIGNhbiBmYWlsLiBUaGUgc2Vjb25kIGlzIGRlZmluaXRpb25hbCDigJQgU3VycGx1cygpCi8vIGlzIGNvbXB1dGVkIGFzIEhlbGQoKS1MaWFiaWxpdGllcygpIOKAlCBzbyBhc3NlcnRpbmcgaXQgaXMgYSB0YXV0b2xvZ3ksCi8vIGFuZCB3aGF0IHRoZSB0ZXN0IGFjdHVhbGx5IGNoZWNrcyBpcyBIZWxkKCkgPj0gTGlhYmlsaXRpZXMoKSBiZXNpZGUgdGhlCi8vIGRlY29tcG9zaXRpb24uIEEgcmVhZGVyIHdobyB0YWtlcyB0aGUgc2Vjb25kIGxpbmUgZm9yIGEgY2hlY2sgaGFzIGJlZW4KLy8gcmVhc3N1cmVkIGJ5IGFyaXRobWV0aWMuCi8vCi8vIFRoaXMgcGFyYWdyYXBoIHJlYWQgYEhlbGQoKSA9PSBUb3RhbFBvb2xlZCgpICsgTGlhYmlsaXRpZXMoKSArCi8vIFN1cnBsdXMoKWAgdW50aWwgdGhlIHByZS1kZXBsb3kgYXVkaXQsIHdoaWNoIGRvdWJsZS1jb3VudHMgdGhlIHBvb2xzCi8vIGJlY2F1c2UgTGlhYmlsaXRpZXMoKSBhbHJlYWR5IGNvbnRhaW5zIFRvdGFsUG9vbGVkKCkuIFRoZSBjb2RlIHdhcwovLyBuZXZlciB3cm9uZyBhbmQgcGF5cm9sbF90ZXN0LmdubyBlbmNvZGVkIHRoZSByaWdodCBkZWNvbXBvc2l0aW9uIHRoZQovLyB3aG9sZSB0aW1lOyB0aGUgY29tbWVudCB3YXMsIGFuZCBhIGNvbW1lbnQgaXMgaW1tdXRhYmxlIGFmdGVyIGFkZHBrZy4KLy8KLy8gIyBUZXJtaW5hdGlvbiBpcyB0d28gc3RlcHMsIGFuZCB0aGF0IGlzIGEgcHJvdGVjdGlvbgovLwovLyBUZXJtaW5hdGUgc3RvcHMgdGhlIGNsb2NrLiBSZWxlYXNlIGZyZWVzIHRoZSBzdG9yYWdlLiBUaGV5IGFyZQovLyBzZXBhcmF0ZSBiZWNhdXNlIGNvbGxhcHNpbmcgdGhlbSB3b3VsZCBkZXN0cm95IGVhcm5lZC1idXQtdW5hY2NydWVkCi8vIHBheTogYW4gZW1wbG95ZXIgd2hvc2UgcG9vbCBpcyBzaG9ydCBjb3VsZCByZW1vdmUgYSBwb3NpdGlvbiBvd2luZwovLyB0aHJlZSBwZXJpb2RzIGFuZCB0aGUgZGVidCB3b3VsZCB2YW5pc2ggd2l0aCB0aGUgcmVjb3JkLgovLwovLyBTbyBUZXJtaW5hdGUgc2V0cyB0aGUgZW5kIGhlaWdodCB0byBub3cgYW5kIGxlYXZlcyB0aGUgcG9zaXRpb24gaW4KLy8gcGxhY2UsIHdpdGggd2hhdGV2ZXIgaXMgZHVlIHN0aWxsIGR1ZSBhbmQgc3RpbGwgYWNjcnVhYmxlIGJ5IGFueW9uZS4KLy8gUmVsZWFzZSByZW1vdmVzIGl0LCBhbmQgb25seSBvbmNlIG5vdGhpbmcgaXMgZHVlLiBSZWxlYXNlIGlzCi8vIHBlcm1pc3Npb25sZXNzIGFuZCB0aGUgY2hhaW4gcmVmdW5kcyB0aGUgZnJlZWQgc3RvcmFnZSBkZXBvc2l0IHRvIHRoZQovLyBjYWxsZXIsIHdoaWNoIGlzIHRoZSBzdGFuZGluZyBpbmNlbnRpdmUgdG8gdGlkeSB1cCBzb21lb25lIGVsc2UncwovLyBzZXR0bGVkIHBvc2l0aW9uIOKAlCB0aGUgc2FtZSBtZWNoYW5pc20gYnVkZ2V0cyB1c2VzIGZvciBSZWFwLgovLwovLyAjIFdoYXQgdGhpcyByZWFsbSBkb2VzIE5PVCBkbwovLwovLyAgIC0gSXQgZG9lcyBub3QgdmFsdWUgd29yaywgdmVyaWZ5IGl0IGhhcHBlbmVkLCBvciBhcmJpdHJhdGUgYSBkaXNwdXRlCi8vICAgICBhYm91dCBpdC4gQSBwb3NpdGlvbiBpcyBhIHN0YW5kaW5nIGluc3RydWN0aW9uIGZyb20gYW4gZW1wbG95ZXIsCi8vICAgICBhbmQgbm90aGluZyBtb3JlLgovLyAgIC0gSXQgaG9sZHMgdWdub3QgYW5kIG9ubHkgdWdub3QuCi8vICAgLSBJdCBoYXMgbm8gYWRtaW4uIFRoZSBkZXBsb3lpbmcgbmFtZXNwYWNlIHJlY2VpdmVzIHByb3RvY29sIGZlZXMKLy8gICAgIGFuZCBzd2VwdCBzdXJwbHVzIGFuZCBoYXMgbm8gb3RoZXIgcHJpdmlsZWdlOiBubyBzZXR0ZXIsIG5vIHBhdXNlLAovLyAgICAgbm8gYWJpbGl0eSB0byB0b3VjaCBhIHBvb2wgb3IgYSBiYWxhbmNlLiBGdW5kaW5nIGEgcG9vbCBpcyB3aGF0Ci8vICAgICBtYWtlcyBhbiBhZGRyZXNzIGFuIGVtcGxveWVyLCBleGFjdGx5IGFzIGluIGJ1ZGdldHMuCi8vCi8vICMgU1RPUkFHRQovLwovLyBBbiBlbXBsb3llciByZWNvcmQgaXMgcGFpZCBmb3IgYnkgdGhhdCBlbXBsb3llcidzIGZpcnN0IEZ1bmQ7IGEKLy8gcG9zaXRpb24gcmVjb3JkIGJ5IHRoZSBIaXJlIHRoYXQgb3BlbnMgaXQuIFJlbGVhc2UgcmVtb3ZlcyBhIHBvc2l0aW9uCi8vIHJlY29yZCBhbmQgdGhlIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIGRlcG9zaXQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoYXQKLy8gZnJlZXMgaXQuCnBhY2thZ2UgcGF5cm9sbAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZmVlbGVkZ2VyIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9wYXlyb2xsIgoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBob2xkcy4KY29uc3QgRGVub20gPSAidWdub3QiCgovLyBNYXhGZWVCcHMgaXMgdGhlIGhhcmQgY2VpbGluZyBvbiBhbnkgYWNjcnVhbCBmZWUgdGhpcyByZWFsbSBjb3VsZCBldmVyCi8vIGNoYXJnZSwgZW5mb3JjZWQgYnkgdGhlIGZlZWxlZGdlciB0aGUgcmVhbG0gaXMgY29uc3RydWN0ZWQgd2l0aCDigJQgYQovLyBmZWVCcHMgYWJvdmUgaXQgaXMgcmVmdXNlZCBieSB0aGUgcHJpbWl0aXZlJ3Mgb3duIHZhbGlkYXRpb24sIG5vdCBieSBhCi8vIGNoZWNrIGluIHRoaXMgZmlsZS4gNTAwIGJwcyA9IDUlLgpjb25zdCBNYXhGZWVCcHMgPSBpbnQ2NCg1MDApCgovLyBBY2NydWVGZWVCcHMgaXMgdGhlIGZlZSBjaGFyZ2VkIG9uIGVhY2ggYWNjcnVhbCwgb24gdGhlIGdyb3NzIGFtb3VudCwKLy8gZmxvb3Itcm91bmRlZCBpbiB0aGUgRU1QTE9ZRUUncyBmYXZvdXI6IDEwMCBicHMgPSAxJS4gSXQgbWF0Y2hlcyB0aGUKLy8gbW9zdCBjb25zZXJ2YXRpdmUgbGl2ZSBmZWUgaW4gdGhpcyBwb3J0Zm9saW8gKGZlZV9zcGxpdCwgY3Jvd2RmdW5kLAovLyBidWRnZXRzKS4gSXQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgYW5kIHRoZXJlIGlzIG5vIHNldHRlciwgc28gYQovLyBwb3NpdGlvbidzIGVjb25vbWljcyBjYW5ub3QgYmUgY2hhbmdlZCB1bmRlciB0aGUgZW1wbG95ZWUgYWZ0ZXIgdGhlCi8vIHBvc2l0aW9uIGlzIG9wZW5lZC4KY29uc3QgQWNjcnVlRmVlQnBzID0gaW50NjQoMTAwKQoKLy8gRmVlQ29sbGVjdG9yIHJlY2VpdmVzIHdpdGhkcmF3biBmZWVzIGFuZCBzd2VwdCBzdXJwbHVzLiBDb21waWxlLXRpbWUKLy8gY29uc3RhbnQ6IHRoZXJlIGlzIG5vIHNldHRlciBhbmQgbm8gdHJhbnNmZXIgcGF0aC4gSXQgaXMgdGhlIGRlcGxveWluZwovLyBuYW1lc3BhY2UncyBhZGRyZXNzIOKAlCBzdGF0ZWQgcGxhaW5seTogdGhlIG9wZXJhdG9yIG9mIHRoaXMgcmVhbG0uCi8vCi8vIE5PVEUgRk9SIEFOWSBSRS1OQU1FU1BBQ0VEIFBPUlQ6IHRoaXMgaXMgdGhlIGFkZHJlc3MtYXMtZGF0YSBoYXphcmQKLy8gdGhhdCBhIG5hbWVzcGFjZSBzdWJzdGl0dXRpb24gcmV3cml0ZXMgc2lsZW50bHkgd2hpbGUgZXZlcnkKLy8gYnl0ZS1jb21wYXJpc29uIHN0aWxsIHJlcG9ydHMgdGhlIHRyZWUgZmFpdGhmdWwsIGJlY2F1c2UgdGhlIHJld3JpdGUKLy8gSVMgdGhlIGludGVuZGVkIHRyYW5zZm9ybWF0aW9uLiBSZS1zdGF0ZSBpdCBkZWxpYmVyYXRlbHkgcGVyIGNoYWluOwovLyBuZXZlciBsZXQgaXQgYmUgZGVyaXZlZC4KY29uc3QgRmVlQ29sbGVjdG9yID0gYWRkcmVzcygiZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMyIpCgovLyBNaW5GdW5kaW5nIGtlZXBzIGR1c3QgcG9vbHMgb3V0OiAxIEdOT1QgcGVyIEZ1bmQgY2FsbC4KY29uc3QgTWluRnVuZGluZyA9IGludDY0KDFfMDAwXzAwMCkKCi8vIE1pblBlclBlcmlvZCBpcyB0aGUgc21hbGxlc3Qgc2FsYXJ5IGEgcG9zaXRpb24gbWF5IGNhcnJ5LiBCZWxvdyB0aGUKLy8gZmVlIGRlbm9taW5hdG9yIGEgMSUgZmVlIGZsb29ycyB0byB6ZXJvLCBzbyBhIHBlci1wZXJpb2QgYW1vdW50IG9mIGEKLy8gZmV3IHVnbm90IHdvdWxkIGJlIGEgZmVlLWZyZWUgcG9zaXRpb24gYnkgYWNjaWRlbnQgcmF0aGVyIHRoYW4gYnkKLy8gZGVzaWduOyAxMDAwIHVnbm90IGtlZXBzIHRoZSBmZWUgYXJpdGhtZXRpYyBtZWFuaW5nZnVsLgpjb25zdCBNaW5QZXJQZXJpb2QgPSBpbnQ2NCgxXzAwMCkKCi8vIE1pblBlcmlvZEJsb2NrcyBpcyB0aGUgc2hvcnRlc3QgcGVyaW9kIGEgcG9zaXRpb24gbWF5IHVzZS4gQSBwZXJpb2Qgb2YKLy8gYSBoYW5kZnVsIG9mIGJsb2NrcyBpcyBhIHJhdGUgcmF0aGVyIHRoYW4gYSBzYWxhcnksIGFuZCBpdCBtYWtlcyB0aGUKLy8gYXJyZWFycyBydWxlIG1lYW5pbmdsZXNzLiBVbmxpa2UgYnVkZ2V0cywgYSBwZXJpb2Qgb2YgMCBpcyBOT1QKLy8gYWNjZXB0ZWQgaGVyZTogdGhlcmUgaXMgbm8gIm9uZSBsaWZldGltZSB3aW5kb3ciIHJlYWRpbmcgb2YgYSBzYWxhcnksCi8vIGFuZCBkaXZpZGluZyBieSBpdCB3b3VsZCBwYW5pYy4KY29uc3QgTWluUGVyaW9kQmxvY2tzID0gaW50NjQoMTAwKQoKLy8gTWF4Um9zdGVyIGNhcHMgc2ltdWx0YW5lb3VzbHktb3BlbiBwb3NpdGlvbnMgcGVyIGVtcGxveWVyLiBIaXJlIGlzCi8vIHBlcm1pc3Npb25sZXNzIHRvIGFueW9uZSB3aXRoIGEgZnVuZGVkIHBvb2wsIHNvIHRoaXMgaXMgYW4KLy8gQVZBSUxBQklMSVRZIEJPVU5EIGFuZCBpdCBpcyBkb2N1bWVudGVkIHJhdGhlciB0aGFuIGhpZGRlbjogYW4KLy8gZW1wbG95ZXIgY2FuIGV4aGF1c3QgdGhlaXIgT1dOIHJvc3RlciBhbmQgbm8gb25lIGVsc2UncywgYmVjYXVzZSB0aGUKLy8gcm9zdGVyIGlzIHBlci1lbXBsb3llci4gVGhlIGNvc3Qgb2YgZmlsbGluZyBvbmUgaXMgZ2FzIHBsdXMgdGhlCi8vIHN0b3JhZ2UgZGVwb3NpdCBvbiBldmVyeSBwb3NpdGlvbiByZWNvcmQsIGhlbGQgdW50aWwgUmVsZWFzZS4KY29uc3QgTWF4Um9zdGVyID0gNjQKCi8vIE9wZW5FbmRlZCBpcyB0aGUgRW5kSGVpZ2h0IHZhbHVlIG1lYW5pbmcgIm5vIGVuZCI6IHRoZSBwb3NpdGlvbgovLyBhY2NydWVzIHVudGlsIGl0IGlzIHRlcm1pbmF0ZWQuCmNvbnN0IE9wZW5FbmRlZCA9IGludDY0KDApCgp0eXBlIHBvc2l0aW9uIHN0cnVjdCB7CgllbXBsb3llciBhZGRyZXNzCgllbXBsb3llZSBhZGRyZXNzCgoJLy8gcGVyUGVyaW9kIGlzIHRoZSBncm9zcyBzYWxhcnkgcGVyIGNvbXBsZXRlZCBwZXJpb2QuIFRoZSBlbXBsb3llZQoJLy8gcmVjZWl2ZXMgcGVyUGVyaW9kIG1pbnVzIHRoZSBhY2NydWFsIGZlZS4KCXBlclBlcmlvZCBpbnQ2NAoKCS8vIHBlcmlvZEJsb2NrcyBpcyB0aGUgcGVyaW9kIGxlbmd0aC4gUGVyaW9kcyBhcmUgQU5DSE9SRUQgdG8KCS8vIHN0YXJ0SGVpZ2h0LCBub3Qgc2xpZGluZzogcGVyaW9kIGsgY2xvc2VzIGF0CgkvLyBzdGFydEhlaWdodCArIGsqcGVyaW9kQmxvY2tzLgoJcGVyaW9kQmxvY2tzIGludDY0CgoJc3RhcnRIZWlnaHQgaW50NjQKCgkvLyBlbmRIZWlnaHQgaXMgT3BlbkVuZGVkLCBvciB0aGUgaGVpZ2h0IHBhc3Qgd2hpY2ggbm8gZnVydGhlciBwZXJpb2QKCS8vIGFjY3J1ZXMuIFRlcm1pbmF0ZSBzZXRzIGl0IHRvIHRoZSBjdXJyZW50IGhlaWdodC4KCWVuZEhlaWdodCBpbnQ2NAoKCS8vIHBhaWRQZXJpb2RzIGNvdW50cyB3aG9sZSBwZXJpb2RzIGFscmVhZHkgYWNjcnVlZC4gSXQgb25seSBldmVyCgkvLyBpbmNyZWFzZXMsIGFuZCBpdCBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igd2hhdCBoYXMgYmVlbgoJLy8gc2V0dGxlZCDigJQgbmV2ZXIgYSBjb2luIGJhbGFuY2UsIHdoaWNoIHRoZSBlbXBsb3llZSBjYW4gd2l0aGRyYXcuCglwYWlkUGVyaW9kcyBpbnQ2NAp9Cgp2YXIgKAoJc2VsZiBhZGRyZXNzCgoJLy8gZW1wbG95ZXJzIGhvbGRzIG9uZSByZWNvcmQgcGVyIGFkZHJlc3MgdGhhdCBoYXMgZXZlciBmdW5kZWQgYQoJLy8gcG9vbC4gS2V5IGlzIHRoZSBhZGRyZXNzIHN0cmluZy4KCWVtcGxveWVycyA9IGF2bC5OZXdUcmVlKCkgLy8gYWRkcmVzcyBzdHJpbmcgLT4gKmVtcGxveWVyCgoJLy8gcG9zaXRpb25zIGhvbGRzIG9uZSByZWNvcmQgcGVyIG9wZW4gcG9zaXRpb24sIGtleWVkIGJ5CgkvLyBlbXBsb3llcnxlbXBsb3llZSBzbyBhIHJvc3RlciBzY2FuIGlzIGEgcHJlZml4IGl0ZXJhdGlvbiBhbmQgYQoJLy8gZHVwbGljYXRlIGhpcmUgaXMgYW4gZXhhY3Qta2V5IGNvbGxpc2lvbi4KCXBvc2l0aW9ucyA9IGF2bC5OZXdUcmVlKCkgLy8gImVtcGxveWVyfGVtcGxveWVlIiAtPiAqcG9zaXRpb24KCgkvLyBsZWRnZXIgaG9sZHMgZXZlcnkgZW1wbG95ZWUncyBhY2NydWVkLWJ1dC11bmNsYWltZWQgYmFsYW5jZSBhbmQKCS8vIHRoZSBmZWUgcG90LiBJdCBpcyBHTE9CQUwgYWNyb3NzIGVtcGxveWVycyBvbiBwdXJwb3NlOiBhbiBlbXBsb3llZQoJLy8gcGFpZCBieSB0d28gZW1wbG95ZXJzIGhhcyBvbmUgYmFsYW5jZSBhbmQgb25lIENsYWltLgoJbGVkZ2VyID0gZmVlbGVkZ2VyLk11c3ROZXcoTWF4RmVlQnBzKQopCgp0eXBlIGVtcGxveWVyIHN0cnVjdCB7Cglwb29sICAgaW50NjQKCXJvc3RlciBpbnQKfQoKZnVuYyBpbml0KCkgewoJc2VsZiA9IHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkKfQoKLy8gcmVqZWN0U3RyYXlTZW5kIGFib3J0cyB3aGVuIGEgZGlyZWN0IEVPQSBNc2dDYWxsIGF0dGFjaGVzIGNvaW5zIHRvIGEKLy8gbm9uLXBheWFibGUgZW50cnlwb2ludC4gVGhpcyByZWFsbSBob2xkcyBmdW5kcywgc28gc3VjaCBhIHNlbmQgd291bGQKLy8gYmVjb21lIHN3ZWVwYWJsZSBzdXJwbHVzLCBzaWxlbnRseSBjb252ZXJ0aW5nIGEgdXNlcidzIGNvaW5zIGludG8KLy8gb3BlcmF0b3IgZnVuZHMuCi8vCi8vIFRIRSBQUkVESUNBVEUgSVMgTkFSUk9XRVIgVEhBTiBUSEUgRklSU1QgU0VOVEVOQ0UgT0YgVEhJUyBDT01NRU5UIFVTRUQKLy8gVE8gQkUsIGFuZCB0aGUgbmFycm93aW5nIGlzIGNvcnJlY3QgcmF0aGVyIHRoYW4gYSBnYXAuIE9yaWdpblNlbmQoKQovLyByZXBvcnRzIHRoZSBjb2lucyBhdHRhY2hlZCB0byB0aGUgT1JJR0lOQVRJTkcgVFJBTlNBQ1RJT04sIG5vdCBjb2lucwovLyB0aGlzIHJlYWxtIHJlY2VpdmVkIGluIHRoaXMgY2FsbCDigJQgdGhlcmUgaXMgbm8gcGVyLWNhbGwgbXNnLnZhbHVlIGluCi8vIEduby4gTXNnQ2FsbCBpcyB0aGUgb25lIGNhbGxlciBzaGFwZSB3aGVyZSB0aGUgdHdvIGNvaW5jaWRlOiB0aGUKLy8gZW52ZWxvcGUgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWFsbSBiZWluZyBjYWxsZWQuIFVuZGVyIE1zZ1J1biB0aGUKLy8gZW52ZWxvcGUgbGFuZHMgaW4gdGhlIGNhbGxlcidzIG93biBlcGhlbWVyYWwgL2UvIHJlYWxtLCBhbmQgdW5kZXIgYQovLyByZWFsbSBjYWxsZXIgaXQgbGFuZHMgYXQgdGhlIGZpcnN0IHJlYWxtIGluIHRoZSBjaGFpbjsgaW4gYm90aCwgY29pbnMKLy8gdGhhdCBnZW51aW5lbHkgcmVhY2ggcGF5cm9sbCBkbyBzbyB0aHJvdWdoIGFuIGV4cGxpY2l0IFNlbmRDb2lucyB0aGF0Ci8vIE9yaWdpblNlbmQoKSBkb2VzIG5vdCBkZXNjcmliZS4gU28gd2lkZW5pbmcgdGhpcyBndWFyZCB0byBJc1VzZXIoKSwgb3IKLy8gZHJvcHBpbmcgdGhlIGNvbmp1bmN0IGVudGlyZWx5LCB3b3VsZCByZWZ1c2UgY2FsbHMgdGhhdCBzZW50IHBheXJvbGwKLy8gbm90aGluZyB3aGlsZSBzdGlsbCBub3Qgc2VlaW5nIHRoZSBzZW5kcyBpdCB3YXMgd2lkZW5lZCB0byBjYXRjaC4gVGhlCi8vIHN0ZGxpYiBndWlkYW5jZSBpcyBleHBsaWNpdCB0aGF0IE9yaWdpblNlbmQgcGFpcnMgd2l0aCBJc1VzZXJDYWxsLgovLwovLyBXaGF0IHJlbWFpbnMgdW5jb3ZlcmVkIGlzIHRoZXJlZm9yZSBub3QgYSBob2xlIGluIHRoaXMgZ3VhcmQ6IGNvaW5zIGNhbgovLyBhbHdheXMgYXJyaXZlIGF0IGFuIGFkZHJlc3MgYnkgYSBiYXJlIE1zZ1NlbmQgd2l0aCBubyBjYWxsIGF0IGFsbCwgd2hpY2gKLy8gbm8gZW50cnlwb2ludCBjaGVjayBjYW4gaW50ZXJjZXB0LiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBTdXJwbHVzKCkgYW5kCi8vIFN3ZWVwU3VycGx1cyBleGlzdCB0byBuYW1lIGFuZCByZWNsYWltLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCS8vIEV2ZXJ5IGNhbGwgc2l0ZSBmb3J3YXJkcyBhIGNyb3NzaW5nIGVudHJ5cG9pbnQncyBvd24gbGl2ZSBjdXIsCgkJLy8gc28gdGhpcyBjYW5ub3QgZmlyZSB0b2RheTsgaXQgZXhpc3RzIHNvIGEgZnV0dXJlIHJlZmFjdG9yIHRoYXQKCQkvLyBoYW5kcyB0aGlzIGd1YXJkIGEgc3RhbGUgcmVhbG0gdmFsdWUgZmFpbHMgY2xvc2VkLCBub3Qgb3BlbgoJCS8vIChjb2luaW8gbmFtZXMgSXNDdXJyZW50IGFzIHRoZSBndWFyZCBzZWNvbmRhcnkgcmVhbG0KCQkvLyBwYXJhbWV0ZXJzIHJlcXVpcmUsIGFuZCB0aGlzIGhlbHBlciBmb2xsb3dzIHRoYXQgZGlzY2lwbGluZSkuCgkJcGFuaWMoInBheXJvbGw6IHJlYWxtIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIGVudHJ5cG9pbnQgZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKLy8gLS0tIHRoZSBwb29sIC0tLQoKLy8gRnVuZCBhZGRzIHRoZSBhdHRhY2hlZCBjb2lucyB0byB0aGUgY2FsbGVyJ3Mgb3duIHBvb2wuIERpcmVjdCBFT0EKLy8gY2FsbHMgd2l0aCAtc2VuZCBvbmx5ICh0aGUgcmVjZWlwdC1ndWFyYW50ZWVkIHNoYXBlKTsgZXhhY3RseSBvbmUKLy8gcG9zaXRpdmUgdWdub3QgY29pbiwgYXQgbGVhc3QgTWluRnVuZGluZy4gQW55b25lIG1heSBmdW5kOyBmdW5kaW5nIGlzCi8vIHdoYXQgbWFrZXMgYW4gYWRkcmVzcyBhbiBlbXBsb3llci4KZnVuYyBGdW5kKGN1ciByZWFsbSkgaW50NjQgewoJb3duZXIsIGFtb3VudCA6PSBjb2luaW8uUmVjZWl2ZSgwLCBjdXIsIERlbm9tKQoJaWYgYW1vdW50IDwgTWluRnVuZGluZyB7CgkJcGFuaWMoImZ1bmRpbmcgaXMgYmVsb3cgTWluRnVuZGluZyIpCgl9CglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCWUgOj0gZ2V0RW1wbG95ZXIoa2V5KQoJaWYgZSA9PSBuaWwgewoJCWUgPSAmZW1wbG95ZXJ7fQoJCWVtcGxveWVycy5TZXQoa2V5LCBlKQoJfQoJdG90YWwsIG9rIDo9IGNoZWNrZWRBZGQoZS5wb29sLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJwb29sIHdvdWxkIG92ZXJmbG93IikKCX0KCWUucG9vbCA9IHRvdGFsCgljaGFpbi5FbWl0KCJGdW5kZWQiLCAiZW1wbG95ZXIiLCBrZXksICJhbW91bnQiLCBpdG9hKGFtb3VudCksCgkJInBvb2wiLCBpdG9hKGUucG9vbCkpCglyZXR1cm4gZS5wb29sCn0KCi8vIFdpdGhkcmF3UG9vbCByZXR1cm5zIHVuYWxsb2NhdGVkIHBvb2wgY29pbnMgdG8gdGhlIGVtcGxveWVyLiBUaGVyZSBpcwovLyBubyBsb2NrIGFuZCBubyBub3RpY2UgcGVyaW9kLCBhbmQgdGhhdCBpcyBhIERPQ1VNRU5URUQgYXN5bW1ldHJ5Ci8vIHJhdGhlciB0aGFuIGFuIG92ZXJzaWdodDogc2VlIHRoZSBwYWNrYWdlIGRvYyBvbiBzb2x2ZW5jeS4gQW4gZW1wbG95ZXIKLy8gbWF5IHdpdGhkcmF3IGEgcG9vbCB3aGlsZSBwb3NpdGlvbnMgYXJlIG9wZW4sIHdoaWNoIGxlYXZlcyB0aG9zZQovLyBwb3NpdGlvbnMgYWNjcnVpbmcgYWdhaW5zdCBhbiBlbXB0eSBwb29sIOKAlCBkdWUgYnV0IHVuc2V0dGxlYWJsZSB1bnRpbAovLyB0aGUgcG9vbCBpcyByZWZ1bmRlZC4gV2hhdCBhbiBlbXBsb3llciBjYW4gbmV2ZXIgZG8gaXMgcmVkdWNlIGEKLy8gYmFsYW5jZSBhbHJlYWR5IGFjY3J1ZWQgdG8gYW4gZW1wbG95ZWUncyBsZWRnZXIgYWNjb3VudC4KZnVuYyBXaXRoZHJhd1Bvb2woY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJa2V5IDo9IG93bmVyLlN0cmluZygpCgllIDo9IG11c3RFbXBsb3llcihrZXkpCglpZiBhbW91bnQgPiBlLnBvb2wgewoJCXBhbmljKCJhbW91bnQgZXhjZWVkcyBwb29sIikKCX0KCS8vIERlYml0IGJlZm9yZSB0aGUgcGF5b3V0LCBwZXIgY29pbmlvJ3Mgb3JkZXJpbmcgY29udHJhY3Q6IGEgcGFuaWMKCS8vIGluc2lkZSBjb2luaW8gYWJvcnRzIHRoZSB0cmFuc2FjdGlvbiBhbmQgcmV2ZXJ0cyB0aGlzIGRlYml0LgoJZS5wb29sIC09IGFtb3VudAoJY29pbmlvLlBheW91dCgwLCBjdXIsIG93bmVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiUG9vbFdpdGhkcmF3biIsICJlbXBsb3llciIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicG9vbCIsIGl0b2EoZS5wb29sKSkKCXJldHVybiBlLnBvb2wKfQoKLy8gV2l0aGRyYXdQb29sQWxsIGlzIFdpdGhkcmF3UG9vbCBmb3IgdGhlIHdob2xlIHBvb2wuIEl0IHBhbmljcyBvbiBhbgovLyBlbXB0eSBwb29sIHJhdGhlciB0aGFuIHN1Y2NlZWRpbmcgd2l0aCBhIHplcm8gdHJhbnNmZXIsIHNvIGEgY2FsbGVyCi8vIGNhbm5vdCByZWFkIHN1Y2Nlc3MgYXMgZXZpZGVuY2UgdGhhdCBjb2lucyBtb3ZlZC4KZnVuYyBXaXRoZHJhd1Bvb2xBbGwoY3VyIHJlYWxtKSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgllIDo9IG11c3RFbXBsb3llcihvd25lci5TdHJpbmcoKSkKCWlmIGUucG9vbCA9PSAwIHsKCQlwYW5pYygibm8gcG9vbCB0byB3aXRoZHJhdyIpCgl9CglyZXR1cm4gV2l0aGRyYXdQb29sKGN1ciwgZS5wb29sKQp9CgovLyAtLS0gcG9zaXRpb25zIC0tLQoKLy8gSGlyZSBvcGVucyBhIHBvc2l0aW9uLiBUaGUgY2FsbGVyIGlzIHRoZSBlbXBsb3llciBhbmQgbXVzdCBhbHJlYWR5Ci8vIGhhdmUgYSBmdW5kZWQgcG9vbCwgd2hpY2ggaXMgdGhpcyByZWFsbSdzIG9ubHkgYmFycmllciB0byBvcGVuaW5nCi8vIHJlY29yZHMgYXQgc29tZW9uZSBlbHNlJ3MgZXhwZW5zZS4KLy8KLy8gc3RhcnRIZWlnaHQgbXVzdCBub3QgYmUgaW4gdGhlIHBhc3QuIEEgYmFja2RhdGVkIHN0YXJ0IHdvdWxkIG1ha2UgYQovLyBsYXJnZSBudW1iZXIgb2YgcGVyaW9kcyBkdWUgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gdGhhdCBvcGVuZWQgdGhlCi8vIHBvc2l0aW9uLCBkcmFpbmluZyB0aGUgcG9vbCB0byBvbmUgZW1wbG95ZWUgaW4gb25lIGNhbGwg4oCUIHRoZSBoaXJlCi8vIHdvdWxkIGxvb2sgbGlrZSBhIHNjaGVkdWxlIGFuZCBiZWhhdmUgbGlrZSBhIHdpdGhkcmF3YWwuIFJlZnVzaW5nIGl0Ci8vIGlzIGNoZWFwZXIgdG8gcmVhc29uIGFib3V0IHRoYW4gYm91bmRpbmcgaXQuCi8vCi8vICMgcGVyUGVyaW9kIGlzIGJvdW5kZWQgYmVsb3cgYW5kIE5PVCBhYm92ZSwgYW5kIHRoZSBzbG90IGNvc3QgaXMgcGVybWFuZW50Ci8vCi8vIE1pblBlclBlcmlvZCBpcyBhIGZsb29yOyB0aGVyZSBpcyBubyBjZWlsaW5nLiBBIHBvc2l0aW9uIG9wZW5lZCB3aXRoIGEKLy8gcGVyUGVyaW9kIGxhcmdlciB0aGFuIGFueSBwb29sIHRoYXQgY2FuIGJlIGZ1bmRlZCBpcyB1bnNldHRsZWFibGUsCi8vIGJlY2F1c2UgQWNjcnVlJ3Mgc29sdmVuY3kgY2hlY2sgaXMgaW50ZWdlciBkaXZpc2lvbiDigJQgZS5wb29sL3BlclBlcmlvZAovLyBpcyAwIGZvciBldmVyeSByZWFjaGFibGUgcG9vbCwgc28gQWNjcnVlIHBhbmljcyBvbiAiY2Fubm90IGNvdmVyIG9uZQovLyBwZXJpb2QiIGZvcmV2ZXIuIE9uY2UgdGhhdCBwb3NpdGlvbidzIGZpcnN0IHBlcmlvZCBjb21wbGV0ZXMsIGR1ZVBlcmlvZHMKLy8gaXMgcGVybWFuZW50bHkgbm9uLXplcm8sIHNvIFJlbGVhc2UgcmVmdXNlcyBmb3JldmVyIHRvbywgYW5kIHRoZSByZWNvcmQKLy8gY29uc3VtZXMgb25lIG9mIHRoZSBlbXBsb3llcidzIE1heFJvc3RlciBzbG90cyBmb3IgZ29vZC4KLy8KLy8gVGhpcyBpcyBhIERFQ0xBUkVEIExJTUlUQVRJT04gcmF0aGVyIHRoYW4gYSBkZWZlY3QsIGFuZCB0aGUgcmVhc29uIGlzCi8vIHRoYXQgaXQgaXMgc3RyaWN0bHkgc2VsZi1oYXJtOiBvd25lciBjb21lcyBmcm9tIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQovLyBiZWxvdyBhbmQgaXMgbmV2ZXIgYSBwYXJhbWV0ZXIsIHNvIG5vIGNhbGxlciBjYW4gb3BlbiBhbiB1bnBheWFibGUKLy8gcG9zaXRpb24gb24gYW55b25lIGVsc2UncyByb3N0ZXIsIGFuZCB0aGUgcG9vbCBpdHNlbGYgc3RheXMgZnVsbHkKLy8gd2l0aGRyYXdhYmxlIHRocm91Z2ggV2l0aGRyYXdQb29sLiBUaGUgbWl0aWdhdGlvbiBpcyBhdmFpbGFibGUgYW5kCi8vIG5hcnJvdzogVGVybWluYXRlIHRoZW4gUmVsZWFzZSBCRUZPUkUgdGhlIGZpcnN0IHBlcmlvZCBjb21wbGV0ZXMsIHdoaWxlCi8vIGR1ZVBlcmlvZHMgaXMgc3RpbGwgemVyby4gQWZ0ZXIgdGhhdCB0aGUgc2xvdCBkb2VzIG5vdCBjb21lIGJhY2suCmZ1bmMgSGlyZShjdXIgcmVhbG0sIGVtcGxveWVlIGFkZHJlc3MsIHBlclBlcmlvZCwgcGVyaW9kQmxvY2tzLCBzdGFydEhlaWdodCwgZW5kSGVpZ2h0IGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoKCS8vIFRoZSBsb3dlcmNhc2UgY2xhdXNlIGlzIGxvYWQtYmVhcmluZywgYW5kIGl0IGlzIGNhcnJpZWQgZnJvbSBidWRnZXRzJwoJLy8gR3JhbnQgKG1lYXN1cmVkIG9uIHRoaXMgdG9vbGNoYWluLCBub3QgYXJndWVkKTogYWRkcmVzcy5Jc1ZhbGlkKCkKCS8vIGRlZmVycyB0byBjcnlwdG8uQWRkcmVzc0Zyb21CZWNoMzIsIHdob3NlIGRlY29kZXIgbG93ZXJjYXNlcyB0aGUKCS8vIGlucHV0IEJFRk9SRSB2ZXJpZnlpbmcgdGhlIGNoZWNrc3VtLCBzbyBpdCByZXR1cm5zIHRydWUgZm9yIHRoZQoJLy8gYWxsLXVwcGVyY2FzZSBzcGVsbGluZyBvZiBhIHZhbGlkIGFkZHJlc3MuCgkvLwoJLy8gSEVSRSBUSEUgQ09OU0VRVUVOQ0UgSVMgV09SU0UgVEhBTiBJTiBCVURHRVRTLCB3aGljaCBpcyB3aHkgdGhpcyBpcwoJLy8gbm90IGJvaWxlcnBsYXRlLiBJbiBidWRnZXRzIGFuIHVwcGVyY2FzZSBkZWxlZ2F0ZSB5aWVsZHMgYSBCUklDS0VECgkvLyBHUkFOVDogbm8gY29pbnMgbW92ZSwgdGhlIG93bmVyJ3MgcG9vbCBpcyB1bnRvdWNoZWQsIG9ubHkgYSBzbG90IGlzCgkvLyB3YXN0ZWQuIEluIHBheXJvbGwsIEFjY3J1ZSB3b3VsZCBkZWJpdCB0aGUgZW1wbG95ZXIncyBwb29sIGFuZCBjcmVkaXQKCS8vIGxlZGdlclsiRzFVUFBFUi4uLiJdLCB3aGlsZSBDbGFpbSBhdXRoZW50aWNhdGVzIGFnYWluc3QKCS8vIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSwgd2hpY2ggaXMgYWx3YXlzIGNhbm9uaWNhbC4gVGhlIGJhbGFuY2Ugd291bGQKCS8vIGJlIHJlYWwsIG93ZWQsIGFuZCB1bnJlYWNoYWJsZSBieSBldmVyeSBjYWxsZXIg4oCUIGEgUEVSTUFORU5UIExPU1Mgb2YKCS8vIHRoZSBlbXBsb3llcidzIGNvaW5zIHJhdGhlciB0aGFuIGEgd2FzdGVkIHJlY29yZC4KCS8vCgkvLyBPbmUgZ3VhcmQgb2YgdGhpcyBraW5kIGlzIGFsbCB0aGUgcmVhbG0gbmVlZHMsIGFuZCB0aGUgcmVhc29uIGlzCgkvLyBzdHJ1Y3R1cmFsOiBlbXBsb3llZSBpcyB0aGUgb25seSBjYWxsZXItc3VwcGxpZWQgdmFsdWUgdGhhdCBldmVyCgkvLyBiZWNvbWVzIGEgc3RvcmFnZSBrZXkgaGVyZS4gRXZlcnkgb3RoZXIga2V5IGRlcml2ZXMgZnJvbQoJLy8gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIG9yIGNvaW5pby5SZWNlaXZlJ3Mgc2VuZGVyLCBib3RoIGNhbm9uaWNhbCBieQoJLy8gY29uc3RydWN0aW9uLCBhbmQgZXZlcnkgb3RoZXIgZW50cnlwb2ludCBMT09LUyBVUCBhIHBvc2l0aW9uIHJhdGhlcgoJLy8gdGhhbiBjcmVhdGluZyBvbmUsIHNvIGEgbm9uLWNhbm9uaWNhbCBhcmd1bWVudCB0aGVyZSBmYWlscyBjbG9zZWQgYXQKCS8vIG11c3RQb3NpdGlvbi4gVGhlIGNoZWNrIGlzIGNvbXBsZXRlIGFzIHdlbGwgYXMgbmVjZXNzYXJ5OiB0aGF0IGRlY29kZXIKCS8vIHJlamVjdHMgbWl4ZWQgY2FzZSBvdXRyaWdodCwgc28gYSB2YWxpZCBhZGRyZXNzIGhhcyBleGFjdGx5IHR3bwoJLy8gc3BlbGxpbmdzIGFuZCByZWZ1c2luZyBldmVyeSBub24tbG93ZXIgb25lIGxlYXZlcyBwcmVjaXNlbHkgdGhlCgkvLyBjYW5vbmljYWwgb25lLgoJaWYgIWVtcGxveWVlLklzVmFsaWQoKSB8fCBzdHJpbmcoZW1wbG95ZWUpICE9IHN0cmluZ3MuVG9Mb3dlcihzdHJpbmcoZW1wbG95ZWUpKSB7CgkJcGFuaWMoImVtcGxveWVlIGlzIG5vdCBhIHZhbGlkIGFkZHJlc3MgaW4gY2Fub25pY2FsIChsb3dlcmNhc2UpIGZvcm0iKQoJfQoJaWYgcGVyUGVyaW9kIDwgTWluUGVyUGVyaW9kIHsKCQlwYW5pYygicGVyUGVyaW9kIGlzIGJlbG93IE1pblBlclBlcmlvZCIpCgl9CglpZiBwZXJpb2RCbG9ja3MgPCBNaW5QZXJpb2RCbG9ja3MgewoJCXBhbmljKCJwZXJpb2RCbG9ja3MgaXMgYmVsb3cgTWluUGVyaW9kQmxvY2tzIikKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIHN0YXJ0SGVpZ2h0IDwgbm93IHsKCQlwYW5pYygic3RhcnRIZWlnaHQgaXMgaW4gdGhlIHBhc3QiKQoJfQoJaWYgZW5kSGVpZ2h0ICE9IE9wZW5FbmRlZCB7CgkJaWYgZW5kSGVpZ2h0IDw9IHN0YXJ0SGVpZ2h0IHsKCQkJcGFuaWMoImVuZEhlaWdodCBtdXN0IGJlIGFmdGVyIHN0YXJ0SGVpZ2h0LCBvciBPcGVuRW5kZWQiKQoJCX0KCQlpZiBlbmRIZWlnaHQtc3RhcnRIZWlnaHQgPCBwZXJpb2RCbG9ja3MgewoJCQlwYW5pYygicG9zaXRpb24gZW5kcyBiZWZvcmUgaXRzIGZpcnN0IHBlcmlvZCBjb21wbGV0ZXMiKQoJCX0KCX0KCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCW93bmVyS2V5IDo9IG93bmVyLlN0cmluZygpCgllIDo9IG11c3RFbXBsb3llcihvd25lcktleSkKCWlmIGUucG9vbCA9PSAwIHsKCQlwYW5pYygiZnVuZCBhIHBvb2wgYmVmb3JlIGhpcmluZyIpCgl9CglpZiBlLnJvc3RlciA+PSBNYXhSb3N0ZXIgewoJCXBhbmljKCJlbXBsb3llciByb3N0ZXIgaXMgZnVsbCIpCgl9CglrIDo9IHBvc0tleShvd25lciwgZW1wbG95ZWUpCglpZiBwb3NpdGlvbnMuR2V0KGspICE9IG5pbCB7CgkJcGFuaWMoInRoaXMgZW1wbG95ZWUgYWxyZWFkeSBoYXMgYW4gb3BlbiBwb3NpdGlvbiB3aXRoIHRoaXMgZW1wbG95ZXIiKQoJfQoKCXBvc2l0aW9ucy5TZXQoaywgJnBvc2l0aW9uewoJCWVtcGxveWVyOiAgICAgb3duZXIsCgkJZW1wbG95ZWU6ICAgICBlbXBsb3llZSwKCQlwZXJQZXJpb2Q6ICAgIHBlclBlcmlvZCwKCQlwZXJpb2RCbG9ja3M6IHBlcmlvZEJsb2NrcywKCQlzdGFydEhlaWdodDogIHN0YXJ0SGVpZ2h0LAoJCWVuZEhlaWdodDogICAgZW5kSGVpZ2h0LAoJCXBhaWRQZXJpb2RzOiAgMCwKCX0pCgllLnJvc3RlcisrCgljaGFpbi5FbWl0KCJIaXJlZCIsICJlbXBsb3llciIsIG93bmVyS2V5LCAiZW1wbG95ZWUiLCBlbXBsb3llZS5TdHJpbmcoKSwKCQkicGVyUGVyaW9kIiwgaXRvYShwZXJQZXJpb2QpLCAicGVyaW9kQmxvY2tzIiwgaXRvYShwZXJpb2RCbG9ja3MpLAoJCSJzdGFydEhlaWdodCIsIGl0b2Eoc3RhcnRIZWlnaHQpLCAiZW5kSGVpZ2h0IiwgaXRvYShlbmRIZWlnaHQpKQp9CgovLyBBY2NydWUgc2V0dGxlcyBldmVyeSB3aG9sZSBwZXJpb2QgdGhhdCBoYXMgY29tcGxldGVkIGFuZCBub3QgeWV0IGJlZW4KLy8gcGFpZCwgYXMgZmFyIGFzIHRoZSBlbXBsb3llcidzIHBvb2wgcmVhY2hlcywgYW5kIGNyZWRpdHMgdGhlIGdyb3NzCi8vIG1pbnVzIHRoZSBhY2NydWFsIGZlZSB0byB0aGUgZW1wbG95ZWUncyBsZWRnZXIgYmFsYW5jZS4KLy8KLy8gQU5ZT05FIG1heSBjYWxsIHRoaXMg4oCUIHNlZSB0aGUgcGFja2FnZSBkb2MuIEl0IHJldHVybnMgdGhlIGdyb3NzCi8vIGFtb3VudCBzZXR0bGVkLgpmdW5jIEFjY3J1ZShjdXIgcmVhbG0sIGVtcGxveWVyLCBlbXBsb3llZSBhZGRyZXNzKSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJcCA6PSBtdXN0UG9zaXRpb24oZW1wbG95ZXIsIGVtcGxveWVlKQoJZSA6PSBtdXN0RW1wbG95ZXIoZW1wbG95ZXIuU3RyaW5nKCkpCgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJZHVlIDo9IGR1ZVBlcmlvZHMocCwgbm93KQoJaWYgZHVlID09IDAgewoJCXBhbmljKCJubyBwZXJpb2RzIGFyZSBkdWUiKQoJfQoKCS8vIFdob2xlIHBlcmlvZHMgdGhlIHBvb2wgY2FuIGNvdmVyLiBUaGlzIGlzIHRoZSBzb2x2ZW5jeSBjaGVjayBhbmQKCS8vIGl0IHJ1bnMgQkVGT1JFIGFueSBzdGF0ZSBtb3Zlcywgc28gYSBwb29sIHRoYXQgY2Fubm90IGNvdmVyIGV2ZW4KCS8vIG9uZSBwZXJpb2QgbGVhdmVzIHBhaWRQZXJpb2RzIHVudG91Y2hlZCBhbmQgbm90aGluZyBpcyBsb3N0LgoJYWZmb3JkYWJsZSA6PSBlLnBvb2wgLyBwLnBlclBlcmlvZAoJbiA6PSBkdWUKCWlmIGFmZm9yZGFibGUgPCBuIHsKCQluID0gYWZmb3JkYWJsZQoJfQoJaWYgbiA9PSAwIHsKCQlwYW5pYygiZW1wbG95ZXIncyBwb29sIGNhbm5vdCBjb3ZlciBvbmUgcGVyaW9kIikKCX0KCglncm9zcyA6PSBuICogcC5wZXJQZXJpb2QgLy8gYm91bmRlZCBieSBlLnBvb2wsIHNvIGl0IGNhbm5vdCBvdmVyZmxvdwoJZS5wb29sIC09IGdyb3NzCglwLnBhaWRQZXJpb2RzICs9IG4KCWNyZWRpdGVkLCBmZWUgOj0gbGVkZ2VyLk11c3REZXBvc2l0KGVtcGxveWVlLlN0cmluZygpLCBncm9zcywgQWNjcnVlRmVlQnBzKQoKCWNoYWluLkVtaXQoIkFjY3J1ZWQiLCAiZW1wbG95ZXIiLCBlbXBsb3llci5TdHJpbmcoKSwKCQkiZW1wbG95ZWUiLCBlbXBsb3llZS5TdHJpbmcoKSwgInBlcmlvZHMiLCBpdG9hKG4pLAoJCSJncm9zcyIsIGl0b2EoZ3Jvc3MpLCAiY3JlZGl0ZWQiLCBpdG9hKGNyZWRpdGVkKSwgImZlZSIsIGl0b2EoZmVlKSwKCQkicGFpZFBlcmlvZHMiLCBpdG9hKHAucGFpZFBlcmlvZHMpLCAicG9vbCIsIGl0b2EoZS5wb29sKSkKCXJldHVybiBncm9zcwp9CgovLyBUZXJtaW5hdGUgc3RvcHMgdGhlIGNsb2NrIG9uIGEgcG9zaXRpb24uIFRoZSBlbXBsb3llciBvbmx5LgovLwovLyBJdCBkb2VzIE5PVCByZW1vdmUgdGhlIHJlY29yZCBhbmQgZG9lcyBub3Qgc2V0dGxlIGFueXRoaW5nOiB3aGF0ZXZlcgovLyB3YXMgZHVlIHN0YXlzIGR1ZSwgYW5kIGFueW9uZSBtYXkgc3RpbGwgQWNjcnVlIGl0LiBUaGF0IHNlcGFyYXRpb24gaXMKLy8gdGhlIGVtcGxveWVlJ3MgcHJvdGVjdGlvbiDigJQgc2VlIHRoZSBwYWNrYWdlIGRvYy4gVXNlIFJlbGVhc2UgdG8gcmVtb3ZlCi8vIGEgc2V0dGxlZCBwb3NpdGlvbi4KLy8KLy8gSWYgdGhlIHBvc2l0aW9uIGhhcyBub3QgeWV0IHJlYWNoZWQgaXRzIGZpcnN0IGNvbXBsZXRlIHBlcmlvZCwgdGhpcwovLyBwYXlzIG5vdGhpbmcsIGJ5IHRoZSBhcnJlYXJzIHJ1bGUuCmZ1bmMgVGVybWluYXRlKGN1ciByZWFsbSwgZW1wbG95ZWUgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJcCA6PSBtdXN0UG9zaXRpb24ob3duZXIsIGVtcGxveWVlKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgcC5lbmRIZWlnaHQgIT0gT3BlbkVuZGVkICYmIHAuZW5kSGVpZ2h0IDw9IG5vdyB7CgkJcGFuaWMoInBvc2l0aW9uIGhhcyBhbHJlYWR5IGVuZGVkIikKCX0KCXAuZW5kSGVpZ2h0ID0gbm93CgljaGFpbi5FbWl0KCJUZXJtaW5hdGVkIiwgImVtcGxveWVyIiwgb3duZXIuU3RyaW5nKCksCgkJImVtcGxveWVlIiwgZW1wbG95ZWUuU3RyaW5nKCksICJlbmRIZWlnaHQiLCBpdG9hKG5vdyksCgkJInBhaWRQZXJpb2RzIiwgaXRvYShwLnBhaWRQZXJpb2RzKSwgImR1ZSIsIGl0b2EoZHVlUGVyaW9kcyhwLCBub3cpKSkKfQoKLy8gUmVsZWFzZSByZW1vdmVzIGFuIGVuZGVkLCBmdWxseS1zZXR0bGVkIHBvc2l0aW9uIGFuZCBmcmVlcyBpdHMKLy8gc3RvcmFnZS4gUGVybWlzc2lvbmxlc3M6IHRoZSBjaGFpbiByZWZ1bmRzIHRoZSBmcmVlZCBzdG9yYWdlIGRlcG9zaXQKLy8gdG8gdGhlIGNhbGxlciwgd2hpY2ggaXMgdGhlIHN0YW5kaW5nIGluY2VudGl2ZSB0byB0aWR5IHVwIGEgc2V0dGxlZAovLyBwb3NpdGlvbiB0aGF0IGlzIG5vdCB5b3VyIG93bi4KLy8KLy8gSXQgcmVmdXNlcyB3aGlsZSBhbnl0aGluZyBpcyBkdWUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgc2FmZSB0byBsZXQgYQovLyBzdHJhbmdlciBjYWxsOiBhIFJlbGVhc2UgY2Fubm90IGRlc3Ryb3kgYW4gdW5wYWlkIG9ibGlnYXRpb24uCmZ1bmMgUmVsZWFzZShjdXIgcmVhbG0sIGVtcGxveWVyLCBlbXBsb3llZSBhZGRyZXNzKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJcCA6PSBtdXN0UG9zaXRpb24oZW1wbG95ZXIsIGVtcGxveWVlKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgcC5lbmRIZWlnaHQgPT0gT3BlbkVuZGVkIHx8IHAuZW5kSGVpZ2h0ID4gbm93IHsKCQlwYW5pYygicG9zaXRpb24gaGFzIG5vdCBlbmRlZCIpCgl9CglpZiBkdWVQZXJpb2RzKHAsIG5vdykgIT0gMCB7CgkJcGFuaWMoInBvc2l0aW9uIGhhcyB1bnNldHRsZWQgcGVyaW9kcyIpCgl9Cglwb3NpdGlvbnMuUmVtb3ZlKHBvc0tleShlbXBsb3llciwgZW1wbG95ZWUpKQoJaWYgZSA6PSBnZXRFbXBsb3llcihlbXBsb3llci5TdHJpbmcoKSk7IGUgIT0gbmlsICYmIGUucm9zdGVyID4gMCB7CgkJZS5yb3N0ZXItLQoJfQoJY2hhaW4uRW1pdCgiUmVsZWFzZWQiLCAiZW1wbG95ZXIiLCBlbXBsb3llci5TdHJpbmcoKSwKCQkiZW1wbG95ZWUiLCBlbXBsb3llZS5TdHJpbmcoKSwgInBhaWRQZXJpb2RzIiwgaXRvYShwLnBhaWRQZXJpb2RzKSkKfQoKLy8gLS0tIGNsYWltaW5nIC0tLQoKLy8gQ2xhaW0gcGF5cyB0aGUgY2FsbGVyIHRoZWlyIHdob2xlIGFjY3J1ZWQgYmFsYW5jZS4gVGhlIGVtcGxveWVlIG9ubHkg4oCUCi8vIHRoZXJlIGlzIG5vICJjbGFpbSBvbiBiZWhhbGYgb2YiLCBiZWNhdXNlIHRoYXQgd291bGQgbGV0IGEgdGhpcmQgcGFydHkKLy8gY2hvb3NlIHRoZSBtb21lbnQgc29tZW9uZSBlbHNlJ3MgY29pbnMgbW92ZS4KZnVuYyBDbGFpbShjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl3aG8gOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglrZXkgOj0gd2hvLlN0cmluZygpCglhbW91bnQgOj0gbGVkZ2VyLkJhbGFuY2VPZihrZXkpCglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIGJhbGFuY2UgdG8gY2xhaW0iKQoJfQoJLy8gRGViaXQgZmlyc3QsIHBlciBjb2luaW8ncyBvcmRlcmluZyBjb250cmFjdC4KCWxlZGdlci5NdXN0V2l0aGRyYXcoa2V5LCBhbW91bnQpCgljb2luaW8uUGF5b3V0KDAsIGN1ciwgd2hvLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW1lZCIsICJhY2NvdW50Iiwga2V5LCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQoJcmV0dXJuIGFtb3VudAp9CgovLyBXaXRoZHJhd0ZlZXMgbW92ZXMgdGhlIGFjY3J1ZWQgZmVlIHBvdCB0byBGZWVDb2xsZWN0b3IuIEFueW9uZSBtYXkKLy8gY2FsbCBpdDsgdGhlIGRlc3RpbmF0aW9uIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBzbyB0aGUgY2FsbGVyCi8vIGNhbm5vdCBpbmZsdWVuY2Ugd2hlcmUgdGhlIGNvaW5zIGdvLgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglmZWVzIDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgZmVlcyA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBGZWVDb2xsZWN0b3IsIERlbm9tLCBmZWVzKQoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoZmVlcykpCglyZXR1cm4gZmVlcwp9CgovLyBTd2VlcFN1cnBsdXMgc2VuZHMgY29pbnMgaGVsZCBiZXlvbmQgZXZlcnkgb2JsaWdhdGlvbiB0byBGZWVDb2xsZWN0b3IuCi8vIFRoZSByZXNlcnZlIHBhc3NlZCB0byBjb2luaW8gaXMgdGhlIHJlYWxtJ3MgZnVsbCBsaWFiaWxpdHkg4oCUIHBvb2xlZAovLyBjb2lucyBwbHVzIGxlZGdlciBsaWFiaWxpdGllcyDigJQgc28gYSBzd2VlcCBjYW4gbmV2ZXIgcmVhY2ggYSBjb2luIHRoYXQKLy8gYW4gZW1wbG95ZXIgb3IgYW4gZW1wbG95ZWUgaXMgb3dlZC4KZnVuYyBTd2VlcFN1cnBsdXMoY3VyIHJlYWxtKSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgRmVlQ29sbGVjdG9yLCBEZW5vbSwgTGlhYmlsaXRpZXMoKSkKCWNoYWluLkVtaXQoIlN3ZXB0IiwgImRlbm9tIiwgRGVub20sICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShzd2VwdCkpCglyZXR1cm4gc3dlcHQKfQoKLy8gLS0tIGFjY3J1YWwgYXJpdGhtZXRpYywgdGhlIG9uZSBuZXcgbWVjaGFuaXNtIC0tLQoKLy8gZHVlUGVyaW9kcyBpcyB0aGUgbnVtYmVyIG9mIHdob2xlIHBlcmlvZHMgdGhhdCBoYXZlIGNvbXBsZXRlZCBhbmQgbm90Ci8vIGJlZW4gcGFpZC4gSXQgaXMgYSBwdXJlIGZ1bmN0aW9uIG9mIHRoZSBwb3NpdGlvbiBhbmQgdGhlIGNsb2NrLCB3aGljaAovLyBpcyB3aGF0IG1ha2VzIGl0IHVuaXQtdGVzdGFibGUgd2l0aG91dCBhIGNoYWluLgovLwovLyBQZXJpb2RzIGFyZSBBTkNIT1JFRCB0byBzdGFydEhlaWdodDogcGVyaW9kIGsgY2xvc2VzIGF0Ci8vIHN0YXJ0SGVpZ2h0ICsgaypwZXJpb2RCbG9ja3MuIE5vdGhpbmcgaXMgZHVlIGF0IHN0YXJ0SGVpZ2h0IGl0c2VsZiDigJQKLy8gc2FsYXJ5IGlzIHBhaWQgaW4gYXJyZWFycy4KZnVuYyBkdWVQZXJpb2RzKHAgKnBvc2l0aW9uLCBub3cgaW50NjQpIGludDY0IHsKCWhvcml6b24gOj0gbm93CglpZiBwLmVuZEhlaWdodCAhPSBPcGVuRW5kZWQgJiYgcC5lbmRIZWlnaHQgPCBob3Jpem9uIHsKCQlob3Jpem9uID0gcC5lbmRIZWlnaHQKCX0KCWlmIGhvcml6b24gPD0gcC5zdGFydEhlaWdodCB7CgkJcmV0dXJuIDAKCX0KCWNvbXBsZXRlZCA6PSAoaG9yaXpvbiAtIHAuc3RhcnRIZWlnaHQpIC8gcC5wZXJpb2RCbG9ja3MKCWlmIGNvbXBsZXRlZCA8PSBwLnBhaWRQZXJpb2RzIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGNvbXBsZXRlZCAtIHAucGFpZFBlcmlvZHMKfQoKLy8gLS0tIHJlYWQtb25seSBhY2Nlc3NvcnMgLS0tCgovLyBEdWVQZXJpb2RzIGlzIGR1ZVBlcmlvZHMgZm9yIGEgbGl2ZSBwb3NpdGlvbiwgYXQgdGhlIGN1cnJlbnQgaGVpZ2h0LgpmdW5jIER1ZVBlcmlvZHMoZW1wbG95ZXIsIGVtcGxveWVlIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBkdWVQZXJpb2RzKG11c3RQb3NpdGlvbihlbXBsb3llciwgZW1wbG95ZWUpLCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCn0KCi8vIER1ZUFtb3VudCBpcyB0aGUgZ3Jvc3MgdGhhdCBEdWVQZXJpb2RzIHdvdWxkIHNldHRsZSBpZiB0aGUgcG9vbCB3ZXJlCi8vIHVuYm91bmRlZC4gUmVhZCBpdCBiZXNpZGUgQWNjcnVhYmxlQW1vdW50OiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0KLy8gaXMgZXhhY3RseSB0aGUgZW1wbG95ZXIncyBzaG9ydGZhbGwuCi8vCi8vIEl0IGlzIHRoZSBvbmUgYXJpdGhtZXRpYyBoZXJlIHdpdGggTk8gcG9vbCBib3VuZCBiZWhpbmQgaXQsIHNvIGl0IGlzIHRoZQovLyBvbmUgcGxhY2UgYW4gaW50NjQgY2FuIHdyYXA6IHBlclBlcmlvZCBoYXMgbm8gY2VpbGluZyBhbmQgZHVlIGdyb3dzIHdpdGgKLy8gdGhlIGNoYWluLiBBY2NydWUgY2Fubm90IHdyYXAsIGJlY2F1c2UgaXRzIHByb2R1Y3QgaXMgYm91bmRlZCBieSB0aGUKLy8gcG9vbCBpdCBpcyBhYm91dCB0byBkZWJpdCAoc2VlIHRoZSBjb21tZW50IHRoZXJlKS4gQW4gdW5wYXlhYmxlIHBvc2l0aW9uCi8vIGlzIGEgbGVnYWwgc3RhdGUgaW4gdGhpcyByZWFsbSwgc28gdGhlIG92ZXJmbG93IGlzIHJlYWNoYWJsZSBpbgovLyBwcmluY2lwbGUsIGFuZCB0aGlzIHBhbmljcyByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSBuZWdhdGl2ZSBzYWxhcnkg4oCUCi8vIGEgdmlldyB0aGF0IHJlZnVzZXMgaXMgcmVjb3ZlcmFibGUsIGEgdmlldyB0aGF0IGxpZXMgaXMgbm90LgpmdW5jIER1ZUFtb3VudChlbXBsb3llciwgZW1wbG95ZWUgYWRkcmVzcykgaW50NjQgewoJcCA6PSBtdXN0UG9zaXRpb24oZW1wbG95ZXIsIGVtcGxveWVlKQoJZ3Jvc3MsIG9rIDo9IGNoZWNrZWRNdWwoZHVlUGVyaW9kcyhwLCBydW50aW1lLkNoYWluSGVpZ2h0KCkpLCBwLnBlclBlcmlvZCkKCWlmICFvayB7CgkJcGFuaWMoImR1ZSBhbW91bnQgd291bGQgb3ZlcmZsb3c7IHJlYWQgRHVlUGVyaW9kcyBhbmQgUGVyUGVyaW9kT2YgaW5zdGVhZCIpCgl9CglyZXR1cm4gZ3Jvc3MKfQoKLy8gQWNjcnVhYmxlQW1vdW50IGlzIHRoZSBncm9zcyBhbiBBY2NydWUgd291bGQgc2V0dGxlIHJpZ2h0IG5vdywgcG9vbAovLyBib3VuZCBpbmNsdWRlZC4gSXQgaXMgdGhlIGhvbmVzdCBudW1iZXIsIGFuZCBpdCBjYW4gYmUgbGVzcyB0aGFuCi8vIER1ZUFtb3VudCB3aXRob3V0IGFueXRoaW5nIGJlaW5nIHdyb25nIOKAlCBzZWUgdGhlIHBhY2thZ2UgZG9jIG9uCi8vIHNvbHZlbmN5LgpmdW5jIEFjY3J1YWJsZUFtb3VudChlbXBsb3llciwgZW1wbG95ZWUgYWRkcmVzcykgaW50NjQgewoJcCA6PSBtdXN0UG9zaXRpb24oZW1wbG95ZXIsIGVtcGxveWVlKQoJZSA6PSBtdXN0RW1wbG95ZXIoZW1wbG95ZXIuU3RyaW5nKCkpCglkdWUgOj0gZHVlUGVyaW9kcyhwLCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCglhZmZvcmRhYmxlIDo9IGUucG9vbCAvIHAucGVyUGVyaW9kCglpZiBhZmZvcmRhYmxlIDwgZHVlIHsKCQlkdWUgPSBhZmZvcmRhYmxlCgl9CglyZXR1cm4gZHVlICogcC5wZXJQZXJpb2QKfQoKLy8gUG9vbE9mIGlzIGFuIGVtcGxveWVyJ3MgdW5hbGxvY2F0ZWQgcG9vbC4gWmVybyBmb3IgYW4gYWRkcmVzcyB0aGF0IGhhcwovLyBuZXZlciBmdW5kZWQgb25lLgpmdW5jIFBvb2xPZihlbXBsb3llciBhZGRyZXNzKSBpbnQ2NCB7CglpZiBlIDo9IGdldEVtcGxveWVyKGVtcGxveWVyLlN0cmluZygpKTsgZSAhPSBuaWwgewoJCXJldHVybiBlLnBvb2wKCX0KCXJldHVybiAwCn0KCi8vIFJvc3Rlck9mIGlzIHRoZSBudW1iZXIgb2Ygb3BlbiBwb3NpdGlvbnMgYW4gZW1wbG95ZXIgaG9sZHMuCmZ1bmMgUm9zdGVyT2YoZW1wbG95ZXIgYWRkcmVzcykgaW50IHsKCWlmIGUgOj0gZ2V0RW1wbG95ZXIoZW1wbG95ZXIuU3RyaW5nKCkpOyBlICE9IG5pbCB7CgkJcmV0dXJuIGUucm9zdGVyCgl9CglyZXR1cm4gMAp9CgovLyBCYWxhbmNlT2YgaXMgYW4gZW1wbG95ZWUncyBhY2NydWVkLCB1bmNsYWltZWQgYmFsYW5jZS4KZnVuYyBCYWxhbmNlT2YoZW1wbG95ZWUgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihlbXBsb3llZS5TdHJpbmcoKSkgfQoKLy8gUGVyUGVyaW9kT2YgaXMgYSBwb3NpdGlvbidzIGdyb3NzIHNhbGFyeSBwZXIgcGVyaW9kLgpmdW5jIFBlclBlcmlvZE9mKGVtcGxveWVyLCBlbXBsb3llZSBhZGRyZXNzKSBpbnQ2NCB7CglyZXR1cm4gbXVzdFBvc2l0aW9uKGVtcGxveWVyLCBlbXBsb3llZSkucGVyUGVyaW9kCn0KCi8vIFBhaWRQZXJpb2RzT2YgaXMgaG93IG1hbnkgd2hvbGUgcGVyaW9kcyBhIHBvc2l0aW9uIGhhcyBzZXR0bGVkLgpmdW5jIFBhaWRQZXJpb2RzT2YoZW1wbG95ZXIsIGVtcGxveWVlIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBtdXN0UG9zaXRpb24oZW1wbG95ZXIsIGVtcGxveWVlKS5wYWlkUGVyaW9kcwp9CgovLyBFbmRIZWlnaHRPZiBpcyBhIHBvc2l0aW9uJ3MgZW5kIGhlaWdodCwgb3IgT3BlbkVuZGVkLgpmdW5jIEVuZEhlaWdodE9mKGVtcGxveWVyLCBlbXBsb3llZSBhZGRyZXNzKSBpbnQ2NCB7CglyZXR1cm4gbXVzdFBvc2l0aW9uKGVtcGxveWVyLCBlbXBsb3llZSkuZW5kSGVpZ2h0Cn0KCi8vIEhhc1Bvc2l0aW9uIHJlcG9ydHMgd2hldGhlciBhIHBvc2l0aW9uIGlzIG9wZW4sIHdpdGhvdXQgcGFuaWNraW5nIG9uCi8vIGFic2VuY2Ug4oCUIGV2ZXJ5IG90aGVyIHBvc2l0aW9uIGFjY2Vzc29yIHBhbmljcywgd2hpY2ggbWFrZXMgdGhlbQovLyB1bnVzYWJsZSBhcyBhbiBleGlzdGVuY2UgcHJvYmUuCmZ1bmMgSGFzUG9zaXRpb24oZW1wbG95ZXIsIGVtcGxveWVlIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIHBvc2l0aW9ucy5HZXQocG9zS2V5KGVtcGxveWVyLCBlbXBsb3llZSkpICE9IG5pbAp9CgovLyBPcGVuUG9zaXRpb25zIGlzIHRoZSBudW1iZXIgb2Ygb3BlbiBwb3NpdGlvbnMgYWNyb3NzIGV2ZXJ5IGVtcGxveWVyLgpmdW5jIE9wZW5Qb3NpdGlvbnMoKSBpbnQgeyByZXR1cm4gcG9zaXRpb25zLlNpemUoKSB9CgovLyBFbXBsb3llcnMgaXMgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgdGhhdCBoYXZlIGV2ZXIgZnVuZGVkIGEgcG9vbC4KLy8gTm90ZSB0aGUgdGVuc2U6IGFuIGVtcGxveWVyIHJlY29yZCBzdXJ2aXZlcyBhIHBvb2wgZ29pbmcgdG8gemVybywgc28KLy8gdGhpcyBpcyBub3QgYSBjb3VudCBvZiBjdXJyZW50bHktZnVuZGVkIGVtcGxveWVycy4KZnVuYyBFbXBsb3llcnMoKSBpbnQgeyByZXR1cm4gZW1wbG95ZXJzLlNpemUoKSB9CgovLyBUb3RhbFBvb2xlZCBpcyB0aGUgc3VtIG9mIGV2ZXJ5IGVtcGxveWVyJ3MgdW5hbGxvY2F0ZWQgcG9vbC4KZnVuYyBUb3RhbFBvb2xlZCgpIGludDY0IHsKCXZhciBzdW0gaW50NjQKCWVtcGxveWVycy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCXN1bSArPSB2LigqZW1wbG95ZXIpLnBvb2wKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gc3VtCn0KCi8vIEFjY3J1ZWRUb3RhbCBpcyB0aGUgc3VtIG9mIGV2ZXJ5IGVtcGxveWVlJ3MgdW5jbGFpbWVkIGJhbGFuY2UuCmZ1bmMgQWNjcnVlZFRvdGFsKCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLlVzZXJzVG90YWwoKSB9CgovLyBGZWVzQWNjcnVlZCBpcyB0aGUgZmVlIHBvdCBhd2FpdGluZyBXaXRoZHJhd0ZlZXMuCmZ1bmMgRmVlc0FjY3J1ZWQoKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSB9CgovLyBMaWFiaWxpdGllcyBpcyBldmVyeSBjb2luIHRoaXMgcmVhbG0gb3dlcyB0byBhbnlvbmU6IHBvb2xlZCBjb2lucyBwbHVzCi8vIHRoZSBsZWRnZXIncyBvd24gdG90YWwgKGVtcGxveWVlIGJhbGFuY2VzIHBsdXMgdGhlIGZlZSBwb3QpLgpmdW5jIExpYWJpbGl0aWVzKCkgaW50NjQgewoJdG90YWwsIG9rIDo9IGNoZWNrZWRBZGQoVG90YWxQb29sZWQoKSwgbGVkZ2VyLkxpYWJpbGl0aWVzKCkpCglpZiAhb2sgewoJCXBhbmljKCJsaWFiaWxpdGllcyB3b3VsZCBvdmVyZmxvdyIpCgl9CglyZXR1cm4gdG90YWwKfQoKLy8gSGVsZCBpcyB0aGUgcmVhbG0ncyBhY3R1YWwgdWdub3QgYmFsYW5jZSwgcmVhZCBmcm9tIHRoZSBjaGFpbi4KZnVuYyBIZWxkKCkgaW50NjQgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gU3VycGx1cyBpcyBjb2lucyBoZWxkIGJleW9uZCBldmVyeSBvYmxpZ2F0aW9uIOKAlCB3aGF0IFN3ZWVwU3VycGx1cwovLyB3b3VsZCBtb3ZlLiBJdCBpcyB6ZXJvIHdoZW4gZXZlcnkgY29pbiBhcnJpdmVkIHRocm91Z2ggYW4gZW50cnlwb2ludC4KZnVuYyBTdXJwbHVzKCkgaW50NjQgewoJaCwgbCA6PSBIZWxkKCksIExpYWJpbGl0aWVzKCkKCWlmIGggPD0gbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBoIC0gbAp9CgovLyBBZGRyZXNzIGlzIHRoaXMgcmVhbG0ncyBvd24gYWRkcmVzcy4KZnVuYyBBZGRyZXNzKCkgYWRkcmVzcyB7IHJldHVybiBzZWxmIH0KCi8vIEhlaWdodCBpcyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQsIGV4cG9zZWQgc28gYSBjYWxsZXIgY2FuIGNvbXB1dGUKLy8gcGVyaW9kIGJvdW5kYXJpZXMgYWdhaW5zdCB0aGUgc2FtZSBjbG9jayB0aGlzIHJlYWxtIHVzZXMuCmZ1bmMgSGVpZ2h0KCkgaW50NjQgeyByZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIH0KCi8vIC0tLSBpbnRlcm5hbHMgLS0tCgpmdW5jIHBvc0tleShlbXBsb3llciwgZW1wbG95ZWUgYWRkcmVzcykgc3RyaW5nIHsKCXJldHVybiBlbXBsb3llci5TdHJpbmcoKSArICJ8IiArIGVtcGxveWVlLlN0cmluZygpCn0KCmZ1bmMgZ2V0RW1wbG95ZXIoa2V5IHN0cmluZykgKmVtcGxveWVyIHsKCXYgOj0gZW1wbG95ZXJzLkdldChrZXkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCplbXBsb3llcikKfQoKZnVuYyBtdXN0RW1wbG95ZXIoa2V5IHN0cmluZykgKmVtcGxveWVyIHsKCWUgOj0gZ2V0RW1wbG95ZXIoa2V5KQoJaWYgZSA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIGVtcGxveWVyIikKCX0KCXJldHVybiBlCn0KCmZ1bmMgbXVzdFBvc2l0aW9uKGVtcGxveWVyLCBlbXBsb3llZSBhZGRyZXNzKSAqcG9zaXRpb24gewoJdiA6PSBwb3NpdGlvbnMuR2V0KHBvc0tleShlbXBsb3llciwgZW1wbG95ZWUpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIHBvc2l0aW9uIikKCX0KCXJldHVybiB2LigqcG9zaXRpb24pCn0KCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCWMgOj0gYSArIGIKCWlmIChiID4gMCAmJiBjIDwgYSkgfHwgKGIgPCAwICYmIGMgPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gYywgdHJ1ZQp9CgovLyBjaGVja2VkTXVsIHJlcG9ydHMgYSpiIGFuZCB3aGV0aGVyIGl0IGlzIGV4YWN0LiBCb3RoIG9wZXJhbmRzIGhlcmUgYXJlCi8vIG5vbi1uZWdhdGl2ZSAoZHVlUGVyaW9kcyBuZXZlciByZXR1cm5zIGEgbmVnYXRpdmUsIHBlclBlcmlvZCBpcyB2YWxpZGF0ZWQKLy8gYXQgb3IgYWJvdmUgTWluUGVyUGVyaW9kKSwgc28gdGhlIGRpdmlzaW9uIHRlc3QgaXMgc3VmZmljaWVudCBhbmQgdGhlCi8vIHNpZ24gY2FzZXMgYSBnZW5lcmFsIHZlcnNpb24gd291bGQgbmVlZCBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudC4KZnVuYyBjaGVja2VkTXVsKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJaWYgYSA9PSAwIHx8IGIgPT0gMCB7CgkJcmV0dXJuIDAsIHRydWUKCX0KCWMgOj0gYSAqIGIKCWlmIGMvYiAhPSBhIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBjLCB0cnVlCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KCi8vIC0tLSByZW5kZXIgLS0tCgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBwYXlyb2xsXG5cbiIpCgliLldyaXRlU3RyaW5nKCJFbXBsb3llci1mdW5kZWQgcmVjdXJyaW5nIHNhbGFyeSBkaXNidXJzZW1lbnQuICIpCgliLldyaXRlU3RyaW5nKCJBbiBhbGxvd2FuY2UgcmVmaWxsczsgYSBzYWxhcnkgYWNjcnVlcy5cblxuIikKCglpZiBwYXRoID09ICIiIHsKCQliLldyaXRlU3RyaW5nKCIjIyBUb3RhbHNcblxuIikKCQliLldyaXRlU3RyaW5nKCJ8IGZpZWxkIHwgdmFsdWUgfFxufC0tLXwtLS18XG4iKQoJCWIuV3JpdGVTdHJpbmcoInwgZW1wbG95ZXJzIHwgIiArIGl0b2EoaW50NjQoRW1wbG95ZXJzKCkpKSArICIgfFxuIikKCQliLldyaXRlU3RyaW5nKCJ8IG9wZW4gcG9zaXRpb25zIHwgIiArIGl0b2EoaW50NjQoT3BlblBvc2l0aW9ucygpKSkgKyAiIHxcbiIpCgkJYi5Xcml0ZVN0cmluZygifCBwb29sZWQgfCAiICsgaXRvYShUb3RhbFBvb2xlZCgpKSArICIgIiArIERlbm9tICsgIiB8XG4iKQoJCWIuV3JpdGVTdHJpbmcoInwgYWNjcnVlZCB0byBlbXBsb3llZXMgfCAiICsgaXRvYShBY2NydWVkVG90YWwoKSkgKyAiICIgKyBEZW5vbSArICIgfFxuIikKCQliLldyaXRlU3RyaW5nKCJ8IGZlZXMgYWNjcnVlZCB8ICIgKyBpdG9hKEZlZXNBY2NydWVkKCkpICsgIiAiICsgRGVub20gKyAiIHxcbiIpCgkJYi5Xcml0ZVN0cmluZygifCBoZWxkIHwgIiArIGl0b2EoSGVsZCgpKSArICIgIiArIERlbm9tICsgIiB8XG4iKQoJCWIuV3JpdGVTdHJpbmcoInwgc3VycGx1cyB8ICIgKyBpdG9hKFN1cnBsdXMoKSkgKyAiICIgKyBEZW5vbSArICIgfFxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIlNhbGFyeSBpcyBwYWlkIGluIGFycmVhcnM6IGEgcGVyaW9kIG11c3QgY29tcGxldGUgIikKCQliLldyaXRlU3RyaW5nKCJiZWZvcmUgaXQgaXMgb3dlZC4gQWNjcnVlIGlzIHBlcm1pc3Npb25sZXNzLlxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIkFwcGVuZCBhbiBlbXBsb3llciBhZGRyZXNzIHRvIHRoaXMgcGF0aCB0byBzZWUgIikKCQliLldyaXRlU3RyaW5nKCJ0aGVpciByb3N0ZXIuXG4iKQoJCXJldHVybiBiLlN0cmluZygpCgl9CgoJd2hvIDo9IHNhbml0aXplLklubGluZVRleHQocGF0aCkKCWIuV3JpdGVTdHJpbmcoIiMjIFJvc3RlciBvZiAiICsgd2hvICsgIlxuXG4iKQoJZSA6PSBnZXRFbXBsb3llcihwYXRoKQoJaWYgZSA9PSBuaWwgewoJCWIuV3JpdGVTdHJpbmcoIk5vIGVtcGxveWVyIHJlY29yZCBhdCB0aGF0IGFkZHJlc3MuXG4iKQoJCXJldHVybiBiLlN0cmluZygpCgl9CgliLldyaXRlU3RyaW5nKCJQb29sOiAiICsgaXRvYShlLnBvb2wpICsgIiAiICsgRGVub20gKyAiLCAiKQoJYi5Xcml0ZVN0cmluZygib3BlbiBwb3NpdGlvbnM6ICIgKyBpdG9hKGludDY0KGUucm9zdGVyKSkgKyAiXG5cbiIpCgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJYi5Xcml0ZVN0cmluZygifCBlbXBsb3llZSB8IHBlciBwZXJpb2QgfCBwZXJpb2QgfCBwYWlkIHwgZHVlIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglwcmVmaXggOj0gcGF0aCArICJ8IgoJcG9zaXRpb25zLkl0ZXJhdGUocHJlZml4LCBwcmVmaXgrIlx4ZmYiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJcCA6PSB2LigqcG9zaXRpb24pCgkJYi5Xcml0ZVN0cmluZygifCAiICsgc2FuaXRpemUuSW5saW5lVGV4dChwLmVtcGxveWVlLlN0cmluZygpKSkKCQliLldyaXRlU3RyaW5nKCIgfCAiICsgaXRvYShwLnBlclBlcmlvZCkpCgkJYi5Xcml0ZVN0cmluZygiIHwgIiArIGl0b2EocC5wZXJpb2RCbG9ja3MpKQoJCWIuV3JpdGVTdHJpbmcoIiB8ICIgKyBpdG9hKHAucGFpZFBlcmlvZHMpKQoJCWIuV3JpdGVTdHJpbmcoIiB8ICIgKyBpdG9hKGR1ZVBlcmlvZHMocCwgbm93KSkgKyAiIHxcbiIpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoiDTEwMDAwMDAwdWdub3QSEgi84phBEgsxMzY3MjJ1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAZFFacal7BYUs+68vJyE6XSkrTTnhogdQ9KfrlfSx3gIKxhZOcBy/HW2yHbOHhAjOB8BJSS1t3n6uIWjhcILXeRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}