{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "W5aZ1FBEgJotICkccwrN4xWRJyJCAl5PexQe0jouRUY=",
    "height": "382786",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "102776139",
      "GasUsed": "68517426"
    },
    "tx": "CuSVAwoML3ZtLm1fYWRkcGtnEtKVAwooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKVlQMKB25ldHRpbmcSO2duby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9uZXR0aW5nGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL25ldHRpbmciCmdubyA9ICIwLjkiChrnkwMKC25ldHRpbmcuZ25vEtaTAy8vIFJlYWxtIG5ldHRpbmcgaXMgYSBtdWx0aWxhdGVyYWwgb2JsaWdhdGlvbiBjbGVhcmluZyByZWdpc3RlciBpbiBHTk9ULgovLyBBIGNvbnZlbm9yIG9wZW5zIGEgbmV0dGluZyBzZXQgYW5kIGFkbWl0cyBtZW1iZXJzOyBlYWNoIG1lbWJlcgovLyBkZWNsYXJlcywgYWdhaW5zdCBvdGhlciBtZW1iZXJzLCB3aGF0IGl0IG93ZXMgdGhlbTsgY2xvc2luZyB0aGUgc2V0Ci8vIGNvbXB1dGVzIGV2ZXJ5IG1lbWJlcidzIE5FVCBwb3NpdGlvbiDigJQgd2hhdCBpdCBpcyBvd2VkIG1pbnVzIHdoYXQgaXQKLy8gb3dlcyDigJQgYW5kIG9ubHkgdGhvc2UgbmV0IGFtb3VudHMgbW92ZS4gTmV0IGRlYnRvcnMgcGF5IGluLCBuZXQKLy8gY3JlZGl0b3JzIHdpdGhkcmF3LCBhbmQgYSBncmFwaCBvZiBHIGdyb3NzIG9ibGlnYXRpb25zIGNvbGxhcHNlcyB0byBhdAovLyBtb3N0IE4tMSB0cmFuc2ZlcnMuCi8vCi8vIFdIWSBUSElTIEVYSVNUUyAoc2VlIERJU0NPVkVSWS5tZCk6IGFjcm9zcyA2NDEgbGl2ZSBwYWNrYWdlcyBvbgovLyBnbm9sYW5kLTEgYW5kIDYzNyBvbiBvbnl4LTEsIHRoaXJ0ZWVuIGNoYWlucyBtaXJyb3JlZCBpbgovLyBnbm9sYW5nL3R4LWV4cG9ydHMsIGFuZCBHaXRIdWItd2lkZSBgZXh0ZW5zaW9uOmdub2AsIG5vIHBhY2thZ2UKLy8gcmVjb3JkcyBCSUxBVEVSQUwgb2JsaWdhdGlvbnMgYmV0d2VlbiBwYWlycyBvZiBwYXJ0aWVzLCBjb21wdXRlcyBuZXQKLy8gcG9zaXRpb25zLCBvciBjb21wcmVzc2VzIGdyb3NzIG9ibGlnYXRpb25zIGludG8gbmV0IHRyYW5zZmVycy4gVGhlIHR3bwovLyBjbG9zZXN0IGFydGlmYWN0cyB3ZXJlIHJlYWQgaW4gZnVsbCDigJQgbWFpbm5ldAovLyBwL21vdWwveC9kYWlseS9wdWxscGF5bWVudC92MCBhbmQgci9tb3VsL3gvZGFpbHkvc3BsaXR0ZXIvdjEg4oCUIGFuZAovLyBib3RoIGZhaWwgb24gdGhlIHNhbWUgc3RydWN0dXJhbCBwb2ludDogdGhlaXIgbGVkZ2VycyBhcmUga2V5ZWQgYnkKLy8gUEFZRUUgQUxPTkUsIHNvIHRoZXJlIGlzIG5vIHBheWVyIGF4aXMsIG5vIGRpcmVjdGVkIGdyYXBoLCBhbmQgbm90aGluZwovLyB0byBuZXQuIEJvdGggYXJlIHBvcnRzIG9mIFNvbGlkaXR5J3MgY2Fub25pY2FsIHByaW1pdGl2ZXMsIGFuZCBib3RoCi8vIHBvcnRzIGtlcHQgdGhlIG9uZS1kaW1lbnNpb25hbCBsZWRnZXIuCi8vCi8vIFRIRSBERUxUQSBJUyBTVEFURUQgQVQgSVRTIFJFQUwgU0laRSBBTkQgTk8gTEFSR0VSLiBNdWx0aWxhdGVyYWwKLy8gbmV0dGluZyBpcyBub3QgYSBuZXcgaWRlYSDigJQgaXQgaXMgQ0xTLCBBQ0gsIFNhcmRleCwgdGhlIFJvbWFuaWFuCi8vIE1pbmlzdHJ5IG9mIEVjb25vbXkncyBuYXRpb25hbCBzZXRvZmYsIGFuZCBhIGxpdGVyYXR1cmUgb2YgZ3JhcGgKLy8gYWxnb3JpdGhtcyAoRElTQ09WRVJZLm1kIMKnIG91dC1vZi1sYW5ndWFnZSBwcmlvciBhcnQpLiBXaGF0IGlzIG5ldwovLyBoZXJlIGlzIGEgR25vIGltcGxlbWVudGF0aW9uLCB3aXRoIHRoaXMgcG9ydGZvbGlvJ3MgbGl2ZS12YWxpZGF0ZWQKLy8gY3VzdG9keSBkaXNjaXBsaW5lLiBOb3RoaW5nIG1vcmUgaXMgY2xhaW1lZC4KLy8KLy8gV0hBVCBORVRUSU5HIElTIFdPUlRILCBIT05FU1RMWTogY29tcHJlc3Npb24gcmVxdWlyZXMgTVVUVUFMSVRZLiBBCi8vIHN0YXIgZ3JhcGgg4oCUIGV2ZXJ5IG1lbWJlciBvd2luZyBvbmUgaHViIGFuZCB0aGUgaHViIG93aW5nIG5vYm9keSDigJQKLy8gbmV0cyB0byBpdHNlbGYsIGFuZCB0aGUgZ3Jvc3MgYW5kIG5ldCBmaWd1cmVzIGFyZSBpZGVudGljYWwuIFRoaXMKLy8gcmVhbG0gdGhlcmVmb3JlIFJFUE9SVFMgdGhlIGdyb3NzIGFuZCBuZXQgdGVybXMgKENvbXByZXNzaW9uKSBhbmQKLy8gbmV2ZXIgYXNzZXJ0cyBhIHNhdmluZy4gUmVhZCB0aGUgdHdvIHBhaXJzIG9mIG51bWJlcnM7IHRoZSByYXRpbyBpcwovLyB3aGF0ZXZlciB0aGUgbWVtYmVycycgb2JsaWdhdGlvbnMgbWFrZSBpdC4KLy8KLy8gQ09NUE9TSVRJT046IGNvaW4gbW92ZW1lbnQgaXMgZGVsZWdhdGVkIHRvIGNvaW5pbywgZmVlIGFyaXRobWV0aWMgYW5kCi8vIHRoZSBmZWUgcG90IHRvIGZlZWxlZGdlciwgdGhlIGRlY2xhcmF0aW9uIHdpbmRvdyBhbmQgZXhhY3RseS1vbmNlCi8vIHNldHRsZW1lbnQgYXV0aG9yaXphdGlvbiB0byBkdWVib29rLCBvcmRlcmVkIHN0b3JhZ2UgdG8gcC9udC9hdmwvdjAsCi8vIGFuZCBmcmVlLXRleHQgcmVuZGVyIG91dHB1dCB0byB0aGUgZWNvc3lzdGVtIHNhbml0aXplcgovLyBwL250L21hcmtkb3duL3Nhbml0aXplL3YwLiBUaGlzIHJlYWxtIG93bnMgb25seSB0aGUgbmV0dGluZwovLyBhcml0aG1ldGljLCB0aGUgc2V0IHN0YXRlIG1hY2hpbmUsIGFuZCB0aGUgY29uc2VydmF0aW9uIGJvb2trZWVwaW5nLgovLwovLyBBIE5FVFRJTkcgU0VUIEhPTERTIE5PIENPSU5TIFdISUxFIElUIElTIE9QRU4uIEFuIG9ibGlnYXRpb24gaXMgYQovLyBERUNMQVJBVElPTiwgbm90IGEgdHJhbnNmZXI6IERlY2xhcmUgbW92ZXMgbm8gdmFsdWUgYW5kIGxvY2tzIG5vbmUuCi8vIENvaW5zIGVudGVyIG9ubHkgYXQgU2V0dGxlLCBhZnRlciB0aGUgc2V0IGhhcyBjbG9zZWQgYW5kIG5ldCBwb3NpdGlvbnMKLy8gYXJlIGZyb3plbi4gVGhpcyBpcyB3aHkgQ2FuY2VsIGFuZCBMYXBzZSBuZWVkIG5vIHJlZnVuZCBwYXRoIGF0IGFsbCDigJQKLy8gdGhlcmUgaXMgbm90aGluZyBoZWxkIHRvIHJlZnVuZCDigJQgYW5kIGl0IGlzIHRoZSBzaGFycGVzdCBkaWZmZXJlbmNlCi8vIGJldHdlZW4gdGhpcyByZWFsbSBhbmQgdGhlIGVzY3JvdyBmYW1pbHkgdGhlIGRpc2NvdmVyeSBnYXRlIGZvdW5kLgovLwovLyBORVQgUE9TSVRJT05TIEFSRSBNQUlOVEFJTkVEIElOQ1JFTUVOVEFMTFksIE5PVCBDT01QVVRFRCBBVCBDTE9TRS4KLy8gRWFjaCBEZWNsYXJlIGFwcGxpZXMgLWFtb3VudCB0byB0aGUgZGVidG9yIGFuZCArYW1vdW50IHRvIHRoZSBjcmVkaXRvcgovLyBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiwgc28gdGhlIHZlY3RvciBvZiBuZXQgcG9zaXRpb25zIHN1bXMgdG8gemVybwovLyBieSBjb25zdHJ1Y3Rpb24gYXQgZXZlcnkgaGVpZ2h0LiBDbG9zZSBhc3NlcnRzIHRoYXQgc3VtIGlzIHplcm8gYW55d2F5Ci8vIChuZXRzU3VtVG9aZXJvKSBiZWZvcmUgYSBzaW5nbGUgY29pbiBjYW4gYmUgYXNrZWQgZm9yLiBUaGUgYXNzZXJ0aW9uCi8vIGlzIHVucmVhY2hhYmxlIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkgYW5kIGlzIGtlcHQgYmVjYXVzZSBpdCBpcyB0aGUKLy8gb25lIGludmFyaWFudCB3aG9zZSB2aW9sYXRpb24gd291bGQgbWludCBvciBkZXN0cm95IHZhbHVlLgovLwovLyBUSEUgU0VUVExFTUVOVCBJUyBPTkUgREVGRVJSQUwuIE9wZW4gc2NoZWR1bGVzIGV4YWN0bHkgb25lIGR1ZWJvb2sKLy8gZGVmZXJyYWwgcGVyIHNldCDigJQgb3duZXI6IHRoZSBjb252ZW5vciwgZHVlOiB0aGUgZGVjbGFyYXRpb24gZGVhZGxpbmUsCi8vIGV4cGlyeTogdGhlIGVuZCBvZiB0aGUgY2xvc2luZyB3aW5kb3cg4oCUIGFuZCB0aGUgdGhyZWUgdHJhbnNpdGlvbnMgb3V0Ci8vIG9mIFtvcGVuXSBhcmUgdGhlIHRocmVlIHdheXMgdGhhdCBkZWZlcnJhbCBjYW4gYmUgY29uc3VtZWQ6Ci8vCi8vCUNsb3NlICAtPiBib29rLkNsYWltICAgKGR1ZSwgbm90IGV4cGlyZWQ7IEFOWU9ORSkKLy8JQ2FuY2VsIC0+IGJvb2suQ2FuY2VsICAoY29udmVub3IgcmVub3VuY2VzLCB3aGlsZSBvcGVuKQovLwlMYXBzZSAgLT4gYm9vay5FeHBpcmUgIChhbnlvbmUsIG9uY2UgdGhlIGNsb3Npbmcgd2luZG93IGlzIG92ZXIpCi8vCi8vIEJlY2F1c2UgZHVlYm9vayBjb25zdW1lcyBhIGRlZmVycmFsIGJlZm9yZSByZXR1cm5pbmcgYW5kIG5ldmVyIHJldXNlcwovLyBhbiBJRCwgYSBzZXQgY2FuIGxlYXZlIFtvcGVuXSBBVCBNT1NUIE9OQ0UsIHN0cnVjdHVyYWxseS4gVGhlIGJvb2sncwovLyBvcGVuLWRlZmVycmFsIGNhcCBpcyBsaWtld2lzZSB0aGlzIHJlYWxtJ3MgY2FwIG9uIG9wZW4gc2V0cy4KLy8KLy8gTElGRUNZQ0xFIChzdG9yZWQgc3RhdGVzIGluIGJyYWNrZXRzKToKLy8KLy8JT3BlbiAoYW55b25lKSAgICAgICAgICAgIDogb3BlbnMgW29wZW5dOyBjYWxsZXIgaXMgdGhlIGNvbnZlbm9yOwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXMgdGhlIGRlZmVycmFsLgovLwlBZG1pdCAoY29udmVub3IpICAgICAgICAgOiBhZGRzIGEgbWVtYmVyLCB3aGlsZSBbb3Blbl0uIEFkbWlzc2lvbgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmxpZ2F0ZXMgbm9ib2R5OiBpdCBvbmx5IG1ha2VzIGFuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgYSBsZWdhbCBlbmRwb2ludCBvZiBhIGRlY2xhcmF0aW9uLgovLwlEZWNsYXJlIChtZW1iZXIpICAgICAgICAgOiAiSSBvd2UgdGhpcyBtZW1iZXIgWCIuIENhbGxlciBpcyBBTFdBWVMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlYnRvciwgc28gYSBkZWNsYXJhdGlvbiBjYW4gb25seSBldmVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlIHRoZSBDQUxMRVIncyBvd24gbmV0IGRlYml0LiBObwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2lucyBtb3ZlLgovLwlDbG9zZSAoQU5ZT05FKSAgICAgICAgICAgOiBoZWlnaHQgaW4gW2RlYWRsaW5lLCBjbG9zZUVuZCkuIEZyZWV6ZXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlcnkgbmV0IHBvc2l0aW9uLiBuZXRWYWx1ZSA9PSAwIChhIGZ1bGx5Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmN1bGFyIGdyYXBoKSBzZXR0bGVzIG9uIHRoZSBzcG90IHdpdGgKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gY29pbnMgZXZlciBoZWxkIC0+IFtzZXR0bGVkXS4gT3RoZXJ3aXNlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtzZXR0bGluZ10gd2l0aCBhIHBheS1pbiB3aW5kb3cuCi8vCVNldHRsZSAobmV0IGRlYnRvciwrc2VuZCk6IGV4YWN0bHkgdGhlIGRlYnRvcidzIG93biBuZXQgZGViaXQsIG9uY2UsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFtzZXR0bGluZ10gYW5kIGJlZm9yZSBzZXR0bGVFbmQuIFRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IHBheW1lbnQgdGhhdCBjb21wbGV0ZXMgdGhlIHNldAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkaXRzIGV2ZXJ5IG5ldCBjcmVkaXRvciAtPiBbc2V0dGxlZF0uCi8vCUFiYW5kb24gKEFOWU9ORSkgICAgICAgICA6IFtzZXR0bGluZ10sIHNldHRsZUVuZCByZWFjaGVkLCBzdGlsbAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydC4gRXZlcnkgZGVidG9yIHdobyBwYWlkIGdldHMgZXhhY3RseQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IGl0IHBhaWQgYmFjaywgRkVFLUZSRUUgLT4gW2FiYW5kb25lZF0uCi8vCUNhbmNlbCAoY29udmVub3IpICAgICAgICA6IHdoaWxlIFtvcGVuXSAtPiBbY2FuY2VsbGVkXS4gTm8gY29pbnMgYXJlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQsIHNvIG5vdGhpbmcgaXMgcmVmdW5kZWQuCi8vCUxhcHNlIChBTllPTkUpICAgICAgICAgICA6IFtvcGVuXSBhbmQgY2xvc2VFbmQgcmVhY2hlZCAtPiBbbGFwc2VkXS4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBlcm1pc3Npb25sZXNzIHZhbHZlOiBhIHNldCBub2JvZHkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzIGNhbm5vdCBob2xkIGl0cyBkdWVib29rIHNsb3QKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZXZlci4KLy8JV2l0aGRyYXcgKGFueSBjcmVkaXRvcikgIDogdGhlIGNhbGxlcidzIHdob2xlIGNyZWRpdCBiYWxhbmNlLCBpbgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2lucy4gUHVsbC1vbmx5OyB0aGlzIHJlYWxtIG5ldmVyIHB1c2hlcy4KLy8JUHJ1bmUgKEFOWU9ORSkgICAgICAgICAgIDogcmVtb3ZlcyBhIHRlcm1pbmFsIHNldCBob2xkaW5nIG5vIGNvaW5zLgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZnJlZWQgc3RvcmFnZSBkZXBvc2l0IGlzIHJlZnVuZGVkIGJ5Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjaGFpbiB0byB0aGUgQ0FMTEVSLCB3aGljaCBpcyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jZW50aXZlIHRvIGNhbGwgaXQuCi8vCVdpdGhkcmF3RmVlcyAoQU5ZT05FKSAgICA6IHBheXMgdGhlIGFjY3J1ZWQgZmVlIHBvdCB0byB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZS10aW1lIEZlZUNvbGxlY3Rvci4KLy8JU3dlZXBTdXJwbHVzIChBTllPTkUpICAgIDogb3V0LW9mLWJhbmQgY29pbnMgdG8gdGhlIEZlZUNvbGxlY3RvciwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgdG91Y2hpbmcgdHJhY2tlZCBsaWFiaWxpdGllcy4KLy8KLy8gQUxMLU9SLU5PVEhJTkcsIEFORCBXSEFUIElUIENPU1RTOiBhIG5ldCBjcmVkaXRvciBpcyBjcmVkaXRlZCBvbmx5Ci8vIG9uY2UgRVZFUlkgbmV0IGRlYnRvciBoYXMgcGFpZCBpbiBmdWxsLiBPbmUgZGVmYXVsdGluZyBkZWJ0b3IKLy8gdGhlcmVmb3JlIGRlbmllcyBldmVyeSBjcmVkaXRvciBpbiB0aGF0IHNldCDigJQgYW5kIHRoZSBjb21wZW5zYXRpb24gaXMKLy8gdGhhdCBubyBjcmVkaXRvciBpcyBldmVyIGNyZWRpdGVkIGEgdWdub3QgdGhlIHJlYWxtIGRvZXMgbm90IGFscmVhZHkKLy8gaG9sZCwgYW5kIGV2ZXJ5IGRlYnRvciB3aG8gcGFpZCBnZXRzIGl0cyBtb25leSBiYWNrIGZlZS1mcmVlLiBBCi8vIHBhcnRpYWwtc2V0dGxlbWVudCBkZXNpZ24gd291bGQgcGF5IHNvbWUgY3JlZGl0b3JzIGZyb20gb3RoZXIKLy8gZGVidG9ycycgbW9uZXkgYW5kIG5lZWQgYSBydWxlIGZvciB3aG87IHRoZXJlIGlzIG5vIHN1Y2ggcnVsZSBoZXJlCi8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3VjaCBjYXNlLgovLwovLyBUSEUgRkVFLCBwcmVjaXNlbHk6IGZlZUJwcyBpcyBzbmFwc2hvdHRlZCBhdCBPcGVuIGZyb20gdGhlCi8vIGNvbXBpbGUtdGltZSBTZXR0bGVGZWVCcHMsIHNvIGEgc2V0J3MgdGVybXMgYXJlIGZpeGVkIHdoZW4gaXQgaXMKLy8gY3JlYXRlZCBhbmQgdmlzaWJsZSBpbiBTZXRJbmZvIGZyb20gdGhhdCBtb21lbnQuIEl0IGlzIGNoYXJnZWQgT05DRSwKLy8gYXQgdGhlIG1vbWVudCBhIHNldCBiZWNvbWVzIFtzZXR0bGVkXSwgb24gZWFjaCBuZXQgY3JlZGl0b3IncyBjcmVkaXQsCi8vIHdpdGggZmVlbGVkZ2VyJ3MgZmxvb3Igcm91bmRpbmcgKHJvdW5kaW5nIGZhdm9ycyB0aGUgY3JlZGl0b3IpLiBUaGUKLy8gbGVkZ2VyIGlzIGNvbnN0cnVjdGVkIHdpdGggdGhlIGNvbXBpbGUtdGltZSBNYXhGZWVCcHMgY2FwLCBzbyBhIGZlZQovLyBhYm92ZSB0aGUgY2FwIGlzIHJlZnVzZWQgYnkgdGhlIHByaW1pdGl2ZSwgbm90IGJ5IGEgY2hlY2sgaW4gdGhpcwovLyBmaWxlLiBUaGVyZSBpcyBubyBmZWUgb24gZGVjbGFyaW5nLCBubyBmZWUgb24gc2V0dGxpbmcsIGFuZCBOTyBGRUUgT04KLy8gQU5ZIEFCQU5ET04gUkVGVU5ELgovLwovLyBUSEVSRSBJUyBOTyBBRE1JTi4gVGhlIGZlZSByYXRlLCB0aGUgZmVlIGNvbGxlY3RvciwgZXZlcnkgYm91bmQgYW5kCi8vIGV2ZXJ5IHdpbmRvdyBhcmUgY29tcGlsZS10aW1lIGNvbnN0YW50czsgbm8gYWRkcmVzcyBjYW4gY2hhbmdlIHRlcm1zLAovLyBwYXVzZSB0aGUgcmVhbG0sIG9yIHRvdWNoIGEgc2V0IGl0IGRvZXMgbm90IGNvbnZlbmUuIFRoZSBjb252ZW5vcidzCi8vIG9ubHkgcG93ZXJzIGFyZSBhZG1pdHRpbmcgbWVtYmVycyBhbmQgY2FuY2VsbGluZyBpdHMgb3duIHNldCB3aGlsZSBpdAovLyBpcyBvcGVuIOKAlCBuZWl0aGVyIG9mIHdoaWNoIGNhbiBtb3ZlIGEgY29pbi4gVGhlIGRlcGxveWVyIGhhcyBubwovLyBwcml2aWxlZ2Ugb2YgYW55IGtpbmQgYWZ0ZXIgZGVwbG95bWVudC4KLy8KLy8gTU9ORVRBUlkgSU5WQVJJQU5UIChjb25zZXJ2YXRpb24pOiBsZXQgSCBiZSB0aGUgdWdub3QgaGVsZCBhdCB0aGlzCi8vIHJlYWxtJ3MgYWRkcmVzcywgUCB0aGUgc3VtIG9mIGNvaW5zIHBhaWQgaW4gZm9yIHNldHMgc3RpbGwgW3NldHRsaW5nXQovLyAodHJhY2tlZCBPKDEpIGFzIHRvdGFsUGVuZGluZyksIEwgdGhlIGxlZGdlcidzIGxpYWJpbGl0aWVzICh1bmNsYWltZWQKLy8gY3JlZGl0b3IgY3JlZGl0cywgdW5jbGFpbWVkIGFiYW5kb24gcmVmdW5kcywgYW5kIHRoZSBmZWUgcG90KSwgYW5kCi8vIFMgPj0gMCB0aGUgb3V0LW9mLWJhbmQgc3VycGx1czoKLy8KLy8JSCA9PSBQICsgTCArIFMKLy8KLy8gRXZlcnkgdHJhbnNpdGlvbiBtb3ZlcyB2YWx1ZSBiZXR3ZWVuIGV4YWN0bHkgdHdvIHRlcm1zIGluc2lkZSBvbmUKLy8gdHJhbnNhY3Rpb246IFNldHRsZSByYWlzZXMgSCBhbmQgUCB0b2dldGhlciAoY29pbmlvLlJlY2VpdmUgaXMgdGhlCi8vIHJlY2VpcHQtZ3VhcmFudGVlZCBzaGFwZSk7IGNvbXBsZXRpbmcgYSBzZXQgbW92ZXMgbmV0VmFsdWUgb3V0IG9mIFAKLy8gYW5kIGludG8gTCwgc3BsaXQgaW50byBjcmVkaXRvciBjcmVkaXRzIGFuZCB0aGUgZmVlOyBBYmFuZG9uIG1vdmVzCi8vIHBhaWRJbiBvdXQgb2YgUCBhbmQgaW50byBMIGZlZS1mcmVlOyBXaXRoZHJhdyBhbmQgV2l0aGRyYXdGZWVzIGRlYml0IEwKLy8gYmVmb3JlIHRoZSBpZGVudGljYWwgYW1vdW50IGxlYXZlcyBIIChjaGVja3MtZWZmZWN0cy1pbnRlcmFjdGlvbnMpOwovLyBhbnkgcGFuaWMgYWJvcnRzIHRoZSB3aG9sZSB0cmFuc2FjdGlvbjsgdGhpcyByZWFsbSBuZXZlciBpc3N1ZXMgb3IKLy8gcmVtb3ZlcyBjb2lucy4KLy8KLy8gT05MWSBHTk9UIElTIEFDQ0VQVEVEOiBTZXR0bGUgcmVqZWN0cyBhbnkgZW52ZWxvcGUgdGhhdCBpcyBub3QgZXhhY3RseQovLyBvbmUgcG9zaXRpdmUgdWdub3QgY29pbiAoY29pbmlvLlJlY2VpdmUpLiBFdmVyeSBvdGhlciBlbnRyeXBvaW50Ci8vIHJlamVjdHMgYXR0YWNoZWQgY29pbnMgb3V0cmlnaHQgcmF0aGVyIHRoYW4gY29udmVydGluZyB0aGVtIGludG8KLy8gc3dlZXBhYmxlIHN1cnBsdXMuCi8vCi8vIEFVVEhPUklaQVRJT046IGV2ZXJ5IGlkZW50aXR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgY3Jvc3NpbmcKLy8gZW50cnlwb2ludCdzIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS4gTm8gZnVuY3Rpb24gdGFrZXMgYSBjYWxsZXIKLy8gaWRlbnRpdHkgYXMgYSBwYXJhbWV0ZXIsIHNvIGRlY2xhcmluZyBhIGRlYnQgYXMgYW5vdGhlciBtZW1iZXIsCi8vIHNldHRsaW5nIGFub3RoZXIgbWVtYmVyJ3MgbmV0IGRlYml0LCBvciB3aXRoZHJhd2luZyBhbm90aGVyCi8vIGNyZWRpdG9yJ3MgYmFsYW5jZSBpcyBpbXBvc3NpYmxlIGJ5IGNvbnN0cnVjdGlvbi4KLy8KLy8gU1RPUkFHRTogYSBzZXQgcmVjb3JkIGlzIHBhaWQgZm9yIGJ5IHRoZSBjb252ZW5vcidzIHRyYW5zYWN0aW9uCi8vIGRlcG9zaXQsIGEgbWVtYmVyIHJlY29yZCBieSB0aGUgY29udmVub3IncyBBZG1pdCwgYW5kIGEgcGFpciByZWNvcmQgYnkKLy8gdGhlIGRlY2xhcmluZyBkZWJ0b3IncyBvd24gdHJhbnNhY3Rpb24uIENvbXBsZXRpbmcgb3IgYWJhbmRvbmluZyBhIHNldAovLyBkcm9wcyBub3RoaW5nOyBQcnVuZSByZW1vdmVzIHRoZSB3aG9sZSB0ZXJtaW5hbCByZWNvcmQsIGFuZCB0aGUgY2hhaW4KLy8gcmVmdW5kcyB0aGUgZnJlZWQgZGVwb3NpdCB0byB0aGUgdHJhbnNhY3Rpb24gdGhhdCBmcmVlcyBpdC4KcGFja2FnZSBuZXR0aW5nCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZHVlYm9vayIKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZmVlbGVkZ2VyIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9uZXR0aW5nIgoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBob2xkcy4KY29uc3QgRGVub20gPSAidWdub3QiCgovLyBNYXhGZWVCcHMgaXMgdGhlIGhhcmQgY2VpbGluZyBvbiBhbnkgZmVlIHRoaXMgcmVhbG0gY291bGQgZXZlciBjaGFyZ2UsCi8vIGVuZm9yY2VkIGJ5IHRoZSBmZWVsZWRnZXIgdGhlIHJlYWxtIGlzIGNvbnN0cnVjdGVkIHdpdGgg4oCUIGEgZmVlQnBzCi8vIGFib3ZlIGl0IGlzIHJlZnVzZWQgYnkgdGhlIHByaW1pdGl2ZSdzIG93biB2YWxpZGF0aW9uLCBub3QgYnkgYSBjaGVjawovLyBpbiB0aGlzIGZpbGUuIDUwMCBicHMgPSA1JS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoNTAwKQoKLy8gU2V0dGxlRmVlQnBzIGlzIHRoZSBmZWUgYWN0dWFsbHkgc25hcHNob3R0ZWQgaW50byBldmVyeSBzZXQgYXQgT3BlbjoKLy8gMTAwIGJwcyA9IDElLCBjaGFyZ2VkIG9uY2UsIHdoZW4gdGhlIHNldCBiZWNvbWVzIHNldHRsZWQsIG9uIGVhY2ggbmV0Ci8vIGNyZWRpdG9yJ3MgY3JlZGl0LCBmbG9vci1yb3VuZGVkIGluIHRoZSBjcmVkaXRvcidzIGZhdm9yLiAxJSBpcyB0aGUKLy8gbW9zdCBjb25zZXJ2YXRpdmUgbGl2ZSBmZWUgaW4gdGhpcyBwb3J0Zm9saW8gKGZlZV9zcGxpdCBwcmVjZWRlbnQpIGFuZAovLyBpcyB3aGF0IGNyb3dkZnVuZCBjaGFyZ2VzLgpjb25zdCBTZXR0bGVGZWVCcHMgPSBpbnQ2NCgxMDApCgovLyBGZWVDb2xsZWN0b3IgcmVjZWl2ZXMgd2l0aGRyYXduIGZlZXMgYW5kIHN3ZXB0IHN1cnBsdXMuIENvbXBpbGUtdGltZQovLyBjb25zdGFudDogdGhlcmUgaXMgbm8gc2V0dGVyIGFuZCBubyB0cmFuc2ZlciBwYXRoLiBJdCBpcyB0aGUgZGVwbG95aW5nCi8vIG5hbWVzcGFjZSdzIGFkZHJlc3Mg4oCUIHN0YXRlZCBwbGFpbmx5OiB0aGUgb3BlcmF0b3Igb2YgdGhpcyByZWFsbS4KY29uc3QgRmVlQ29sbGVjdG9yID0gYWRkcmVzcygiZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMyIpCgovLyBNaW5PYmxpZ2F0aW9uIGtlZXBzIGR1c3QgZGVjbGFyYXRpb25zIG91dCBvZiB0aGUgZ3JhcGg6IDAuMDAxIEdOT1QuCi8vIERlY2xhcmluZyBjb3N0cyBubyBjb2lucywgc28gdGhlIG9ubHkgdGhpbmcgYSBkdXN0IGRlY2xhcmF0aW9uIHdhc3RlcwovLyBpcyB0aGUgZGVjbGFyZXIncyBvd24gc3RvcmFnZSBkZXBvc2l0IOKAlCBidXQgYSBncmFwaCBmdWxsIG9mIDEtdWdub3QKLy8gZWRnZXMgbWFrZXMgdGhlIGNvbXByZXNzaW9uIGZpZ3VyZXMgbWVhbmluZ2xlc3MsIHdoaWNoIGlzIHRoZSBvdXRwdXQKLy8gdGhpcyByZWFsbSBleGlzdHMgdG8gcHJvZHVjZS4KY29uc3QgTWluT2JsaWdhdGlvbiA9IGludDY0KDFfMDAwKQoKLy8gTWF4TWVtYmVycyBjYXBzIG9uZSBzZXQncyBtZW1iZXJzaGlwLiBDbG9zZSBpdGVyYXRlcyB0aGUgbWVtYmVyIHRyZWUKLy8gdHdpY2UgKG9uY2UgdG8gYXNzZXJ0IHRoZSBuZXRzIHN1bSB0byB6ZXJvLCBvbmNlIHRvIGZyZWV6ZSBwb3NpdGlvbnMpLAovLyBhbmQgY29tcGxldGluZyBhIHNldCBpdGVyYXRlcyBpdCBvbmNlIG1vcmUgdG8gY3JlZGl0IGNyZWRpdG9ycywgc28KLy8gdGhpcyBpcyB0aGUgYm91bmQgdGhhdCBrZWVwcyBldmVyeSBPKE0pIHBhc3MgaW5zaWRlIGEgdHJhbnNhY3Rpb24ncwovLyBnYXMuIDMyIGlzIGRlbGliZXJhdGVseSBtb2Rlc3Q6IGEgY2xlYXJpbmcgc2V0IGlzIGEgY291bnRlcnBhcnR5Ci8vIGdyb3VwLCBub3QgYSBwb3B1bGF0aW9uLgpjb25zdCBNYXhNZW1iZXJzID0gMzIKCi8vIE1heFBhaXJzIGNhcHMgdGhlIERJU1RJTkNUIG9yZGVyZWQgKGRlYnRvciwgY3JlZGl0b3IpIHBhaXJzIG9uZSBzZXQKLy8gbWF5IGhvbGQuIERlY2xhcmF0aW9ucyB0aGVtc2VsdmVzIGFyZSB1bmJvdW5kZWQgaW4gY291bnQg4oCUIGEgcmVwZWF0Ci8vIGRlY2xhcmF0aW9uIGJldHdlZW4gYW4gZXhpc3RpbmcgcGFpciBhY2N1bXVsYXRlcyBpbnRvIHRoYXQgcGFpcidzCi8vIHJlY29yZCBhbmQgYWxsb2NhdGVzIG5vdGhpbmcg4oCUIHNvIHRoaXMgYm91bmRzIHN0b3JhZ2UsIG5vdCBhY3Rpdml0eS4KLy8gTWF4TWVtYmVycyooTWF4TWVtYmVycy0xKSA9PSA5OTIgaXMgdGhlIGNvbXBsZXRlIGRpZ3JhcGg7IDI1NiBpcyBhCi8vIGRlbGliZXJhdGUgZnJhY3Rpb24gb2YgaXQuCmNvbnN0IE1heFBhaXJzID0gMjU2Cgpjb25zdCAoCgkvLyBNaW5EZWNsYXJlQmxvY2tzIGFuZCBNYXhEZWNsYXJlQmxvY2tzIGJvdW5kIHRoZSBkZWNsYXJhdGlvbgoJLy8gd2luZG93LCBpbiBibG9ja3MsIGFuZCBhcmUgZW5mb3JjZWQgYnkgdGhlIGR1ZWJvb2sncyBvd24gU2NoZWR1bGUKCS8vIHZhbGlkYXRpb24gcmF0aGVyIHRoYW4gYnkgYSBjaGVjayBpbiB0aGlzIGZpbGUuCglNaW5EZWNsYXJlQmxvY2tzID0gaW50NjQoMV8yMDApCglNYXhEZWNsYXJlQmxvY2tzID0gaW50NjQoMV8zMDBfMDAwKQopCgovLyBDbG9zZVdpbmRvd0Jsb2NrcyBpcyBob3cgbG9uZyBhZnRlciB0aGUgZGVhZGxpbmUgYSBzZXQgbWF5IHN0aWxsIGJlCi8vIGNsb3NlZC4gUGFzdCBpdCwgQ2xvc2UgaXMgaW1wb3NzaWJsZSAodGhlIGRlZmVycmFsIGhhcyBleHBpcmVkKSBhbmQKLy8gTGFwc2UgaXMgdGhlIG9ubHkgd2F5IG91dCDigJQgd2hpY2ggc3RyYW5kcyBubyBtb25leSwgYmVjYXVzZSBhbiBvcGVuCi8vIHNldCBob2xkcyBub25lLgpjb25zdCBDbG9zZVdpbmRvd0Jsb2NrcyA9IGludDY0KDY1MF8wMDApCgovLyBTZXR0bGVXaW5kb3dCbG9ja3MgaXMgaG93IGxvbmcgbmV0IGRlYnRvcnMgaGF2ZSB0byBwYXkgaW4gYWZ0ZXIgYSBzZXQKLy8gY2xvc2VzLiBQYXN0IGl0LCBBYmFuZG9uIHJlZnVuZHMgZXZlcnkgcGF5ZXIgZmVlLWZyZWUuCmNvbnN0IFNldHRsZVdpbmRvd0Jsb2NrcyA9IGludDY0KDY1MF8wMDApCgovLyBNYXhPcGVuU2V0cyBjYXBzIHNpbXVsdGFuZW91c2x5IG9wZW4gc2V0cywgdmlhIHRoZSBkdWVib29rJ3Mgb3duCi8vIG9wZW4tZGVmZXJyYWwgY2FwLiBUaGUgQVZBSUxBQklMSVRZIEJPVU5EIHRoaXMgaW1wbGllcyBpcyBzdGF0ZWQKLy8gcmF0aGVyIHRoYW4gaGlkZGVuOiB3aGVuIHRoZSBib29rIGlzIGZ1bGwsIE9wZW4gZmFpbHMgdW50aWwgYSBzZXQgaXMKLy8gY2xvc2VkLCBjYW5jZWxsZWQgb3IgbGFwc2VkLiBTZXR0bGluZyBhbmQgdGVybWluYWwgc2V0cyBkbyBub3Qgb2NjdXB5Ci8vIGEgc2xvdCDigJQgdGhlaXIgZGVmZXJyYWwgaXMgYWxyZWFkeSBjb25zdW1lZC4KY29uc3QgTWF4T3BlblNldHMgPSAxMDI0CgovLyBNYXhPcGVuUGVyQ29udmVub3IgYm91bmRzIGhvdyBtdWNoIG9mIHRoZSBnbG9iYWwgY2FwIG9uZSBjb252ZW5vciBtYXkKLy8gb2NjdXB5IChwZXJtaXNzaW9uX3JlZ2lzdHJ5IFIxIHByZWNlZGVudDogYW4gdW5jYXBwZWQgcGVyLXByaW5jaXBhbAovLyBzaGFyZSBvZiBhIGdsb2JhbCBjYXAgaXMgYSBncmllZmluZyB2ZWN0b3IsIG5vdCBhIGZlYXR1cmUpLgpjb25zdCBNYXhPcGVuUGVyQ29udmVub3IgPSA2NAoKY29uc3QgKAoJLy8gTWF4TGFiZWxMZW4gYW5kIE1heE1lbW9MZW4gYm91bmQgdGhlIGZyZWUgdGV4dCBhIHNldCBjYXJyaWVzLiBCb3RoCgkvLyBhcmUgc2FuaXRpemVkIGJlZm9yZSB0aGV5IHJlYWNoIFJlbmRlci4KCU1heExhYmVsTGVuID0gMTAwCglNYXhNZW1vTGVuICA9IDI1NgopCgovLyBNYXhSZW5kZXJSb3dzIGJvdW5kcyB0aGUgbGlzdCBsZW5ndGggb24gdGhlIHJlbmRlciBwYWdlcy4KY29uc3QgTWF4UmVuZGVyUm93cyA9IDUwCgovLyBzZXQgc3RhdGVzLiAib3BlbiIgYW5kICJzZXR0bGluZyIgYXJlIHRoZSB0d28gbm9uLXRlcm1pbmFsIHN0YXRlczsKLy8gInNldHRsaW5nIiBpcyB0aGUgb25seSBzdGF0ZSBpbiB3aGljaCB0aGlzIHJlYWxtIGhvbGRzIGNvaW5zIGZvciBhCi8vIHNldC4KY29uc3QgKAoJc3RhdGVPcGVuICAgICAgPSAib3BlbiIKCXN0YXRlU2V0dGxpbmcgID0gInNldHRsaW5nIgoJc3RhdGVTZXR0bGVkICAgPSAic2V0dGxlZCIKCXN0YXRlQWJhbmRvbmVkID0gImFiYW5kb25lZCIKCXN0YXRlQ2FuY2VsbGVkID0gImNhbmNlbGxlZCIKCXN0YXRlTGFwc2VkICAgID0gImxhcHNlZCIKKQoKLy8gbWVtYmVyIGlzIG9uZSBwYXJ0eSB0byBhIG5ldHRpbmcgc2V0LgovLwovLyBuZXQgaXMgbWFpbnRhaW5lZCBpbmNyZW1lbnRhbGx5IGJ5IERlY2xhcmUgYW5kIGlzIHRoZSB3aG9sZSBvZiB0aGUKLy8gbmV0dGluZyBhcml0aG1ldGljOiBwb3NpdGl2ZSBtZWFucyB0aGUgbWVtYmVyIGlzIG93ZWQgdGhhdCBtdWNoIG9uCi8vIGJhbGFuY2UsIG5lZ2F0aXZlIG1lYW5zIGl0IG93ZXMgdGhhdCBtdWNoLiBkZWJpdCBhbmQgY3JlZGl0IGFyZQovLyBGUk9aRU4gQVQgQ0xPU0UgZnJvbSBuZXQsIHNvIHRoYXQgdGhlIHNldHRsZW1lbnQgZmlndXJlcyBjYW5ub3QgbW92ZQovLyBhZnRlciBjb2lucyBoYXZlIGJlZW4gYXNrZWQgZm9yLgp0eXBlIG1lbWJlciBzdHJ1Y3QgewoJYWRkciAgIGFkZHJlc3MKCW5ldCAgICBpbnQ2NCAvLyArIG93ZWQgdG8gdGhlbSwgLSB0aGV5IG93ZTsgbGl2ZSB3aGlsZSBbb3Blbl0KCWRlYml0ICBpbnQ2NCAvLyBmcm96ZW4gYXQgQ2xvc2U6IC1uZXQgd2hlbiBuZXQgPCAwLCBlbHNlIDAKCWNyZWRpdCBpbnQ2NCAvLyBmcm96ZW4gYXQgQ2xvc2U6IG5ldCB3aGVuIG5ldCA+IDAsIGVsc2UgMAoJcGFpZCAgIGludDY0IC8vIGNvaW5zIHJlY2VpdmVkIGZyb20gdGhpcyBtZW1iZXIgZHVyaW5nIFtzZXR0bGluZ10KCglncm9zc091dCBpbnQ2NCAvLyBncm9zcyBkZWNsYXJlZCBCWSB0aGVtIChmb3IgdGhlIGNvbXByZXNzaW9uIHZpZXcpCglncm9zc0luICBpbnQ2NCAvLyBncm9zcyBkZWNsYXJlZCBUT1dBUkQgdGhlbQp9Cgp0eXBlIHNldCBzdHJ1Y3QgewoJaWQgICAgICAgIGludDY0Cgljb252ZW5vciAgYWRkcmVzcwoJbGFiZWwgICAgIHN0cmluZwoJbWVtbyAgICAgIHN0cmluZwoJZmVlQnBzICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGF0IE9wZW4KCWNyZWF0ZWRBdCBpbnQ2NAoJZGVhZGxpbmUgIGludDY0IC8vIGNyZWF0ZWRBdCArIGRlY2xhcmVCbG9ja3M7IGRlY2xhcmluZyB3aGlsZSBoZWlnaHQgPCBkZWFkbGluZQoJY2xvc2VFbmQgIGludDY0IC8vIGRlYWRsaW5lICsgQ2xvc2VXaW5kb3dCbG9ja3M7ID09IGRlZmVycmFsIEV4cGlyZXNBdAoJc2V0dGxlRW5kIGludDY0IC8vIHNldCBhdCBDbG9zZTsgMCB3aGlsZSBbb3Blbl0KCWRlZklEICAgICB1aW50NjQKCXN0YXRlICAgICBzdHJpbmcKCgltZW1iZXJzICAgKmF2bC5UcmVlIC8vIG1lbWJlciBhZGRyZXNzIHN0cmluZyAtPiAqbWVtYmVyCglwYWlycyAgICAgKmF2bC5UcmVlIC8vIHBhaXJLZXkoZGVidG9yLCBjcmVkaXRvcikgLT4gaW50NjQgKD4gMCkKCXBhaXJDb3VudCBpbnQKCglncm9zc0NvdW50IGludDY0IC8vIGRlY2xhcmF0aW9ucyBhY2NlcHRlZAoJZ3Jvc3NWYWx1ZSBpbnQ2NCAvLyBzdW0gb2YgZXZlcnkgZGVjbGFyZWQgYW1vdW50CgoJLy8gZnJvemVuIGF0IENsb3NlLgoJbmV0VHJhbnNmZXJDb3VudCBpbnQ2NCAvLyBtZW1iZXJzIHdpdGggYSBub24temVybyBuZXQgcG9zaXRpb24KCW5ldFZhbHVlICAgICAgICAgaW50NjQgLy8gdG90YWwgbmV0IGRlYml0cyA9PSB0b3RhbCBuZXQgY3JlZGl0cwoJY2xvc2VkQXQgICAgICAgICBpbnQ2NAoKCXBhaWRJbiBpbnQ2NCAvLyBjb2lucyBjdXJyZW50bHkgaGVsZCBmb3IgdGhpcyBzZXQ7IDAgdW5sZXNzIFtzZXR0bGluZ10KfQoKdmFyICgKCXNlbGYgYWRkcmVzcwoKCXNldHMgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpIC0+ICpzZXQKCW5leHRJRCBpbnQ2NAoKCS8vIG9wZW5CeUNvbnZlbm9yIHRyYWNrcyBlYWNoIGNvbnZlbm9yJ3Mgc3RpbGwtb3BlbiBzZXRzOgoJLy8gYWRkcmVzcyBzdHJpbmcgLT4gaW50NjQgY291bnQgKD4gMCkuCglvcGVuQnlDb252ZW5vciA9IGF2bC5OZXdUcmVlKCkKCgkvLyB0b3RhbFBlbmRpbmcgaXMgdGhlIFAgdGVybSBvZiBIID09IFAgKyBMICsgUzogdGhlIHN1bSBvZiBwYWlkSW4KCS8vIGFjcm9zcyBldmVyeSBzZXQsIG1haW50YWluZWQgTygxKSBhdCBldmVyeSB0cmFuc2l0aW9uLiBPbmx5IGEKCS8vIFtzZXR0bGluZ10gc2V0IGNhbiBoYXZlIGEgbm9uLXplcm8gcGFpZEluLgoJdG90YWxQZW5kaW5nIGludDY0CgoJLy8gbGlmZXRpbWUgY291bnRlcnMsIHJlbmRlcmVkIGZvciBvcGVyYXRvcnMuCglsaWZldGltZVNldHMgICAgICAgaW50NjQgLy8gc2V0cyB0aGF0IHJlYWNoZWQgW3NldHRsZWRdCglsaWZldGltZUdyb3NzVmFsdWUgaW50NjQgLy8gZGVjbGFyZWQgdmFsdWUgYWNyb3NzIGV2ZXJ5IGNsb3NlZCBzZXQKCWxpZmV0aW1lTmV0VmFsdWUgICBpbnQ2NCAvLyBuZXQgdmFsdWUgYWNyb3NzIGV2ZXJ5IGNsb3NlZCBzZXQKCWxpZmV0aW1lU2V0dGxlZEluICBpbnQ2NCAvLyBjb2lucyBwYWlkIGluIGJ5IG5ldCBkZWJ0b3JzCglsaWZldGltZUNyZWRpdGVkICAgaW50NjQgLy8gY3JlZGl0ZWQgdG8gbmV0IGNyZWRpdG9ycywgbmV0IG9mIGZlZQoJbGlmZXRpbWVSZWZ1bmRlZCAgIGludDY0IC8vIHJldHVybmVkIGJ5IEFiYW5kb24sIGZlZS1mcmVlCglsaWZldGltZVdpdGhkcmF3biAgaW50NjQgLy8gcGFpZCBvdXQgb2YgdGhlIGxlZGdlciB0byBjcmVkaXRvcnMKCgkvLyBsZWRnZXIgY2FycmllcyBCT1RIIHRoZSBuZXQtY3JlZGl0b3IgY3JlZGl0cyBhbmQgdGhlIGFiYW5kb24KCS8vIHJlZnVuZHMsIHdoaWNoIGlzIHdoYXQgY29sbGFwc2VzIHR3byBsaWFiaWxpdHkgYnVja2V0cyBpbnRvIG9uZQoJLy8gdHJhY2tlZCBMaWFiaWxpdGllcygpIHRlcm0uIEl0IGFsc28gb3ducyB0aGUgZmVlIGNhcCBhbmQgdGhlIGZlZQoJLy8gcG90LgoJbGVkZ2VyID0gZmVlbGVkZ2VyLk11c3ROZXcoTWF4RmVlQnBzKQoKCS8vIGJvb2sgaG9sZHMgb25lIG9wZW4gZGVmZXJyYWwgcGVyIG9wZW4gc2V0LiBUaGUgZGVjbGFyYXRpb24td2luZG93CgkvLyBib3VuZHMgYXJlIHRoZSBwcmltaXRpdmUncyBvd24gdmFsaWRhdGlvbjogYSB3aW5kb3cgb3V0c2lkZQoJLy8gW01pbkRlY2xhcmVCbG9ja3MsIE1heERlY2xhcmVCbG9ja3NdIGlzIHJlZnVzZWQgYnkgU2NoZWR1bGUuCglib29rID0gZHVlYm9vay5NdXN0TmV3KE1pbkRlY2xhcmVCbG9ja3MsIE1heERlY2xhcmVCbG9ja3MsIE1heE9wZW5TZXRzKQopCgpmdW5jIGluaXQoKSB7CglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgbm9uLXBheWFibGUgY2FsbC4KLy8gVGhpcyByZWFsbSBob2xkcyBmdW5kcywgc28gYSBzdHJheSBzZW5kIHdvdWxkIGJlY29tZSBzd2VlcGFibGUKLy8gc3VycGx1cywgc2lsZW50bHkgY29udmVydGluZyBhIHVzZXIncyBjb2lucyBpbnRvIG9wZXJhdG9yIGZ1bmRzLgovLyBBYm9ydGluZyByZXZlcnRzIHRoZSB0cmFuc2ZlciBpbnN0ZWFkLiBHdWFyZGVkIG9uIElzVXNlckNhbGwsIG5vdAovLyBJc1VzZXIsIGJlY2F1c2UgYSBNc2dSdW4gZXBoZW1lcmFsIGNhbiBjb25zdW1lIHRoZSBPcmlnaW5TZW5kIGVudmVsb3BlCi8vIGJlZm9yZSBmb3J3YXJkaW5nIGNvbnRyb2w7IGZvciBhIHJlYWxtLXJvdXRlZCBjYWxsIHRoZSBlbnZlbG9wZSBsYW5kcwovLyBhdCB0aGUgaW50ZXJtZWRpYXJ5LCBzbyB0aGVyZSBpcyBub3RoaW5nIGhlcmUgdG8gcmVqZWN0IGFuZCB0aGUgZ3VhcmQKLy8gZGVsaWJlcmF0ZWx5IGZhaWxzIG9wZW4gKGNyb3dkZnVuZCBhbmQgdHJlYXN1cnlfYm9hcmQgZG9jdW1lbnQgdGhlCi8vIHNhbWUgc2NvcGUpLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCS8vIEV2ZXJ5IGNhbGwgc2l0ZSBmb3J3YXJkcyBhIGNyb3NzaW5nIGVudHJ5cG9pbnQncyBvd24gbGl2ZSBjdXIsCgkJLy8gc28gdGhpcyBjYW5ub3QgZmlyZSB0b2RheTsgaXQgZXhpc3RzIHNvIGEgZnV0dXJlIHJlZmFjdG9yIHRoYXQKCQkvLyBoYW5kcyB0aGlzIGd1YXJkIGEgc3RhbGUgcmVhbG0gdmFsdWUgZmFpbHMgY2xvc2VkLCBub3Qgb3BlbgoJCS8vIChjb2luaW8gbmFtZXMgSXNDdXJyZW50IGFzIHRoZSBndWFyZCBzZWNvbmRhcnkgcmVhbG0KCQkvLyBwYXJhbWV0ZXJzIHJlcXVpcmUsIGFuZCB0aGlzIGhlbHBlciBmb2xsb3dzIHRoYXQgZGlzY2lwbGluZSkuCgkJcGFuaWMoIm5ldHRpbmc6IHJlYWxtIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIGVudHJ5cG9pbnQgZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKLy8gLS0tIHNldCBsaWZlY3ljbGUgLS0tCgovLyBPcGVuIGNvbnZlbmVzIGEgbmV0dGluZyBzZXQgYW5kIHJldHVybnMgaXRzIGlkLiBBbnlvbmUgbWF5IG9wZW4gb25lOwovLyB0aGUgY2FsbGVyIGJlY29tZXMgdGhlIGNvbnZlbm9yLiBUaGUgZmVlIHRlcm1zIChTZXR0bGVGZWVCcHMgYXQgdGhpcwovLyBtb21lbnQg4oCUIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBzbyBhbHdheXMgU2V0dGxlRmVlQnBzKSBhcmUKLy8gc25hcHNob3R0ZWQgaW50byB0aGUgc2V0IGFuZCBhcmUgZml4ZWQgZnJvbSBoZXJlIG9uLiBkZWNsYXJlQmxvY2tzIGlzCi8vIHRoZSBsZW5ndGggb2YgdGhlIGRlY2xhcmF0aW9uIHdpbmRvdyBhbmQgbXVzdCBiZSB3aXRoaW4KLy8gW01pbkRlY2xhcmVCbG9ja3MsIE1heERlY2xhcmVCbG9ja3NdIOKAlCBlbmZvcmNlZCBieSB0aGUgZHVlYm9vay4KLy8KLy8gVGhlIGNvbnZlbm9yIGlzIE5PVCBhdXRvbWF0aWNhbGx5IGEgbWVtYmVyLiBBIGNvbnZlbm9yIHRoYXQgd2FudHMgdG8KLy8gbmV0IGl0cyBvd24gb2JsaWdhdGlvbnMgbXVzdCBBZG1pdCBpdHNlbGYsIHdoaWNoIGtlZXBzICJ3aG8gcnVucyB0aGUKLy8gc2V0IiBhbmQgIndobyBpcyBwYXJ0eSB0byBpdCIgc2VwYXJhdGUgY29uY2VwdHMuCmZ1bmMgT3BlbihjdXIgcmVhbG0sIGxhYmVsLCBtZW1vIHN0cmluZywgZGVjbGFyZUJsb2NrcyBpbnQ2NCkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNvbnZlbm9yIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCWlmIGxhYmVsID09ICIiIHsKCQlwYW5pYygibGFiZWwgbXVzdCBub3QgYmUgZW1wdHkiKQoJfQoJaWYgbGVuKGxhYmVsKSA+IE1heExhYmVsTGVuIHsKCQlwYW5pYygibGFiZWwgZXhjZWVkcyAiICsgc3RyY29udi5JdG9hKE1heExhYmVsTGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgbGVuKG1lbW8pID4gTWF4TWVtb0xlbiB7CgkJcGFuaWMoIm1lbW8gZXhjZWVkcyAiICsgc3RyY29udi5JdG9hKE1heE1lbW9MZW4pICsgIiBieXRlcyIpCgl9CgoJa2V5IDo9IGNvbnZlbm9yLlN0cmluZygpCglpZiBjb252ZW5vck9wZW4oa2V5KSA+PSBNYXhPcGVuUGVyQ29udmVub3IgewoJCXBhbmljKCJjb252ZW5vciBhbHJlYWR5IGhhcyAiICsgc3RyY29udi5JdG9hKE1heE9wZW5QZXJDb252ZW5vcikgKwoJCQkiIG9wZW4gc2V0cyIpCgl9CgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWQgOj0gbmV4dElEICsgMQoKCS8vIFRoZSBkZWZlcnJhbCBpcyB0aGUgc2V0dGxlbWVudCBhdXRob3JpemF0aW9uOiBkdWUgYXQgdGhlCgkvLyBkZWNsYXJhdGlvbiBkZWFkbGluZSwgZXhwaXJpbmcgd2hlbiB0aGUgY2xvc2luZyB3aW5kb3cgZW5kcy4KCS8vIFdpbmRvdyBib3VuZHMgYW5kIHRoZSBnbG9iYWwgb3Blbi1zZXQgY2FwIGFyZSBlbmZvcmNlZCBoZXJlIGJ5IHRoZQoJLy8gcHJpbWl0aXZlLgoJLy8KCS8vIG5leHRJRCBhZHZhbmNlcyBvbmx5IEFGVEVSIHRoZSBkZWZlcnJhbCBleGlzdHMuIE9uIGNoYWluIHRoZQoJLy8gZGlzdGluY3Rpb24gaXMgaW52aXNpYmxlIOKAlCBhIHBhbmljIHJldmVydHMgdGhlIHdob2xlIHRyYW5zYWN0aW9uIOKAlAoJLy8gYnV0IGl0IGtlZXBzICJhbiBpZCB3YXMgaXNzdWVkIiBhbmQgImEgc2V0IGV4aXN0cyIgZnJvbSBkaXZlcmdpbmcKCS8vIHVuZGVyIGFueSBmdXR1cmUgcmVmYWN0b3IgdGhhdCByZWNvdmVycyBpbnN0ZWFkIG9mIGFib3J0aW5nLCBhbmQgaXQKCS8vIGlzIHdoYXQgbGV0cyB0aGUgdGVzdCBzdWl0ZSBhc3NlcnQgYW4gZXhhY3QgaWQgYWZ0ZXIgYSByZWZ1c2VkIE9wZW4uCglkZWZJRCA6PSBib29rLk11c3RTY2hlZHVsZShrZXksIGl0b2EoaWQpLCBub3csIGRlY2xhcmVCbG9ja3MsIENsb3NlV2luZG93QmxvY2tzKQoJbmV4dElEID0gaWQKCglzIDo9ICZzZXR7CgkJaWQ6ICAgICAgICBpZCwKCQljb252ZW5vcjogIGNvbnZlbm9yLAoJCWxhYmVsOiAgICAgbGFiZWwsCgkJbWVtbzogICAgICBtZW1vLAoJCWZlZUJwczogICAgU2V0dGxlRmVlQnBzLAoJCWNyZWF0ZWRBdDogbm93LAoJCWRlYWRsaW5lOiAgbm93ICsgZGVjbGFyZUJsb2NrcywKCQljbG9zZUVuZDogIG5vdyArIGRlY2xhcmVCbG9ja3MgKyBDbG9zZVdpbmRvd0Jsb2NrcywKCQlkZWZJRDogICAgIGRlZklELAoJCXN0YXRlOiAgICAgc3RhdGVPcGVuLAoJCW1lbWJlcnM6ICAgYXZsLk5ld1RyZWUoKSwKCQlwYWlyczogICAgIGF2bC5OZXdUcmVlKCksCgl9CglzZXRzLlNldChwYWRJRChpZCksIHMpCglidW1wQ29udmVub3Ioa2V5LCAxKQoKCWNoYWluLkVtaXQoIlNldE9wZW5lZCIsICJpZCIsIGl0b2EoaWQpLCAiY29udmVub3IiLCBrZXksCgkJImRlYWRsaW5lIiwgaXRvYShzLmRlYWRsaW5lKSwgImNsb3NlRW5kIiwgaXRvYShzLmNsb3NlRW5kKSkKCXJldHVybiBpZAp9CgovLyBBZG1pdCBhZGRzIGFuIGFkZHJlc3MgdG8gYSBzZXQncyBtZW1iZXJzaGlwIHdoaWxlIHRoZSBzZXQgaXMgb3Blbi4KLy8gQ29udmVub3Igb25seS4KLy8KLy8gQURNSVNTSU9OIE9CTElHQVRFUyBOT0JPRFkuIEJlaW5nIGEgbWVtYmVyIG9ubHkgbWFrZXMgYW4gYWRkcmVzcyBhCi8vIGxlZ2FsIGVuZHBvaW50IG9mIGEgZGVjbGFyYXRpb24g4oCUIGl0IGNhbm5vdCBiZSBtYWRlIGEgZGVidG9yIGJ5Ci8vIGFueW9uZSBidXQgaXRzZWxmIChzZWUgRGVjbGFyZSkuIFdoYXQgYWRtaXNzaW9uIGRvZXMgY29udHJvbCBpcyB0aGUKLy8gZ3JpZWZpbmcgc3VyZmFjZTogd2l0aG91dCBpdCwgYW55IGFkZHJlc3MgY291bGQgZmlsbCBhIHNldCB0byBNYXhQYWlycwovLyB3aXRoIGRlY2xhcmF0aW9ucyBuYW1pbmcgc3RyYW5nZXJzLCBhbmQgdGhlIGNvbnZlbm9yIGNvdWxkIG5vdCBmb3JtCi8vIHRoZSBncm91cCBpdCBtZWFudCB0byBmb3JtLgpmdW5jIEFkbWl0KGN1ciByZWFsbSwgaWQgaW50NjQsIGFkZHIgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdE9wZW4oaWQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcy5jb252ZW5vciB7CgkJcGFuaWMoImNvbnZlbm9yIG9ubHkiKQoJfQoJaWYgYWRkciA9PSAiIiB7CgkJcGFuaWMoIm1lbWJlciBhZGRyZXNzIG11c3Qgbm90IGJlIGVtcHR5IikKCX0KCWtleSA6PSBhZGRyLlN0cmluZygpCglpZiBzLm1lbWJlcnMuSGFzKGtleSkgewoJCXBhbmljKCJhbHJlYWR5IGEgbWVtYmVyIikKCX0KCWlmIHMubWVtYmVycy5TaXplKCkgPj0gTWF4TWVtYmVycyB7CgkJcGFuaWMoInNldCBhbHJlYWR5IGhhcyAiICsgc3RyY29udi5JdG9hKE1heE1lbWJlcnMpICsgIiBtZW1iZXJzIikKCX0KCXMubWVtYmVycy5TZXQoa2V5LCAmbWVtYmVye2FkZHI6IGFkZHJ9KQoKCWNoYWluLkVtaXQoIkFkbWl0dGVkIiwgImlkIiwgaXRvYShzLmlkKSwgIm1lbWJlciIsIGtleSwKCQkibWVtYmVycyIsIHN0cmNvbnYuSXRvYShzLm1lbWJlcnMuU2l6ZSgpKSkKfQoKLy8gRGVjbGFyZSByZWNvcmRzIHRoYXQgdGhlIENBTExFUiBvd2VzIGEgZmVsbG93IG1lbWJlciBgYW1vdW50YCB1Z25vdCwKLy8gd2hpbGUgdGhlIHNldCBpcyBvcGVuLiBObyBjb2lucyBtb3ZlIGFuZCBub25lIGFyZSBsb2NrZWQ6IGFuCi8vIG9ibGlnYXRpb24gaXMgYSBkZWNsYXJhdGlvbiwgYW5kIHRoZSBvbmx5IHZhbHVlIHRoaXMgcmVhbG0gZXZlciBob2xkcwovLyBhcnJpdmVzIGF0IFNldHRsZS4KLy8KLy8gVGhlIGNhbGxlciBpcyBBTFdBWVMgdGhlIGRlYnRvci4gVGhhdCBpcyB0aGUgd2hvbGUgYXV0aG9yaXphdGlvbgovLyBtb2RlbCBoZXJlIGFuZCBpdCBpcyB3b3J0aCBzYXlpbmcgcGxhaW5seTogYSBkZWNsYXJhdGlvbiBjYW4gb25seQovLyBpbmNyZWFzZSB0aGUgY2FsbGVyJ3Mgb3duIG5ldCBkZWJpdCBhbmQgc29tZSBvdGhlciBtZW1iZXIncyBuZXQKLy8gY3JlZGl0LCBzbyBubyBhZGRyZXNzIGNhbiBiZSBtYWRlIHRvIG93ZSBhbnl0aGluZyBieSBhbnlvbmUgZWxzZS4KLy8gRGVjbGFyaW5nIHJlcGVhdGVkbHkgdG93YXJkIHRoZSBzYW1lIGNyZWRpdG9yIGFjY3VtdWxhdGVzIGludG8gb25lCi8vIHBhaXIgcmVjb3JkIGFuZCBhbGxvY2F0ZXMgbm8gbmV3IHN0b3JhZ2UuCmZ1bmMgRGVjbGFyZShjdXIgcmVhbG0sIGlkIGludDY0LCBjcmVkaXRvciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglkZWJ0b3JBZGRyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJcyA6PSBtdXN0T3BlbihpZCkKCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA+PSBzLmRlYWRsaW5lIHsKCQlwYW5pYygiZGVjbGFyYXRpb24gd2luZG93IGlzIGNsb3NlZCIpCgl9CglpZiBhbW91bnQgPCBNaW5PYmxpZ2F0aW9uIHsKCQlwYW5pYygiZGVjbGFyZSBhdCBsZWFzdCAiICsgaXRvYShNaW5PYmxpZ2F0aW9uKSArIERlbm9tKQoJfQoJaWYgY3JlZGl0b3IgPT0gZGVidG9yQWRkciB7CgkJcGFuaWMoImNhbm5vdCBvd2UgeW91cnNlbGYiKQoJfQoKCWRLZXkgOj0gZGVidG9yQWRkci5TdHJpbmcoKQoJY0tleSA6PSBjcmVkaXRvci5TdHJpbmcoKQoJZCA6PSBtZW1iZXJPZihzLCBkS2V5KQoJaWYgZCA9PSBuaWwgewoJCXBhbmljKCJjYWxsZXIgaXMgbm90IGEgbWVtYmVyIG9mIHRoaXMgc2V0IikKCX0KCWMgOj0gbWVtYmVyT2YocywgY0tleSkKCWlmIGMgPT0gbmlsIHsKCQlwYW5pYygiY3JlZGl0b3IgaXMgbm90IGEgbWVtYmVyIG9mIHRoaXMgc2V0IikKCX0KCglwayA6PSBwYWlyS2V5KGRLZXksIGNLZXkpCglwcmlvciA6PSBwYWlyQW1vdW50KHMsIHBrKQoJbmV3UGFpciwgb2sgOj0gY2hlY2tlZEFkZChwcmlvciwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygicGFpciBvYmxpZ2F0aW9uIHdvdWxkIG92ZXJmbG93IikKCX0KCWlmIHByaW9yID09IDAgJiYgcy5wYWlyQ291bnQgPj0gTWF4UGFpcnMgewoJCXBhbmljKCJzZXQgYWxyZWFkeSBoYXMgIiArIHN0cmNvbnYuSXRvYShNYXhQYWlycykgKyAiIG9ibGlnYXRpb24gcGFpcnMiKQoJfQoKCS8vIC1hbW91bnQgb24gdGhlIGRlYnRvciwgK2Ftb3VudCBvbiB0aGUgY3JlZGl0b3IsIGluIG9uZSB0cmFuc2FjdGlvbi4KCS8vIGNoZWNrZWRBZGQgaGFuZGxlcyBhIG5lZ2F0aXZlIGFkZGVuZCwgYW5kIGFtb3VudCBpcyBzdHJpY3RseQoJLy8gcG9zaXRpdmUgaGVyZSwgc28gLWFtb3VudCBjYW4gbmV2ZXIgYmUgbWF0aC5NaW5JbnQ2NC4KCW5ld0RlYnRvck5ldCwgb2sgOj0gY2hlY2tlZEFkZChkLm5ldCwgLWFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImRlYnRvciBuZXQgcG9zaXRpb24gd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3Q3JlZGl0b3JOZXQsIG9rIDo9IGNoZWNrZWRBZGQoYy5uZXQsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImNyZWRpdG9yIG5ldCBwb3NpdGlvbiB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdHcm9zc091dCwgb2sgOj0gY2hlY2tlZEFkZChkLmdyb3NzT3V0LCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJncm9zcyBvdXRnb2luZyB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdHcm9zc0luLCBvayA6PSBjaGVja2VkQWRkKGMuZ3Jvc3NJbiwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygiZ3Jvc3MgaW5jb21pbmcgd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3R3Jvc3NWYWx1ZSwgb2sgOj0gY2hlY2tlZEFkZChzLmdyb3NzVmFsdWUsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoInNldCBncm9zcyB2YWx1ZSB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdHcm9zc0NvdW50LCBvayA6PSBjaGVja2VkQWRkKHMuZ3Jvc3NDb3VudCwgMSkKCWlmICFvayB7CgkJcGFuaWMoInNldCBncm9zcyBjb3VudCB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJaWYgcHJpb3IgPT0gMCB7CgkJcy5wYWlyQ291bnQrKwoJfQoJcy5wYWlycy5TZXQocGssIG5ld1BhaXIpCglkLm5ldCA9IG5ld0RlYnRvck5ldAoJYy5uZXQgPSBuZXdDcmVkaXRvck5ldAoJZC5ncm9zc091dCA9IG5ld0dyb3NzT3V0CgljLmdyb3NzSW4gPSBuZXdHcm9zc0luCglzLmdyb3NzVmFsdWUgPSBuZXdHcm9zc1ZhbHVlCglzLmdyb3NzQ291bnQgPSBuZXdHcm9zc0NvdW50CgoJY2hhaW4uRW1pdCgiRGVjbGFyZWQiLCAiaWQiLCBpdG9hKHMuaWQpLCAiZGVidG9yIiwgZEtleSwKCQkiY3JlZGl0b3IiLCBjS2V5LCAiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJwYWlyVG90YWwiLCBpdG9hKG5ld1BhaXIpKQp9CgovLyBDbG9zZSBmcmVlemVzIGV2ZXJ5IG5ldCBwb3NpdGlvbiBpbiBhIHNldCBhbmQgb3BlbnMgdGhlIHBheS1pbiB3aW5kb3cuCi8vIEFueW9uZSBtYXkgY2FsbCBpdCwgZnJvbSB0aGUgZGVjbGFyYXRpb24gZGVhZGxpbmUgdW50aWwgdGhlIGNsb3NpbmcKLy8gd2luZG93IGVuZHM7IHRoZSBkdWVib29rIENsYWltIGNvbnN1bWVzIHRoZSBzZXQncyBkZWZlcnJhbCwgc28gdGhpcwovLyBjYW4gc3VjY2VlZCBhdCBtb3N0IG9uY2UgcGVyIHNldCwgZXZlci4KLy8KLy8gQSBzZXQgd2hvc2UgbmV0IHZhbHVlIGlzIFpFUk8g4oCUIGV2ZXJ5IG1lbWJlcidzIG9ibGlnYXRpb25zIGV4YWN0bHkKLy8gY2FuY2VsbGVkLCB3aGljaCBpcyB3aGF0IGEgZnVsbHkgY2lyY3VsYXIgZ3JhcGggcHJvZHVjZXMg4oCUIHNldHRsZXMgb24KLy8gdGhlIHNwb3QuIE5vIGNvaW5zIGFyZSBldmVyIGFza2VkIGZvciwgaGVsZCwgb3IgcGFpZCwgYW5kIHRoZSBncm9zcwovLyB2YWx1ZSBpcyBleHRpbmd1aXNoZWQgaW4gb25lIHRyYW5zYWN0aW9uLiBUaGF0IGNhc2UgaXMgdGhlIHdob2xlCi8vIHBvaW50IG9mIHRoZSByZWFsbSwgc28gaXQgaXMgdGhlIGZhc3QgcGF0aCByYXRoZXIgdGhhbiBhIHNwZWNpYWwgb25lLgpmdW5jIENsb3NlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzIDo9IG11c3RPcGVuKGlkKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoKCS8vIENsYWltIGVuZm9yY2VzIGR1ZS1hbmQtbm90LWV4cGlyZWQgYW5kIGNvbnN1bWVzIHRoZSBkZWZlcnJhbC4gVGhlCgkvLyBoZWlnaHQgY2hlY2tzIGxpdmUgaW4gdGhlIHByaW1pdGl2ZSwgbm90IGhlcmUuCglib29rLk11c3RDbGFpbShzLmRlZklELCBub3cpCgoJLy8gVGhlIG5ldHMgc3VtIHRvIHplcm8gYnkgY29uc3RydWN0aW9uIChEZWNsYXJlIGFwcGxpZXMgLWEgYW5kICthIGluCgkvLyBvbmUgdHJhbnNhY3Rpb24pLCBzbyB0aGlzIGNhbm5vdCBmaXJlIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkuIEl0IGlzCgkvLyBhc3NlcnRlZCBhbnl3YXksIEJFRk9SRSBhbnkgY29pbiBpcyBhc2tlZCBmb3IsIGJlY2F1c2UgYSB2aW9sYXRpb24KCS8vIHdvdWxkIG1lYW4gdGhlIHJlYWxtIGlzIGFib3V0IHRvIG1pbnQgb3IgZGVzdHJveSB2YWx1ZSDigJQgdGhlIG9uZQoJLy8gaW52YXJpYW50IHdoZXJlIGZhaWxpbmcgY2xvc2VkIGlzIHdvcnRoIGFuIE8oTSkgcGFzcy4KCWlmIHN1bSA6PSBuZXRzU3VtVG9aZXJvKHMpOyBzdW0gIT0gMCB7CgkJcGFuaWMoIm5ldHRpbmc6IG5ldCBwb3NpdGlvbnMgZG8gbm90IHN1bSB0byB6ZXJvICgiICsgaXRvYShzdW0pICsgIikiKQoJfQoKCXZhciBkZWJpdHMsIGNyZWRpdHMsIHRyYW5zZmVycyBpbnQ2NAoJcy5tZW1iZXJzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJbSA6PSB2LigqbWVtYmVyKQoJCXN3aXRjaCB7CgkJY2FzZSBtLm5ldCA8IDA6CgkJCW0uZGViaXQgPSAtbS5uZXQKCQkJZCwgb2sgOj0gY2hlY2tlZEFkZChkZWJpdHMsIG0uZGViaXQpCgkJCWlmICFvayB7CgkJCQlwYW5pYygidG90YWwgbmV0IGRlYml0cyB3b3VsZCBvdmVyZmxvdyIpCgkJCX0KCQkJZGViaXRzID0gZAoJCQl0cmFuc2ZlcnMrKwoJCWNhc2UgbS5uZXQgPiAwOgoJCQltLmNyZWRpdCA9IG0ubmV0CgkJCWMsIG9rIDo9IGNoZWNrZWRBZGQoY3JlZGl0cywgbS5jcmVkaXQpCgkJCWlmICFvayB7CgkJCQlwYW5pYygidG90YWwgbmV0IGNyZWRpdHMgd291bGQgb3ZlcmZsb3ciKQoJCQl9CgkJCWNyZWRpdHMgPSBjCgkJCXRyYW5zZmVycysrCgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCWlmIGRlYml0cyAhPSBjcmVkaXRzIHsKCQlwYW5pYygibmV0dGluZzogbmV0IGRlYml0cyBhbmQgY3JlZGl0cyBkaXNhZ3JlZSIpCgl9CgoJcy5uZXRWYWx1ZSA9IGRlYml0cwoJcy5uZXRUcmFuc2ZlckNvdW50ID0gdHJhbnNmZXJzCglzLmNsb3NlZEF0ID0gbm93CgoJaWYgZ3YsIG9rIDo9IGNoZWNrZWRBZGQobGlmZXRpbWVHcm9zc1ZhbHVlLCBzLmdyb3NzVmFsdWUpOyBvayB7CgkJbGlmZXRpbWVHcm9zc1ZhbHVlID0gZ3YKCX0gZWxzZSB7CgkJcGFuaWMoImxpZmV0aW1lIGdyb3NzIHZhbHVlIHdvdWxkIG92ZXJmbG93IikKCX0KCWlmIG52LCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lTmV0VmFsdWUsIHMubmV0VmFsdWUpOyBvayB7CgkJbGlmZXRpbWVOZXRWYWx1ZSA9IG52Cgl9IGVsc2UgewoJCXBhbmljKCJsaWZldGltZSBuZXQgdmFsdWUgd291bGQgb3ZlcmZsb3ciKQoJfQoKCWJ1bXBDb252ZW5vcihzLmNvbnZlbm9yLlN0cmluZygpLCAtMSkKCglpZiBkZWJpdHMgPT0gMCB7CgkJLy8gRnVsbHkgbmV0dGVkLiBOb3RoaW5nIHRvIHBheSwgbm90aGluZyB0byBjcmVkaXQsIG5vIHdpbmRvdy4KCQlzLnN0YXRlID0gc3RhdGVTZXR0bGVkCgkJaWYgbiwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZVNldHMsIDEpOyBvayB7CgkJCWxpZmV0aW1lU2V0cyA9IG4KCQl9IGVsc2UgewoJCQlwYW5pYygibGlmZXRpbWUgc2V0cyB3b3VsZCBvdmVyZmxvdyIpCgkJfQoJCWNoYWluLkVtaXQoIlNldENsb3NlZCIsICJpZCIsIGl0b2Eocy5pZCksICJzdGF0ZSIsIHMuc3RhdGUsCgkJCSJncm9zc0NvdW50IiwgaXRvYShzLmdyb3NzQ291bnQpLCAiZ3Jvc3NWYWx1ZSIsIGl0b2Eocy5ncm9zc1ZhbHVlKSwKCQkJIm5ldFRyYW5zZmVycyIsIGl0b2EodHJhbnNmZXJzKSwgIm5ldFZhbHVlIiwgIjAiKQoJCXJldHVybgoJfQoKCXMuc3RhdGUgPSBzdGF0ZVNldHRsaW5nCglzLnNldHRsZUVuZCA9IG5vdyArIFNldHRsZVdpbmRvd0Jsb2NrcwoJY2hhaW4uRW1pdCgiU2V0Q2xvc2VkIiwgImlkIiwgaXRvYShzLmlkKSwgInN0YXRlIiwgcy5zdGF0ZSwKCQkiZ3Jvc3NDb3VudCIsIGl0b2Eocy5ncm9zc0NvdW50KSwgImdyb3NzVmFsdWUiLCBpdG9hKHMuZ3Jvc3NWYWx1ZSksCgkJIm5ldFRyYW5zZmVycyIsIGl0b2EodHJhbnNmZXJzKSwgIm5ldFZhbHVlIiwgaXRvYShzLm5ldFZhbHVlKSwKCQkic2V0dGxlRW5kIiwgaXRvYShzLnNldHRsZUVuZCkpCn0KCi8vIFNldHRsZSBwYXlzIGluIHRoZSBjYWxsZXIncyBvd24gbmV0IGRlYml0LCBpbiBmdWxsLCBvbmNlLiBUaGUgYXR0YWNoZWQKLy8gZW52ZWxvcGUgbXVzdCBiZSBleGFjdGx5IHRoZSBjYWxsZXIncyBmcm96ZW4gbmV0IGRlYml0IOKAlCBub3QgbW9yZSwgbm90Ci8vIGxlc3MsIGFuZCBub3QgaW4gaW5zdGFsbWVudHMuIFBhcnRpYWwgcGF5bWVudCBpcyByZWZ1c2VkIHJhdGhlciB0aGFuCi8vIGFjY29tbW9kYXRlZDogaXQgd291bGQgbGVhdmUgdGhlIHNldCBob2xkaW5nIG1vbmV5IHRoYXQgYmVsb25ncyB0bwovLyBuZWl0aGVyIHRoZSBwYXllciBub3IgYW55IGNyZWRpdG9yLCBhbmQgYSBydWxlIGZvciB3aG8gZ2V0cyBpdCBmaXJzdC4KLy8KLy8gVGhlIHBheW1lbnQgdGhhdCBjb21wbGV0ZXMgdGhlIHNldCBjcmVkaXRzIGV2ZXJ5IG5ldCBjcmVkaXRvciBpbiB0aGUKLy8gc2FtZSB0cmFuc2FjdGlvbiBhbmQgdGhlIHNldCBiZWNvbWVzIHNldHRsZWQuCmZ1bmMgU2V0dGxlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXBheWVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCXMgOj0gbXVzdEdldChpZCkKCWlmIHMuc3RhdGUgIT0gc3RhdGVTZXR0bGluZyB7CgkJcGFuaWMoInNldCBpcyBub3Qgc2V0dGxpbmciKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpID49IHMuc2V0dGxlRW5kIHsKCQlwYW5pYygic2V0dGxlbWVudCB3aW5kb3cgaXMgY2xvc2VkIikKCX0KCglrZXkgOj0gcGF5ZXIuU3RyaW5nKCkKCW0gOj0gbWVtYmVyT2Yocywga2V5KQoJaWYgbSA9PSBuaWwgewoJCXBhbmljKCJjYWxsZXIgaXMgbm90IGEgbWVtYmVyIG9mIHRoaXMgc2V0IikKCX0KCWlmIG0uZGViaXQgPT0gMCB7CgkJcGFuaWMoImNhbGxlciBpcyBub3QgYSBuZXQgZGVidG9yIikKCX0KCWlmIG0ucGFpZCAhPSAwIHsKCQlwYW5pYygiY2FsbGVyIGhhcyBhbHJlYWR5IHNldHRsZWQiKQoJfQoJaWYgYW1vdW50ICE9IG0uZGViaXQgewoJCXBhbmljKCJzZW5kIGV4YWN0bHkgIiArIGl0b2EobS5kZWJpdCkgKyBEZW5vbSkKCX0KCgluZXdQYWlkSW4sIG9rIDo9IGNoZWNrZWRBZGQocy5wYWlkSW4sIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoInNldCBwYXktaW4gd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3UGVuZGluZywgb2sgOj0gY2hlY2tlZEFkZCh0b3RhbFBlbmRpbmcsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoInRvdGFsIHBlbmRpbmcgd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3TGlmZXRpbWUsIG9rIDo9IGNoZWNrZWRBZGQobGlmZXRpbWVTZXR0bGVkSW4sIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIHNldHRsZWQtaW4gd291bGQgb3ZlcmZsb3ciKQoJfQoKCW0ucGFpZCA9IGFtb3VudAoJcy5wYWlkSW4gPSBuZXdQYWlkSW4KCXRvdGFsUGVuZGluZyA9IG5ld1BlbmRpbmcKCWxpZmV0aW1lU2V0dGxlZEluID0gbmV3TGlmZXRpbWUKCgljaGFpbi5FbWl0KCJTZXR0bGVkIiwgImlkIiwgaXRvYShzLmlkKSwgImRlYnRvciIsIGtleSwKCQkiYW1vdW50IiwgaXRvYShhbW91bnQpLCAicGFpZEluIiwgaXRvYShzLnBhaWRJbiksCgkJIm5ldFZhbHVlIiwgaXRvYShzLm5ldFZhbHVlKSkKCglpZiBzLnBhaWRJbiA9PSBzLm5ldFZhbHVlIHsKCQljb21wbGV0ZVNldChzKQoJfQp9CgovLyBjb21wbGV0ZVNldCBjb252ZXJ0cyBhIGZ1bGx5LWZ1bmRlZCBzZXQncyBwYXktaW5zIGludG8gY3JlZGl0b3IKLy8gY3JlZGl0cyBhbmQgbWFya3MgaXQgc2V0dGxlZC4gSXQgaXMgcmVhY2hlZCBvbmx5IGZyb20gU2V0dGxlLCBvbmx5Ci8vIHdoZW4gcGFpZEluID09IG5ldFZhbHVlLCBhbmQgaXQgaXMgd2hlcmUgdGhlIGZlZSBpcyBjaGFyZ2VkLgovLwovLyBUaGUgT1JERVIgaXMgdGhlIGNvbnNlcnZhdGlvbiBhcmd1bWVudDogcGFpZEluIGFuZCB0b3RhbFBlbmRpbmcgYXJlCi8vIGRlYml0ZWQgYnkgZXhhY3RseSBuZXRWYWx1ZSwgYW5kIHRoZSBpZGVudGljYWwgbmV0VmFsdWUgaXMgZGVwb3NpdGVkCi8vIGludG8gdGhlIGxlZGdlciBhcyBjcmVkaXRzIHBsdXMgZmVlLiBmZWVsZWRnZXIuRGVwb3NpdCBjcmVkaXRzCi8vIGFtb3VudC1mZWUgYW5kIGFjY3J1ZXMgZmVlLCBzbyB0aGUgdHdvIHNpZGVzIGFncmVlIHRvIHRoZSB1Z25vdC4KZnVuYyBjb21wbGV0ZVNldChzICpzZXQpIHsKCW1vdmVkIDo9IHMubmV0VmFsdWUKCXMucGFpZEluID0gMAoJdG90YWxQZW5kaW5nIC09IG1vdmVkCglzLnN0YXRlID0gc3RhdGVTZXR0bGVkCgoJdmFyIGNyZWRpdGVkIGludDY0CglzLm1lbWJlcnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQltIDo9IHYuKCptZW1iZXIpCgkJaWYgbS5jcmVkaXQgPT0gMCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlnb3QsIF8gOj0gbGVkZ2VyLk11c3REZXBvc2l0KG0uYWRkci5TdHJpbmcoKSwgbS5jcmVkaXQsIHMuZmVlQnBzKQoJCWMsIG9rIDo9IGNoZWNrZWRBZGQoY3JlZGl0ZWQsIGdvdCkKCQlpZiAhb2sgewoJCQlwYW5pYygiY3JlZGl0ZWQgdG90YWwgd291bGQgb3ZlcmZsb3ciKQoJCX0KCQljcmVkaXRlZCA9IGMKCQlyZXR1cm4gZmFsc2UKCX0pCgoJaWYgbiwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZUNyZWRpdGVkLCBjcmVkaXRlZCk7IG9rIHsKCQlsaWZldGltZUNyZWRpdGVkID0gbgoJfSBlbHNlIHsKCQlwYW5pYygibGlmZXRpbWUgY3JlZGl0ZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJaWYgbiwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZVNldHMsIDEpOyBvayB7CgkJbGlmZXRpbWVTZXRzID0gbgoJfSBlbHNlIHsKCQlwYW5pYygibGlmZXRpbWUgc2V0cyB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJY2hhaW4uRW1pdCgiU2V0U2V0dGxlZCIsICJpZCIsIGl0b2Eocy5pZCksICJuZXRWYWx1ZSIsIGl0b2EobW92ZWQpLAoJCSJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLCAiZmVlQnBzIiwgaXRvYShzLmZlZUJwcykpCn0KCi8vIEFiYW5kb24gZW5kcyBhIHNldCB0aGF0IHJlYWNoZWQgaXRzIHNldHRsZW1lbnQgZGVhZGxpbmUgc3RpbGwgc2hvcnQsCi8vIGFuZCBjcmVkaXRzIGV2ZXJ5IGRlYnRvciB3aG8gcGFpZCBleGFjdGx5IHdoYXQgaXQgcGFpZCwgRkVFLUZSRUUuCi8vIEFueW9uZSBtYXkgY2FsbCBpdDogdGhlIG91dGNvbWUgaXMgZnVsbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2V0J3Mgb3duCi8vIHN0YXRlLCBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciBhIGNhbGxlciB0byBzdGVlci4KLy8KLy8gTmV0IGNyZWRpdG9ycyByZWNlaXZlIG5vdGhpbmcgb24gdGhpcyBwYXRoLCBhbmQgdGhhdCBpcyB0aGUKLy8gYWxsLW9yLW5vdGhpbmcgZ3VhcmFudGVlIHdvcmtpbmcgcmF0aGVyIHRoYW4gZmFpbGluZzogdGhleSB3ZXJlIG5ldmVyCi8vIGNyZWRpdGVkLCBzbyB0aGVyZSBpcyBubyBjbGF3YmFjaywgYW5kIG5vIGNyZWRpdG9yIHdhcyBldmVyIHBhaWQgZnJvbQovLyBhbm90aGVyIGRlYnRvcidzIG1vbmV5LgpmdW5jIEFiYW5kb24oY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdEdldChpZCkKCWlmIHMuc3RhdGUgIT0gc3RhdGVTZXR0bGluZyB7CgkJcGFuaWMoInNldCBpcyBub3Qgc2V0dGxpbmciKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgcy5zZXR0bGVFbmQgewoJCXBhbmljKCJzZXR0bGVtZW50IHdpbmRvdyBpcyBzdGlsbCBvcGVuIikKCX0KCWlmIHMucGFpZEluID09IHMubmV0VmFsdWUgewoJCS8vIFVucmVhY2hhYmxlOiBTZXR0bGUgY29tcGxldGVzIHRoZSBzZXQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24KCQkvLyB0aGF0IG1ha2VzIHBhaWRJbiBlcXVhbCBuZXRWYWx1ZSwgc28gYSBmdWxseS1mdW5kZWQgc2V0IGlzCgkJLy8gbmV2ZXIgW3NldHRsaW5nXS4gS2VwdCBzbyB0aGF0IGEgZnV0dXJlIGNoYW5nZSB3aGljaCBkZWZlcnMKCQkvLyBjb21wbGV0aW9uIGZhaWxzIGNsb3NlZCBpbnN0ZWFkIG9mIHJlZnVuZGluZyBhIHNldHRsZWQgc2V0LgoJCXBhbmljKCJzZXQgaXMgZnVsbHkgZnVuZGVkIikKCX0KCglyZXR1cm5lZCA6PSBzLnBhaWRJbgoJcy5wYWlkSW4gPSAwCgl0b3RhbFBlbmRpbmcgLT0gcmV0dXJuZWQKCXMuc3RhdGUgPSBzdGF0ZUFiYW5kb25lZAoKCXZhciByZWZ1bmRlZCBpbnQ2NAoJcy5tZW1iZXJzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJbSA6PSB2LigqbWVtYmVyKQoJCWlmIG0ucGFpZCA9PSAwIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCS8vIEZlZS1mcmVlLCBkZWxpYmVyYXRlbHk6IHRoZSByZWZ1bmQgcGF0aCBuZXZlciBjaGFyZ2VzLgoJCWdvdCwgXyA6PSBsZWRnZXIuTXVzdERlcG9zaXQobS5hZGRyLlN0cmluZygpLCBtLnBhaWQsIDApCgkJciwgb2sgOj0gY2hlY2tlZEFkZChyZWZ1bmRlZCwgZ290KQoJCWlmICFvayB7CgkJCXBhbmljKCJyZWZ1bmRlZCB0b3RhbCB3b3VsZCBvdmVyZmxvdyIpCgkJfQoJCXJlZnVuZGVkID0gcgoJCXJldHVybiBmYWxzZQoJfSkKCWlmIHJlZnVuZGVkICE9IHJldHVybmVkIHsKCQlwYW5pYygibmV0dGluZzogYWJhbmRvbiByZWZ1bmRzIGRpc2FncmVlIHdpdGggY29pbnMgaGVsZCIpCgl9CglpZiBuLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lUmVmdW5kZWQsIHJlZnVuZGVkKTsgb2sgewoJCWxpZmV0aW1lUmVmdW5kZWQgPSBuCgl9IGVsc2UgewoJCXBhbmljKCJsaWZldGltZSByZWZ1bmRlZCB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJY2hhaW4uRW1pdCgiU2V0QWJhbmRvbmVkIiwgImlkIiwgaXRvYShzLmlkKSwgInNob3J0ZmFsbCIsCgkJaXRvYShzLm5ldFZhbHVlLXJldHVybmVkKSwgInJlZnVuZGVkIiwgaXRvYShyZWZ1bmRlZCkpCn0KCi8vIENhbmNlbCBlbmRzIGFuIG9wZW4gc2V0LiBDb252ZW5vciBvbmx5LCBhbnkgdGltZSB3aGlsZSB0aGUgc2V0IGlzCi8vIG9wZW4uIE5vIHJlZnVuZCBwYXRoIGlzIG5lZWRlZCBhbmQgbm9uZSBleGlzdHM6IGFuIG9wZW4gc2V0IGhvbGRzIG5vCi8vIGNvaW5zLCBiZWNhdXNlIGEgZGVjbGFyYXRpb24gaXMgbm90IGEgdHJhbnNmZXIuIFdoYXQgbWVtYmVycyBsb3NlIGlzCi8vIHRoZSBzdG9yYWdlIGRlcG9zaXQgYW5kIGdhcyB0aGV5IHNwZW50IGRlY2xhcmluZywgd2hpY2ggaXMgc3RhdGVkCi8vIHBsYWlubHkgcmF0aGVyIHRoYW4gaGlkZGVuIOKAlCBhIGNvbnZlbm9yIGNhbiB3YXN0ZSBhIG1lbWJlcidzIGdhcyBidXQKLy8gY2FuIG5ldmVyIHRvdWNoIGEgbWVtYmVyJ3MgbW9uZXkuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzIDo9IG11c3RPcGVuKGlkKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHMuY29udmVub3IgewoJCXBhbmljKCJjb252ZW5vciBvbmx5IikKCX0KCWJvb2suTXVzdENhbmNlbChzLmRlZklELCBzLmNvbnZlbm9yLlN0cmluZygpKQoJcy5zdGF0ZSA9IHN0YXRlQ2FuY2VsbGVkCglidW1wQ29udmVub3Iocy5jb252ZW5vci5TdHJpbmcoKSwgLTEpCgoJY2hhaW4uRW1pdCgiU2V0Q2FuY2VsbGVkIiwgImlkIiwgaXRvYShzLmlkKSwKCQkiZ3Jvc3NDb3VudCIsIGl0b2Eocy5ncm9zc0NvdW50KSwgImdyb3NzVmFsdWUiLCBpdG9hKHMuZ3Jvc3NWYWx1ZSkpCn0KCi8vIExhcHNlIGVuZHMgYW4gb3BlbiBzZXQgd2hvc2UgY2xvc2luZyB3aW5kb3cgaGFzIHBhc3NlZC4gQW55b25lIG1heQovLyBjYWxsIGl0LiBUaGlzIGlzIHRoZSBwZXJtaXNzaW9ubGVzcyB2YWx2ZTogYSBzZXQgbm9ib2R5IGNsb3NlcyBjYW5ub3QKLy8gaG9sZCBpdHMgZHVlYm9vayBzbG90IGZvcmV2ZXIsIGFuZCBiZWNhdXNlIGFuIG9wZW4gc2V0IGhvbGRzIG5vIGNvaW5zCi8vIHRoZXJlIGlzIG5vdGhpbmcgc3RyYW5kZWQgYnkgdGhlIG91dGNvbWUuCmZ1bmMgTGFwc2UoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdE9wZW4oaWQpCglib29rLk11c3RFeHBpcmUocy5kZWZJRCwgcnVudGltZS5DaGFpbkhlaWdodCgpKQoJcy5zdGF0ZSA9IHN0YXRlTGFwc2VkCglidW1wQ29udmVub3Iocy5jb252ZW5vci5TdHJpbmcoKSwgLTEpCgoJY2hhaW4uRW1pdCgiU2V0TGFwc2VkIiwgImlkIiwgaXRvYShzLmlkKSwKCQkiZ3Jvc3NDb3VudCIsIGl0b2Eocy5ncm9zc0NvdW50KSwgImdyb3NzVmFsdWUiLCBpdG9hKHMuZ3Jvc3NWYWx1ZSkpCn0KCi8vIC0tLSBjcmVkaXRvciB3aXRoZHJhd2FsIC0tLQoKLy8gV2l0aGRyYXcgcGF5cyB0aGUgY2FsbGVyIGl0cyBlbnRpcmUgY3JlZGl0IGJhbGFuY2UgaW4gY29pbnMgYW5kCi8vIHJldHVybnMgdGhlIGFtb3VudC4gUHVsbC1vbmx5OiB0aGlzIHJlYWxtIG5ldmVyIHB1c2hlcyBhIHBheW91dCwgc28gYQovLyBjcmVkaXRvciB0aGF0IGNhbm5vdCByZWNlaXZlIGNvaW5zIGNhbiBuZXZlciBibG9jayBhIHNldHRsZW1lbnQuCi8vIENyZWRpdHMgYXJyaXZlIGZyb20gYSBzZXR0bGVkIHNldCAobmV0IG9mIHRoYXQgc2V0J3MgZmVlKSBhbmQgZnJvbSBhbgovLyBhYmFuZG9uZWQgc2V0J3MgcmVmdW5kIChmZWUtZnJlZSk7IGJvdGggbGFuZCBpbiB0aGUgc2FtZSBiYWxhbmNlLgpmdW5jIFdpdGhkcmF3KGN1ciByZWFsbSkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWtleSA6PSBjYWxsZXIuU3RyaW5nKCkKCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoa2V5KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBjcmVkaXQgdG8gd2l0aGRyYXciKQoJfQoJaWYgbiwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZVdpdGhkcmF3biwgYW1vdW50KTsgb2sgewoJCWxpZmV0aW1lV2l0aGRyYXduID0gbgoJfSBlbHNlIHsKCQlwYW5pYygibGlmZXRpbWUgd2l0aGRyYXduIHdvdWxkIG92ZXJmbG93IikKCX0KCgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiV2l0aGRyYXduIiwgInRvIiwga2V5LCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQoJcmV0dXJuIGFtb3VudAp9CgovLyBQcnVuZSByZW1vdmVzIGEgdGVybWluYWwgc2V0IHRoYXQgaG9sZHMgbm8gY29pbnMsIHJlY2xhaW1pbmcgaXRzCi8vIHN0b3JhZ2UuIEFueW9uZSBtYXkgY2FsbCBpdDogdGhlIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIHN0b3JhZ2UKLy8gZGVwb3NpdCB0byB0aGUgcHJ1bmluZyB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgdGhlIGluY2VudGl2ZS4gQ3JlZGl0cwovLyBhbHJlYWR5IGluIHRoZSBsZWRnZXIgYXJlIHVuYWZmZWN0ZWQg4oCUIHRoZXkgYXJlIGEgcGVyLWFkZHJlc3MgYmFsYW5jZSwKLy8gbm90IHBhcnQgb2YgdGhlIHNldCByZWNvcmQuCmZ1bmMgUHJ1bmUoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdEdldChpZCkKCWlmIHMuc3RhdGUgPT0gc3RhdGVPcGVuIHx8IHMuc3RhdGUgPT0gc3RhdGVTZXR0bGluZyB7CgkJcGFuaWMoInNldCBpcyBub3QgdGVybWluYWwiKQoJfQoJaWYgcy5wYWlkSW4gIT0gMCB7CgkJcGFuaWMoInNldCBzdGlsbCBob2xkcyBjb2lucyIpCgl9CglzZXRzLlJlbW92ZShwYWRJRChzLmlkKSkKCWNoYWluLkVtaXQoIlBydW5lZCIsICJpZCIsIGl0b2Eocy5pZCksICJieSIsCgkJY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLlN0cmluZygpKQp9CgovLyAtLS0gZmVlcyBhbmQgc3VycGx1cyAtLS0KCi8vIFdpdGhkcmF3RmVlcyBwYXlzIHRoZSBlbnRpcmUgYWNjcnVlZCBmZWUgcG90IHRvIHRoZSBjb21waWxlLXRpbWUKLy8gRmVlQ29sbGVjdG9yLiBBbnlvbmUgbWF5IGNhbGwgaXQ6IHRoZSBkZXN0aW5hdGlvbiBpcyBmaXhlZCwgc28gdGhlcmUKLy8gaXMgbm90aGluZyBmb3IgYSBjYWxsZXIgdG8gc3RlZXIuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWZlZXMgOj0gbGVkZ2VyLldpdGhkcmF3RmVlcygpCglpZiBmZWVzID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIEZlZUNvbGxlY3RvciwgRGVub20sIGZlZXMpCgljaGFpbi5FbWl0KCJGZWVzV2l0aGRyYXduIiwgInRvIiwgRmVlQ29sbGVjdG9yLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShmZWVzKSkKCXJldHVybiBmZWVzCn0KCi8vIFN3ZWVwU3VycGx1cyBzZW5kcyBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgRmVlQ29sbGVjdG9yOiBmb3IgdGhlIHBvdAovLyBkZW5vbSwgZXZlcnl0aGluZyBhYm92ZSB0cmFja2VkIGxpYWJpbGl0aWVzOyBmb3IgYW55IGZvcmVpZ24gZGVub20sCi8vIHRoZSBmdWxsIGJhbGFuY2UuIFBlbmRpbmcgcGF5LWlucywgY3JlZGl0b3IgY3JlZGl0cyBhbmQgdGhlIGZlZSBwb3QKLy8gYXJlIHVudG91Y2hhYmxlIGJ5IGNvbnN0cnVjdGlvbiAoY29pbmlvLlN3ZWVwIHJlZnVzZXMgdG8gZGlwIGJlbG93IHRoZQovLyByZXNlcnZlKS4gQW55b25lIG1heSBjYWxsIGl0LgpmdW5jIFN3ZWVwU3VycGx1cyhjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gTGlhYmlsaXRpZXMoKQoJfQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgRmVlQ29sbGVjdG9yLCBkZW5vbSwgcmVzZXJ2ZSkKCWNoYWluLkVtaXQoIlN3ZXB0IiwgImRlbm9tIiwgZGVub20sICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShzd2VwdCkpCglyZXR1cm4gc3dlcHQKfQoKLy8gLS0tIHZpZXdzIC0tLQoKLy8gU2V0SW5mbyByZXR1cm5zIGEgc2V0J3MgZml4ZWQgdGVybXMgYW5kIGxpdmUgdGFsbGllcy4KZnVuYyBTZXRJbmZvKGlkIGludDY0KSAoY29udmVub3IgYWRkcmVzcywgZmVlQnBzLCBjcmVhdGVkQXQsIGRlYWRsaW5lLAoJY2xvc2VFbmQsIHNldHRsZUVuZCBpbnQ2NCwgc3RhdGUgc3RyaW5nLCBtZW1iZXJzIGludCwgcGFpcnMgaW50LAoJcGFpZEluIGludDY0KSB7CglzIDo9IG11c3RHZXQoaWQpCglyZXR1cm4gcy5jb252ZW5vciwgcy5mZWVCcHMsIHMuY3JlYXRlZEF0LCBzLmRlYWRsaW5lLCBzLmNsb3NlRW5kLAoJCXMuc2V0dGxlRW5kLCBzLnN0YXRlLCBzLm1lbWJlcnMuU2l6ZSgpLCBzLnBhaXJDb3VudCwgcy5wYWlkSW4KfQoKLy8gQ29tcHJlc3Npb24gcmV0dXJucyB0aGUgZm91ciBudW1iZXJzIHRoZSBwcm9kdWN0IGV4aXN0cyB0byBwcm9kdWNlOgovLyBob3cgbWFueSBvYmxpZ2F0aW9ucyB3ZXJlIGRlY2xhcmVkIGFuZCBmb3IgaG93IG11Y2gsIGFnYWluc3QgaG93IG1hbnkKLy8gdHJhbnNmZXJzIHRoZSBuZXR0aW5nIGxlYXZlcyBhbmQgZm9yIGhvdyBtdWNoLiBUaGUgUkFUSU8gSVMgTk9UCi8vIFJFVFVSTkVEIGFuZCBpcyBub3QgYXNzZXJ0ZWQgYW55d2hlcmUg4oCUIGRpdmlkZSB0aGVtIGlmIHlvdSB3YW50IGl0LAovLyBhbmQgbm90ZSB0aGF0IG5ldFZhbHVlIGNhbiBsZWdpdGltYXRlbHkgYmUgemVybyAoYSBmdWxseSBjaXJjdWxhcgovLyBncmFwaCwgdGhlIGJlc3QgcG9zc2libGUgY2FzZSksIHdoaWNoIGlzIGV4YWN0bHkgd2h5IG5vIHJhdGlvIGlzCi8vIGNvbXB1dGVkIGhlcmUuCi8vCi8vIFdoaWxlIGEgc2V0IGlzIHN0aWxsIG9wZW4gdGhlIG5ldCBmaWd1cmVzIGFyZSB6ZXJvIGJlY2F1c2UgdGhleSBhcmUKLy8gZnJvemVuIGF0IENsb3NlLCBub3QgZGVyaXZlZCBvbiByZWFkLgpmdW5jIENvbXByZXNzaW9uKGlkIGludDY0KSAoZ3Jvc3NDb3VudCwgbmV0VHJhbnNmZXJDb3VudCwgZ3Jvc3NWYWx1ZSwgbmV0VmFsdWUgaW50NjQpIHsKCXMgOj0gbXVzdEdldChpZCkKCXJldHVybiBzLmdyb3NzQ291bnQsIHMubmV0VHJhbnNmZXJDb3VudCwgcy5ncm9zc1ZhbHVlLCBzLm5ldFZhbHVlCn0KCi8vIFNldExhYmVsIHJldHVybnMgYSBzZXQncyBsYWJlbCwgdmVyYmF0aW0gYW5kIHVuc2FuaXRpemVkLiBSZW5kZXIKLy8gc2FuaXRpemVzOyBhIGNhbGxlciByZWFkaW5nIHRoZSByYXcgdmFsdWUgZ2V0cyB0aGUgcmF3IHZhbHVlLgpmdW5jIFNldExhYmVsKGlkIGludDY0KSBzdHJpbmcgeyByZXR1cm4gbXVzdEdldChpZCkubGFiZWwgfQoKLy8gU2V0TWVtbyByZXR1cm5zIGEgc2V0J3MgbWVtbywgdmVyYmF0aW0gYW5kIHVuc2FuaXRpemVkLgpmdW5jIFNldE1lbW8oaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0R2V0KGlkKS5tZW1vIH0KCi8vIFN0YXR1cyByZXR1cm5zIGEgc2V0J3Mgc3RvcmVkIHN0YXRlLgpmdW5jIFN0YXR1cyhpZCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RHZXQoaWQpLnN0YXRlIH0KCi8vIElzTWVtYmVyIHJlcG9ydHMgd2hldGhlciBhbiBhZGRyZXNzIGlzIHBhcnR5IHRvIGEgc2V0LgpmdW5jIElzTWVtYmVyKGlkIGludDY0LCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIG1lbWJlck9mKG11c3RHZXQoaWQpLCBhZGRyLlN0cmluZygpKSAhPSBuaWwKfQoKLy8gTmV0T2YgcmV0dXJucyBhIG1lbWJlcidzIGxpdmUgbmV0IHBvc2l0aW9uOiBwb3NpdGl2ZSB3aGVuIGl0IGlzIG93ZWQKLy8gdGhhdCBtdWNoIG9uIGJhbGFuY2UsIG5lZ2F0aXZlIHdoZW4gaXQgb3dlcyB0aGF0IG11Y2guIEl0IGlzIGxpdmUKLy8gd2hpbGUgdGhlIHNldCBpcyBvcGVuIGFuZCBmcm96ZW4gdGhlcmVhZnRlci4gQSBub24tbWVtYmVyIHJlYWRzIDAsCi8vIHdoaWNoIGlzIGFsc28gYSBtZW1iZXIncyB2YWx1ZSB3aGVuIGl0cyBvYmxpZ2F0aW9ucyBjYW5jZWwgZXhhY3RseSDigJQKLy8gdXNlIElzTWVtYmVyIHRvIHRlbGwgdGhlIHR3byBhcGFydC4KZnVuYyBOZXRPZihpZCBpbnQ2NCwgYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglpZiBtIDo9IG1lbWJlck9mKG11c3RHZXQoaWQpLCBhZGRyLlN0cmluZygpKTsgbSAhPSBuaWwgewoJCXJldHVybiBtLm5ldAoJfQoJcmV0dXJuIDAKfQoKLy8gUG9zaXRpb25PZiByZXR1cm5zIGEgbWVtYmVyJ3MgZnJvemVuIHNldHRsZW1lbnQgZmlndXJlczogd2hhdCBpdCBtdXN0Ci8vIHBheSBpbiwgd2hhdCBpdCBpcyBvd2VkLCBhbmQgd2hhdCBpdCBoYXMgYWN0dWFsbHkgcGFpZC4gQWxsIHRocmVlIGFyZQovLyB6ZXJvIHVudGlsIHRoZSBzZXQgaXMgY2xvc2VkLgpmdW5jIFBvc2l0aW9uT2YoaWQgaW50NjQsIGFkZHIgYWRkcmVzcykgKGRlYml0LCBjcmVkaXQsIHBhaWQgaW50NjQpIHsKCWlmIG0gOj0gbWVtYmVyT2YobXVzdEdldChpZCksIGFkZHIuU3RyaW5nKCkpOyBtICE9IG5pbCB7CgkJcmV0dXJuIG0uZGViaXQsIG0uY3JlZGl0LCBtLnBhaWQKCX0KCXJldHVybiAwLCAwLCAwCn0KCi8vIEdyb3NzT2YgcmV0dXJucyBhIG1lbWJlcidzIGdyb3NzIGRlY2xhcmVkIGZsb3dzOiB3aGF0IGl0IGhhcyBkZWNsYXJlZAovLyBpdCBvd2VzLCBhbmQgd2hhdCBvdGhlcnMgaGF2ZSBkZWNsYXJlZCB0aGV5IG93ZSBpdC4gVGhlc2UgYXJlIHRoZQovLyB1bmNvbXByZXNzZWQgZmlndXJlcywga2VwdCBzbyBhIHJlYWRlciBjYW4gc2VlIHdoYXQgbmV0dGluZyByZW1vdmVkLgpmdW5jIEdyb3NzT2YoaWQgaW50NjQsIGFkZHIgYWRkcmVzcykgKG91dCwgaW4gaW50NjQpIHsKCWlmIG0gOj0gbWVtYmVyT2YobXVzdEdldChpZCksIGFkZHIuU3RyaW5nKCkpOyBtICE9IG5pbCB7CgkJcmV0dXJuIG0uZ3Jvc3NPdXQsIG0uZ3Jvc3NJbgoJfQoJcmV0dXJuIDAsIDAKfQoKLy8gT2JsaWdhdGlvbiByZXR1cm5zIHRoZSBjdW11bGF0aXZlIGFtb3VudCBkZWJ0b3IgaGFzIGRlY2xhcmVkIGl0IG93ZXMKLy8gY3JlZGl0b3IgaW4gYSBzZXQuIERpcmVjdGlvbiBtYXR0ZXJzOiBPYmxpZ2F0aW9uKGlkLCBhLCBiKSBhbmQKLy8gT2JsaWdhdGlvbihpZCwgYiwgYSkgYXJlIGRpZmZlcmVudCBlZGdlcyBhbmQgYm90aCBtYXkgYmUgbm9uLXplcm8g4oCUCi8vIHRoZSBncmFwaCBpcyBkaXJlY3RlZCwgYW5kIG5ldHRpbmcgdGhlbSBpcyBDbG9zZSdzIGpvYiwgbm90IHN0b3JhZ2Uncy4KZnVuYyBPYmxpZ2F0aW9uKGlkIGludDY0LCBkZWJ0b3IsIGNyZWRpdG9yIGFkZHJlc3MpIGludDY0IHsKCXMgOj0gbXVzdEdldChpZCkKCXJldHVybiBwYWlyQW1vdW50KHMsIHBhaXJLZXkoZGVidG9yLlN0cmluZygpLCBjcmVkaXRvci5TdHJpbmcoKSkpCn0KCi8vIE1lbWJlckNvdW50IHJldHVybnMgaG93IG1hbnkgYWRkcmVzc2VzIGFyZSBwYXJ0eSB0byBhIHNldC4KZnVuYyBNZW1iZXJDb3VudChpZCBpbnQ2NCkgaW50IHsgcmV0dXJuIG11c3RHZXQoaWQpLm1lbWJlcnMuU2l6ZSgpIH0KCi8vIE51bVNldHMgcmV0dXJucyBob3cgbWFueSBzZXRzIGhhdmUgZXZlciBiZWVuIG9wZW5lZC4gSXQgaXMgdGhlIGlkCi8vIGhpZ2gtd2F0ZXIgbWFyaywgc28gaXQgZG9lcyBub3QgZGVjcmVhc2Ugd2hlbiBhIHNldCBpcyBwcnVuZWQuCmZ1bmMgTnVtU2V0cygpIGludDY0IHsgcmV0dXJuIG5leHRJRCB9CgovLyBPcGVuU2V0cyByZXR1cm5zIGhvdyBtYW55IHNldHMgYXJlIGN1cnJlbnRseSBvcGVuLCB2aWEgdGhlIGR1ZWJvb2sncwovLyBvd24gb3Blbi1kZWZlcnJhbCBjb3VudC4KZnVuYyBPcGVuU2V0cygpIGludDY0IHsgcmV0dXJuIGludDY0KGJvb2suT3BlbkNvdW50KCkpIH0KCi8vIE9wZW5PZiByZXR1cm5zIGhvdyBtYW55IG9wZW4gc2V0cyBhbiBhZGRyZXNzIGNvbnZlbmVzLgpmdW5jIE9wZW5PZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGNvbnZlbm9yT3BlbihhZGRyLlN0cmluZygpKSB9CgovLyBCYWxhbmNlT2YgcmV0dXJucyBhbiBhZGRyZXNzJ3Mgd2l0aGRyYXdhYmxlIGNyZWRpdC4KZnVuYyBCYWxhbmNlT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuQmFsYW5jZU9mKGFkZHIuU3RyaW5nKCkpIH0KCi8vIFRvdGFsUGVuZGluZyBpcyB0aGUgUCB0ZXJtIG9mIHRoZSBjb25zZXJ2YXRpb24gaW52YXJpYW50OiBjb2lucyBwYWlkCi8vIGluIGZvciBzZXRzIHRoYXQgaGF2ZSBub3QgeWV0IHNldHRsZWQgb3IgYmVlbiBhYmFuZG9uZWQuCmZ1bmMgVG90YWxQZW5kaW5nKCkgaW50NjQgeyByZXR1cm4gdG90YWxQZW5kaW5nIH0KCi8vIEZlZXNBY2NydWVkIGlzIHRoZSBmZWUgcG90LCB3aXRoZHJhd2FibGUgb25seSB0byB0aGUgRmVlQ29sbGVjdG9yLgpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkZlZXNBY2NydWVkKCkgfQoKLy8gTGlhYmlsaXRpZXMgaXMgZXZlcnl0aGluZyB0aGlzIHJlYWxtIG93ZXMgYW55b25lOiBwZW5kaW5nIHBheS1pbnMgcGx1cwovLyB1bmNsYWltZWQgY3JlZGl0cyBwbHVzIHRoZSBmZWUgcG90LgpmdW5jIExpYWJpbGl0aWVzKCkgaW50NjQgeyByZXR1cm4gdG90YWxQZW5kaW5nICsgbGVkZ2VyLkxpYWJpbGl0aWVzKCkgfQoKLy8gSGVsZCBpcyB0aGUgcmVhbG0ncyBhY3R1YWwgdWdub3QgYmFsYW5jZS4KZnVuYyBIZWxkKCkgaW50NjQgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gU3VycGx1cyBpcyBIZWxkIG1pbnVzIExpYWJpbGl0aWVzOiBvdXQtb2YtYmFuZCBjb2lucywgc3dlZXBhYmxlIHRvIHRoZQovLyBGZWVDb2xsZWN0b3IuIEl0IGlzIG5ldmVyIG5lZ2F0aXZlIGluIGNvcnJlY3Qgb3BlcmF0aW9uLgpmdW5jIFN1cnBsdXMoKSBpbnQ2NCB7IHJldHVybiBIZWxkKCkgLSBMaWFiaWxpdGllcygpIH0KCi8vIExpZmV0aW1lIHJldHVybnMgdGhlIHJlYWxtJ3MgY3VtdWxhdGl2ZSBjb3VudGVyczogc2V0cyBzZXR0bGVkLCBncm9zcwovLyBhbmQgbmV0IHZhbHVlIGFjcm9zcyBldmVyeSBjbG9zZWQgc2V0LCBjb2lucyBwYWlkIGluLCBjcmVkaXRlZCB0bwovLyBjcmVkaXRvcnMsIHJlZnVuZGVkIGJ5IEFiYW5kb24sIGFuZCB3aXRoZHJhd24uCmZ1bmMgTGlmZXRpbWUoKSAoc2V0cywgZ3Jvc3NWYWx1ZSwgbmV0VmFsdWUsIHNldHRsZWRJbiwgY3JlZGl0ZWQsCglyZWZ1bmRlZCwgd2l0aGRyYXduIGludDY0KSB7CglyZXR1cm4gbGlmZXRpbWVTZXRzLCBsaWZldGltZUdyb3NzVmFsdWUsIGxpZmV0aW1lTmV0VmFsdWUsCgkJbGlmZXRpbWVTZXR0bGVkSW4sIGxpZmV0aW1lQ3JlZGl0ZWQsIGxpZmV0aW1lUmVmdW5kZWQsCgkJbGlmZXRpbWVXaXRoZHJhd24KfQoKLy8gQWRkcmVzcyByZXR1cm5zIHRoaXMgcmVhbG0ncyBvd24gYWRkcmVzcywgd2hpY2ggaXMgd2hlcmUgY29pbnMgcGFpZCBpbgovLyBhcmUgaGVsZC4KZnVuYyBBZGRyZXNzKCkgYWRkcmVzcyB7IHJldHVybiBzZWxmIH0KCi8vIEhlaWdodCByZXR1cm5zIHRoZSBjaGFpbiBoZWlnaHQgdGhpcyByZWFsbSBzZWVzLCBzbyBhIGNhbGxlciBjYW4KLy8gY29tcGFyZSBpdCBhZ2FpbnN0IGEgZGVhZGxpbmUgd2l0aG91dCBhIHNlY29uZCBxdWVyeS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIGludGVybmFscyAtLS0KCi8vIG11c3RHZXQgcmVzb2x2ZXMgYSBzZXQgaWQgb3IgYWJvcnRzLgovLwovLyBhdmwvdjAncyBHZXQgcmV0dXJucyBPTkUgdmFsdWUg4oCUIHRoZSBzdG9yZWQgdmFsdWUsIG9yIG5pbCB3aGVuIHRoZSBrZXkKLy8gaXMgYWJzZW50IOKAlCBzbyBhYnNlbmNlIGlzIGRldGVjdGVkIGJ5IHRoZSB0eXBlIGFzc2VydGlvbiByYXRoZXIgdGhhbgovLyBieSBhIHNlY29uZCBib29sZWFuIHJldHVybi4gVGhhdCBpcyBzb3VuZCBoZXJlLCBhbmQgc291bmQgb25seSBiZWNhdXNlCi8vIHRoaXMgcmVhbG0gbmV2ZXIgc3RvcmVzIGEgbmlsIHVuZGVyIGFueSBrZXkgaW4gYW55IG9mIGl0cyB0cmVlczogdGhlCi8vIHBhY2thZ2UncyBvd24gZG9jIHdhcm5zIHRoYXQgYSBrZXkgaG9sZGluZyBuaWwgaXMgaW5kaXN0aW5ndWlzaGFibGUKLy8gZnJvbSBhIG1pc3Npbmcga2V5LCB3aGljaCB3b3VsZCB0dXJuIHRoZSBhc3NlcnRpb24ncyBvayBmcm9tICJ0aGUga2V5Ci8vIGlzIHByZXNlbnQiIGludG8gInRoZSBrZXkgaXMgcHJlc2VudCBBTkQgd2VsbC10eXBlZCIuIEV2ZXJ5IFNldCBjYWxsCi8vIGluIHRoaXMgZmlsZSBzdG9yZXMgYSBub24tbmlsICpzZXQsICptZW1iZXIgb3IgaW50NjQuCmZ1bmMgbXVzdEdldChpZCBpbnQ2NCkgKnNldCB7CglzLCBvayA6PSBzZXRzLkdldChwYWRJRChpZCkpLigqc2V0KQoJaWYgIW9rIHsKCQlwYW5pYygibm8gc3VjaCBzZXQiKQoJfQoJcmV0dXJuIHMKfQoKZnVuYyBtdXN0T3BlbihpZCBpbnQ2NCkgKnNldCB7CglzIDo9IG11c3RHZXQoaWQpCglpZiBzLnN0YXRlICE9IHN0YXRlT3BlbiB7CgkJcGFuaWMoInNldCBpcyBub3Qgb3BlbiIpCgl9CglyZXR1cm4gcwp9CgpmdW5jIG1lbWJlck9mKHMgKnNldCwga2V5IHN0cmluZykgKm1lbWJlciB7CglpZiBtLCBvayA6PSBzLm1lbWJlcnMuR2V0KGtleSkuKCptZW1iZXIpOyBvayB7CgkJcmV0dXJuIG0KCX0KCXJldHVybiBuaWwKfQoKZnVuYyBwYWlyQW1vdW50KHMgKnNldCwgcGsgc3RyaW5nKSBpbnQ2NCB7CglpZiBuLCBvayA6PSBzLnBhaXJzLkdldChwaykuKGludDY0KTsgb2sgewoJCXJldHVybiBuCgl9CglyZXR1cm4gMAp9CgovLyBwYWlyS2V5IGJ1aWxkcyB0aGUgc3RvcmFnZSBrZXkgZm9yIGEgZGlyZWN0ZWQgZWRnZS4gVGhlIHNlcGFyYXRvciBpcyBhCi8vIG5ld2xpbmUsIHdoaWNoIG5vIGJlY2gzMiBhZGRyZXNzIGNhbiBjb250YWluLCBzbyB0d28gZGlmZmVyZW50Ci8vIChkZWJ0b3IsIGNyZWRpdG9yKSBwYWlycyBjYW4gbmV2ZXIgY29sbGlkZSBpbnRvIG9uZSBrZXkuCmZ1bmMgcGFpcktleShkZWJ0b3IsIGNyZWRpdG9yIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIGRlYnRvciArICJcbiIgKyBjcmVkaXRvciB9CgovLyBuZXRzU3VtVG9aZXJvIHJldHVybnMgdGhlIHN1bSBvZiBldmVyeSBtZW1iZXIncyBuZXQgcG9zaXRpb24sIHdoaWNoCi8vIG11c3QgYmUgemVyby4gSXQgaXMgYSBzZXBhcmF0ZSBPKE0pIHBhc3MgcmF0aGVyIHRoYW4gZm9sZGVkIGludG8KLy8gQ2xvc2UncyBmcmVlemluZyBsb29wIG9uIHB1cnBvc2U6IHRoZSBhc3NlcnRpb24gaGFzIHRvIGhvbGQgb3ZlciB0aGUKLy8gV0hPTEUgbWVtYmVyc2hpcCBiZWZvcmUgYW55IHBvc2l0aW9uIGlzIGZyb3plbiwgYW5kIGEgc2luZ2xlIGxvb3AKLy8gd291bGQgZnJlZXplIHRoZSBlYXJseSBtZW1iZXJzIGJlZm9yZSBpdCBjb3VsZCBrbm93IGFib3V0IHRoZSBsYXRlCi8vIG9uZXMuCmZ1bmMgbmV0c1N1bVRvWmVybyhzICpzZXQpIGludDY0IHsKCXZhciBzdW0gaW50NjQKCXMubWVtYmVycy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCW4sIG9rIDo9IGNoZWNrZWRBZGQoc3VtLCB2LigqbWVtYmVyKS5uZXQpCgkJaWYgIW9rIHsKCQkJcGFuaWMoIm5ldCBwb3NpdGlvbiBzdW0gd291bGQgb3ZlcmZsb3ciKQoJCX0KCQlzdW0gPSBuCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIHN1bQp9CgpmdW5jIGNvbnZlbm9yT3BlbihrZXkgc3RyaW5nKSBpbnQ2NCB7CglpZiBuLCBvayA6PSBvcGVuQnlDb252ZW5vci5HZXQoa2V5KS4oaW50NjQpOyBvayB7CgkJcmV0dXJuIG4KCX0KCXJldHVybiAwCn0KCmZ1bmMgYnVtcENvbnZlbm9yKGtleSBzdHJpbmcsIGRlbHRhIGludDY0KSB7CgluIDo9IGNvbnZlbm9yT3BlbihrZXkpICsgZGVsdGEKCXN3aXRjaCB7CgljYXNlIG4gPCAwOgoJCXBhbmljKCJuZXR0aW5nOiBjb252ZW5vciBvcGVuIGNvdW50IHdlbnQgbmVnYXRpdmUiKQoJY2FzZSBuID09IDA6CgkJb3BlbkJ5Q29udmVub3IuUmVtb3ZlKGtleSkKCWRlZmF1bHQ6CgkJb3BlbkJ5Q29udmVub3IuU2V0KGtleSwgbikKCX0KfQoKLy8gY2hlY2tlZEFkZCBhZGRzIHR3byBpbnQ2NHMgYW5kIHJlcG9ydHMgd2hldGhlciB0aGUgcmVzdWx0IGlzIGV4YWN0LgovLwovLyBTVEFURUQgTElNSVQsIGJlY2F1c2UgaXQgaXMgdGhlIGtpbmQgdGhhdCBzdXJ2aXZlcyBhIGNvcHktcGFzdGUgaW50byBhCi8vIGNvbnRleHQgd2hlcmUgaXQgaXMgd3Jvbmc6IHRoZSBzaWduIHRlc3QgY2Fubm90IHNlZSB0aGUgb25lIG92ZXJmbG93Ci8vIHdoZXJlIHRoZSBzdW0gZG9lcyBub3QgbW92ZSBwYXN0IHRoZSBhZGRlbmQuIGNoZWNrZWRBZGQoMCwgTWluSW50NjQpCi8vIHJldHVybnMgKE1pbkludDY0LCB0cnVlKSDigJQgY29ycmVjdCwgc2luY2UgMCtNaW5JbnQ2NCBpcyBleGFjdGx5Ci8vIE1pbkludDY0IOKAlCBidXQgc28gZG9lcyBjaGVja2VkQWRkKGEsIE1pbkludDY0KSBmb3IgYW55IGEgPj0gMCwgd2hlcmUKLy8gdGhlIHRydWUgc3VtIGlzIHJlcHJlc2VudGFibGUgb25seSB3aGVuIGEgPT0gMC4gTm90aGluZyBoZXJlIGNhbiByZWFjaAovLyBpdDogZXZlcnkgYWRkZW5kIHRoaXMgcmVhbG0gcGFzc2VzIGlzIGVpdGhlciBwb3NpdGl2ZSBvciB0aGUgbmVnYXRpb24KLy8gb2YgYSB2YWx1ZSBhdCBvciBhYm92ZSBNaW5PYmxpZ2F0aW9uLCBzbyBNaW5JbnQ2NCBpcyBuZXZlciBhbiBvcGVyYW5kCi8vIGFuZCBubyBhY2N1bXVsYXRvciBzdGFydHMgYXQgb25lLiBUaGUgYXVkaXQgcmFpc2VkIGl0IGFzIGFuIG9wZW4KLy8gcXVlc3Rpb24gYW5kIHRoZSBhbnN3ZXIgaXMgInVucmVhY2hhYmxlLCBhbmQgd29ydGggYSBjb21tZW50IGlmIHRoaXMKLy8gaGVscGVyIGlzIGV2ZXIgcmV1c2VkIiDigJQgc28gdGhpcyBpcyB0aGUgY29tbWVudCwgYW5kIGEgY2FsbGVyIHRoYXQgY2FuCi8vIHN1cHBseSBNaW5JbnQ2NCBuZWVkcyBhIGRpZmZlcmVudCBoZWxwZXIgcmF0aGVyIHRoYW4gdGhpcyBvbmUuCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXN1bSA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHN1bSA8IGEpIHx8IChiIDwgMCAmJiBzdW0gPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gc3VtLCB0cnVlCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KCi8vIGJwcyByZW5kZXJzIGEgYmFzaXMtcG9pbnQgZmlndXJlIGFzIGEgaHVtYW4gcGVyY2VudGFnZSwgZXhhY3RseS4KZnVuYyBicHMobiBpbnQ2NCkgc3RyaW5nIHsKCXdob2xlIDo9IG4gLyAxMDAKCWZyYWMgOj0gbiAlIDEwMAoJaWYgZnJhYyA9PSAwIHsKCQlyZXR1cm4gaXRvYSh3aG9sZSkgKyAiJSIKCX0KCWlmIGZyYWMlMTAgPT0gMCB7CgkJcmV0dXJuIGl0b2Eod2hvbGUpICsgIi4iICsgaXRvYShmcmFjLzEwKSArICIlIgoJfQoJcGFkIDo9ICIiCglpZiBmcmFjIDwgMTAgewoJCXBhZCA9ICIwIgoJfQoJcmV0dXJuIGl0b2Eod2hvbGUpICsgIi4iICsgcGFkICsgaXRvYShmcmFjKSArICIlIgp9Cgpjb25zdCB6ZXJvcyA9ICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIKCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWNvbnN0IHdpZHRoID0gMjAKCWlmIGxlbihzKSA+PSB3aWR0aCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiB6ZXJvc1s6d2lkdGgtbGVuKHMpXSArIHMKfQoKZnVuYyBzaG9ydEFkZHIoYSBzdHJpbmcpIHN0cmluZyB7CglpZiBsZW4oYSkgPD0gMTQgewoJCXJldHVybiBhCgl9CglyZXR1cm4gYVs6OF0gKyAi4oCmIiArIGFbbGVuKGEpLTQ6XQp9CgovLyAtLS0gcmVuZGVyIC0tLQoKLy8gUmVuZGVyIHNlcnZlcyB0aGUgaW5kZXggYXQgIiIgYW5kIGEgc2V0IHBhZ2UgYXQgIjxpZD4iLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXJldHVybiByZW5kZXJJbmRleCgpCgl9CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocGF0aCwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIjIG5ldHRpbmdcblxuTm90IGEgc2V0IGlkOiBgIiArIHNhbml0aXplLklubGluZVRleHQocGF0aCkgKyAiYFxuIgoJfQoJcywgb2sgOj0gc2V0cy5HZXQocGFkSUQoaWQpKS4oKnNldCkKCWlmICFvayB7CgkJcmV0dXJuICIjIG5ldHRpbmdcblxuTm8gc2V0IGAiICsgaXRvYShpZCkgKyAiYC5cbiIKCX0KCXJldHVybiByZW5kZXJTZXQocykKfQoKZnVuYyByZW5kZXJJbmRleCgpIHN0cmluZyB7CglvdXQgOj0gIiMgbmV0dGluZ1xuXG5NdWx0aWxhdGVyYWwgb2JsaWdhdGlvbiBjbGVhcmluZy4gTWVtYmVycyBkZWNsYXJlIHdoYXQgdGhleSBvd2UgZWFjaCBvdGhlcjsgY2xvc2luZyBhIHNldCBuZXRzIHRob3NlIG9ibGlnYXRpb25zIGFuZCBvbmx5IHRoZSBuZXQgYW1vdW50cyBtb3ZlLlxuXG4iCglvdXQgKz0gInwgfCB8XG58LS0tfC0tLXxcbiIKCW91dCArPSAifCBzZXRzIG9wZW5lZCB8ICIgKyBpdG9hKG5leHRJRCkgKyAiIHxcbiIKCW91dCArPSAifCBvcGVuIG5vdyB8ICIgKyBpdG9hKE9wZW5TZXRzKCkpICsgIiB8XG4iCglvdXQgKz0gInwgc2V0dGxlIGZlZSB8ICIgKyBicHMoU2V0dGxlRmVlQnBzKSArICIgfFxuIgoJb3V0ICs9ICJ8IHBlbmRpbmcgcGF5LWlucyB8ICIgKyBpdG9hKHRvdGFsUGVuZGluZykgKyAiICIgKyBEZW5vbSArICIgfFxuIgoJb3V0ICs9ICJ8IHVuY2xhaW1lZCBjcmVkaXQgfCAiICsgaXRvYShsZWRnZXIuTGlhYmlsaXRpZXMoKS1sZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyAiICIgKyBEZW5vbSArICIgfFxuIgoJb3V0ICs9ICJ8IGZlZSBwb3QgfCAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyAiICIgKyBEZW5vbSArICIgfFxuIgoJb3V0ICs9ICJ8IGhlbGQgfCAiICsgaXRvYShIZWxkKCkpICsgIiAiICsgRGVub20gKyAiIHxcblxuIgoKCWdyb3NzIDo9IGxpZmV0aW1lR3Jvc3NWYWx1ZQoJbmV0IDo9IGxpZmV0aW1lTmV0VmFsdWUKCW91dCArPSAiIyMgTGlmZXRpbWUgY29tcHJlc3Npb25cblxuIgoJb3V0ICs9ICJBY3Jvc3MgZXZlcnkgY2xvc2VkIHNldDogKioiICsgaXRvYShncm9zcykgKyAiICIgKyBEZW5vbSArCgkJIioqIG9mIGRlY2xhcmVkIG9ibGlnYXRpb25zIHJlcXVpcmVkICoqIiArIGl0b2EobmV0KSArICIgIiArIERlbm9tICsKCQkiKiogb2YgdHJhbnNmZXJzLlxuXG4iCglvdXQgKz0gIj4gTmV0dGluZyBjb21wcmVzc2VzIG9ubHkgd2hlcmUgb2JsaWdhdGlvbnMgYXJlIG11dHVhbC4gQSBzdGFyIGdyYXBoIOKAlCBldmVyeW9uZSBvd2luZyBvbmUgaHViIOKAlCBuZXRzIHRvIGl0c2VsZiwgYW5kIHRoZXNlIHR3byBudW1iZXJzIGFyZSBlcXVhbC4gQm90aCBmaWd1cmVzIGFyZSByZXBvcnRlZDsgbm8gc2F2aW5nIGlzIGNsYWltZWQgYW5kIG5vIHJhdGlvIGlzIGNvbXB1dGVkLlxuXG4iCgoJb3V0ICs9ICIjIyBTZXRzXG5cbiIKCWlmIHNldHMuU2l6ZSgpID09IDAgewoJCXJldHVybiBvdXQgKyAiX25vbmUgeWV0Ll9cbiIKCX0KCW91dCArPSAifCBpZCB8IGxhYmVsIHwgc3RhdGUgfCBtZW1iZXJzIHwgZ3Jvc3MgfCBuZXQgfFxufC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIgoJcm93cyA6PSAwCglzZXRzLlJldmVyc2VJdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWlmIHJvd3MgPj0gTWF4UmVuZGVyUm93cyB7CgkJCXJldHVybiB0cnVlCgkJfQoJCXMgOj0gdi4oKnNldCkKCQlvdXQgKz0gInwgWyIgKyBpdG9hKHMuaWQpICsgIl0oIiArIFJlYWxtUGF0aCArICI6IiArIGl0b2Eocy5pZCkgKyAiKSB8ICIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KHMubGFiZWwpICsgIiB8ICIgKyBzLnN0YXRlICsgIiB8ICIgKwoJCQlzdHJjb252Lkl0b2Eocy5tZW1iZXJzLlNpemUoKSkgKyAiIHwgIiArIGl0b2Eocy5ncm9zc1ZhbHVlKSArICIgfCAiICsKCQkJaXRvYShzLm5ldFZhbHVlKSArICIgfFxuIgoJCXJvd3MrKwoJCXJldHVybiBmYWxzZQoJfSkKCWlmIHNldHMuU2l6ZSgpID4gcm93cyB7CgkJb3V0ICs9ICJcbl9zaG93aW5nICIgKyBzdHJjb252Lkl0b2Eocm93cykgKyAiIG9mICIgKwoJCQlzdHJjb252Lkl0b2Eoc2V0cy5TaXplKCkpICsgIiBzdG9yZWQgc2V0cy5fXG4iCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyU2V0KHMgKnNldCkgc3RyaW5nIHsKCW91dCA6PSAiIyBuZXR0aW5nIHNldCAiICsgaXRvYShzLmlkKSArICJcblxuIyMgIiArCgkJc2FuaXRpemUuSW5saW5lVGV4dChzLmxhYmVsKSArICJcblxuIgoJaWYgcy5tZW1vICE9ICIiIHsKCQlvdXQgKz0gc2FuaXRpemUuSW5saW5lVGV4dChzLm1lbW8pICsgIlxuXG4iCgl9CglvdXQgKz0gInwgfCB8XG58LS0tfC0tLXxcbiIKCW91dCArPSAifCBzdGF0ZSB8ICoqIiArIHMuc3RhdGUgKyAiKiogfFxuIgoJb3V0ICs9ICJ8IGNvbnZlbm9yIHwgYCIgKyBzaG9ydEFkZHIocy5jb252ZW5vci5TdHJpbmcoKSkgKyAiYCB8XG4iCglvdXQgKz0gInwgZmVlIHwgIiArIGJwcyhzLmZlZUJwcykgKyAiIHxcbiIKCW91dCArPSAifCBkZWNsYXJlIHVudGlsIHwgaGVpZ2h0ICIgKyBpdG9hKHMuZGVhZGxpbmUpICsgIiB8XG4iCglvdXQgKz0gInwgY2xvc2UgdW50aWwgfCBoZWlnaHQgIiArIGl0b2Eocy5jbG9zZUVuZCkgKyAiIHxcbiIKCWlmIHMuc2V0dGxlRW5kICE9IDAgewoJCW91dCArPSAifCBzZXR0bGUgdW50aWwgfCBoZWlnaHQgIiArIGl0b2Eocy5zZXR0bGVFbmQpICsgIiB8XG4iCgl9CglvdXQgKz0gInwgbm93IHwgaGVpZ2h0ICIgKyBpdG9hKHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgKyAiIHxcbiIKCWlmIHMuc3RhdGUgPT0gc3RhdGVTZXR0bGluZyB7CgkJb3V0ICs9ICJ8IHBhaWQgaW4gfCAiICsgaXRvYShzLnBhaWRJbikgKyAiIG9mICIgKyBpdG9hKHMubmV0VmFsdWUpICsKCQkJIiAiICsgRGVub20gKyAiIHxcbiIKCX0KCW91dCArPSAiXG4jIyBDb21wcmVzc2lvblxuXG4iCglvdXQgKz0gInwgfCBjb3VudCB8IHZhbHVlIHxcbnwtLS18LS0tfC0tLXxcbiIKCW91dCArPSAifCBncm9zcyBvYmxpZ2F0aW9ucyB8ICIgKyBpdG9hKHMuZ3Jvc3NDb3VudCkgKyAiIHwgIiArCgkJaXRvYShzLmdyb3NzVmFsdWUpICsgIiAiICsgRGVub20gKyAiIHxcbiIKCW91dCArPSAifCBuZXQgdHJhbnNmZXJzIHwgIiArIGl0b2Eocy5uZXRUcmFuc2ZlckNvdW50KSArICIgfCAiICsKCQlpdG9hKHMubmV0VmFsdWUpICsgIiAiICsgRGVub20gKyAiIHxcblxuIgoJaWYgcy5zdGF0ZSA9PSBzdGF0ZU9wZW4gewoJCW91dCArPSAiX05ldCBmaWd1cmVzIGFyZSBmcm96ZW4gYXQgQ2xvc2UgYW5kIHJlYWQgemVybyB1bnRpbCB0aGVuLl9cblxuIgoJfSBlbHNlIGlmIHMubmV0VmFsdWUgPT0gMCAmJiBzLmdyb3NzVmFsdWUgPiAwIHsKCQlvdXQgKz0gIioqRnVsbHkgbmV0dGVkOiAiICsgaXRvYShzLmdyb3NzVmFsdWUpICsgIiAiICsgRGVub20gKwoJCQkiIG9mIG9ibGlnYXRpb25zIGNsZWFyZWQgd2l0aCBubyB0cmFuc2ZlciBhdCBhbGwuKipcblxuIgoJfQoKCW91dCArPSAiIyMgTWVtYmVyc1xuXG4iCglpZiBzLm1lbWJlcnMuU2l6ZSgpID09IDAgewoJCW91dCArPSAiX25vbmUgYWRtaXR0ZWQuX1xuXG4iCgl9IGVsc2UgewoJCW91dCArPSAifCBtZW1iZXIgfCBvd2VzIChncm9zcykgfCBvd2VkIChncm9zcykgfCBuZXQgfCBwYXkgaW4gfCByZWNlaXZlIHwgcGFpZCB8XG4iCgkJb3V0ICs9ICJ8LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIgoJCXJvd3MgOj0gMAoJCXMubWVtYmVycy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCQlpZiByb3dzID49IE1heFJlbmRlclJvd3MgewoJCQkJcmV0dXJuIHRydWUKCQkJfQoJCQltIDo9IHYuKCptZW1iZXIpCgkJCW91dCArPSAifCBgIiArIHNob3J0QWRkcihrKSArICJgIHwgIiArIGl0b2EobS5ncm9zc091dCkgKyAiIHwgIiArCgkJCQlpdG9hKG0uZ3Jvc3NJbikgKyAiIHwgIiArIGl0b2EobS5uZXQpICsgIiB8ICIgKwoJCQkJaXRvYShtLmRlYml0KSArICIgfCAiICsgaXRvYShtLmNyZWRpdCkgKyAiIHwgIiArCgkJCQlpdG9hKG0ucGFpZCkgKyAiIHxcbiIKCQkJcm93cysrCgkJCXJldHVybiBmYWxzZQoJCX0pCgkJaWYgcy5tZW1iZXJzLlNpemUoKSA+IHJvd3MgewoJCQlvdXQgKz0gIlxuX3Nob3dpbmcgIiArIHN0cmNvbnYuSXRvYShyb3dzKSArICIgb2YgIiArCgkJCQlzdHJjb252Lkl0b2Eocy5tZW1iZXJzLlNpemUoKSkgKyAiIG1lbWJlcnMuX1xuIgoJCX0KCQlvdXQgKz0gIlxuIgoJfQoKCW91dCArPSAiIyMgT2JsaWdhdGlvbnNcblxuIgoJaWYgcy5wYWlycy5TaXplKCkgPT0gMCB7CgkJcmV0dXJuIG91dCArICJfbm9uZSBkZWNsYXJlZC5fXG4iCgl9CglvdXQgKz0gInwgZGVidG9yIHwgY3JlZGl0b3IgfCBhbW91bnQgfFxufC0tLXwtLS18LS0tfFxuIgoJcm93cyA6PSAwCglzLnBhaXJzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGsgc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJaWYgcm93cyA+PSBNYXhSZW5kZXJSb3dzIHsKCQkJcmV0dXJuIHRydWUKCQl9CgkJZGVidG9yLCBjcmVkaXRvciA6PSBzcGxpdFBhaXJLZXkoaykKCQlvdXQgKz0gInwgYCIgKyBzaG9ydEFkZHIoZGVidG9yKSArICJgIHwgYCIgKyBzaG9ydEFkZHIoY3JlZGl0b3IpICsKCQkJImAgfCAiICsgaXRvYSh2LihpbnQ2NCkpICsgIiB8XG4iCgkJcm93cysrCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgcy5wYWlycy5TaXplKCkgPiByb3dzIHsKCQlvdXQgKz0gIlxuX3Nob3dpbmcgIiArIHN0cmNvbnYuSXRvYShyb3dzKSArICIgb2YgIiArCgkJCXN0cmNvbnYuSXRvYShzLnBhaXJzLlNpemUoKSkgKyAiIG9ibGlnYXRpb24gcGFpcnMuX1xuIgoJfQoJcmV0dXJuIG91dAp9CgovLyBzcGxpdFBhaXJLZXkgcmV2ZXJzZXMgcGFpcktleSBmb3IgcmVuZGVyLiBUaGUgc2VwYXJhdG9yIGNhbm5vdCBhcHBlYXIKLy8gaW5zaWRlIGFuIGFkZHJlc3MsIHNvIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGlzIHRoZSBvbmx5IG9uZS4KZnVuYyBzcGxpdFBhaXJLZXkocGsgc3RyaW5nKSAoZGVidG9yLCBjcmVkaXRvciBzdHJpbmcpIHsKCWZvciBpIDo9IDA7IGkgPCBsZW4ocGspOyBpKysgewoJCWlmIHBrW2ldID09ICdcbicgewoJCQlyZXR1cm4gcGtbOmldLCBwa1tpKzE6XQoJCX0KCX0KCXJldHVybiBwaywgIiIKfQoiDTEwMDAwMDAwdWdub3QSEgiW9YFiEgsyMDU1NTR1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAUodHe6ZvwrUgv0ut6IlUuz2ELz/glXvDvimLvmLB1881jCkeNVjwhPkOG8U3SroA81z85hxs2sPtl7KTwmiNdBooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}