{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "CZj4OKtpNNDjC5kpFD4Ofarhqu1I5pi/1+v4rs4sN80=",
    "height": "551862",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "139391818",
      "GasUsed": "92927889"
    },
    "tx": "CqSrBAoML3ZtLm1fYWRkcGtnEpKrBAooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLVqgQKDnJlaW1idXJzZW1lbnRzEkJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcmVpbWJ1cnNlbWVudHMaaQoLZ25vbW9kLnRvbWwSWm1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcmVpbWJ1cnNlbWVudHMiCmdubyA9ICIwLjkiChqSqQQKEnJlaW1idXJzZW1lbnRzLmdubxL6qAQvLyBSZWFsbSByZWltYnVyc2VtZW50cyBpcyBhIGNsYWltYW50LWluaXRpYXRlZCwgYXBwcm92ZXItZ2F0ZWQgZXhwZW5zZQovLyByZWltYnVyc2VtZW50IGRlc2sgaW4gR05PVDogYW4gb3duZXIgZnVuZHMgYSBwb29sIGFuZCBhcHBvaW50cyBhbgovLyBhcHByb3ZlciB3aXRoIGEgYm91bmRlZCwgcmF0ZS1saW1pdGVkLCByZXZvY2FibGUgYXV0aG9yaXR5IHRvIGFwcHJvdmUKLy8gYWdhaW5zdCBpdDsgYW55b25lIG1heSB0aGVuIFNVQk1JVCBhIHJlcXVlc3QgZm9yIGEgc3BlY2lmaWMgYW1vdW50IHdpdGgKLy8gYSBtZW1vOyBhbmQgdGhlIGFwcHJvdmVyIGVpdGhlciBhcHByb3ZlcyBpdCDigJQgd2hpY2ggc2V0dGxlcyB0aGUgbW9uZXkKLy8gaW50byB0aGUgY2xhaW1hbnQncyBjcmVkaXQgaW1tZWRpYXRlbHkg4oCUIG9yIHJlamVjdHMgaXQuCi8vCi8vIFdIWSBUSElTIEVYSVNUUyAoc2VlIERJU0NPVkVSWS5tZCk6IHJlcXVlc3QtdGhlbi1hcHByb3ZlIGlzIE5PVCBuZXcKLy8gaGVyZSwgYW5kIGFuIGVhcmxpZXIgZHJhZnQgb2YgdGhpcyBjb21tZW50IHdyb25nbHkgY2xhaW1lZCBpdCB3YXMuCi8vIFRocmVlIHJlYWxtcyBpbiB0aGlzIHBvcnRmb2xpbyBhbHJlYWR5IGxldCBhIHJlcXVlc3RlciBpbml0aWF0ZSBhbmQgYQovLyBzZWNvbmQgcGFydHkgZ2F0ZSBiZWZvcmUgdmFsdWUgbW92ZXMg4oCUIGdyYW50cyAoYXBwbGljYW50cyBhcHBseSwgdGhlCi8vIGNyZWF0b3Igc2VsZWN0cyksIGJvdW50aWVzIChhIGZ1bmRlciBkZXNpZ25hdGVzIGEgd2lubmVyKSBhbmQKLy8gYm91bnR5X3BhbmVsIChjb250cmlidXRvcnMgc3VibWl0LCBhbiBNLW9mLU4gcGFuZWwgdm90ZXMpLiBUaGUgwqc3Ci8vIHN3ZWVwIHRoYXQgZm91bmQgdGhlbSBpcyByZWNvcmRlZCBpbiBESVNDT1ZFUlkubWQuIFRoZSBjbGFpbSB0aGlzCi8vIHJlYWxtIGFjdHVhbGx5IHJlc3RzIG9uIGlzIG5hcnJvd2VyLCBhbmQgYWxsIHRocmVlIHBhcnRzIGFyZQovLyBsb2FkLWJlYXJpbmc6Ci8vCi8vICAgLSBUSEUgUkVRVUVTVEVSIFBSSUNFUyBJVC4gQSBncmFudCBvciBib3VudHkgYW1vdW50IGlzIHRoZSBmdW5kZXIncwovLyAgICAgb2ZmZXIsIGZpeGVkIGJlZm9yZSBhbnlvbmUgYXNrcy4gQSByZWltYnVyc2VtZW50IGFtb3VudCBpcyBhIGNvc3QKLy8gICAgIHRoZSBjbGFpbWFudCBhbHJlYWR5IGluY3VycmVkLCBzbyB0aGUgY2xhaW1hbnQgbmFtZXMgaXQgYW5kIHRoZQovLyAgICAgYXBwcm92ZXIncyBvbmx5IGxldmVyIGlzIHllcyBvciBubyBvbiB0aGF0IGZpZ3VyZS4KLy8gICAtIFNFVFRMRU1FTlQgSVMgTk9OLUVYQ0xVU0lWRS4gVGhvc2UgdGhyZWUgYXJlIGNvbXBldGl0aXZlIGF3YXJkczoKLy8gICAgIGVzY3JvdyBpcyByZXNlcnZlZCBwZXIgaXRlbSBhbmQgZXhhY3RseSBvbmUgcmVxdWVzdGVyIHdpbnMuIEhlcmUgYW4KLy8gICAgIHVuYm91bmRlZCBudW1iZXIgb2YgcmVxdWVzdHMgc2V0dGxlIGFnYWluc3Qgb25lIFNIQVJFRCwKLy8gICAgIFVOLUVTQ1JPV0VEIHBvb2wsIHdoaWNoIGlzIHdoeSBhIHBlbmRpbmcgcmVxdWVzdCBpcyBub3QgYQovLyAgICAgcmVzZXJ2YXRpb24gKHNlZSBiZWxvdykg4oCUIHRoZSBkaXZlcmdlbmNlIHRoaXMgcmVhbG0gaXMgYnVpbHQgb24uCi8vICAgLSBUSEUgQVBQUk9WRVIgSVMgUkFURS1MSU1JVEVELiBJbiBhbGwgdGhyZWUgdGhlIHNlbGVjdGluZyBwYXJ0eSBtYXkKLy8gICAgIGF3YXJkIHdoZW5ldmVyIGl0IGxpa2VzLiBIZXJlIHRoZSBhcHByb3ZlciBpcyBub3QgdGhlIG93bmVyIGFuZAovLyAgICAgaG9sZHMgYSBib3VuZGVkLCB3aW5kb3dlZCwgcmV2b2NhYmxlIHNwZW5kYm9vayBhdXRob3JpdHksIHNvIGFuCi8vICAgICBhcHByb3ZlciBrZXkgY2Fubm90IGRyYWluIHRoZSBwb29sLgovLwovLyBUaGUgZm91ciBvdGhlciBkaXNidXJzZW1lbnQgc2hhcGVzIGhlcmUgYXJlIGZ1cnRoZXIgYXdheSBzdGlsbDoKLy8gdHJlYXN1cnlfYm9hcmQgbmVlZHMgdGhlIFBST1BPU0VSIHRvIGJlIGEgc2lnbmVyLCBzbyBhbiBvdXRzaWRlCi8vIGNsYWltYW50IGNhbm5vdCBhc2s7IGJ1ZGdldHMgZ3JhbnRzIGF1dGhvcml0eSB1cCBmcm9udCB3aXRoIG5vCi8vIHBlci1pdGVtIGdhdGU7IGludm9pY2VzIGlzIGEgcmVjZWl2YWJsZSBub2JvZHkgYXBwcm92ZXM7IHBheXJvbGwgYW5kCi8vIHZlc3RpbmcgYXJlIGVtcGxveWVyLWZ1bmRlZCBhY2NydWFsIG9uIGEgc2NoZWR1bGUuCi8vCi8vIEl0IGlzIGFsc28sIGRlbGliZXJhdGVseSwgdGhlIFNFQ09ORCBDT05TVU1FUiBvZiBzcGVuZGJvb2ssIGFuZCB0aGUKLy8gZmlyc3Qgd2l0aCBhbiBJTlZFUlRFRCB0ZW1wb3JhbCBvcmRlci4gYnVkZ2V0cyBjb25zdW1lcyBhdXRob3JpdHkgYXQKLy8gc3BlbmQgdGltZSBieSB0aGUgc3BlbmRlci4gSGVyZSB0aGUgc3BlbmRib29rICJzcGVuZGVyIiBpcyB0aGUKLy8gQVBQUk9WRVIsIGFuZCB0aGUgYXV0aG9yaXR5IGlzIGNvbnN1bWVkIGF0IEFQUFJPVkUgdGltZSBhZ2FpbnN0IGEKLy8gcmVxdWVzdCBhIHRoaXJkIHBhcnR5IHN1Ym1pdHRlZC4gQSBwcmltaXRpdmUgd2l0aCBvbmUgY29uc3VtZXIgaXMKLy8gYmFyZWx5IHByb3ZlbiBhcyBhIHByaW1pdGl2ZTsgYSBzZWNvbmQgY29uc3VtZXIgdGhhdCB1c2VzIGl0IHRoZSBzYW1lCi8vIHdheSBwcm92ZXMgbGl0dGxlIG1vcmUuIFRoaXMgb25lIGV4ZXJjaXNlcyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgovLwovLyBDT01QT1NJVElPTjogYXBwcm92YWwgYXV0aG9yaXR5IGlzIGRlbGVnYXRlZCBlbnRpcmVseSB0byBzcGVuZGJvb2sKLy8gKGFuY2hvcmVkIHdpbmRvd3MsIGxpZmV0aW1lIGNhcHMsIGV4cGlyeSwgb25lLXNpZGVkIGFtZW5kbWVudHMsCi8vIHJldm9jYXRpb24pLCBjb2luIG1vdmVtZW50IHRvIGNvaW5pbywgcGVyLWNsYWltYW50IGNyZWRpdCBhbmQgdGhlIGZlZQovLyBwb3QgdG8gZmVlbGVkZ2VyLCBvcmRlcmVkIHN0b3JhZ2UgdG8gcC9udC9hdmwvdjAsIGFuZCBmcmVlLXRleHQgcmVuZGVyCi8vIG91dHB1dCB0byBwL250L21hcmtkb3duL3Nhbml0aXplL3YwLiBUaGlzIHJlYWxtIG93bnMgdGhlIHBvb2wKLy8gYWNjb3VudGluZywgdGhlIGRlc2sgYW5kIHJlcXVlc3QgcmVjb3JkcywgdGhlIGNvbmZsaWN0LW9mLWludGVyZXN0Ci8vIHJ1bGUsIGFuZCB0aGUgc29sdmVuY3kgcnVsZS4KLy8KLy8gIyBBIGRlc2ssIGFuZCB3aGF0IGFuIGFwcHJvdmFsIElTCi8vCi8vIEEgZGVzayBpcyBvbmUgKG93bmVyLCBhcHByb3ZlcikgcGFpciB3aXRoIGEgYm91bmRlZCBhdXRob3JpdHkgb3ZlciB0aGUKLy8gb3duZXIncyBwb29sLiBBIHJlcXVlc3QgaXMgb25lIGNsYWltYW50J3MgYXNrIGFnYWluc3Qgb25lIGRlc2suCi8vCi8vIFRoZSBERUxJQkVSQVRFIERJVkVSR0VOQ0UgZnJvbSBidWRnZXRzIGlzIGF0IGFwcHJvdmFsOgovLwovLwlBbiBhcHByb3ZlZCByZWltYnVyc2VtZW50IGlzIGEgU0VUVExFRCBPQkxJR0FUSU9OLCBub3QgYXV0aG9yaXR5LgovLwovLyBBcHByb3ZlIG1vdmVzIHRoZSBncm9zcyBvdXQgb2YgdGhlIG93bmVyJ3MgcG9vbCBhbmQgaW50byB0aGUgY2xhaW1hbnQncwovLyBsZWRnZXIgY3JlZGl0IGluIHRoZSBzYW1lIGNhbGwuIFRoZSBvd25lciBjYW5ub3QgdGhlbiB3aXRoZHJhdyBpdCBvdXQKLy8gZnJvbSB1bmRlciBhbiBhcHByb3ZlZCBjbGFpbWFudCwgYW5kIG5vIHNlY29uZCBzdGVwIGNhbiBmYWlsLiBidWRnZXRzJwovLyBydWxlIOKAlCAiYSBidWRnZXQgaXMgYXV0aG9yaXR5LCBub3QgYSByZXNlcnZhdGlvbiIg4oCUIGlzIGV4cGxpY2l0bHkgTk9UCi8vIGluaGVyaXRlZCwgYmVjYXVzZSB0aGUgdHdvIHJlYWxtcyBhcmUgYW5zd2VyaW5nIGRpZmZlcmVudCBxdWVzdGlvbnMuIEEKLy8gYnVkZ2V0IGlzIGFuIG9uZ29pbmcgcGVybWlzc2lvbiB3aG9zZSBwb2ludCBpcyBub3QgcHJlLWNvbW1pdHRpbmcKLy8gY2FwaXRhbC4gQW4gYXBwcm92ZWQgZXhwZW5zZSBjbGFpbSBpcyBhIGRlY2lzaW9uIGFib3V0IGEgY29zdCBhbHJlYWR5Ci8vIGluY3VycmVkLCBhbmQgYSBkZWNpc2lvbiB0aGF0IGNhbiBldmFwb3JhdGUgaXMgbm90IGEgZGVjaXNpb24uCi8vCi8vIFRoZSByZWFsbSB0aGVyZWZvcmUgbmV2ZXIgaG9sZHMgYSBwYXJ0aWFsbHktY29tbWl0dGVkIHN0YXRlOiBhIHJlcXVlc3QKLy8gaXMgcGVuZGluZyAobm90aGluZyBoYXMgbW92ZWQpIG9yIHNldHRsZWQgKGV2ZXJ5dGhpbmcgaGFzIG1vdmVkKS4KLy8KLy8gIyBBIFBFTkRJTkcgUkVRVUVTVCBJUyBOT1QgQSBMSUFCSUxJVFkKLy8KLy8gU3RhdGVkIHBsYWlubHkgYmVjYXVzZSB0aGUgb3Bwb3NpdGUgaXMgdGhlIG5hdHVyYWwgYXNzdW1wdGlvbi4KLy8gU3VibWl0dGluZyByZXNlcnZlcyBub3RoaW5nLCBsb2NrcyBub3RoaW5nLCBhbmQgaXMgbm90IGEgY2xhaW0gb24gdGhlCi8vIHBvb2wuIFRlbiBwZW5kaW5nIHJlcXVlc3RzIG9mIDEwMCBhZ2FpbnN0IGEgcG9vbCBvZiAxMDAgYXJlIGFsbCB0ZW4KLy8gc3VibWl0dGFibGU7IHRoZSBhcHByb3ZlciBjYW4gYXBwcm92ZSBvbmUgb2YgdGhlbS4gTGlhYmlsaXRpZXMoKSBjb3VudHMKLy8gcG9vbGVkIGZ1bmRzIGFuZCBzZXR0bGVkIGNyZWRpdCwgYW5kIGEgcGVuZGluZyByZXF1ZXN0IGFwcGVhcnMgaW4KLy8gbmVpdGhlci4gV2hhdCBhIGNsYWltYW50IGNhbiByZWx5IG9uIGlzIHRoZSBtb21lbnQgb2YgYXBwcm92YWwsIHdoaWNoCi8vIGlzIGF0b21pYywgYW5kIHRoZSBBcHByb3ZhYmxlIHZpZXcsIHdoaWNoIHJlcG9ydHMgdGhlIGhvbmVzdCBmaWd1cmUKLy8gYmVmb3JlIHRoZXkgYXJlIHRvbGQgeWVzLgovLwovLyAjIFRIRSBBUFBST1ZFUiBJUyBUSEUgU1BFTkRCT09LIFNQRU5ERVIKLy8KLy8gVGhlIGRlc2sncyBhbGxvd2FuY2UgaXMgY29uc3VtZWQgYnkgdGhlIEdST1NTIGFwcHJvdmVkIGFtb3VudCwgc28gaXQKLy8gYm91bmRzIHRoZSBvd25lcidzIHRvdGFsIE9VVEZMT1cgcGVyIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgY2xhaW1hbnQncwovLyByZWNlaXB0IOKAlCB0aGUgZmlndXJlIGFuIG93bmVyIGFjdHVhbGx5IGNhcmVzIGFib3V0IGNhcHBpbmcsIGFuZCB0aGUgc2FtZQovLyB0cmVhdG1lbnQgYnVkZ2V0cyBnaXZlcyBpdHMgZmVlLiBBbiBhcHByb3ZlciB3aXRoIGEgUGVyUGVyaW9kIG9mIDEgR05PVAovLyBjYW4gYXBwcm92ZSAxIEdOT1Qgb2YgdGhlIG93bmVyJ3MgbW9uZXkgcGVyIHdpbmRvdyBubyBtYXR0ZXIgaG93IG1hbnkKLy8gY2xhaW1hbnRzIGFzaywgYW5kIG5vIHNpbmdsZSBjb21wcm9taXNlZCBhcHByb3ZlciBrZXkgY2FuIGRvIG1vcmUgdGhhbgovLyBpdHMgd2luZG93IGFsbG93cyBiZWZvcmUgdGhlIG93bmVyIHJldm9rZXMgdGhlIGRlc2suCi8vCi8vICMgU0VMRi1BUFBST1ZBTCBJUyBQUk9ISUJJVEVECi8vCi8vIEFwcHJvdmUgcmVmdXNlcyB3aGVuIHRoZSByZXF1ZXN0J3MgY2xhaW1hbnQgaXMgdGhlIGFwcHJvdmluZyBhZGRyZXNzLgovLyBUaGlzIGlzIGEgcmVhbCBjb25mbGljdC1vZi1pbnRlcmVzdCBjb250cm9sIGFuZCBub3QgYSBmb3JtYWxpdHk6IGFuCi8vIGFwcHJvdmVyIHdpdGggYSBkZXNrIGNvdWxkIG90aGVyd2lzZSByZWltYnVyc2UgdGhlbXNlbHZlcyBhdCB3aWxsIHVwIHRvCi8vIHRoZSB3aW5kb3cgY2FwLiBUaGUgcnVsZSBpcyBwZXItQVBQUk9WQUwsIG5vdCBwZXItZGVzaywgc28gYW4gYWRkcmVzcwovLyBjYW5ub3Qgcm91dGUgaXRzIG93biBjbGFpbSB0aHJvdWdoIGEgc2Vjb25kIGRlc2sgaXQgYWxzbyBhcHByb3Zlcy4gQW4KLy8gYXBwcm92ZXIgbWF5IHN0aWxsIHN1Ym1pdCByZXF1ZXN0cyDigJQgdG8gYmUgYXBwcm92ZWQgYnkgc29tZWJvZHkgZWxzZS4KLy8KLy8gIyBMSUZFQ1lDTEUKLy8KLy8JRnVuZCAob3duZXIsICtzZW5kKSAgICAgIDogYWRkcyByZWFsIGNvaW5zIHRvIHRoZSBjYWxsZXIncyBvd24gcG9vbC4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgQW55b25lIG1heSBmdW5kOyBmdW5kaW5nIG1ha2VzIHlvdSBhbgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lci4gTWluaW11bSBNaW5GdW5kaW5nLgovLwlXaXRoZHJhd1Bvb2wgKG93bmVyKSAgICAgOiBwdWxscyBVTlNQRU5UIHBvb2wgYmFjayBvdXQsIGFueSBhbW91bnQsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSB0aW1lLiBBcHByb3ZlZCBjcmVkaXQgaXMgYWxyZWFkeSBvdXQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBvb2wgYW5kIHVucmVhY2hhYmxlLgovLwlXaXRoZHJhd1Bvb2xBbGwgKG93bmVyKSAgOiB0aGUgd2hvbGUgdW5zcGVudCBwb29sLgovLwlPcGVuRGVzayAob3duZXIpICAgICAgICAgOiBhcHBvaW50cyBvbmUgYXBwcm92ZXIgd2l0aCBib3VuZGVkCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eSBhbmQgcmV0dXJucyB0aGUgZGVzayBpZC4gVGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsIGZlZSBpcyBzbmFwc2hvdHRlZCBoZXJlLgovLwlBbWVuZERlc2sgKG93bmVyKSAgICAgICAgOiBjaGFuZ2VzIHRoZSBkZXNrJ3MgdGVybXMuIFRpZ2h0ZXItb3ItZXF1YWwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllcyBub3c7IGxvb3NlciB3YWl0cyBmb3IgdGhlIG5leHQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IGJvdW5kYXJ5LiBwZXJpb2RMZW5ndGggaXMgTk9UIGEKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIOKAlCBzcGVuZGJvb2sgbWFrZXMgaXQgaW1tdXRhYmxlLgovLwlDbG9zZURlc2sgKG93bmVyKSAgICAgICAgOiBpbW1lZGlhdGU7IHRoZSBpZCBpcyBuZXZlciByZXVzZWQuCi8vCVJlYXBEZXNrIChBTllPTkUpICAgICAgICA6IHJlbW92ZXMgYW4gRVhQSVJFRCBkZXNrLCBmcmVlaW5nIGl0cyBzbG90LgovLwlTdWJtaXQgKEFOWU9ORSkgICAgICAgICAgOiBmaWxlcyBhIHJlcXVlc3QgYWdhaW5zdCBhIGRlc2sgZm9yIGEKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgYW1vdW50IHdpdGggYSBtZW1vLCBhbmQgcmV0dXJucwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdCBpZC4gRXhwaXJlcyBhZnRlciBSZXF1ZXN0VFRMCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy4KLy8JQXBwcm92ZSAoQVBQUk9WRVIpICAgICAgIDogc2V0dGxlcyB0aGUgcmVxdWVzdCDigJQgZGViaXRzIHRoZSBvd25lcidzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIGNyZWRpdHMgdGhlIGNsYWltYW50IG5ldCBvZiB0aGUgZmVlLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcyB0aGUgZGVzaydzIGF1dGhvcml0eSwgcmVtb3ZlcyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC4KLy8JUmVqZWN0IChBUFBST1ZFUikgICAgICAgIDogY2xvc2VzIHRoZSByZXF1ZXN0IHdpdGggYSByZWFzb24uIE5vdGhpbmcKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZXMuIEFsbG93ZWQgZXZlbiBhZnRlciBleHBpcnkuCi8vCVJldHJhY3QgKENMQUlNQU5UKSAgICAgICA6IHRoZSBjbGFpbWFudCB3aXRoZHJhd3MgdGhlaXIgb3duIHJlcXVlc3QuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGhpbmcgbW92ZXMuIE5hbWVkIFJldHJhY3QsIG5vdAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXRoZHJhdywgYmVjYXVzZSBldmVyeSBXaXRoZHJhdyogaW4gdGhpcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Zm9saW8gbW92ZXMgbW9uZXkgYW5kIHRoaXMgbW92ZXMgbm9uZS4KLy8JRXhwaXJlUmVxdWVzdCAoQU5ZT05FKSAgIDogcmVtb3ZlcyBhIHJlcXVlc3QgcGFzdCBpdHMgZXhwaXJ5LgovLwlDbGFpbSAoQ0xBSU1BTlQpICAgICAgICAgOiBwYXlzIHRoZSBjbGFpbWFudCdzIHdob2xlIHNldHRsZWQgY3JlZGl0Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC4gVGhlIHBvcnRmb2xpbydzIHN0YW5kYXJkIHB1bGwuCi8vCVdpdGhkcmF3RmVlcyAoQU5ZT05FKSAgICA6IHBheXMgdGhlIGZlZSBwb3QgdG8gdGhlIGNvbXBpbGUtdGltZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWVDb2xsZWN0b3IuIEZpeGVkIGRlc3RpbmF0aW9uLgovLwlTd2VlcFN1cnBsdXMgKEFOWU9ORSkgICAgOiBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgRmVlQ29sbGVjdG9yLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXZlciB0b3VjaGluZyB0cmFja2VkIGxpYWJpbGl0aWVzLgovLwovLyAjIEEgQ0xPU0VEIERFU0sgTEVBVkVTIElUUyBSRVFVRVNUUyBVTi1BUFBST1ZBQkxFCi8vCi8vIENsb3NlRGVzayBhbmQgUmVhcERlc2sgcmVtb3ZlIHRoZSBkZXNrIGFuZCBpdHMgYWxsb3dhbmNlLiBSZXF1ZXN0cwovLyBmaWxlZCBhZ2FpbnN0IGl0IHJlbWFpbiBhcyByZWNvcmRzIGFuZCBjYW4gbmV2ZXIgYmUgYXBwcm92ZWQg4oCUIEFwcHJvdmUKLy8gcGFuaWNzIG9uIHRoZSBtaXNzaW5nIGRlc2suIFRoZXkgY2FuIGJlIFJldHJhY3RlZCBieSB0aGVpciBjbGFpbWFudCBvciwKLy8gb25jZSBwYXN0IGV4cGlyeSwgRXhwaXJlUmVxdWVzdGVkIGJ5IGFueW9uZS4KLy8KLy8gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIENBU0NBREUgREVMRVRFLiBGaW5kaW5nIGEgY2xvc2VkIGRlc2sncwovLyByZXF1ZXN0cyBtZWFucyBpdGVyYXRpbmcgdGhlIHJlcXVlc3QgdHJlZSwgd2hpY2ggaXMgdW5ib3VuZGVkIHdvcmsgaW4gYQovLyB0cmFuc2FjdGlvbiB3aG9zZSBnYXMgdGhlIG93bmVyIHBheXMsIGFuZCBhbiBvd25lciB3aG8gY2Fubm90IGNsb3NlIGEKLy8gZGVzayBiZWNhdXNlIGl0IGhhcyB0b28gbWFueSBwZW5kaW5nIHJlcXVlc3RzIGlzIGEgd29yc2UgcmVhbG0gdGhhbiBvbmUKLy8gd2hlcmUgY2xvc2luZyBsZWF2ZXMgcmVjb3JkcyB0byBiZSBzd2VwdC4gVGhlIGNvbmRpdGlvbiBpcyBkb2N1bWVudGVkLAovLyB2aXNpYmxlIGluIFJlcXVlc3RJbmZvIGFuZCBvbiB0aGUgcmVxdWVzdCdzIHJlbmRlciBwYWdlLCBhbmQKLy8gc2VsZi1jbGVhcmluZyB3aXRoaW4gUmVxdWVzdFRUTC4KLy8KLy8gIyBBVkFJTEFCSUxJVFkgQk9VTkQsIHN0YXRlZCBob25lc3RseQovLwovLyBTdWJtaXQgaXMgcGVybWlzc2lvbmxlc3MsIHNvIHRoZSByZXF1ZXN0IHRyZWUgaXMgZmlsbGFibGUuIFRoZQovLyBwZXItY2xhaW1hbnQgYW5kIHBlci1kZXNrIGNhcHMgYm91bmQgT05FIGFkZHJlc3MgYW5kIE9ORSBkZXNrLCBhbmQgYXJlCi8vIGRlZmVhdGVkIGJ5IG1hbnkgYWRkcmVzc2VzIOKAlCB0aGF0IGlzIHRoZSBjb3JyZWN0IHdheSB0byByZWFkIGEKLy8gcGVyLWlkZW50aXR5IGNhcCBvbiBhIHBlcm1pc3Npb25sZXNzIGNoYWluLCBhbmQgYnVkZ2V0cycgb3duIGNvcnJlY3RlZAovLyBjb21tZW50IChmaW5kaW5nIFkxKSBpcyB0aGlzIHBvcnRmb2xpbydzIHJlY29yZCBvZiBnZXR0aW5nIGl0IHdyb25nIHRoZQovLyBvdGhlciB3YXkuCi8vCi8vIFdoYXQgZ2VudWluZWx5IGhlbHBzIGhlcmUsIGFuZCBkb2VzIG5vdCBoZWxwIGluIGJ1ZGdldHMsIGlzIHRoYXQgYQovLyByZXF1ZXN0IGhhcyBhIE1BTkRBVE9SWSBleHBpcnk6IFJlcXVlc3RUVEwgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsCi8vIGV2ZXJ5IHJlcXVlc3QgY2FycmllcyBzdWJtaXR0ZWRBdCArIFJlcXVlc3RUVEwsIGFuZCBFeHBpcmVSZXF1ZXN0IGlzCi8vIHBlcm1pc3Npb25sZXNzIHdpdGggdGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCByZWZ1bmRlZCB0byB0aGUgc3dlZXBpbmcKLy8gdHJhbnNhY3Rpb24uIFNvIHRoZSBmaWxsIGlzIGJvdW5kZWQgaW4gRFVSQVRJT04gYXMgd2VsbCBhcyBwcmljZWQgaW4KLy8gZ2FzIGFuZCBzdG9yYWdlLCBhbmQgaXQgZHJhaW5zIGl0c2VsZi4gYnVkZ2V0cycgZ3JhbnRzIHdpdGggZXhwaXJlc0F0Ci8vID09IDAgY2FuIG5ldmVyIGJlIHJlYXBlZCBieSBhbnlvbmUsIHdoaWNoIGlzIHN0cmljdGx5IHdvcnNlLiBUaGUKLy8gcmVzaWR1YWwgaXMgcmVhbDogZm9yIFJlcXVlc3RUVEwgYmxvY2tzIGEgZmlsbGVkIHRyZWUgYmxvY2tzIE5FVwovLyByZXF1ZXN0cy4gRXZlcnkgZGVzaywgcG9vbCwgYXBwcm92YWwsIGNyZWRpdCBhbmQgY2xhaW0ga2VlcHMgd29ya2luZywKLy8gYW5kIG5vIHZhbHVlIGlzIGF0IHJpc2suCi8vCi8vICMgVEhFUkUgSVMgTk8gQURNSU4KLy8KLy8gVGhlIGZlZSByYXRlLCB0aGUgZmVlIGNvbGxlY3RvciwgdGhlIFRUTCwgZXZlcnkgYm91bmQgYW5kIGV2ZXJ5IGNhcCBhcmUKLy8gY29tcGlsZS10aW1lIGNvbnN0YW50cy4gTm8gYWRkcmVzcyBjYW4gY2hhbmdlIHRlcm1zLCBwYXVzZSB0aGUgcmVhbG0sCi8vIHRvdWNoIGEgcG9vbCBpdCBkaWQgbm90IGZ1bmQsIGFwcHJvdmUgYXQgYSBkZXNrIGl0IHdhcyBub3QgYXBwb2ludGVkCi8vIHRvLCBvciBtb3ZlIGEgcmVxdWVzdCBpdCBkaWQgbm90IGZpbGUuIFRoZSBkZXBsb3llciBoYXMgbm8gcHJpdmlsZWdlIG9mCi8vIGFueSBraW5kIGFmdGVyIGRlcGxveW1lbnQuCi8vCi8vICMgTU9ORVRBUlkgSU5WQVJJQU5UIChjb25zZXJ2YXRpb24pCi8vCi8vIExldCBIIGJlIHRoZSB1Z25vdCBoZWxkIGF0IHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBQIHRoZSBzdW0gb2YgYWxsIG93bmVyCi8vIHBvb2xzICh0cmFja2VkIE8oMSkgYXMgdG90YWxQb29sZWQpLCBMIHRoZSBsZWRnZXIncyBsaWFiaWxpdGllcwovLyAoc2V0dGxlZCBjbGFpbWFudCBjcmVkaXQgcGx1cyB0aGUgZmVlIHBvdCksIGFuZCBTID49IDAgdGhlIG91dC1vZi1iYW5kCi8vIHN1cnBsdXM6Ci8vCi8vCUggPT0gUCArIEwgKyBTCi8vCi8vIEV2ZXJ5IHRyYW5zaXRpb24gbW92ZXMgdmFsdWUgYmV0d2VlbiBleGFjdGx5IHR3byB0ZXJtcyBpbnNpZGUgb25lCi8vIHRyYW5zYWN0aW9uLiBGdW5kIHJhaXNlcyBIIGFuZCBQIHRvZ2V0aGVyIChjb2luaW8uUmVjZWl2ZSBpcyB0aGUKLy8gcmVjZWlwdC1ndWFyYW50ZWVkIHNoYXBlKS4gV2l0aGRyYXdQb29sIGRlYml0cyBQIGJlZm9yZSB0aGUgaWRlbnRpY2FsCi8vIGFtb3VudCBsZWF2ZXMgSC4gQXBwcm92ZSBtb3ZlcyB0aGUgZ3Jvc3Mgb3V0IG9mIFAgYW5kIGludG8gTCwgc3BsaXQKLy8gaW50byB0aGUgY2xhaW1hbnQncyBjcmVkaXQgYW5kIHRoZSBmZWUg4oCUIEggZG9lcyBub3QgbW92ZSBhdCBhbGwsIHdoaWNoCi8vIGlzIHdoeSBBcHByb3ZlIGhhcyBubyBwYXlvdXQgdG8gZmFpbC4gQ2xhaW0gYW5kIFdpdGhkcmF3RmVlcyBkZWJpdCBMCi8vIGJlZm9yZSB0aGVpciBwYXlvdXQuIFN1Ym1pdCwgUmVqZWN0LCBSZXRyYWN0IGFuZCBFeHBpcmVSZXF1ZXN0IG1vdmUKLy8gbm90aGluZyBpbiBhbnkgdGVybS4gQW55IHBhbmljIGFib3J0cyB0aGUgd2hvbGUgdHJhbnNhY3Rpb247IHRoaXMgcmVhbG0KLy8gbmV2ZXIgaXNzdWVzIG9yIHJlbW92ZXMgY29pbnMuCi8vCi8vICMgT05MWSBHTk9UIElTIEFDQ0VQVEVECi8vCi8vIEZ1bmQgcmVqZWN0cyBhbnkgZW52ZWxvcGUgdGhhdCBpcyBub3QgZXhhY3RseSBvbmUgcG9zaXRpdmUgdWdub3QgY29pbgovLyAoY29pbmlvLlJlY2VpdmUpLiBFdmVyeSBvdGhlciBlbnRyeXBvaW50IHJlamVjdHMgYXR0YWNoZWQgY29pbnMKLy8gb3V0cmlnaHQgcmF0aGVyIHRoYW4gY29udmVydGluZyB0aGVtIGludG8gc3dlZXBhYmxlIHN1cnBsdXMuCi8vCi8vICMgQVVUSE9SSVpBVElPTgovLwovLyBFdmVyeSBpZGVudGl0eSBpcyBkZXJpdmVkIGZyb20gdGhlIGNyb3NzaW5nIGVudHJ5cG9pbnQncwovLyBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkuIE5vIGZ1bmN0aW9uIHRha2VzIGEgY2FsbGVyIGlkZW50aXR5IGFzIGEKLy8gcGFyYW1ldGVyLCBzbyBmdW5kaW5nIGFub3RoZXIgb3duZXIncyBwb29sLCBhcHByb3ZpbmcgYXQgYW5vdGhlcgovLyBhZGRyZXNzJ3MgZGVzaywgcmV0cmFjdGluZyBhbm90aGVyIGNsYWltYW50J3MgcmVxdWVzdCwgb3IgY2xhaW1pbmcKLy8gYW5vdGhlciBjbGFpbWFudCdzIGNyZWRpdCBpcyBpbXBvc3NpYmxlIGJ5IGNvbnN0cnVjdGlvbi4gVGhpcyBpcwovLyBzcGVuZGJvb2sgY29uc3VtZXIgY29udHJhY3QgaXRlbSAyLCBjbG9zZWQgc3RydWN0dXJhbGx5LgovLwovLyBUaGUgY2xvY2sgaXMgcnVudGltZS5DaGFpbkhlaWdodCgpLCBuZXZlciBhbiBhcmd1bWVudCDigJQgc3BlbmRib29rCi8vIGNvbnN1bWVyIGNvbnRyYWN0IGl0ZW0gMS4gQSBjYWxsZXIgd2hvIGNvdWxkIGNob29zZSBgbm93YCBjb3VsZCByb2xsCi8vIHRoZSBhcHByb3ZhbCB3aW5kb3cgYXQgd2lsbCwgYW5kIGNvdWxkIGFsc28gZXhwaXJlIGEgcmVxdWVzdCBvdXQgZnJvbQovLyB1bmRlciBpdHMgY2xhaW1hbnQgb3Iga2VlcCBhbiBleHBpcmVkIG9uZSBhbGl2ZS4KLy8KLy8gIyBTVE9SQUdFCi8vCi8vIEEgcG9vbCBlbnRyeSBpcyBwYWlkIGZvciBieSB0aGUgb3duZXIncyBvd24gZnVuZGluZyB0cmFuc2FjdGlvbjsgYSBkZXNrCi8vIHJlY29yZCBhbmQgaXRzIGFsbG93YW5jZSBieSB0aGUgb3duZXIncyBPcGVuRGVzazsgYSByZXF1ZXN0IHJlY29yZCBieQovLyB0aGUgY2xhaW1hbnQncyBTdWJtaXQuIENsb3NlRGVzaywgUmVhcERlc2ssIEFwcHJvdmUsIFJlamVjdCwgUmV0cmFjdAovLyBhbmQgRXhwaXJlUmVxdWVzdCBlYWNoIHJlbW92ZSBhIHJlY29yZCwgYW5kIHRoZSBjaGFpbiByZWZ1bmRzIHRoZSBmcmVlZAovLyBzdG9yYWdlIGRlcG9zaXQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZXMgaXQg4oCUIHdoaWNoIGlzIHRoZQovLyBzdGFuZGluZyBpbmNlbnRpdmUgdG8gY2FsbCBFeHBpcmVSZXF1ZXN0IG9yIFJlYXBEZXNrIG9uIHNvbWVib2R5Ci8vIGVsc2UncyBzdGFsZSByZWNvcmQuCnBhY2thZ2UgcmVpbWJ1cnNlbWVudHMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jb2luaW8iCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ZlZWxlZGdlciIKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvc3BlbmRib29rIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9yZWltYnVyc2VtZW50cyIKCi8vIERlbm9tIGlzIHRoZSBvbmx5IGFzc2V0IHRoaXMgcmVhbG0gaG9sZHMuCmNvbnN0IERlbm9tID0gInVnbm90IgoKLy8gTWF4RmVlQnBzIGlzIHRoZSBoYXJkIGNlaWxpbmcgb24gYW55IGFwcHJvdmFsIGZlZSB0aGlzIHJlYWxtIGNvdWxkIGV2ZXIKLy8gY2hhcmdlLCBlbmZvcmNlZCBieSB0aGUgZmVlbGVkZ2VyIHRoZSByZWFsbSBpcyBjb25zdHJ1Y3RlZCB3aXRoIOKAlCBhCi8vIGZlZUJwcyBhYm92ZSBpdCBpcyByZWZ1c2VkIGJ5IHRoZSBwcmltaXRpdmUncyBvd24gdmFsaWRhdGlvbiwgbm90IGJ5IGEKLy8gY2hlY2sgaW4gdGhpcyBmaWxlLiA1MDAgYnBzID0gNSUuCmNvbnN0IE1heEZlZUJwcyA9IGludDY0KDUwMCkKCi8vIEFwcHJvdmFsRmVlQnBzIGlzIHRoZSBmZWUgYWN0dWFsbHkgc25hcHNob3R0ZWQgaW50byBldmVyeSBkZXNrOiAxMDAgYnBzCi8vID0gMSUsIGNoYXJnZWQgb25jZSBwZXIgYXBwcm92YWwgb24gdGhlIGdyb3NzIGFtb3VudCwgZmxvb3Itcm91bmRlZCBpbgovLyB0aGUgY2xhaW1hbnQncyBmYXZvci4gVGhlIG1vc3QgY29uc2VydmF0aXZlIGxpdmUgZmVlIGluIHRoaXMgcG9ydGZvbGlvCi8vIChmZWVfc3BsaXQsIGNyb3dkZnVuZCwgYnVkZ2V0cykgaXMgYWxzbyAxJS4KY29uc3QgQXBwcm92YWxGZWVCcHMgPSBpbnQ2NCgxMDApCgovLyBGZWVDb2xsZWN0b3IgcmVjZWl2ZXMgd2l0aGRyYXduIGZlZXMgYW5kIHN3ZXB0IHN1cnBsdXMuIENvbXBpbGUtdGltZQovLyBjb25zdGFudDogdGhlcmUgaXMgbm8gc2V0dGVyIGFuZCBubyB0cmFuc2ZlciBwYXRoLiBJdCBpcyB0aGUgZGVwbG95aW5nCi8vIG5hbWVzcGFjZSdzIGFkZHJlc3Mg4oCUIHN0YXRlZCBwbGFpbmx5OiB0aGUgb3BlcmF0b3Igb2YgdGhpcyByZWFsbS4KY29uc3QgRmVlQ29sbGVjdG9yID0gYWRkcmVzcygiZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMyIpCgovLyBNaW5GdW5kaW5nIGtlZXBzIGR1c3QgcG9vbHMgb3V0OiAxIEdOT1QgcGVyIEZ1bmQgY2FsbC4KY29uc3QgTWluRnVuZGluZyA9IGludDY0KDFfMDAwXzAwMCkKCi8vIE1pblBlclBlcmlvZCBpcyB0aGUgc21hbGxlc3QgcGVyLXdpbmRvdyBhcHByb3ZhbCBjYXAgYSBkZXNrIG1heSBjYXJyeS4KLy8gSXQgZXhpc3RzIHNvIGEgZGVzayBjYW5ub3QgYmUgb3BlbmVkIHRoYXQgbm8gYXBwcm92YWwgY291bGQgZXZlcgovLyBzYXRpc2Z5LCBhbmQgaXQgaXMgcGFpcmVkIHdpdGggTWluUmVxdWVzdEFtb3VudCBiZWxvdyByYXRoZXIgdGhhbgovLyBzdGFuZGluZyBhbG9uZS4KY29uc3QgTWluUGVyUGVyaW9kID0gaW50NjQoMV8wMDApCgovLyBNaW5QZXJpb2RCbG9ja3MgaXMgdGhlIHNob3J0ZXN0IHdpbmRvdyBhIGRlc2sgbWF5IHVzZS4gQSB3aW5kb3cgb2YgYQovLyBoYW5kZnVsIG9mIGJsb2NrcyBpcyBhIHJhdGUsIG5vdCBhIGJ1ZGdldCwgYW5kIGl0IG1ha2VzIFBlclBlcmlvZAovLyBtZWFuaW5nbGVzcyBhcyBhIGJvdW5kIG9uIHdvcnN0LWNhc2UgbG9zcy4gQSBwZXJpb2RMZW5ndGggb2YgMCBpcyBzdGlsbAovLyBhY2NlcHRlZCBhbmQgbWVhbnMgT05FIExJRkVUSU1FIFdJTkRPVyB0aGF0IG5ldmVyIHJlZmlsbHMgKHNwZW5kYm9vaydzCi8vIG93biBzZW1hbnRpY3MpLgpjb25zdCBNaW5QZXJpb2RCbG9ja3MgPSBpbnQ2NCgxMDApCgovLyBNaW5SZXF1ZXN0QW1vdW50IGlzIHRoZSBzbWFsbGVzdCByZXF1ZXN0IHRoYXQgbWF5IGJlIGZpbGVkLCBhbmQgaXQgaXMKLy8gZGVsaWJlcmF0ZWx5IEVRVUFMIFRPIE1pblBlclBlcmlvZCByYXRoZXIgdGhhbiBzbWFsbGVyLiBUaGUgdHdvCi8vIHRvZ2V0aGVyIGFyZSB3aGF0IG1ha2UgYSBkZXNrJ3MgYXV0aG9yaXR5IGV4cHJlc3NpYmxlOiBhIGRlc2sgd2hvc2UKLy8gcGVyLXdpbmRvdyBjYXAgaXMgYXQgdGhlIGZsb29yIGNhbiBzdGlsbCBhcHByb3ZlIGEgcmVxdWVzdCBhdCB0aGUKLy8gZmxvb3IuIFNldHRpbmcgdGhpcyBiZWxvdyBNaW5QZXJQZXJpb2Qgd291bGQgYWRtaXQgZHVzdCByZXF1ZXN0cyB0aGF0Ci8vIGNvc3QgdGhlIGFwcHJvdmVyIGEgdHJhbnNhY3Rpb24gZWFjaDsgc2V0dGluZyBpdCBhYm92ZSB3b3VsZCBjcmVhdGUKLy8gZGVza3Mgbm8gcmVxdWVzdCBjb3VsZCB1c2UuCmNvbnN0IE1pblJlcXVlc3RBbW91bnQgPSBpbnQ2NCgxXzAwMCkKCi8vIFJlcXVlc3RUVEwgaXMgaG93IGxvbmcgYSByZXF1ZXN0IHN0YXlzIGFwcHJvdmFibGUsIElOIEJMT0NLUy4gTm8KLy8gd2FsbC1jbG9jayBlcXVpdmFsZW50IGlzIHN0YXRlZCBiZWNhdXNlIG9ueXgtMSdzIGJsb2NrIHRpbWUgaGFzIG5ldmVyCi8vIGJlZW4gbWVhc3VyZWQgYnkgdGhpcyBwcm9qZWN0LCBhbmQgY29udmVydGluZyBibG9ja3MgdG8gaG91cnMgd2l0aCBhbgovLyBhc3N1bWVkIHJhdGUgaXMgaG93IGEgZG9jdW1lbnQgY29tZXMgdG8gY2FycnkgYSBudW1iZXIgbm9ib2R5IGNoZWNrZWQuCi8vIEl0IGlzIHNpemVkIHRvIGJlIGxvbmcgZW5vdWdoIHRoYXQgYW4gYXBwcm92ZXIgbmVlZCBub3QgYmUgb25saW5lCi8vIGNvbnRpbnVvdXNseSBhbmQgc2hvcnQgZW5vdWdoIHRoYXQgdGhlIHJlcXVlc3QgdHJlZSBkcmFpbnMuCmNvbnN0IFJlcXVlc3RUVEwgPSBpbnQ2NCg4Nl80MDApCgovLyBNYXhMaXZlRGVza3MgY2FwcyBzaW11bHRhbmVvdXNseSBsaXZlIGRlc2tzLCB2aWEgc3BlbmRib29rJ3Mgb3duCi8vIGNvbnN0cnVjdGlvbiBib3VuZC4gT3BlbkRlc2sgcmVxdWlyZXMgYSBmdW5kZWQgcG9vbCwgd2hpY2ggaXMgTk9UIGEKLy8gY2FwaXRhbCBib3VuZCDigJQgc2VlIE1heE9wZW5QZXJDbGFpbWFudCBmb3Igd2h5IHRoYXQgbWlzdGFrZSBpcyBub3QKLy8gcmVwZWF0ZWQgaGVyZS4gc3BlbmRib29rJ3Mgb3duIE1heExpdmVMaW1pdCBpcyAxMDAwMC4KY29uc3QgTWF4TGl2ZURlc2tzID0gNDA5NgoKLy8gTWF4RGVza3NQZXJPd25lciBib3VuZHMgaG93IG11Y2ggb2YgdGhlIGdsb2JhbCBkZXNrIGNhcCBvbmUgb3duZXIgY2FuCi8vIG9jY3VweS4gc3BlbmRib29rJ3MgcGFja2FnZSBkb2N1bWVudGF0aW9uIG5hbWVzIHRoaXMgYXMgdGhlIGdhcCBhCi8vIGNvbnN1bWluZyByZWFsbSBtdXN0IGNsb3NlOiAibWF4TGl2ZSBpcyBhIHNpbmdsZSBnbG9iYWwgZmlndXJlLCBzbyBhbnkKLy8gb3duZXIgcGVybWl0dGVkIHRvIE9wZW4gY2FuIGV4aGF1c3QgaXQgYW5kIGxvY2sgb3V0IHRoZSByZXN0IOKApiBhIEJvb2sKLy8gc2hhcmVkIGFjcm9zcyBtdXR1YWxseSB1bnRydXN0aW5nIG93bmVycyBuZWVkcyBpdHMgb3duIHBlci1vd25lciBjYXAgb24KLy8gdG9wIG9mIHRoaXMgb25lLiIgVGhpcyBpcyB0aGF0IGNhcC4KY29uc3QgTWF4RGVza3NQZXJPd25lciA9IGludDY0KDE2KQoKLy8gTWF4TGl2ZVJlcXVlc3RzIGNhcHMgc2ltdWx0YW5lb3VzbHkgbGl2ZSByZXF1ZXN0cyBhY3Jvc3MgdGhlIHJlYWxtLgovLyBTdWJtaXQgaXMgcGVybWlzc2lvbmxlc3MsIHNvIHRoaXMgY2FwIGlzIGV4aGF1c3RpYmxlLCBhbmQgdGhlIHBhY2thZ2UKLy8gZG9jIHN0YXRlcyB0aGF0IGJvdW5kIHJhdGhlciB0aGFuIGNsYWltaW5nIHRoZSBwZXItaWRlbnRpdHkgY2FwcyBiZWxvdwovLyBjbG9zZSBpdC4KY29uc3QgTWF4TGl2ZVJlcXVlc3RzID0gNDA5NgoKLy8gTWF4T3BlblBlckNsYWltYW50IGJvdW5kcyBvbmUgY2xhaW1hbnQncyBzaW11bHRhbmVvdXNseS1wZW5kaW5nCi8vIHJlcXVlc3RzLiBJdCBpcyBhIEdSSUVGLUNPU1QgbXVsdGlwbGllciBhbmQgbm90IGEgZGVmZW5jZTogb25lIGFkZHJlc3MKLy8gaXMgYm91bmRlZCwgTiBhZGRyZXNzZXMgYXJlIG5vdCwgYW5kIGFuIGF0dGFja2VyIGNvbnRyb2xzIE4uIFRoZSByZWFsCi8vIG1pdGlnYXRpb24gaXMgUmVxdWVzdFRUTCBwbHVzIHBlcm1pc3Npb25sZXNzIEV4cGlyZVJlcXVlc3Qg4oCUIHNlZSB0aGUKLy8gcGFja2FnZSBkb2MncyBhdmFpbGFiaWxpdHkgc2VjdGlvbi4KY29uc3QgTWF4T3BlblBlckNsYWltYW50ID0gaW50NjQoMTYpCgovLyBNYXhPcGVuUGVyRGVzayBib3VuZHMgdGhlIHBlbmRpbmcgcmVxdWVzdHMgYXQgb25lIGRlc2ssIHNvIGEgc2luZ2xlCi8vIGRlc2sncyBhcHByb3ZlciBpcyBub3QgaGFuZGVkIGFuIHVucmV2aWV3YWJsZSBxdWV1ZSBieSBvbmUgYnVyc3QuIEl0IGlzCi8vIHBlci1kZXNrLCBzbyBmaWxsaW5nIGl0IGRlbmllcyB0aGF0IGRlc2sgb25seTsgb3RoZXIgZGVza3MgYXJlCi8vIHVuYWZmZWN0ZWQuCmNvbnN0IE1heE9wZW5QZXJEZXNrID0gaW50NjQoNjQpCgovLyBNYXhMYWJlbExlbiBib3VuZHMgYSBkZXNrJ3MgZnJlZS10ZXh0IGxhYmVsLgpjb25zdCBNYXhMYWJlbExlbiA9IDY0CgovLyBNYXhNZW1vTGVuIGJvdW5kcyBhIHJlcXVlc3QncyBmcmVlLXRleHQgbWVtbyBhbmQgYSByZWplY3Rpb24ncyByZWFzb24uCi8vIExhcmdlciB0aGFuIE1heExhYmVsTGVuIGJlY2F1c2UgYSBtZW1vIGlzIHRoZSBleHBlbnNlIGRlc2NyaXB0aW9uIOKAlCB0aGUKLy8gdGhpbmcgYW4gYXBwcm92ZXIgcmVhZHMgdG8gZGVjaWRlIOKAlCB3aGlsZSBhIGxhYmVsIG9ubHkgbmFtZXMgYSBkZXNrLgpjb25zdCBNYXhNZW1vTGVuID0gMTYwCgovLyBNYXhSZW5kZXJSb3dzIGJvdW5kcyB0aGUgbGlzdHMgb24gdGhlIGluZGV4IHBhZ2UuCmNvbnN0IE1heFJlbmRlclJvd3MgPSAyMAoKdHlwZSBkZXNrIHN0cnVjdCB7CglpZCAgICAgICAgaW50NjQKCW93bmVyICAgICBhZGRyZXNzCglhcHByb3ZlciAgYWRkcmVzcwoJYWxsb3dJRCAgIHVpbnQ2NCAvLyB0aGUgc3BlbmRib29rIGFsbG93YW5jZSBiYWNraW5nIHRoaXMgZGVzawoJZmVlQnBzICAgIGludDY0ICAvLyBzbmFwc2hvdHRlZCBhdCBPcGVuRGVzawoJbGFiZWwgICAgIHN0cmluZwoJY3JlYXRlZEF0IGludDY0CgoJYXBwcm92ZWQgICBpbnQ2NCAvLyBsaWZldGltZSBncm9zcyBhcHByb3ZlZCB0aHJvdWdoIHRoaXMgZGVzawoJYXBwcm92YWxzICBpbnQ2NAoJcmVqZWN0aW9ucyBpbnQ2NAp9Cgp0eXBlIHJlcXVlc3Qgc3RydWN0IHsKCWlkICAgICAgICAgIGludDY0CglkZXNrSUQgICAgICBpbnQ2NAoJY2xhaW1hbnQgICAgYWRkcmVzcwoJYW1vdW50ICAgICAgaW50NjQKCWZlZUJwcyAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGF0IFN1Ym1pdCBmcm9tIHRoZSBkZXNrCgltZW1vICAgICAgICBzdHJpbmcKCXN1Ym1pdHRlZEF0IGludDY0CglleHBpcmVzQXQgICBpbnQ2NCAvLyBzdWJtaXR0ZWRBdCArIFJlcXVlc3RUVEwKfQoKdmFyICgKCXNlbGYgYWRkcmVzcwoKCS8vIGRlc2tzIGhvbGRzIG9uZSByZWNvcmQgcGVyIGxpdmUgZGVzay4gQ2xvc2VEZXNrIGFuZCBSZWFwRGVzayByZW1vdmUKCS8vIHRoZSByZWNvcmQ7IGlkcyBhcmUgbmV2ZXIgcmV1c2VkLgoJZGVza3MgICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpIC0+ICpkZXNrCgluZXh0RGVza0lEIGludDY0CgoJLy8gcmVxdWVzdHMgaG9sZHMgb25lIHJlY29yZCBwZXIgUEVORElORyByZXF1ZXN0LiBBcHByb3ZlLCBSZWplY3QsCgkvLyBSZXRyYWN0IGFuZCBFeHBpcmVSZXF1ZXN0IGVhY2ggcmVtb3ZlIG9uZTsgaWRzIGFyZSBuZXZlciByZXVzZWQuCglyZXF1ZXN0cyAgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKGlkKSAtPiAqcmVxdWVzdAoJbmV4dFJlcUlEIGludDY0CgoJLy8gcG9vbHMgaXMgZWFjaCBvd25lcidzIHVuc3BlbnQgZnVuZGVkIGJhbGFuY2U6CgkvLyBhZGRyZXNzIHN0cmluZyAtPiBpbnQ2NCAoPiAwKS4gVGhpcyBpcyB0aGUgUCB0ZXJtLgoJcG9vbHMgPSBhdmwuTmV3VHJlZSgpCgoJLy8gZGVza3NCeU93bmVyIHRyYWNrcyBlYWNoIG93bmVyJ3MgbGl2ZSBkZXNrIGNvdW50OgoJLy8gYWRkcmVzcyBzdHJpbmcgLT4gaW50NjQgKD4gMCkuCglkZXNrc0J5T3duZXIgPSBhdmwuTmV3VHJlZSgpCgoJLy8gb3BlbkJ5Q2xhaW1hbnQgdHJhY2tzIGVhY2ggY2xhaW1hbnQncyBwZW5kaW5nIHJlcXVlc3QgY291bnQ6CgkvLyBhZGRyZXNzIHN0cmluZyAtPiBpbnQ2NCAoPiAwKS4KCW9wZW5CeUNsYWltYW50ID0gYXZsLk5ld1RyZWUoKQoKCS8vIG9wZW5CeURlc2sgdHJhY2tzIGVhY2ggZGVzaydzIHBlbmRpbmcgcmVxdWVzdCBjb3VudDoKCS8vIHBhZElEKGRlc2tJRCkgLT4gaW50NjQgKD4gMCkuCglvcGVuQnlEZXNrID0gYXZsLk5ld1RyZWUoKQoKCS8vIHRvdGFsUG9vbGVkIGlzIHRoZSBQIHRlcm0gb2YgSCA9PSBQICsgTCArIFMsIG1haW50YWluZWQgTygxKS4KCXRvdGFsUG9vbGVkIGludDY0CgoJLy8gbGlmZXRpbWUgY291bnRlcnMsIHJlbmRlcmVkIGZvciBvcGVyYXRvcnMuCglsaWZldGltZUZ1bmRlZCAgICBpbnQ2NAoJbGlmZXRpbWVTdWJtaXR0ZWQgaW50NjQKCS8vIGxpZmV0aW1lQXBwcm92YWxzIGNvdW50cyBSRVFVRVNUUyBzZXR0bGVkOyBsaWZldGltZUFwcHJvdmVkIHN1bXMgdGhlCgkvLyBHUk9TUyB1Z25vdCB0aGV5IG1vdmVkLiBUd28gZGlmZmVyZW50IGF4ZXMsIGFuZCBrZWVwaW5nIG9ubHkgb25lCgkvLyB3b3VsZCBmb3JjZSBhIFJlbmRlciBsaW5lIHRvIGltcGx5IHRoZSBvdGhlci4gQSBwZXItZGVzawoJLy8gYGFwcHJvdmFsc2AgZmllbGQgZXhpc3RzIHRvbyBhbmQgaXMgTk9UIGEgc3Vic3RpdHV0ZTogY2xvc2luZyBhIGRlc2sKCS8vIHJlbW92ZXMgaXRzIHJlY29yZCBhbmQgdGhlcmVmb3JlIGl0cyBjb3VudCwgd2hpbGUgdGhlc2Ugc3Vydml2ZS4KCWxpZmV0aW1lQXBwcm92YWxzIGludDY0CglsaWZldGltZUFwcHJvdmVkICBpbnQ2NCAvLyBncm9zcywgYmVmb3JlIHRoZSBmZWUKCWxpZmV0aW1lUmVqZWN0ZWQgIGludDY0CglsaWZldGltZVJldHJhY3RlZCBpbnQ2NAoJbGlmZXRpbWVFeHBpcmVkICAgaW50NjQKCWxpZmV0aW1lQ2xhaW1lZCAgIGludDY0IC8vIG5ldCwgcGFpZCB0byBjbGFpbWFudHMKCWxpZmV0aW1lUmV0dXJuZWQgIGludDY0IC8vIHVuc3BlbnQgcG9vbCB3aXRoZHJhd24gYnkgb3duZXJzCgoJLy8gbGVkZ2VyIGhvbGRzIGVhY2ggY2xhaW1hbnQncyBzZXR0bGVkIGNyZWRpdCBhbmQgdGhlIGZlZSBwb3QuIEl0cwoJLy8gTGlhYmlsaXRpZXMoKSBpcyB0aGUgTCB0ZXJtIGFuZCB0aGUgcmVzZXJ2ZSBTd2VlcFN1cnBsdXMgcHJvdGVjdHMuCglsZWRnZXIgPSBmZWVsZWRnZXIuTXVzdE5ldyhNYXhGZWVCcHMpCgoJLy8gYm9vayBob2xkcyBvbmUgbGl2ZSBhbGxvd2FuY2UgcGVyIGxpdmUgZGVzay4gRXZlcnkgYm91bmQgb24KCS8vIGFwcHJvdmFsIGF1dGhvcml0eSDigJQgd2luZG93cywgY2FwcywgZXhwaXJ5LCBhbWVuZG1lbnQgZGlyZWN0aW9uIOKAlCBpcwoJLy8gdGhlIHByaW1pdGl2ZSdzLCBub3QgdGhpcyBmaWxlJ3MuCglib29rID0gc3BlbmRib29rLk11c3ROZXcoTWF4TGl2ZURlc2tzKQopCgpmdW5jIGluaXQoKSB7CglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgbm9uLXBheWFibGUgY2FsbC4KLy8gVGhpcyByZWFsbSBob2xkcyBmdW5kcywgc28gYSBzdHJheSBzZW5kIHdvdWxkIGJlY29tZSBzd2VlcGFibGUgc3VycGx1cywKLy8gc2lsZW50bHkgY29udmVydGluZyBhIHVzZXIncyBjb2lucyBpbnRvIG9wZXJhdG9yIGZ1bmRzLiBBYm9ydGluZwovLyByZXZlcnRzIHRoZSB0cmFuc2ZlciBpbnN0ZWFkLiBHdWFyZGVkIG9uIElzVXNlckNhbGwsIG5vdCBJc1VzZXIsCi8vIGJlY2F1c2UgYSBNc2dSdW4gZXBoZW1lcmFsIGNhbiBjb25zdW1lIHRoZSBPcmlnaW5TZW5kIGVudmVsb3BlIGJlZm9yZQovLyBmb3J3YXJkaW5nIGNvbnRyb2w7IGZvciBhIHJlYWxtLXJvdXRlZCBjYWxsIHRoZSBlbnZlbG9wZSBsYW5kcyBhdCB0aGUKLy8gaW50ZXJtZWRpYXJ5LCBzbyB0aGVyZSBpcyBub3RoaW5nIGhlcmUgdG8gcmVqZWN0IGFuZCB0aGUgZ3VhcmQKLy8gZGVsaWJlcmF0ZWx5IGZhaWxzIG9wZW4gKGJ1ZGdldHMsIGNyb3dkZnVuZCBhbmQgdHJlYXN1cnlfYm9hcmQgZG9jdW1lbnQKLy8gdGhlIHNhbWUgc2NvcGUpLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCS8vIEV2ZXJ5IGNhbGwgc2l0ZSBmb3J3YXJkcyBhIGNyb3NzaW5nIGVudHJ5cG9pbnQncyBvd24gbGl2ZSBjdXIsCgkJLy8gc28gdGhpcyBjYW5ub3QgZmlyZSB0b2RheTsgaXQgZXhpc3RzIHNvIGEgZnV0dXJlIHJlZmFjdG9yIHRoYXQKCQkvLyBoYW5kcyB0aGlzIGd1YXJkIGEgc3RhbGUgcmVhbG0gdmFsdWUgZmFpbHMgY2xvc2VkLCBub3Qgb3BlbgoJCS8vIChjb2luaW8gbmFtZXMgSXNDdXJyZW50IGFzIHRoZSBndWFyZCBzZWNvbmRhcnkgcmVhbG0gcGFyYW1ldGVycwoJCS8vIHJlcXVpcmUsIGFuZCB0aGlzIGhlbHBlciBmb2xsb3dzIHRoYXQgZGlzY2lwbGluZSkuCgkJcGFuaWMoInJlaW1idXJzZW1lbnRzOiByZWFsbSBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50IikKCX0KCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygidGhpcyBlbnRyeXBvaW50IGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCi8vIC0tLSB0aGUgcG9vbCAtLS0KCi8vIEZ1bmQgYWRkcyB0aGUgYXR0YWNoZWQgY29pbnMgdG8gdGhlIGNhbGxlcidzIG93biBwb29sLiBEaXJlY3QgRU9BIGNhbGxzCi8vIHdpdGggLXNlbmQgb25seSAodGhlIHJlY2VpcHQtZ3VhcmFudGVlZCBzaGFwZSk7IGV4YWN0bHkgb25lIHBvc2l0aXZlCi8vIHVnbm90IGNvaW4sIGF0IGxlYXN0IE1pbkZ1bmRpbmcuIEFueW9uZSBtYXkgZnVuZDsgZnVuZGluZyBpcyB3aGF0IG1ha2VzCi8vIGFuIGFkZHJlc3MgYW4gb3duZXIuCmZ1bmMgRnVuZChjdXIgcmVhbG0pIGludDY0IHsKCW93bmVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCWlmIGFtb3VudCA8IE1pbkZ1bmRpbmcgewoJCXBhbmljKCJmdW5kIGF0IGxlYXN0ICIgKyBpdG9hKE1pbkZ1bmRpbmcpICsgRGVub20pCgl9CglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCgluZXdQb29sLCBvayA6PSBjaGVja2VkQWRkKHBvb2xPZihrZXkpLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJwb29sIHdvdWxkIG92ZXJmbG93IikKCX0KCW5ld1RvdGFsLCBvayA6PSBjaGVja2VkQWRkKHRvdGFsUG9vbGVkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJ0b3RhbCBwb29sZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3TGlmZXRpbWUsIG9rIDo9IGNoZWNrZWRBZGQobGlmZXRpbWVGdW5kZWQsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIGZ1bmRlZCB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJc2V0UG9vbChrZXksIG5ld1Bvb2wpCgl0b3RhbFBvb2xlZCA9IG5ld1RvdGFsCglsaWZldGltZUZ1bmRlZCA9IG5ld0xpZmV0aW1lCgoJY2hhaW4uRW1pdCgiRnVuZGVkIiwgIm93bmVyIiwga2V5LCAiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJwb29sIiwgaXRvYShuZXdQb29sKSkKCXJldHVybiBuZXdQb29sCn0KCi8vIFdpdGhkcmF3UG9vbCByZXR1cm5zIHBhcnQgb2YgdGhlIGNhbGxlcidzIFVOU1BFTlQgcG9vbCBhbmQgcmVwb3J0cyB0aGUKLy8gcG9vbCBSRU1BSU5JTkcgYWZ0ZXJ3YXJkcy4KLy8KLy8gVW5saWtlIGJ1ZGdldHMsIHRoaXMgaXMgbm90IGEgaGF6YXJkIHRvIGEgY291bnRlcnBhcnR5LCBhbmQgdGhlIHJlYXNvbgovLyBpcyB0aGUgZGl2ZXJnZW5jZSBpbiB0aGUgcGFja2FnZSBkb2M6IGFuIGFwcHJvdmVkIHJlaW1idXJzZW1lbnQgaGFzCi8vIGFscmVhZHkgbGVmdCB0aGUgcG9vbCBhbmQgc2l0cyBpbiB0aGUgbGVkZ2VyIGFzIHRoZSBjbGFpbWFudCdzLiBXaGF0IGFuCi8vIG93bmVyIGNhbiBzdGlsbCBkbyBpcyBlbXB0eSB0aGUgcG9vbCB1bmRlciBhIGxpdmUgZGVzaywgc28gdGhhdCB0aGUKLy8gYXBwcm92ZXIncyBuZXh0IEFwcHJvdmUgZmFpbHMgb24gc29sdmVuY3kgYW5kIHBlbmRpbmcgcmVxdWVzdHMgY2Fubm90Ci8vIGJlIHNldHRsZWQuIFRoYXQgaXMgdGhlIG93bmVyIGRlY2xpbmluZyB0byBzcGVuZCB0aGVpciBvd24gbW9uZXksIHdoaWNoCi8vIGlzIHRoZWlycyB0byBkZWNsaW5lOyBDbG9zZURlc2sgaXMgdGhlIGNsZWFuIHdheSB0byBlbmQgdGhlCi8vIHJlbGF0aW9uc2hpcC4KZnVuYyBXaXRoZHJhd1Bvb2woY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJfQoJcmV0dXJuIHBheU91dFBvb2woY3VyLCBvd25lciwgYW1vdW50KQp9CgovLyBXaXRoZHJhd1Bvb2xBbGwgcmV0dXJucyB0aGUgY2FsbGVyJ3MgZW50aXJlIHVuc3BlbnQgcG9vbCBhbmQgcmVwb3J0cwovLyB0aGUgYW1vdW50IFdJVEhEUkFXTi4KLy8KLy8gVGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHR3byB3aXRoZHJhdyBlbnRyeXBvaW50cyBhcmUgZGVsaWJlcmF0ZWx5Ci8vIGFzeW1tZXRyaWMsIHdoaWNoIGlzIHdvcnRoIG5hbWluZyByYXRoZXIgdGhhbiBsZXR0aW5nIGEgY2FsbGVyCi8vIGRpc2NvdmVyOiBlYWNoIHJldHVybnMgdGhlIGZpZ3VyZSBpdHMgY2FsbGVyIGRvZXMgbm90IGFscmVhZHkgaGF2ZS4KLy8gV2l0aGRyYXdQb29sIHdhcyB0b2xkIHRoZSBhbW91bnQgYW5kIHdhbnRzIHRvIGtub3cgd2hhdCBpcyBsZWZ0OwovLyBXaXRoZHJhd1Bvb2xBbGwga25vd3Mgd2hhdCBpcyBsZWZ0IChub3RoaW5nKSBhbmQgd2FudHMgdG8ga25vdyB3aGF0IGl0Ci8vIGdvdC4gUmV0dXJuaW5nIHRoZSByZW1haW5kZXIgaGVyZSB3b3VsZCBoYW5kIGV2ZXJ5IGNhbGxlciBhIGNvbnN0YW50IDAuCmZ1bmMgV2l0aGRyYXdQb29sQWxsKGN1ciByZWFsbSkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYW1vdW50IDo9IHBvb2xPZihvd25lci5TdHJpbmcoKSkKCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm8gcG9vbCB0byB3aXRoZHJhdyIpCgl9CglwYXlPdXRQb29sKGN1ciwgb3duZXIsIGFtb3VudCkKCXJldHVybiBhbW91bnQKfQoKLy8gcGF5T3V0UG9vbCBpcyB0aGUgc2hhcmVkIGRlYml0LXRoZW4tc2VuZCBwYXRoOiB0aGUgcG9vbCBhbmQgdGhlIFAgdGVybQovLyBhcmUgcmVkdWNlZCBiZWZvcmUgdGhlIGlkZW50aWNhbCBhbW91bnQgbGVhdmVzIHRoZSByZWFsbQovLyAoY2hlY2tzLWVmZmVjdHMtaW50ZXJhY3Rpb25zKS4KZnVuYyBwYXlPdXRQb29sKGN1ciByZWFsbSwgb3duZXIgYWRkcmVzcywgYW1vdW50IGludDY0KSBpbnQ2NCB7CglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCXBvb2wgOj0gcG9vbE9mKGtleSkKCWlmIGFtb3VudCA+IHBvb2wgewoJCXBhbmljKCJhbW91bnQgZXhjZWVkcyBwb29sIikKCX0KCW5ld1JldHVybmVkLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lUmV0dXJuZWQsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIHJldHVybmVkIHdvdWxkIG92ZXJmbG93IikKCX0KCglzZXRQb29sKGtleSwgcG9vbC1hbW91bnQpCgl0b3RhbFBvb2xlZCAtPSBhbW91bnQKCWxpZmV0aW1lUmV0dXJuZWQgPSBuZXdSZXR1cm5lZAoKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBvd25lciwgRGVub20sIGFtb3VudCkKCgljaGFpbi5FbWl0KCJQb29sV2l0aGRyYXduIiwgIm93bmVyIiwga2V5LCAiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJwb29sIiwgaXRvYShwb29sLWFtb3VudCkpCglyZXR1cm4gcG9vbCAtIGFtb3VudAp9CgovLyAtLS0gZGVza3MgLS0tCgovLyBPcGVuRGVzayBhcHBvaW50cyBhbiBhcHByb3ZlciB3aXRoIGEgYm91bmRlZCBhdXRob3JpdHkgb3ZlciB0aGUKLy8gY2FsbGVyJ3MgcG9vbCBhbmQgcmV0dXJucyB0aGUgZGVzayBpZC4gVGhlIGNhbGxlciBiZWNvbWVzIHRoZSBkZXNrJ3MKLy8gb3duZXIgYW5kIG11c3QgYWxyZWFkeSBoYXZlIGEgZnVuZGVkIHBvb2wg4oCUIG5vdCBiZWNhdXNlIHRoZSBkZXNrCi8vIHJlc2VydmVzIGFueXRoaW5nIChpdCBkb2VzIG5vdCksIGJ1dCBiZWNhdXNlIGEgZGVzayBvdmVyIGFuIHVuZnVuZGVkCi8vIHBvb2wgaXMgYW4gaW52aXRhdGlvbiB0byBjbGFpbWFudHMgdG8gZmlsZSByZXF1ZXN0cyBub3RoaW5nIGNhbiBzZXR0bGUsCi8vIGFuZCB0aGlzIHJlYWxtIGRlY2xpbmVzIHRvIHJlY29yZCBvbmUuCi8vCi8vIFRlcm1zLCBhbGwgaW4gdGhlIGNoYWluJ3Mgb3duIHVuaXRzOgovLwovLwlwZXJQZXJpb2QgICAgdGhlIGdyb3NzIHRoZSBhcHByb3ZlciBtYXkgYXBwcm92ZSBwZXIgd2luZG93LCBhdCBsZWFzdAovLwkgICAgICAgICAgICAgTWluUGVyUGVyaW9kLiBSZXF1aXJlZC4KLy8JcGVyaW9kTGVuZ3RoIGJsb2NrcyBwZXIgd2luZG93LiAwIG1lYW5zIE9ORSBMSUZFVElNRSBXSU5ET1cgdGhhdCBuZXZlcgovLwkgICAgICAgICAgICAgcmVmaWxsczsgb3RoZXJ3aXNlIGF0IGxlYXN0IE1pblBlcmlvZEJsb2Nrcy4KLy8JdG90YWwgICAgICAgIGxpZmV0aW1lIGNhcCBhY3Jvc3MgZXZlcnkgd2luZG93LiAwIG1lYW5zIHVubGltaXRlZC4KLy8JZXhwaXJlc0F0ICAgIGFic29sdXRlIGJsb2NrIGhlaWdodCBhdCB3aGljaCB0aGUgYXBwcm92ZXIncyBhdXRob3JpdHkKLy8JICAgICAgICAgICAgIGVuZHMuIDAgbWVhbnMgbm8gZXhwaXJ5LgovLwovLyBFdmVyeSBib3VuZCBhYm92ZSBleGNlcHQgdGhlIHR3byByZWFsbSBtaW5pbXVtcyBpcyB2YWxpZGF0ZWQgYW5kCi8vIGVuZm9yY2VkIGJ5IHNwZW5kYm9vaywgYW5kIGFuIGludmFsaWQgY29tYmluYXRpb24gc3VyZmFjZXMgYXMgdGhhdAovLyBwYWNrYWdlJ3Mgb3duIHNlbnRpbmVsIGVycm9yLgpmdW5jIE9wZW5EZXNrKGN1ciByZWFsbSwgYXBwcm92ZXIgYWRkcmVzcywgbGFiZWwgc3RyaW5nLAoJcGVyUGVyaW9kLCBwZXJpb2RMZW5ndGgsIHRvdGFsLCBleHBpcmVzQXQgaW50NjQpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCgkvLyBUaGUgbG93ZXJjYXNlIGNsYXVzZSBpcyBsb2FkLWJlYXJpbmcsIG5vdCBkZWNvcmF0aW9uLCBhbmQgdGhlIHJlYXNvbgoJLy8gd2FzIG1lYXN1cmVkIG9uIHRoaXMgdG9vbGNoYWluIHJhdGhlciB0aGFuIGFyZ3VlZDogYWRkcmVzcy5Jc1ZhbGlkKCkKCS8vIGRlZmVycyB0byBjcnlwdG8uQWRkcmVzc0Zyb21CZWNoMzIsIHdob3NlIGRlY29kZXIgbG93ZXJjYXNlcyB0aGUKCS8vIGlucHV0IEJFRk9SRSB2ZXJpZnlpbmcgdGhlIGNoZWNrc3VtLCBzbyBpdCByZXR1cm5zIHRydWUgZm9yIHRoZQoJLy8gYWxsLXVwcGVyY2FzZSBzcGVsbGluZyBvZiBhIHZhbGlkIGFkZHJlc3MuIEhlcmUgdGhlIGhhemFyZCBpcyBhCgkvLyBCUklDS0VEIERFU0s6IEFwcHJvdmUgYXV0aGVudGljYXRlcyBhZ2FpbnN0IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSwKCS8vIHdoaWNoIGlzIGFsd2F5cyBjYW5vbmljYWwsIHNvIGFuIHVwcGVyY2FzZS1zcGVsbGVkIGFwcHJvdmVyIGNvdWxkCgkvLyBuZXZlciBhcHByb3ZlIGFueXRoaW5nLCB3aGlsZSB0aGUgZGVzayBzdGlsbCBvY2N1cGllZCBhCgkvLyBNYXhEZXNrc1Blck93bmVyIHNsb3QgYW5kIGEgc3RvcmFnZSBkZXBvc2l0LCBhbmQgY2xhaW1hbnRzIGNvdWxkCgkvLyBzdGlsbCBmaWxlIHJlcXVlc3RzIGF0IGl0IHRoYXQgbm9ib2R5IGNvdWxkIGV2ZXIgc2V0dGxlLiBUaGUgY2hlY2sgaXMKCS8vIGNvbXBsZXRlIGFzIHdlbGwgYXMgbmVjZXNzYXJ5IOKAlCB0aGF0IGRlY29kZXIgcmVqZWN0cyBtaXhlZCBjYXNlCgkvLyBvdXRyaWdodCwgc28gYSB2YWxpZCBhZGRyZXNzIGhhcyBleGFjdGx5IHR3byBzcGVsbGluZ3MgYW5kIHJlamVjdGluZwoJLy8gZXZlcnkgbm9uLWxvd2VyIG9uZSBsZWF2ZXMgcHJlY2lzZWx5IHRoZSBjYW5vbmljYWwgb25lLgoJaWYgIWFwcHJvdmVyLklzVmFsaWQoKSB8fCBzdHJpbmcoYXBwcm92ZXIpICE9IHN0cmluZ3MuVG9Mb3dlcihzdHJpbmcoYXBwcm92ZXIpKSB7CgkJcGFuaWMoImFwcHJvdmVyIGlzIG5vdCBhIHZhbGlkIGFkZHJlc3MgaW4gY2Fub25pY2FsIChsb3dlcmNhc2UpIGZvcm0iKQoJfQoJaWYgbGVuKGxhYmVsKSA+IE1heExhYmVsTGVuIHsKCQlwYW5pYygibGFiZWwgZXhjZWVkcyAiICsgc3RyY29udi5JdG9hKE1heExhYmVsTGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgcGVyUGVyaW9kIDwgTWluUGVyUGVyaW9kIHsKCQlwYW5pYygicGVyUGVyaW9kIG11c3QgYmUgYXQgbGVhc3QgIiArIGl0b2EoTWluUGVyUGVyaW9kKSArIERlbm9tKQoJfQoJaWYgcGVyaW9kTGVuZ3RoICE9IDAgJiYgcGVyaW9kTGVuZ3RoIDwgTWluUGVyaW9kQmxvY2tzIHsKCQlwYW5pYygicGVyaW9kTGVuZ3RoIG11c3QgYmUgMCAobGlmZXRpbWUpIG9yIGF0IGxlYXN0ICIgKwoJCQlpdG9hKE1pblBlcmlvZEJsb2NrcykgKyAiIGJsb2NrcyIpCgl9CgoJa2V5IDo9IG93bmVyLlN0cmluZygpCglpZiBwb29sT2Yoa2V5KSA9PSAwIHsKCQlwYW5pYygiZnVuZCBhIHBvb2wgYmVmb3JlIG9wZW5pbmcgYSBkZXNrIikKCX0KCWlmIG93bmVyRGVza3Moa2V5KSA+PSBNYXhEZXNrc1Blck93bmVyIHsKCQlwYW5pYygib3duZXIgYWxyZWFkeSBoYXMgIiArIGl0b2EoTWF4RGVza3NQZXJPd25lcikgKyAiIGxpdmUgZGVza3MiKQoJfQoKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWFsbG93SUQsIGVyciA6PSBib29rLk9wZW4oa2V5LCBhcHByb3Zlci5TdHJpbmcoKSwgbm93LCBzcGVuZGJvb2suVGVybXN7CgkJUGVyUGVyaW9kOiAgICBwZXJQZXJpb2QsCgkJUGVyaW9kTGVuZ3RoOiBwZXJpb2RMZW5ndGgsCgkJVG90YWw6ICAgICAgICB0b3RhbCwKCQlFeHBpcmVzQXQ6ICAgIGV4cGlyZXNBdCwKCX0pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaWQgOj0gbmV4dERlc2tJRCArIDEKCW5leHREZXNrSUQgPSBpZAoJZGVza3MuU2V0KHBhZElEKGlkKSwgJmRlc2t7CgkJaWQ6ICAgICAgICBpZCwKCQlvd25lcjogICAgIG93bmVyLAoJCWFwcHJvdmVyOiAgYXBwcm92ZXIsCgkJYWxsb3dJRDogICBhbGxvd0lELAoJCWZlZUJwczogICAgQXBwcm92YWxGZWVCcHMsCgkJbGFiZWw6ICAgICBsYWJlbCwKCQljcmVhdGVkQXQ6IG5vdywKCX0pCglzZXRPd25lckRlc2tzKGtleSwgb3duZXJEZXNrcyhrZXkpKzEpCgoJY2hhaW4uRW1pdCgiRGVza09wZW5lZCIsICJpZCIsIGl0b2EoaWQpLCAib3duZXIiLCBrZXksCgkJImFwcHJvdmVyIiwgYXBwcm92ZXIuU3RyaW5nKCksICJwZXJQZXJpb2QiLCBpdG9hKHBlclBlcmlvZCksCgkJInBlcmlvZExlbmd0aCIsIGl0b2EocGVyaW9kTGVuZ3RoKSwgInRvdGFsIiwgaXRvYSh0b3RhbCksCgkJImV4cGlyZXNBdCIsIGl0b2EoZXhwaXJlc0F0KSwgImZlZUJwcyIsIGl0b2EoQXBwcm92YWxGZWVCcHMpKQoJcmV0dXJuIGlkCn0KCi8vIEFtZW5kRGVzayBjaGFuZ2VzIGEgZGVzaydzIHRlcm1zLiBPd25lciBvbmx5LiBUaGUgcmV0dXJuZWQgYm9vbCByZXBvcnRzCi8vIHdoZXRoZXIgdGhlIG5ldyB0ZXJtcyBhcmUgaW4gZm9yY2UgTk9XIChhIHRpZ2h0ZXItb3ItZXF1YWwgYW1lbmRtZW50KQovLyBvciBxdWV1ZWQgZm9yIHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeSAoYSBsb29zZXIgb25lKSDigJQgc3BlbmRib29rJ3MKLy8gb25lLXNpZGVkIHJ1bGUsIGFuZCB0aGUgZGlzdGluY3Rpb24gd29ydGgga25vd2luZy4KLy8KLy8gcGVyaW9kTGVuZ3RoIGlzIE5PVCBhIHBhcmFtZXRlci4gc3BlbmRib29rIG1ha2VzIGl0IGltbXV0YWJsZSBiZWNhdXNlCi8vIG1vdmluZyBpdCB3b3VsZCBtb3ZlIGV2ZXJ5IGZ1dHVyZSBib3VuZGFyeSwgd2hpY2ggaXMgYW4gZW5sYXJnZW1lbnQKLy8gdmVjdG9yIHdlYXJpbmcgYSBkaWZmZXJlbnQgaGF0OyB0aGlzIHJlYWxtIHJlYWRzIHRoZSBkZXNrJ3Mgb3duCi8vIHBlcmlvZExlbmd0aCBhbmQgcGFzc2VzIGl0IHVuY2hhbmdlZCwgc28gY2hhbmdpbmcgaXQgaXMgbm90IG1lcmVseQovLyByZWZ1c2VkLCBpdCBpcyB1bmV4cHJlc3NpYmxlLgovLwovLyBBbWVuZGluZyBkb2VzIG5vdCB0b3VjaCBwZW5kaW5nIHJlcXVlc3RzLiBUaGVpciBmZWUgd2FzIHNuYXBzaG90dGVkIGF0Ci8vIFN1Ym1pdCBhbmQgdGhlaXIgYW1vdW50IGlzIGZpeGVkOyB3aGF0IGNoYW5nZXMgaXMgd2hldGhlciB0aGUgYXBwcm92ZXIKLy8gc3RpbGwgaGFzIHRoZSBhdXRob3JpdHkgdG8gc2V0dGxlIHRoZW0sIHdoaWNoIEFwcHJvdmFibGUgcmVwb3J0cy4KLy8KLy8gQSBRVUVVRUQgRVhQSVJZIEVYVEVOU0lPTiBDQU4gQkUgTE9TVCwgQU5EIFRIRSBERVNLIEJFQ09NRVMgUkVBUEFCTEUgSU4KLy8gVEhFIE1FQU5USU1FLiBBIHdpZGVuaW5nIGFtZW5kbWVudCBpcyBxdWV1ZWQgcmF0aGVyIHRoYW4gYXBwbGllZCwgYW5kCi8vIHNwZW5kYm9vayBzdXJmYWNlcyBhIHF1ZXVlZCB0ZXJtIG9ubHkgdGhyb3VnaCBpdHMgaW50ZXJuYWwgYXQoKQovLyBhY2Nlc3NvciDigJQgd2hpY2ggSXNFeHBpcmVkIGRvZXMgTk9UIHVzZTogaXQgcmVhZHMgdGhlIGxpdmUKLy8gVGVybXMuRXhwaXJlc0F0IGRpcmVjdGx5LiBTbyBiZXR3ZWVuIHF1ZXVlaW5nIGFuZCB0aGUgbmV4dCBhcHByb3ZhbCwKLy8gSXNEZXNrRXhwaXJlZCBhbmQgUmVhcERlc2sgc3RpbGwgcmVhZCB0aGUgT0xEIGV4cGlyeS4gSWYgdGhlIG9sZCBleHBpcnkKLy8gcGFzc2VzIHdpdGggbm8gQXBwcm92ZSBhbmQgbm8gcmVzdGF0ZWQgQW1lbmREZXNrIGluIGJldHdlZW4sIEFOWU9ORSBtYXkKLy8gUmVhcERlc2sgdGhlIGRlc2sgYW5kIHRoZSBxdWV1ZWQgZXh0ZW5zaW9uIGRpZXMgd2l0aCBpdC4gUmVzdGF0aW5nIHRoZQovLyBzYW1lIGFtZW5kbWVudCB3aGlsZSB0aGUgb2xkIGV4cGlyeSBpcyBzdGlsbCBpbiB0aGUgZnV0dXJlIG1ha2VzIGl0Ci8vIHBlcm1hbmVudCwgYmVjYXVzZSBzcGVuZGJvb2sgd3JpdGVzIFBlbmRpbmcgYmFjayB0byBUZXJtcyBvbiBhIHNwZW5kIG9yCi8vIG9uIGEgbGF0ZXIgYW1lbmRtZW50OyByZXN0YXRpbmcgaXQgYWZ0ZXIgdGhlIG9sZCBleHBpcnkgaXMgcmVmdXNlZCB3aXRoCi8vICJhbGxvd2FuY2UgaGFzIGV4cGlyZWQiLgovLwovLyBOTyBGVU5EUyBBUkUgQVQgUklTSyBhbmQgdGhhdCBpcyBzdHJ1Y3R1cmFsLCBub3QgaW5jaWRlbnRhbDogZHJvcERlc2sKLy8gbW92ZXMgbm8gY29pbnMsIGFuZCB0aGUgY2xhaW1hbnQgcG9vbHMgYXJlIGtleWVkIGJ5IENMQUlNQU5UIEFERFJFU1MKLy8gcmF0aGVyIHRoYW4gYnkgZGVzaywgc28gYSByZWFwIHN0cmFuZHMgb3BlbiByZXF1ZXN0cyBhbmQgbGVhdmVzIGV2ZXJ5Ci8vIGFjY3J1ZWQgYmFsYW5jZSBjbGFpbWFibGUuIFRoZSByb290IGNhdXNlIGlzIGluIHNwZW5kYm9vaywgd2hpY2ggaXMKLy8gYWxyZWFkeSBsaXZlIGFuZCBpbW11dGFibGUsIHNvIHRoZSByZXBhaXIgYmVsb25ncyB0byBhIGZ1dHVyZSAvcC8KLy8gdmVyc2lvbiBhbmQgbm90IHRvIHRoaXMgcmVhbG0uIFNlZSBBVURJVC5tZCBZMSBhbmQgREVQTE9ZX1JFQURJTkVTUy5tZC4KZnVuYyBBbWVuZERlc2soY3VyIHJlYWxtLCBpZCBpbnQ2NCwgcGVyUGVyaW9kLCB0b3RhbCwgZXhwaXJlc0F0IGludDY0KSBib29sIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWQgOj0gbXVzdERlc2soaWQpCglpZiBvd25lciAhPSBkLm93bmVyIHsKCQlwYW5pYygib3duZXIgb25seSIpCgl9CglpZiBwZXJQZXJpb2QgPCBNaW5QZXJQZXJpb2QgewoJCXBhbmljKCJwZXJQZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QZXJQZXJpb2QpICsgRGVub20pCgl9CgoJYSwgZXJyIDo9IGJvb2suR2V0KGQuYWxsb3dJRCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWFwcGxpZWQsIGVyciA6PSBib29rLkFtZW5kKGQuYWxsb3dJRCwgb3duZXIuU3RyaW5nKCksIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCQlzcGVuZGJvb2suVGVybXN7CgkJCVBlclBlcmlvZDogICAgcGVyUGVyaW9kLAoJCQlQZXJpb2RMZW5ndGg6IGEuVGVybXMuUGVyaW9kTGVuZ3RoLCAvLyBpbW11dGFibGUKCQkJVG90YWw6ICAgICAgICB0b3RhbCwKCQkJRXhwaXJlc0F0OiAgICBleHBpcmVzQXQsCgkJfSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljaGFpbi5FbWl0KCJEZXNrQW1lbmRlZCIsICJpZCIsIGl0b2EoZC5pZCksICJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJwZXJQZXJpb2QiLCBpdG9hKHBlclBlcmlvZCksICJ0b3RhbCIsIGl0b2EodG90YWwpLAoJCSJleHBpcmVzQXQiLCBpdG9hKGV4cGlyZXNBdCksICJhcHBsaWVkIiwgYm9vbHN0cihhcHBsaWVkKSkKCXJldHVybiBhcHBsaWVkCn0KCi8vIENsb3NlRGVzayBlbmRzIGFuIGFwcHJvdmVyJ3MgYXV0aG9yaXR5IGltbWVkaWF0ZWx5LiBPd25lciBvbmx5LiBUaGUgaWQKLy8gaXMgbmV2ZXIgcmV1c2VkLCBzbyBhIGNsb3NlZCBkZXNrIGNhbm5vdCBiZSByZXN1cnJlY3RlZC4KLy8KLy8gQ2xvc2luZyBkb2VzIE5PVCBjbGF3IGJhY2sgY3JlZGl0IGFscmVhZHkgYXBwcm92ZWQg4oCUIHRoYXQgaXMgdGhlCi8vIGNsYWltYW50J3MgYW5kIHN0YXlzIGNsYWltYWJsZS4gSXQgZG9lcyBOT1QgcmVtb3ZlIHJlcXVlc3RzIGZpbGVkIGF0Ci8vIHRoaXMgZGVzayBlaXRoZXI6IHNlZSB0aGUgcGFja2FnZSBkb2MsICJhIGNsb3NlZCBkZXNrIGxlYXZlcyBpdHMKLy8gcmVxdWVzdHMgdW4tYXBwcm92YWJsZSIuIFRoZSBjb3VudCBvZiB0aG9zZSBpcyByZXBvcnRlZCBpbiB0aGUgZXZlbnQgc28KLy8gdGhlIG93bmVyIGxlYXJucyB3aGF0IHRoZXkganVzdCBzdHJhbmRlZC4KZnVuYyBDbG9zZURlc2soY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJZCA6PSBtdXN0RGVzayhpZCkKCWlmIG93bmVyICE9IGQub3duZXIgewoJCXBhbmljKCJvd25lciBvbmx5IikKCX0KCS8vIE93bmVyLWdhdGVkIHR3aWNlIG9uIHB1cnBvc2U6IHRoZSBjaGVjayBhYm92ZSBpcyBmb3IgdGhlIGVycm9yCgkvLyBtZXNzYWdlLCB0aGUgcHJpbWl0aXZlJ3MgaXMgdGhlIGF1dGhvcml0YXRpdmUgb25lLgoJaWYgZXJyIDo9IGJvb2suUmV2b2tlKGQuYWxsb3dJRCwgb3duZXIuU3RyaW5nKCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglzdHJhbmRlZCA6PSBkZXNrT3BlbihpZCkKCWRyb3BEZXNrKGQpCgoJY2hhaW4uRW1pdCgiRGVza0Nsb3NlZCIsICJpZCIsIGl0b2EoZC5pZCksICJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJhcHByb3ZlciIsIGQuYXBwcm92ZXIuU3RyaW5nKCksICJhcHByb3ZlZCIsIGl0b2EoZC5hcHByb3ZlZCksCgkJInN0cmFuZGVkUmVxdWVzdHMiLCBpdG9hKHN0cmFuZGVkKSkKfQoKLy8gUmVhcERlc2sgcmVtb3ZlcyBhIGRlc2sgd2hvc2UgYXV0aG9yaXR5IGhhcyBFWFBJUkVELCBmcmVlaW5nIGl0cyBzbG90Ci8vIGFuZCBpdHMgc3RvcmFnZS4gQW55b25lIG1heSBjYWxsIGl0LCBhbmQgdGhlIHJlYXNvbmluZyBpcyBzcGVuZGJvb2sncwovLyBvd246IGFuIGV4cGlyZWQgYWxsb3dhbmNlIGNhbiBuZXZlciBhdXRob3JpemUgYW5vdGhlciBhcHByb3ZhbCwgc28KLy8gcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZyBmcm9tIHRoZSBvd25lciBhbmQgZ3JhbnRzIG5vdGhpbmcgdG8gdGhlCi8vIGNhbGxlci4gVGhlIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCB0byB0aGUgcmVhcGluZwovLyB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgdGhlIHN0YW5kaW5nIGluY2VudGl2ZS4KLy8KLy8gQSBkZXNrIHdpdGggbm8gZXhwaXJ5IGNhbiBuZXZlciBiZSByZWFwZWQ7IG9ubHkgaXRzIG93bmVyIGNhbiBjbG9zZSBpdC4KZnVuYyBSZWFwRGVzayhjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJZCA6PSBtdXN0RGVzayhpZCkKCWlmIGVyciA6PSBib29rLlJlYXAoZC5hbGxvd0lELCBydW50aW1lLkNoYWluSGVpZ2h0KCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglzdHJhbmRlZCA6PSBkZXNrT3BlbihpZCkKCWRyb3BEZXNrKGQpCgoJY2hhaW4uRW1pdCgiRGVza1JlYXBlZCIsICJpZCIsIGl0b2EoZC5pZCksICJvd25lciIsIGQub3duZXIuU3RyaW5nKCksCgkJImJ5IiwgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLlN0cmluZygpLAoJCSJzdHJhbmRlZFJlcXVlc3RzIiwgaXRvYShzdHJhbmRlZCkpCn0KCi8vIC0tLSByZXF1ZXN0cyAtLS0KCi8vIFN1Ym1pdCBmaWxlcyBhIHJlaW1idXJzZW1lbnQgcmVxdWVzdCBhZ2FpbnN0IGEgZGVzayBhbmQgcmV0dXJucyB0aGUKLy8gcmVxdWVzdCBpZC4gQU5ZT05FIG1heSBzdWJtaXQ6IHRoYXQgaXMgdGhlIHBvaW50IG9mIHRoZSByZWFsbSDigJQgdGhlCi8vIHBhcnR5IHdobyBzcGVudCB0aGUgbW9uZXkgYXNrcywgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYSBzaWduZXIsIGEKLy8gZGVsZWdhdGUsIG9yIGtub3duIHRvIHRoZSBkZXNrIGluIGFkdmFuY2UuCi8vCi8vIE5vdGhpbmcgaXMgcmVzZXJ2ZWQgYW5kIG5vdGhpbmcgbW92ZXMuIFRoZSBhbW91bnQgYW5kIHRoZSBmZWUgYXJlIGZpeGVkCi8vIGhlcmUgKHRoZSBmZWUgaXMgc25hcHNob3R0ZWQgZnJvbSB0aGUgZGVzaywgc28gYSBsYXRlciBBbWVuZERlc2sgY2Fubm90Ci8vIGNoYW5nZSB0aGUgdGVybXMgb2YgYSByZXF1ZXN0IGFscmVhZHkgZmlsZWQpLCBhbmQgdGhlIHJlcXVlc3QgZXhwaXJlcwovLyBhdCBzdWJtaXR0ZWRBdCArIFJlcXVlc3RUVEwuCi8vCi8vIFN1Ym1pdHRpbmcgYWdhaW5zdCBhIGRlc2sgd2hvc2UgYXBwcm92ZXIgaXMgdGhlIHN1Ym1pdHRlciBpcyBwZXJtaXR0ZWQKLy8gYW5kIHVzZWxlc3M6IEFwcHJvdmUgcmVmdXNlcyBzZWxmLWFwcHJvdmFsLCBzbyBzdWNoIGEgcmVxdWVzdCBjYW4gb25seQovLyBiZSByZWplY3RlZCwgcmV0cmFjdGVkIG9yIGV4cGlyZWQuIEl0IGlzIG5vdCByZWZ1c2VkIGhlcmUgYmVjYXVzZSBhbgovLyBhcHByb3ZlciBtYXkgbGVnaXRpbWF0ZWx5IHN1Ym1pdCBhdCBhIGRlc2sgdGhleSBkbyBub3QgYXBwcm92ZSwgYW5kIGEKLy8gY2hlY2sgYXQgU3VibWl0IHdvdWxkIGhhdmUgdG8gZ3Vlc3Mgd2hpY2ggZGVzayB0aGUgY2xhaW1hbnQgbWVhbnQuCmZ1bmMgU3VibWl0KGN1ciByZWFsbSwgZGVza0lEIGludDY0LCBhbW91bnQgaW50NjQsIG1lbW8gc3RyaW5nKSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY2xhaW1hbnQgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglkIDo9IG11c3REZXNrKGRlc2tJRCkKCglpZiBhbW91bnQgPCBNaW5SZXF1ZXN0QW1vdW50IHsKCQlwYW5pYygicmVxdWVzdCBhdCBsZWFzdCAiICsgaXRvYShNaW5SZXF1ZXN0QW1vdW50KSArIERlbm9tKQoJfQoJaWYgbGVuKG1lbW8pID4gTWF4TWVtb0xlbiB7CgkJcGFuaWMoIm1lbW8gZXhjZWVkcyAiICsgc3RyY29udi5JdG9hKE1heE1lbW9MZW4pICsgIiBieXRlcyIpCgl9CglpZiBtZW1vID09ICIiIHsKCQkvLyBBIHJlaW1idXJzZW1lbnQgcmVxdWVzdCB3aXRoIG5vIGRlc2NyaXB0aW9uIGlzIHVucmV2aWV3YWJsZTogdGhlCgkJLy8gYXBwcm92ZXIncyB3aG9sZSBqb2IgaXMgZGVjaWRpbmcgd2hldGhlciBUSElTIGV4cGVuc2Ugc2hvdWxkIGJlCgkJLy8gcGFpZCwgYW5kIGFuIGFtb3VudCBhbG9uZSBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgZGVjaXNpb24uCgkJcGFuaWMoIm1lbW8gaXMgcmVxdWlyZWQ6IGRlc2NyaWJlIHRoZSBleHBlbnNlIikKCX0KCWlmIHJlcXVlc3RzLlNpemUoKSA+PSBNYXhMaXZlUmVxdWVzdHMgewoJCXBhbmljKCJ0aGUgcmVxdWVzdCBxdWV1ZSBpcyBmdWxsOyBleHBpcmVkIHJlcXVlc3RzIGNhbiBiZSBjbGVhcmVkICIgKwoJCQkiYnkgYW55b25lIHdpdGggRXhwaXJlUmVxdWVzdCIpCgl9CgoJY2tleSA6PSBjbGFpbWFudC5TdHJpbmcoKQoJaWYgY2xhaW1hbnRPcGVuKGNrZXkpID49IE1heE9wZW5QZXJDbGFpbWFudCB7CgkJcGFuaWMoInlvdSBhbHJlYWR5IGhhdmUgIiArIGl0b2EoTWF4T3BlblBlckNsYWltYW50KSArCgkJCSIgcGVuZGluZyByZXF1ZXN0cyIpCgl9CglpZiBkZXNrT3BlbihkZXNrSUQpID49IE1heE9wZW5QZXJEZXNrIHsKCQlwYW5pYygidGhpcyBkZXNrIGFscmVhZHkgaGFzICIgKyBpdG9hKE1heE9wZW5QZXJEZXNrKSArCgkJCSIgcGVuZGluZyByZXF1ZXN0cyIpCgl9CgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJZXhwaXJlcywgb2sgOj0gY2hlY2tlZEFkZChub3csIFJlcXVlc3RUVEwpCglpZiAhb2sgewoJCXBhbmljKCJyZXF1ZXN0IGV4cGlyeSB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdTdWJtaXR0ZWQsIG9rIDo9IGNoZWNrZWRBZGQobGlmZXRpbWVTdWJtaXR0ZWQsIDEpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBzdWJtaXR0ZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoKCWlkIDo9IG5leHRSZXFJRCArIDEKCW5leHRSZXFJRCA9IGlkCglyZXF1ZXN0cy5TZXQocGFkSUQoaWQpLCAmcmVxdWVzdHsKCQlpZDogICAgICAgICAgaWQsCgkJZGVza0lEOiAgICAgIGRlc2tJRCwKCQljbGFpbWFudDogICAgY2xhaW1hbnQsCgkJYW1vdW50OiAgICAgIGFtb3VudCwKCQlmZWVCcHM6ICAgICAgZC5mZWVCcHMsCgkJbWVtbzogICAgICAgIG1lbW8sCgkJc3VibWl0dGVkQXQ6IG5vdywKCQlleHBpcmVzQXQ6ICAgZXhwaXJlcywKCX0pCglzZXRDbGFpbWFudE9wZW4oY2tleSwgY2xhaW1hbnRPcGVuKGNrZXkpKzEpCglzZXREZXNrT3BlbihkZXNrSUQsIGRlc2tPcGVuKGRlc2tJRCkrMSkKCWxpZmV0aW1lU3VibWl0dGVkID0gbmV3U3VibWl0dGVkCgoJY2hhaW4uRW1pdCgiU3VibWl0dGVkIiwgImlkIiwgaXRvYShpZCksICJkZXNrIiwgaXRvYShkZXNrSUQpLAoJCSJjbGFpbWFudCIsIGNrZXksICJhbW91bnQiLCBpdG9hKGFtb3VudCksICJmZWVCcHMiLCBpdG9hKGQuZmVlQnBzKSwKCQkiZXhwaXJlc0F0IiwgaXRvYShleHBpcmVzKSkKCXJldHVybiBpZAp9CgovLyBBcHByb3ZlIHNldHRsZXMgYSByZXF1ZXN0LiBBUFBST1ZFUiBPTkxZOiB0aGUgYXBwcm92ZXIgaXMgdGhlIGNhbGxpbmcKLy8gYWRkcmVzcywgbmV2ZXIgYW4gYXJndW1lbnQuIFRoZSBjbGFpbWFudCBpcyBjcmVkaXRlZCBuZXQgb2YgdGhlIGZlZSBhbmQKLy8gY2xhaW1zIHNlcGFyYXRlbHksIHdoaWNoIGlzIHRoaXMgcG9ydGZvbGlvJ3Mgc3RhbmRhcmQgcHVsbCBzaGFwZS4KLy8KLy8gVGhlIGNoZWNrcyBmYWlsIGluIHRoaXMgb3JkZXIsIGFuZCB0aGUgb3JkZXIgbWF0dGVyczoKLy8KLy8gIDEuIHRoZSBkZXNrIG11c3Qgc3RpbGwgZXhpc3QgKGEgY2xvc2VkIG9yIHJlYXBlZCBkZXNrIHN0cmFuZHMgaXRzCi8vICAgICByZXF1ZXN0cywgYnkgZGVzaWduKTsKLy8gIDIuIHRoZSBjYWxsZXIgbXVzdCBiZSB0aGF0IGRlc2sncyBhcHByb3ZlcjsKLy8gIDMuIHRoZSBjYWxsZXIgbXVzdCBub3QgYmUgdGhlIHJlcXVlc3QncyBvd24gY2xhaW1hbnQgKG5vCi8vICAgICBzZWxmLWFwcHJvdmFsKTsKLy8gIDQuIHRoZSByZXF1ZXN0IG11c3Qgbm90IGhhdmUgZXhwaXJlZDsKLy8gIDUuIHRoZSBvd25lcidzIHBvb2wgbXVzdCBjb3ZlciB0aGUgR1JPU1MgYW1vdW50OwovLyAgNi4gdGhlIGRlc2sncyBzcGVuZGJvb2sgYXV0aG9yaXR5IG11c3QgcGVybWl0IHRoZSBncm9zcyBhbW91bnQuCi8vCi8vIFNvbHZlbmN5ICg1KSBpcyBjaGVja2VkIEJFRk9SRSB0aGUgYWxsb3dhbmNlIGlzIGNvbnN1bWVkICg2KSwgc28gYW4KLy8gYXBwcm92YWwgcmVmdXNlZCBmb3IgaW5zb2x2ZW5jeSBsZWF2ZXMgdGhlIGRlc2sncyB3aW5kb3cgdW50b3VjaGVkCi8vIHJhdGhlciB0aGFuIGJ1cm5pbmcgY2FwYWNpdHkgb24gYW4gYXBwcm92YWwgdGhhdCBkaWQgbm90IGhhcHBlbi4gVGhpcwovLyBpcyBidWRnZXRzJyBvcmRlcmluZywga2VwdCBmb3IgdGhlIHNhbWUgcmVhc29uLgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCByZXFJRCBpbnQ2NCkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWFwcHJvdmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJciA6PSBtdXN0UmVxdWVzdChyZXFJRCkKCWQgOj0gbXVzdERlc2soci5kZXNrSUQpCgoJaWYgYXBwcm92ZXIgIT0gZC5hcHByb3ZlciB7CgkJcGFuaWMoImFwcHJvdmVyIG9ubHkiKQoJfQoJaWYgci5jbGFpbWFudCA9PSBhcHByb3ZlciB7CgkJLy8gQ29uZmxpY3Qgb2YgaW50ZXJlc3QsIGVuZm9yY2VkIHBlci1hcHByb3ZhbCBzbyBpdCBjYW5ub3QgYmUKCQkvLyByb3V0ZWQgYXJvdW5kIHZpYSBhIHNlY29uZCBkZXNrIHRoZSBzYW1lIGFkZHJlc3MgYXBwcm92ZXMuCgkJcGFuaWMoImFuIGFwcHJvdmVyIGNhbm5vdCBhcHByb3ZlIHRoZWlyIG93biByZXF1ZXN0IikKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIG5vdyA+PSByLmV4cGlyZXNBdCB7CgkJcGFuaWMoInJlcXVlc3QgaGFzIGV4cGlyZWQ7IGFueW9uZSBtYXkgRXhwaXJlUmVxdWVzdCBpdCIpCgl9CgoJb3duZXJLZXkgOj0gZC5vd25lci5TdHJpbmcoKQoJcG9vbCA6PSBwb29sT2Yob3duZXJLZXkpCglpZiByLmFtb3VudCA+IHBvb2wgewoJCS8vIEEgcGVuZGluZyByZXF1ZXN0IGlzIG5vdCBhIHJlc2VydmF0aW9uIChwYWNrYWdlIGRvYykuIFRoZSBob25lc3QKCQkvLyBmYWlsdXJlIGlzIGhlcmUsIGF0IGFwcHJvdmFsIHRpbWUsIHJhdGhlciB0aGFuIGEgY3JlZGl0IHRoZQoJCS8vIGNsYWltYW50IGNvdWxkIG5vdCBjbGFpbS4KCQlwYW5pYygib3duZXIncyBwb29sIGNhbm5vdCBjb3ZlciB0aGlzIHJlcXVlc3QiKQoJfQoKCS8vIEF1dGhvcml0eS4gc3BlbmRib29rIGNoZWNrcyBldmVyeSBib3VuZCBhbmQgQ09OU1VNRVMgdGhlIGFsbG93YW5jZQoJLy8gaW4gdGhpcyBvbmUgY2FsbCwgYmVmb3JlIHJldHVybmluZzsgb24gYW55IGVycm9yIG5vdGhpbmcgaXMKCS8vIGNvbnN1bWVkLiBJdHMgc2VudGluZWwgZXJyb3JzIG5hbWUgdGhlIHJlYXNvbi4gVGhlIGFsbG93YW5jZSBpcwoJLy8gY29uc3VtZWQgYnkgdGhlIEdST1NTLCBzbyB0aGUgZGVzayBib3VuZHMgdGhlIG93bmVyJ3Mgb3V0Zmxvdy4KCWlmIGVyciA6PSBib29rLlNwZW5kKGQuYWxsb3dJRCwgYXBwcm92ZXIuU3RyaW5nKCksIG5vdywgci5hbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJbmV3QXBwcm92ZWQsIG9rIDo9IGNoZWNrZWRBZGQoZC5hcHByb3ZlZCwgci5hbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJkZXNrIGFwcHJvdmVkIHRvdGFsIHdvdWxkIG92ZXJmbG93IikKCX0KCW5ld0xpZmV0aW1lLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lQXBwcm92ZWQsIHIuYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygibGlmZXRpbWUgYXBwcm92ZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbmV3QXBwcm92YWxzLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lQXBwcm92YWxzLCAxKQoJaWYgIW9rIHsKCQlwYW5pYygibGlmZXRpbWUgYXBwcm92YWxzIHdvdWxkIG92ZXJmbG93IikKCX0KCS8vIFRoZSBkZXNrIGNvdW50ZXIgaXMgZ3VhcmRlZCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGV2ZXJ5IG90aGVyCgkvLyBhY2N1bXVsYXRpb24gaGVyZSwgYW5kIG5vdCBiZWNhdXNlIHRoZSBvdmVyZmxvdyBpcyByZWFjaGFibGU6IGl0CgkvLyBjb3N0cyBvbmUgdHJhbnNhY3Rpb24gcGVyIGluY3JlbWVudCwgc28gaXQgaXMgbm90LiBUaGUgYXVkaXQgKEcxKQoJLy8gZmxhZ2dlZCBgZC5hcHByb3ZhbHMrK2AgYW5kIGBkLnJlamVjdGlvbnMrK2AgYXMgdGhlIG9ubHkgdHdvIGJhcmUKCS8vIGFjY3VtdWxhdGlvbnMgaW4gdGhlIHJlYWxtIC0tIG5pbmV0ZWVuIGxpbmVzIGZyb20gYSBjaGVja2VkQWRkIG9mCgkvLyB0aGUgc2FtZSBzaGFwZSAtLSBhbmQgcmVhZCB0aGUgYXN5bW1ldHJ5IGFzIG1pbGQgZXZpZGVuY2UgdGhhdCB0d28KCS8vIGxpbmVzIGhhZCBiZWVuIHNraXBwZWQgcmF0aGVyIHRoYW4gcmVhc29uZWQgYWJvdXQuIFRoYXQgaXMgdGhlCgkvLyBjaGVhcCByZWFkaW5nIHRvIGNsb3NlIEJFRk9SRSBhZGRwa2csIGFmdGVyIHdoaWNoIGl0IGlzIGNsb3NlZAoJLy8gZm9yZXZlcjogYSByZWFkZXIgd2hvIGhhcyB0byByZS1kZXJpdmUgdGhlIHJlYWNoYWJpbGl0eSBhcmd1bWVudAoJLy8gYXQgZXZlcnkgYmFyZSBgKytgIGV2ZW50dWFsbHkgc3RvcHMgZGVyaXZpbmcgaXQuCgluZXdEZXNrQXBwcm92YWxzLCBvayA6PSBjaGVja2VkQWRkKGQuYXBwcm92YWxzLCAxKQoJaWYgIW9rIHsKCQlwYW5pYygiZGVzayBhcHByb3ZhbHMgd291bGQgb3ZlcmZsb3ciKQoJfQoKCS8vIE1vdmUgdGhlIGdyb3NzIG91dCBvZiBQIGFuZCBpbnRvIEwuIEggZG9lcyBub3QgbW92ZSwgd2hpY2ggaXMgd2h5CgkvLyB0aGlzIHRyYW5zaXRpb24gaGFzIG5vIHBheW91dCB0byBmYWlsLgoJc2V0UG9vbChvd25lcktleSwgcG9vbC1yLmFtb3VudCkKCXRvdGFsUG9vbGVkIC09IHIuYW1vdW50CgljcmVkaXRlZCwgZmVlIDo9IGxlZGdlci5NdXN0RGVwb3NpdChyLmNsYWltYW50LlN0cmluZygpLCByLmFtb3VudCwgci5mZWVCcHMpCglkLmFwcHJvdmVkID0gbmV3QXBwcm92ZWQKCWQuYXBwcm92YWxzID0gbmV3RGVza0FwcHJvdmFscwoJbGlmZXRpbWVBcHByb3ZlZCA9IG5ld0xpZmV0aW1lCglsaWZldGltZUFwcHJvdmFscyA9IG5ld0FwcHJvdmFscwoJZHJvcFJlcXVlc3QocikKCgljaGFpbi5FbWl0KCJBcHByb3ZlZCIsICJpZCIsIGl0b2Eoci5pZCksICJkZXNrIiwgaXRvYShkLmlkKSwKCQkiYXBwcm92ZXIiLCBhcHByb3Zlci5TdHJpbmcoKSwgImNsYWltYW50Iiwgci5jbGFpbWFudC5TdHJpbmcoKSwKCQkiZ3Jvc3MiLCBpdG9hKHIuYW1vdW50KSwgImNyZWRpdGVkIiwgaXRvYShjcmVkaXRlZCksCgkJImZlZSIsIGl0b2EoZmVlKSwgInBvb2wiLCBpdG9hKHBvb2wtci5hbW91bnQpKQoJcmV0dXJuIGNyZWRpdGVkCn0KCi8vIFJlamVjdCBjbG9zZXMgYSByZXF1ZXN0IHdpdGhvdXQgc2V0dGxpbmcgaXQuIEFQUFJPVkVSIE9OTFkuIE5vdGhpbmcKLy8gbW92ZXMgaW4gYW55IHRlcm0gb2YgdGhlIGludmFyaWFudCwgYW5kIG5vIGF1dGhvcml0eSBpcyBjb25zdW1lZCDigJQgYQovLyByZWplY3Rpb24gY29zdHMgdGhlIGRlc2sncyB3aW5kb3cgbm90aGluZywgd2hpY2ggaXMgZGVsaWJlcmF0ZTogYW4KLy8gYXBwcm92ZXIgbXVzdCBiZSBhYmxlIHRvIHNheSBubyBhcyBvZnRlbiBhcyBuZWNlc3NhcnkuCi8vCi8vIFJlamVjdGluZyBhbiBFWFBJUkVEIHJlcXVlc3QgaXMgYWxsb3dlZC4gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGZvcmNlIGFuCi8vIGFwcHJvdmVyIHdobyB3YW50cyB0aGUgcmVjb3JkIHRvIGNhcnJ5IGEgcmVhc29uIHRvIHJhY2UgdGhlIGV4cGlyeSwgYW5kCi8vIHRoZSByZWFzb24gaXMgdGhlIHVzZWZ1bCBhcnRpZmFjdDogRXhwaXJlUmVxdWVzdCBlbWl0cyBubyBleHBsYW5hdGlvbi4KZnVuYyBSZWplY3QoY3VyIHJlYWxtLCByZXFJRCBpbnQ2NCwgcmVhc29uIHN0cmluZykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWFwcHJvdmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJciA6PSBtdXN0UmVxdWVzdChyZXFJRCkKCWQgOj0gbXVzdERlc2soci5kZXNrSUQpCgoJaWYgYXBwcm92ZXIgIT0gZC5hcHByb3ZlciB7CgkJcGFuaWMoImFwcHJvdmVyIG9ubHkiKQoJfQoJaWYgbGVuKHJlYXNvbikgPiBNYXhNZW1vTGVuIHsKCQlwYW5pYygicmVhc29uIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhNZW1vTGVuKSArICIgYnl0ZXMiKQoJfQoJbmV3UmVqZWN0ZWQsIG9rIDo9IGNoZWNrZWRBZGQobGlmZXRpbWVSZWplY3RlZCwgMSkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIHJlamVjdGVkIHdvdWxkIG92ZXJmbG93IikKCX0KCS8vIEd1YXJkZWQgZm9yIHRoZSByZWFzb24gZ2l2ZW4gYXQgdGhlIGRlc2stYXBwcm92YWxzIGNvdW50ZXIgYWJvdmUuCgluZXdEZXNrUmVqZWN0aW9ucywgb2sgOj0gY2hlY2tlZEFkZChkLnJlamVjdGlvbnMsIDEpCglpZiAhb2sgewoJCXBhbmljKCJkZXNrIHJlamVjdGlvbnMgd291bGQgb3ZlcmZsb3ciKQoJfQoKCWQucmVqZWN0aW9ucyA9IG5ld0Rlc2tSZWplY3Rpb25zCglsaWZldGltZVJlamVjdGVkID0gbmV3UmVqZWN0ZWQKCWRyb3BSZXF1ZXN0KHIpCgoJY2hhaW4uRW1pdCgiUmVqZWN0ZWQiLCAiaWQiLCBpdG9hKHIuaWQpLCAiZGVzayIsIGl0b2EoZC5pZCksCgkJImFwcHJvdmVyIiwgYXBwcm92ZXIuU3RyaW5nKCksICJjbGFpbWFudCIsIHIuY2xhaW1hbnQuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2Eoci5hbW91bnQpLCAicmVhc29uIiwgcmVhc29uKQp9CgovLyBSZXRyYWN0IHJlbW92ZXMgdGhlIGNhbGxlcidzIG93biBwZW5kaW5nIHJlcXVlc3QuIENMQUlNQU5UIE9OTFkuCi8vIE5vdGhpbmcgbW92ZXMuCi8vCi8vIE5hbWVkIFJldHJhY3QgcmF0aGVyIHRoYW4gV2l0aGRyYXcgb24gcHVycG9zZTogZXZlcnkgV2l0aGRyYXcqIGluIHRoaXMKLy8gcG9ydGZvbGlvIG1vdmVzIG1vbmV5LCBhbmQgdGhpcyBtb3ZlcyBub25lLiBBIGNsYWltYW50IHJlYWRpbmcgYQovLyBmdW5jdGlvbiBsaXN0IHNob3VsZCBub3QgaGF2ZSB0byBvcGVuIHRoZSBzb3VyY2UgdG8gbGVhcm4gd2hpY2guCmZ1bmMgUmV0cmFjdChjdXIgcmVhbG0sIHJlcUlEIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY2xhaW1hbnQgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglyIDo9IG11c3RSZXF1ZXN0KHJlcUlEKQoJaWYgY2xhaW1hbnQgIT0gci5jbGFpbWFudCB7CgkJcGFuaWMoImNsYWltYW50IG9ubHkiKQoJfQoJbmV3UmV0cmFjdGVkLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lUmV0cmFjdGVkLCAxKQoJaWYgIW9rIHsKCQlwYW5pYygibGlmZXRpbWUgcmV0cmFjdGVkIHdvdWxkIG92ZXJmbG93IikKCX0KCWxpZmV0aW1lUmV0cmFjdGVkID0gbmV3UmV0cmFjdGVkCglkcm9wUmVxdWVzdChyKQoKCWNoYWluLkVtaXQoIlJldHJhY3RlZCIsICJpZCIsIGl0b2Eoci5pZCksICJkZXNrIiwgaXRvYShyLmRlc2tJRCksCgkJImNsYWltYW50IiwgY2xhaW1hbnQuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKHIuYW1vdW50KSkKfQoKLy8gRXhwaXJlUmVxdWVzdCByZW1vdmVzIGEgcmVxdWVzdCBwYXN0IGl0cyBleHBpcnksIGZyZWVpbmcgaXRzIHNsb3QgYW5kCi8vIGl0cyBzdG9yYWdlLiBBTllPTkUgbWF5IGNhbGwgaXQsIGFuZCB0aGUgcmVhc29uaW5nIG1hdGNoZXMgUmVhcERlc2snczoKLy8gYW4gZXhwaXJlZCByZXF1ZXN0IGNhbiBuZXZlciBiZSBhcHByb3ZlZCwgc28gcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZwovLyBmcm9tIHRoZSBjbGFpbWFudCBhbmQgZ3JhbnRzIG5vdGhpbmcgdG8gdGhlIGNhbGxlci4gVGhlIGNoYWluIHJlZnVuZHMKLy8gdGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCB0byB0aGUgZXhwaXJpbmcgdHJhbnNhY3Rpb24sIHdoaWNoIGlzIHRoZQovLyBzdGFuZGluZyBpbmNlbnRpdmUgYW5kIHRoZSBtZWNoYW5pc20gdGhhdCBkcmFpbnMgdGhlIHF1ZXVlLgpmdW5jIEV4cGlyZVJlcXVlc3QoY3VyIHJlYWxtLCByZXFJRCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXIgOj0gbXVzdFJlcXVlc3QocmVxSUQpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglpZiBub3cgPCByLmV4cGlyZXNBdCB7CgkJcGFuaWMoInJlcXVlc3QgaGFzIG5vdCBleHBpcmVkIHlldCIpCgl9CgluZXdFeHBpcmVkLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lRXhwaXJlZCwgMSkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIGV4cGlyZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbGlmZXRpbWVFeHBpcmVkID0gbmV3RXhwaXJlZAoJZHJvcFJlcXVlc3QocikKCgljaGFpbi5FbWl0KCJSZXF1ZXN0RXhwaXJlZCIsICJpZCIsIGl0b2Eoci5pZCksICJkZXNrIiwgaXRvYShyLmRlc2tJRCksCgkJImNsYWltYW50Iiwgci5jbGFpbWFudC5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2Eoci5hbW91bnQpLAoJCSJieSIsIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS5TdHJpbmcoKSkKfQoKLy8gLS0tIHRoZSBwdWxsIC0tLQoKLy8gQ2xhaW0gcGF5cyB0aGUgY2FsbGVyJ3MgZW50aXJlIHNldHRsZWQgY3JlZGl0IG91dC4gQ0xBSU1BTlQgT05MWTogdGhlCi8vIGFjY291bnQgaXMgdGhlIGNhbGxpbmcgYWRkcmVzcy4gQ3JlZGl0IGZyb20gYSBkZXNrIHRoYXQgaGFzIHNpbmNlIGJlZW4KLy8gY2xvc2VkLCBleHBpcmVkIG9yIHJlYXBlZCBpcyBzdGlsbCBjbGFpbWFibGUg4oCUIGl0IHdhcyBzZXR0bGVkIHVuZGVyIGEKLy8gbGl2ZSBhdXRob3JpdHkgYW5kIHRoaXMgcmVhbG0gZG9lcyBub3QgcmV2aXNpdCB0aGF0LgpmdW5jIENsYWltKGN1ciByZWFsbSkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWFjY291bnQgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglrZXkgOj0gYWNjb3VudC5TdHJpbmcoKQoKCWFtb3VudCwgZXJyIDo9IGxlZGdlci5XaXRoZHJhd0FsbChrZXkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIGNyZWRpdCB0byBjbGFpbSIpCgl9CgluZXdDbGFpbWVkLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lQ2xhaW1lZCwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygibGlmZXRpbWUgY2xhaW1lZCB3b3VsZCBvdmVyZmxvdyIpCgl9CglsaWZldGltZUNsYWltZWQgPSBuZXdDbGFpbWVkCgoJY29pbmlvLlBheW91dCgwLCBjdXIsIGFjY291bnQsIERlbm9tLCBhbW91bnQpCgoJY2hhaW4uRW1pdCgiQ2xhaW1lZCIsICJhY2NvdW50Iiwga2V5LCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQoJcmV0dXJuIGFtb3VudAp9CgovLyAtLS0gZmVlcyBhbmQgc3VycGx1cyAtLS0KCi8vIFdpdGhkcmF3RmVlcyBwYXlzIHRoZSBlbnRpcmUgYWNjcnVlZCBmZWUgcG90IHRvIHRoZSBjb21waWxlLXRpbWUKLy8gRmVlQ29sbGVjdG9yLiBBbnlvbmUgbWF5IGNhbGwgaXQ6IHRoZSBkZXN0aW5hdGlvbiBpcyBmaXhlZCwgc28gdGhlcmUgaXMKLy8gbm90aGluZyBmb3IgYSBjYWxsZXIgdG8gc3RlZXIuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWZlZXMgOj0gbGVkZ2VyLldpdGhkcmF3RmVlcygpCglpZiBmZWVzID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIEZlZUNvbGxlY3RvciwgRGVub20sIGZlZXMpCgljaGFpbi5FbWl0KCJGZWVzV2l0aGRyYXduIiwgInRvIiwgRmVlQ29sbGVjdG9yLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShmZWVzKSkKCXJldHVybiBmZWVzCn0KCi8vIFN3ZWVwU3VycGx1cyBzZW5kcyBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgRmVlQ29sbGVjdG9yOiBmb3IgdGhlIHBvb2wKLy8gZGVub20sIGV2ZXJ5dGhpbmcgYWJvdmUgdHJhY2tlZCBsaWFiaWxpdGllczsgZm9yIGFueSBmb3JlaWduIGRlbm9tLCB0aGUKLy8gZnVsbCBiYWxhbmNlLiBPd25lciBwb29scywgY2xhaW1hbnQgY3JlZGl0IGFuZCB0aGUgZmVlIHBvdCBhcmUKLy8gdW50b3VjaGFibGUgYnkgY29uc3RydWN0aW9uIChjb2luaW8uU3dlZXAgcmVmdXNlcyB0byBkaXAgYmVsb3cgdGhlCi8vIHJlc2VydmUpLiBBbnlvbmUgbWF5IGNhbGwgaXQuCi8vCi8vIFdpdGggbm90aGluZyBvdXQgb2YgYmFuZCB0aGlzIEFCT1JUUyAoImNvaW5pbzogbm8gc3VycGx1cyB0byBzd2VlcCBmb3IKLy8gPGRlbm9tPiIpIHJhdGhlciB0aGFuIHJldHVybmluZyAwLiBUaGF0IGlzIHRoZSBwcmltaXRpdmUncyBjaG9pY2UgYW5kCi8vIHRoZSByaWdodCBvbmU6IGEgc3dlZXAgaXMgYSB0cmFuc2ZlciwgYW5kIGEgdHJhbnNmZXIgb2Ygbm90aGluZyB0aGF0Ci8vIHJlcG9ydHMgc3VjY2VzcyBpcyBob3cgYSBjYWxsZXIgY29tZXMgdG8gYmVsaWV2ZSBhIGJhbGFuY2Ugd2FzIG1vdmVkLgpmdW5jIFN3ZWVwU3VycGx1cyhjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gTGlhYmlsaXRpZXMoKQoJfQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgRmVlQ29sbGVjdG9yLCBkZW5vbSwgcmVzZXJ2ZSkKCWNoYWluLkVtaXQoIlN3ZXB0IiwgImRlbm9tIiwgZGVub20sICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShzd2VwdCkpCglyZXR1cm4gc3dlcHQKfQoKLy8gLS0tIGRlc2sgdmlld3MgLS0tCgovLyBEZXNrSW5mbyByZXR1cm5zIGEgZGVzaydzIHBhcnRpZXMgYW5kIHRoZSB0ZXJtcyBjdXJyZW50bHkgcmVjb3JkZWQgZm9yCi8vIGl0LiBwZXJQZXJpb2QgcmVmbGVjdHMgYSB0aWdodGVuaW5nIGFtZW5kbWVudCBpbW1lZGlhdGVseTsgYSBxdWV1ZWQKLy8gbG9vc2VuaW5nIHNob3dzIGluIFBlbmRpbmdUZXJtcyB1bnRpbCBpdHMgYm91bmRhcnkgYXJyaXZlcy4KZnVuYyBEZXNrSW5mbyhpZCBpbnQ2NCkgKG93bmVyLCBhcHByb3ZlciBhZGRyZXNzLCBwZXJQZXJpb2QsIHBlcmlvZExlbmd0aCwKCXRvdGFsLCBleHBpcmVzQXQsIGFuY2hvciwgY3JlYXRlZEF0LCBmZWVCcHMgaW50NjQpIHsKCWQgOj0gbXVzdERlc2soaWQpCglhIDo9IG11c3RBbGxvd2FuY2UoZCkKCXJldHVybiBkLm93bmVyLCBkLmFwcHJvdmVyLCBhLlRlcm1zLlBlclBlcmlvZCwgYS5UZXJtcy5QZXJpb2RMZW5ndGgsCgkJYS5UZXJtcy5Ub3RhbCwgYS5UZXJtcy5FeHBpcmVzQXQsIGEuQW5jaG9yLCBkLmNyZWF0ZWRBdCwgZC5mZWVCcHMKfQoKLy8gRGVza1VzYWdlIHJldHVybnMgYSBkZXNrJ3MgY29uc3VtcHRpb24gQVQgVEhFIENVUlJFTlQgSEVJR0hUOiB3aGF0IHRoZQovLyB3aW5kb3cgdGhlIGNoYWluIGlzIGluIHJpZ2h0IG5vdyBoYXMgYXBwcm92ZWQsIHRoZSBsaWZldGltZSBncm9zcywgdGhhdAovLyB3aW5kb3cncyBpbmRleCwgaG93IG1hbnkgYXBwcm92YWxzIHRoZXJlIGhhdmUgYmVlbiwgaG93IG1hbnkKLy8gcmVqZWN0aW9ucywgYW5kIGhvdyBtYW55IHJlcXVlc3RzIGFyZSBwZW5kaW5nIGF0IHRoZSBkZXNrLgovLwovLyBUaGUgdHdvIHdpbmRvdyBmaWd1cmVzIGFyZSBjb21wdXRlZCByYXRoZXIgdGhhbiByZWFkIHN0cmFpZ2h0IG9mZiB0aGUKLy8gcmVjb3JkLCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2Ygd2luZG93QXQgYmVsb3c6IGEgd2luZG93IHRoYXQKLy8gaGFzIHJvbGxlZCB3aXRoIG5vIGFwcHJvdmFsIHNpbmNlIGxlYXZlcyBBbGxvd2FuY2UuV2luZG93SW5kZXggbmFtaW5nIGEKLy8gd2luZG93IHRoZSBjaGFpbiBoYXMgYWxyZWFkeSBsZWZ0LCBhbmQgQWxsb3dhbmNlLlNwZW50V2luZG93IGhvbGRpbmcKLy8gdGhlIHByZXZpb3VzIHdpbmRvdydzIHNwZW5kLgpmdW5jIERlc2tVc2FnZShpZCBpbnQ2NCkgKGFwcHJvdmVkV2luZG93LCBhcHByb3ZlZFRvdGFsLCB3aW5kb3dJbmRleCwKCWFwcHJvdmFscywgcmVqZWN0aW9ucywgcGVuZGluZyBpbnQ2NCkgewoJZCA6PSBtdXN0RGVzayhpZCkKCWEgOj0gbXVzdEFsbG93YW5jZShkKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJcmV0dXJuIHNwZW50SW5XaW5kb3coYSwgbm93KSwgYS5TcGVudFRvdGFsLCB3aW5kb3dBdChhLCBub3cpLAoJCWQuYXBwcm92YWxzLCBkLnJlamVjdGlvbnMsIGRlc2tPcGVuKGlkKQp9CgovLyBEZXNrTGFiZWwgcmV0dXJucyBhIGRlc2sncyByYXcgbGFiZWwgKHVuc2FuaXRpemVkOiBjYWxsZXJzIHJlbmRlcmluZyBpdAovLyBpbnRvIG1hcmtkb3duIG11c3Qgc2FuaXRpemUsIGFzIHRoaXMgcmVhbG0ncyBSZW5kZXIgZG9lcykuCmZ1bmMgRGVza0xhYmVsKGlkIGludDY0KSBzdHJpbmcgeyByZXR1cm4gbXVzdERlc2soaWQpLmxhYmVsIH0KCi8vIFJlbWFpbmluZyBpcyB0aGUgQVVUSE9SSVRZIGZpZ3VyZSBmb3IgYSBkZXNrOiB3aGF0IGl0cyB0ZXJtcyBwZXJtaXQgdGhlCi8vIGFwcHJvdmVyIHRvIGFwcHJvdmUgcmlnaHQgbm93LCBpZ25vcmluZyB3aGV0aGVyIHRoZSBvd25lcidzIHBvb2wgY2FuCi8vIGNvdmVyIGl0LgpmdW5jIFJlbWFpbmluZyhpZCBpbnQ2NCkgaW50NjQgewoJZCA6PSBtdXN0RGVzayhpZCkKCXJldHVybiBib29rLlJlbWFpbmluZyhkLmFsbG93SUQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKfQoKLy8gQXBwcm92YWJsZSBpcyB0aGUgSE9ORVNUIGZpZ3VyZSBmb3IgYSBkZXNrLCBhbmQgdGhlIG9uZSBib3RoIGFuCi8vIGFwcHJvdmVyIGFuZCBhIHByb3NwZWN0aXZlIGNsYWltYW50IHNob3VsZCByZWFkOiB0aGUgbGVzc2VyIG9mIHdoYXQgdGhlCi8vIGRlc2sgYXV0aG9yaXplcyBhbmQgd2hhdCB0aGUgb3duZXIncyBwb29sIGhvbGRzLiBUaGlzIGRpc3RpbmN0aW9uIGlzCi8vIHRoZSByZWFsbSdzIG93biDigJQgc3BlbmRib29rIGJvdW5kcyBwZXJtaXNzaW9uIGFuZCBzYXlzIHNvLCBuZXZlcgovLyBzb2x2ZW5jeS4KZnVuYyBBcHByb3ZhYmxlKGlkIGludDY0KSBpbnQ2NCB7CglkIDo9IG11c3REZXNrKGlkKQoJYXV0aG9yaXplZCA6PSBib29rLlJlbWFpbmluZyhkLmFsbG93SUQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCXBvb2wgOj0gcG9vbE9mKGQub3duZXIuU3RyaW5nKCkpCglpZiBwb29sIDwgYXV0aG9yaXplZCB7CgkJcmV0dXJuIHBvb2wKCX0KCXJldHVybiBhdXRob3JpemVkCn0KCi8vIFBlbmRpbmdUZXJtcyByZXR1cm5zIGEgcXVldWVkIGxvb3NlbmluZyBhbWVuZG1lbnQgb24gYSBkZXNrIGFuZCB3aGV0aGVyCi8vIHRoZXJlIGlzIG9uZS4gQW4gYW1lbmRtZW50IGlzIHF1ZXVlZCBvbmx5IHdoZW4gaXQgd291bGQgd2lkZW4gdGhlIGxpdmUKLy8gd2luZG93LCBhbmQgaXQgdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeS4KZnVuYyBQZW5kaW5nVGVybXMoaWQgaW50NjQpIChwZXJQZXJpb2QsIHRvdGFsLCBleHBpcmVzQXQgaW50NjQsIHBlbmRpbmcgYm9vbCkgewoJYSA6PSBtdXN0QWxsb3dhbmNlKG11c3REZXNrKGlkKSkKCWlmICFhLkhhc1BlbmRpbmcgewoJCXJldHVybiAwLCAwLCAwLCBmYWxzZQoJfQoJcmV0dXJuIGEuUGVuZGluZy5QZXJQZXJpb2QsIGEuUGVuZGluZy5Ub3RhbCwgYS5QZW5kaW5nLkV4cGlyZXNBdCwgdHJ1ZQp9CgovLyBJc0Rlc2tFeHBpcmVkIHJlcG9ydHMgd2hldGhlciBhIGRlc2sncyBhdXRob3JpdHkgaGFzIGxhcHNlZCwgd2hpY2ggaXMKLy8gYWxzbyB0aGUgY29uZGl0aW9uIHVuZGVyIHdoaWNoIGFueW9uZSBtYXkgUmVhcERlc2sgaXQuCi8vCi8vIEl0IHJlYWRzIHRoZSBMSVZFIGV4cGlyeSBvbmx5LiBBIHF1ZXVlZCBleHBpcnkgZXh0ZW5zaW9uIHJlcG9ydGVkIGJ5Ci8vIFBlbmRpbmdUZXJtcyBpcyBOT1QgY29uc2lkZXJlZCBoZXJlLCBzbyB0aGlzIGNhbiByZWFkIHRydWUgd2hpbGUgYW4KLy8gYW1lbmRtZW50IHdpZGVuaW5nIHRoZSB3aW5kb3cgaXMgc3RpbGwgcXVldWVkIOKAlCBzZWUgQW1lbmREZXNrIGZvciB0aGUKLy8gZnVsbCBkaXNjbG9zdXJlIGFuZCB3aHkgbm8gZnVuZHMgYXJlIGF0IHJpc2suCmZ1bmMgSXNEZXNrRXhwaXJlZChpZCBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gbXVzdEFsbG93YW5jZShtdXN0RGVzayhpZCkpLklzRXhwaXJlZChydW50aW1lLkNoYWluSGVpZ2h0KCkpCn0KCi8vIC0tLSByZXF1ZXN0IHZpZXdzIC0tLQoKLy8gUmVxdWVzdEluZm8gcmV0dXJucyBhIHJlcXVlc3QncyBkZXNrLCBjbGFpbWFudCwgYW1vdW50LCBzbmFwc2hvdHRlZAovLyBmZWUsIGFuZCB0aGUgdHdvIGhlaWdodHMgdGhhdCBib3VuZCBpdC4KZnVuYyBSZXF1ZXN0SW5mbyhpZCBpbnQ2NCkgKGRlc2tJRCBpbnQ2NCwgY2xhaW1hbnQgYWRkcmVzcywKCWFtb3VudCwgZmVlQnBzLCBzdWJtaXR0ZWRBdCwgZXhwaXJlc0F0IGludDY0KSB7CglyIDo9IG11c3RSZXF1ZXN0KGlkKQoJcmV0dXJuIHIuZGVza0lELCByLmNsYWltYW50LCByLmFtb3VudCwgci5mZWVCcHMsIHIuc3VibWl0dGVkQXQsIHIuZXhwaXJlc0F0Cn0KCi8vIFJlcXVlc3RNZW1vIHJldHVybnMgYSByZXF1ZXN0J3MgcmF3IG1lbW8gKHVuc2FuaXRpemVkOiBjYWxsZXJzCi8vIHJlbmRlcmluZyBpdCBpbnRvIG1hcmtkb3duIG11c3Qgc2FuaXRpemUsIGFzIHRoaXMgcmVhbG0ncyBSZW5kZXIgZG9lcykuCmZ1bmMgUmVxdWVzdE1lbW8oaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0UmVxdWVzdChpZCkubWVtbyB9CgovLyBJc1JlcXVlc3RFeHBpcmVkIHJlcG9ydHMgd2hldGhlciBhIHJlcXVlc3QgaXMgcGFzdCBpdHMgZXhwaXJ5LCB3aGljaCBpcwovLyBib3RoIHRoZSBjb25kaXRpb24gdW5kZXIgd2hpY2ggQXBwcm92ZSByZWZ1c2VzIGFuZCB0aGUgY29uZGl0aW9uIHVuZGVyCi8vIHdoaWNoIGFueW9uZSBtYXkgRXhwaXJlUmVxdWVzdCBpdC4KZnVuYyBJc1JlcXVlc3RFeHBpcmVkKGlkIGludDY0KSBib29sIHsKCXJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPj0gbXVzdFJlcXVlc3QoaWQpLmV4cGlyZXNBdAp9CgovLyBBcHByb3ZhbEJsb2NrZXIgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gdGhlIHJlcXVlc3QgY291bGQgYmUKLy8gYXBwcm92ZWQgcmlnaHQgbm93IGJ5IGl0cyBkZXNrJ3MgYXBwcm92ZXIsIGFuZCBvdGhlcndpc2UgdGhlIHNpbmdsZQovLyByZWFzb24gaXQgY291bGQgbm90LiBJdCBpcyB0aGUgdmlldyBhIFVJIHdhbnRzIGJlZm9yZSBzaG93aW5nIGFuCi8vIGFwcHJvdmUgYnV0dG9uLCBhbmQgYW4gYXBwcm92ZXIgd2FudHMgYmVmb3JlIHBheWluZyBnYXMgZm9yIGEgY2FsbCB0aGF0Ci8vIHdpbGwgYWJvcnQuCi8vCi8vIFRoZSByZWFzb25zIGFyZSByZXBvcnRlZCBpbiB0aGUgc2FtZSBvcmRlciBBcHByb3ZlIGNoZWNrcyB0aGVtLCBzbyB0aGlzCi8vIHZpZXcgYW5kIHRoYXQgZW50cnlwb2ludCBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgV0hJQ0ggcmVhc29uIGFwcGxpZXMuCi8vIEl0IGRlbGliZXJhdGVseSBkb2VzIE5PVCByZXBvcnQgInlvdSBhcmUgbm90IHRoZSBhcHByb3ZlciI6IHRoZSBjYWxsZXIKLy8gb2YgYSB2aWV3IGlzIG5vdCB0aGUgY2FsbGVyIG9mIHRoZSBhcHByb3ZhbCwgc28gdGhpcyBhbnN3ZXJzIGFib3V0IHRoZQovLyByZXF1ZXN0IGFuZCB0aGUgZGVzaywgbm90IGFib3V0IHdob2V2ZXIgaXMgYXNraW5nLgpmdW5jIEFwcHJvdmFsQmxvY2tlcihpZCBpbnQ2NCkgc3RyaW5nIHsKCXIgOj0gbXVzdFJlcXVlc3QoaWQpCgl2IDo9IGRlc2tzLkdldChwYWRJRChyLmRlc2tJRCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICJ0aGUgZGVzayBoYXMgYmVlbiBjbG9zZWQgb3IgcmVhcGVkOyB0aGlzIHJlcXVlc3QgY2FuIG9ubHkgIiArCgkJCSJiZSByZXRyYWN0ZWQgYnkgaXRzIGNsYWltYW50IG9yIGV4cGlyZWQgYnkgYW55b25lIgoJfQoJZCA6PSB2LigqZGVzaykKCWlmIHIuY2xhaW1hbnQgPT0gZC5hcHByb3ZlciB7CgkJcmV0dXJuICJ0aGUgZGVzaydzIGFwcHJvdmVyIGlzIHRoZSBjbGFpbWFudDsgc2VsZi1hcHByb3ZhbCBpcyByZWZ1c2VkIgoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpID49IHIuZXhwaXJlc0F0IHsKCQlyZXR1cm4gInRoZSByZXF1ZXN0IGhhcyBleHBpcmVkIgoJfQoJaWYgci5hbW91bnQgPiBwb29sT2YoZC5vd25lci5TdHJpbmcoKSkgewoJCXJldHVybiAidGhlIG93bmVyJ3MgcG9vbCBjYW5ub3QgY292ZXIgdGhpcyByZXF1ZXN0IgoJfQoJaWYgci5hbW91bnQgPiBib29rLlJlbWFpbmluZyhkLmFsbG93SUQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgewoJCXJldHVybiAidGhlIGRlc2sncyBhdXRob3JpdHkgZG9lcyBub3QgY292ZXIgdGhpcyByZXF1ZXN0IGF0IHRoaXMgIiArCgkJCSJoZWlnaHQgKHdpbmRvdyBjYXAgc3BlbnQsIGxpZmV0aW1lIGNhcCByZWFjaGVkLCBvciBleHBpcmVkKSIKCX0KCXJldHVybiAiIgp9CgovLyAtLS0gYWdncmVnYXRlIHZpZXdzIC0tLQoKLy8gUG9vbE9mIHJldHVybnMgYW4gb3duZXIncyB1bnNwZW50IHBvb2wuCmZ1bmMgUG9vbE9mKGFkZHIgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gcG9vbE9mKGFkZHIuU3RyaW5nKCkpIH0KCi8vIENyZWRpdE9mIHJldHVybnMgYSBjbGFpbWFudCdzIHNldHRsZWQtYnV0LXVuY2xhaW1lZCBjcmVkaXQuCmZ1bmMgQ3JlZGl0T2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuQmFsYW5jZU9mKGFkZHIuU3RyaW5nKCkpIH0KCi8vIERlc2tzT2YgcmV0dXJucyBob3cgbWFueSBsaXZlIGRlc2tzIGFuIG93bmVyIGN1cnJlbnRseSBob2xkcy4KZnVuYyBEZXNrc09mKGFkZHIgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gb3duZXJEZXNrcyhhZGRyLlN0cmluZygpKSB9CgovLyBPcGVuUmVxdWVzdHNPZiByZXR1cm5zIGhvdyBtYW55IHBlbmRpbmcgcmVxdWVzdHMgYSBjbGFpbWFudCBoYXMuCmZ1bmMgT3BlblJlcXVlc3RzT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBjbGFpbWFudE9wZW4oYWRkci5TdHJpbmcoKSkgfQoKLy8gT3BlblJlcXVlc3RzQXQgcmV0dXJucyBob3cgbWFueSBwZW5kaW5nIHJlcXVlc3RzIGEgZGVzayBoYXMuCmZ1bmMgT3BlblJlcXVlc3RzQXQoZGVza0lEIGludDY0KSBpbnQ2NCB7IHJldHVybiBkZXNrT3BlbihkZXNrSUQpIH0KCi8vIE51bURlc2tzIHJldHVybnMgaG93IG1hbnkgZGVza3MgaGF2ZSBldmVyIGJlZW4gb3BlbmVkLiBJZHMgYXJlIG5ldmVyCi8vIHJldXNlZCwgc28gdGhpcyBvbmx5IGdyb3dzLgpmdW5jIE51bURlc2tzKCkgaW50NjQgeyByZXR1cm4gbmV4dERlc2tJRCB9CgovLyBMaXZlRGVza3MgcmV0dXJucyBob3cgbWFueSBkZXNrcyBhcmUgY3VycmVudGx5IGxpdmUsIGZyb20gdGhlCi8vIHByaW1pdGl2ZSdzIG93biBjb3VudC4KZnVuYyBMaXZlRGVza3MoKSBpbnQ2NCB7IHJldHVybiBpbnQ2NChib29rLkNvdW50KCkpIH0KCi8vIE51bVJlcXVlc3RzIHJldHVybnMgaG93IG1hbnkgcmVxdWVzdHMgaGF2ZSBldmVyIGJlZW4gZmlsZWQuIElkcyBhcmUKLy8gbmV2ZXIgcmV1c2VkLCBzbyB0aGlzIG9ubHkgZ3Jvd3MuCmZ1bmMgTnVtUmVxdWVzdHMoKSBpbnQ2NCB7IHJldHVybiBuZXh0UmVxSUQgfQoKLy8gTGl2ZVJlcXVlc3RzIHJldHVybnMgaG93IG1hbnkgcmVxdWVzdHMgYXJlIGN1cnJlbnRseSBwZW5kaW5nLiBBIHBlbmRpbmcKLy8gcmVxdWVzdCBtYXkgc3RpbGwgYmUgdW5hcHByb3ZhYmxlIOKAlCBzZWUgQXBwcm92YWxCbG9ja2VyLgpmdW5jIExpdmVSZXF1ZXN0cygpIGludDY0IHsgcmV0dXJuIGludDY0KHJlcXVlc3RzLlNpemUoKSkgfQoKLy8gVG90YWxQb29sZWQgcmV0dXJucyB0aGUgUCB0ZXJtOiB1bnNwZW50IG93bmVyIGZ1bmRzLiBQZW5kaW5nIHJlcXVlc3RzCi8vIGFyZSBOT1QgaW5jbHVkZWQ7IHRoZXkgYXJlIG5vdCBsaWFiaWxpdGllcy4KZnVuYyBUb3RhbFBvb2xlZCgpIGludDY0IHsgcmV0dXJuIHRvdGFsUG9vbGVkIH0KCi8vIFVuY2xhaW1lZENyZWRpdCByZXR1cm5zIHRoZSBjbGFpbWFudHMnIHNoYXJlIG9mIHRoZSBMIHRlcm06IGFwcHJvdmVkCi8vIGFuZCBub3QgeWV0IGNsYWltZWQuCmZ1bmMgVW5jbGFpbWVkQ3JlZGl0KCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLlVzZXJzVG90YWwoKSB9CgovLyBGZWVzQWNjcnVlZCByZXR1cm5zIHRoZSBmZWUgcG90OiBjaGFyZ2VkLCBub3QgeWV0IHdpdGhkcmF3bi4KZnVuYyBGZWVzQWNjcnVlZCgpIGludDY0IHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KCi8vIExpYWJpbGl0aWVzIHJldHVybnMgUCArIEwg4oCUIGV2ZXJ5dGhpbmcgdGhpcyByZWFsbSBvd2VzLiBBIHBlbmRpbmcKLy8gcmVxdWVzdCBpcyBub3QgcGFydCBvZiBpdC4KZnVuYyBMaWFiaWxpdGllcygpIGludDY0IHsgcmV0dXJuIHRvdGFsUG9vbGVkICsgbGVkZ2VyLkxpYWJpbGl0aWVzKCkgfQoKLy8gSGVsZCByZXR1cm5zIEg6IHRoZSB1Z25vdCBhY3R1YWxseSBhdCB0aGlzIHJlYWxtJ3MgYWRkcmVzcy4KZnVuYyBIZWxkKCkgaW50NjQgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gU3VycGx1cyByZXR1cm5zIEggLSAoUCArIEwpIOKAlCBvdXQtb2YtYmFuZCBjb2lucywgc3dlZXBhYmxlLgpmdW5jIFN1cnBsdXMoKSBpbnQ2NCB7IHJldHVybiBIZWxkKCkgLSBMaWFiaWxpdGllcygpIH0KCi8vIEFkZHJlc3MgcmV0dXJucyB0aGlzIHJlYWxtJ3Mgb3duIGFkZHJlc3MuCmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgeyByZXR1cm4gc2VsZiB9CgovLyBIZWlnaHQgcmV0dXJucyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQ6IHRoZSBjbG9jayBldmVyeSB3aW5kb3csCi8vIGV4cGlyeSBhbmQgVFRMIGlzIG1lYXN1cmVkIGFnYWluc3QsIGFuZCB0aGUgb25lIG5vIGNhbGxlciBjYW4gY2hvb3NlLgpmdW5jIEhlaWdodCgpIGludDY0IHsgcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB9CgovLyAtLS0gcmVuZGVyIC0tLQoKLy8gUmVuZGVyIHNob3dzIHRoZSByZWFsbSBhdCAiIiwgYSBkZXNrIHBhZ2UgYXQgImRlc2svPGlkPiIgYW5kIGEgcmVxdWVzdAovLyBwYWdlIGF0ICJyZXF1ZXN0LzxpZD4iLiBMYWJlbHMgYW5kIG1lbW9zIGFyZSBmcmVlIHRleHQgYW5kIHBhc3MgdGhyb3VnaAovLyB0aGUgZWNvc3lzdGVtIHNhbml0aXplciBiZWZvcmUgaGl0dGluZyBtYXJrZG93bi4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJJbmRleCgpCgljYXNlIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJkZXNrLyIpOgoJCXJldHVybiByZW5kZXJEZXNrKHBhdGhbbGVuKCJkZXNrLyIpOl0pCgljYXNlIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJyZXF1ZXN0LyIpOgoJCXJldHVybiByZW5kZXJSZXF1ZXN0KHBhdGhbbGVuKCJyZXF1ZXN0LyIpOl0pCgl9CglyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiB1bmtub3duIHBhdGguIFRyeSBgZGVzay88aWQ+YCBvciBgcmVxdWVzdC88aWQ+YC5cbiIKfQoKZnVuYyByZW5kZXJJbmRleCgpIHN0cmluZyB7Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgloZWxkIDo9IEhlbGQoKQoJbGlhYiA6PSBMaWFiaWxpdGllcygpCgljb25zZXJ2YXRpb24gOj0gIk9LIgoJaWYgaGVsZCA8IGxpYWIgewoJCWNvbnNlcnZhdGlvbiA9ICJWSU9MQVRFRCIKCX0KCglvdXQgOj0gIiMgUmVpbWJ1cnNlbWVudHNcblxuIgoJb3V0ICs9ICJDbGFpbWFudC1pbml0aWF0ZWQgZXhwZW5zZSByZWltYnVyc2VtZW50IGluIEdOT1QuIEFuIG93bmVyICIgKwoJCSJmdW5kcyBhIHBvb2wgYW5kIGFwcG9pbnRzIGFuIGFwcHJvdmVyIHdpdGggYSBib3VuZGVkLCAiICsKCQkicmF0ZS1saW1pdGVkLCByZXZvY2FibGUgYXV0aG9yaXR5IG92ZXIgaXQuICoqQW55b25lKiogbWF5IHN1Ym1pdCAiICsKCQkiYSByZXF1ZXN0IHdpdGggYW4gYW1vdW50IGFuZCBhIGRlc2NyaXB0aW9uOyB0aGUgYXBwcm92ZXIgZWl0aGVyICIgKwoJCSJhcHByb3ZlcyBpdCDigJQgd2hpY2ggc2V0dGxlcyB0aGUgbW9uZXkgaW50byB0aGUgY2xhaW1hbnQncyBjcmVkaXQgIiArCgkJImluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIOKAlCBvciByZWplY3RzIGl0LlxuXG4iCglvdXQgKz0gIj4gWyFJTVBPUlRBTlRdXG4+IEEgcGVuZGluZyByZXF1ZXN0IGlzICoqbm90KiogYSByZXNlcnZhdGlvbiAiICsKCQkiYW5kIG5vdCBhIGxpYWJpbGl0eS4gTm90aGluZyBtb3ZlcyB1bnRpbCBhbiBhcHByb3ZhbCwgYW5kIGFuICIgKwoJCSJhcHByb3ZhbCBpcyBhdG9taWMuIFJlYWQgYEFwcHJvdmFibGUoZGVza0lEKWAgZm9yIHdoYXQgYSBkZXNrIGNhbiAiICsKCQkiYWN0dWFsbHkgc2V0dGxlIHJpZ2h0IG5vdywgYW5kIGBBcHByb3ZhbEJsb2NrZXIocmVxSUQpYCBmb3Igd2h5IGEgIiArCgkJInNwZWNpZmljIHJlcXVlc3QgY2Fubm90IGJlLlxuXG4iCglvdXQgKz0gIiMjIFRlcm1zIChmaXhlZCBhdCBkZXBsb3k7IG5vIGFkbWluLCBubyBzZXR0ZXJzKVxuXG4iCglvdXQgKz0gIi0gYXBwcm92YWwgZmVlOiAiICsgYnBzKEFwcHJvdmFsRmVlQnBzKSArCgkJIiBvZiB0aGUgZ3Jvc3MgYXBwcm92ZWQgYW1vdW50LCBwYWlkIGZyb20gdGhlIG93bmVyJ3MgcG9vbCAoaGFyZCBjYXAgIiArCgkJYnBzKE1heEZlZUJwcykgKyAiKVxuIgoJb3V0ICs9ICItIG5vIGZlZSBvbiBmdW5kaW5nLCBvbiB3aXRoZHJhd2luZyBhbiB1bnNwZW50IHBvb2wsIG9yIG9uIGNsYWltaW5nXG4iCglvdXQgKz0gIi0gc2VsZi1hcHByb3ZhbCBpcyByZWZ1c2VkOiBhbiBhcHByb3ZlciBjYW5ub3QgYXBwcm92ZSB0aGVpciBvd24gcmVxdWVzdFxuIgoJb3V0ICs9ICItIG1pbmltdW0gZnVuZGluZzogIiArIGl0b2EoTWluRnVuZGluZykgKyBEZW5vbSArICIgcGVyIGNhbGxcbiIKCW91dCArPSAiLSBtaW5pbXVtIHJlcXVlc3Q6ICIgKyBpdG9hKE1pblJlcXVlc3RBbW91bnQpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gbWluaW11bSBwZXItd2luZG93IGFwcHJvdmFsIGNhcDogIiArIGl0b2EoTWluUGVyUGVyaW9kKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIHdpbmRvdyBsZW5ndGg6IDAgKG9uZSBsaWZldGltZSB3aW5kb3cpIG9yIGF0IGxlYXN0ICIgKwoJCWl0b2EoTWluUGVyaW9kQmxvY2tzKSArICIgYmxvY2tzXG4iCglvdXQgKz0gIi0gcmVxdWVzdCBleHBpcnk6ICIgKyBpdG9hKFJlcXVlc3RUVEwpICsKCQkiIGJsb2NrcyBhZnRlciBzdWJtaXNzaW9uLCB0aGVuIGFueW9uZSBtYXkgRXhwaXJlUmVxdWVzdCBpdFxuIgoJb3V0ICs9ICItIGxpdmUgZGVza3M6ICIgKyBpdG9hKExpdmVEZXNrcygpKSArICIgb2YgIiArCgkJc3RyY29udi5JdG9hKE1heExpdmVEZXNrcykgKyAiIChwZXIgb3duZXI6ICIgKyBpdG9hKE1heERlc2tzUGVyT3duZXIpICsgIilcbiIKCW91dCArPSAiLSBwZW5kaW5nIHJlcXVlc3RzOiAiICsgaXRvYShMaXZlUmVxdWVzdHMoKSkgKyAiIG9mICIgKwoJCXN0cmNvbnYuSXRvYShNYXhMaXZlUmVxdWVzdHMpICsgIiAocGVyIGNsYWltYW50OiAiICsKCQlpdG9hKE1heE9wZW5QZXJDbGFpbWFudCkgKyAiLCBwZXIgZGVzazogIiArIGl0b2EoTWF4T3BlblBlckRlc2spICsgIilcbiIKCW91dCArPSAiLSBjdXJyZW50IGhlaWdodDogIiArIGl0b2Eobm93KSArICJcblxuIgoJb3V0ICs9ICIjIyBBY2NvdW50aW5nIChIID09IFAgKyBMICsgUylcblxuIgoJb3V0ICs9ICItIHBvb2xlZCAoUCk6ICIgKyBpdG9hKHRvdGFsUG9vbGVkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIHVuY2xhaW1lZCBjbGFpbWFudCBjcmVkaXQ6ICIgKyBpdG9hKGxlZGdlci5Vc2Vyc1RvdGFsKCkpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gZmVlIHBvdDogIiArIGl0b2EobGVkZ2VyLkZlZXNBY2NydWVkKCkpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gaGVsZCAoSCk6ICIgKyBpdG9hKGhlbGQpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gc3VycGx1cyAoUyk6ICIgKyBpdG9hKGhlbGQtbGlhYikgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBjb25zZXJ2YXRpb246ICIgKyBjb25zZXJ2YXRpb24gKyAiXG4iCglvdXQgKz0gIi0gbGlmZXRpbWUgZnVuZGVkIC8gYXBwcm92ZWQgLyBjbGFpbWVkIC8gcmV0dXJuZWQ6ICIgKwoJCWl0b2EobGlmZXRpbWVGdW5kZWQpICsgIiAvICIgKyBpdG9hKGxpZmV0aW1lQXBwcm92ZWQpICsgIiAvICIgKwoJCWl0b2EobGlmZXRpbWVDbGFpbWVkKSArICIgLyAiICsgaXRvYShsaWZldGltZVJldHVybmVkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIHJlcXVlc3RzIHN1Ym1pdHRlZCAvIGFwcHJvdmVkIC8gcmVqZWN0ZWQgLyByZXRyYWN0ZWQgLyBleHBpcmVkOiAiICsKCQlpdG9hKGxpZmV0aW1lU3VibWl0dGVkKSArICIgLyAiICsgaXRvYShsaWZldGltZUFwcHJvdmFscykgKyAiIC8gIiArCgkJaXRvYShsaWZldGltZVJlamVjdGVkKSArICIgLyAiICsgaXRvYShsaWZldGltZVJldHJhY3RlZCkgKyAiIC8gIiArCgkJaXRvYShsaWZldGltZUV4cGlyZWQpICsgIlxuXG4iCgoJb3V0ICs9IHJlbmRlckRlc2tMaXN0KG5vdykKCW91dCArPSByZW5kZXJSZXF1ZXN0TGlzdChub3cpCglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyRGVza0xpc3Qobm93IGludDY0KSBzdHJpbmcgewoJb3V0IDo9ICIjIyBMaXZlIGRlc2tzXG5cbiIKCWlmIGRlc2tzLlNpemUoKSA9PSAwIHsKCQlyZXR1cm4gb3V0ICsgIk5vbmUgeWV0LiBGdW5kIGEgcG9vbCwgdGhlbiBPcGVuRGVzayBhbiBhcHByb3Zlci5cblxuIgoJfQoJc2hvd24gOj0gMAoJZXhwaXJlZCA6PSAwCglkZXNrcy5SZXZlcnNlSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlkIDo9IHYuKCpkZXNrKQoJCWEsIGFlcnIgOj0gYm9vay5HZXQoZC5hbGxvd0lEKQoJCXN0YXRlIDo9ICJsaXZlIgoJCWlmIGFlcnIgIT0gbmlsIHsKCQkJc3RhdGUgPSAibWlzc2luZyIKCQl9IGVsc2UgaWYgYS5Jc0V4cGlyZWQobm93KSB7CgkJCXN0YXRlID0gImV4cGlyZWQgKHJlYXBhYmxlKSIKCQkJZXhwaXJlZCsrCgkJfQoJCW91dCArPSAiLSBbZGVzayAjIiArIGl0b2EoZC5pZCkgKyAiXSgiICsgUmVhbG1QYXRoICsgIjpkZXNrLyIgKwoJCQlpdG9hKGQuaWQpICsgIikgWyIgKyBzdGF0ZSArICJdICIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KGxhYmVsT3IoZCkpICsgIiDigJQgYXBwcm92YWJsZSAiICsKCQkJaXRvYShBcHByb3ZhYmxlKGQuaWQpKSArIERlbm9tICsgIiwgIiArIGl0b2EoZGVza09wZW4oZC5pZCkpICsKCQkJIiBwZW5kaW5nXG4iCgkJc2hvd24rKwoJCXJldHVybiBzaG93biA+PSBNYXhSZW5kZXJSb3dzCgl9KQoJaWYgc2hvd24gPCBkZXNrcy5TaXplKCkgewoJCW91dCArPSAiXG4+IFshTk9URV1cbj4gU2hvd2luZyB0aGUgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKwoJCQkiIG1vc3QgcmVjZW50IG9mICIgKyBzdHJjb252Lkl0b2EoZGVza3MuU2l6ZSgpKSArCgkJCSIgbGl2ZSBkZXNrcyAoIiArIGl0b2EobmV4dERlc2tJRCkgKwoJCQkiIGV2ZXIgb3BlbmVkOyBjbG9zZWQgYW5kIHJlYXBlZCByZWNvcmRzIGFyZSByZW1vdmVkKS4gIiArCgkJCSJVc2UgRGVza0luZm8oaWQpIGZvciBhbnkgc3BlY2lmaWMgZGVzay5cbiIKCX0KCWlmIGV4cGlyZWQgPiAwIHsKCQlvdXQgKz0gIlxuPiBbIVRJUF1cbj4gQW55b25lIG1heSBSZWFwRGVzayhpZCkgYW4gZXhwaXJlZCBkZXNrIHRvICIgKwoJCQkiZnJlZSBpdHMgc2xvdCBhbmQgcmVjbGFpbSBpdHMgc3RvcmFnZSBkZXBvc2l0OiAiICsKCQkJc3RyY29udi5JdG9hKGV4cGlyZWQpICsgIiBvZiB0aGUgZGVza3MgYWJvdmUgYXJlIHJlYXBhYmxlLlxuIgoJfQoJcmV0dXJuIG91dCArICJcbiIKfQoKZnVuYyByZW5kZXJSZXF1ZXN0TGlzdChub3cgaW50NjQpIHN0cmluZyB7CglvdXQgOj0gIiMjIFBlbmRpbmcgcmVxdWVzdHNcblxuIgoJaWYgcmVxdWVzdHMuU2l6ZSgpID09IDAgewoJCXJldHVybiBvdXQgKyAiTm9uZSBwZW5kaW5nLlxuIgoJfQoJc2hvd24gOj0gMAoJc3RhbGUgOj0gMAoJcmVxdWVzdHMuUmV2ZXJzZUl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJciA6PSB2LigqcmVxdWVzdCkKCQlzdGF0ZSA6PSAiYXdhaXRpbmcgYXBwcm92YWwiCgkJaWYgbm93ID49IHIuZXhwaXJlc0F0IHsKCQkJc3RhdGUgPSAiZXhwaXJlZCAoY2xlYXJhYmxlKSIKCQkJc3RhbGUrKwoJCX0gZWxzZSBpZiBibG9ja2VyIDo9IEFwcHJvdmFsQmxvY2tlcihyLmlkKTsgYmxvY2tlciAhPSAiIiB7CgkJCXN0YXRlID0gImJsb2NrZWQiCgkJfQoJCW91dCArPSAiLSBbcmVxdWVzdCAjIiArIGl0b2Eoci5pZCkgKyAiXSgiICsgUmVhbG1QYXRoICsgIjpyZXF1ZXN0LyIgKwoJCQlpdG9hKHIuaWQpICsgIikgWyIgKyBzdGF0ZSArICJdICIgKyBpdG9hKHIuYW1vdW50KSArIERlbm9tICsKCQkJIiBhdCBkZXNrICMiICsgaXRvYShyLmRlc2tJRCkgKyAiIOKAlCAiICsKCQkJc2FuaXRpemUuSW5saW5lVGV4dChyLm1lbW8pICsgIlxuIgoJCXNob3duKysKCQlyZXR1cm4gc2hvd24gPj0gTWF4UmVuZGVyUm93cwoJfSkKCWlmIHNob3duIDwgcmVxdWVzdHMuU2l6ZSgpIHsKCQlvdXQgKz0gIlxuPiBbIU5PVEVdXG4+IFNob3dpbmcgdGhlICIgKyBzdHJjb252Lkl0b2Eoc2hvd24pICsKCQkJIiBtb3N0IHJlY2VudCBvZiAiICsgc3RyY29udi5JdG9hKHJlcXVlc3RzLlNpemUoKSkgKwoJCQkiIHBlbmRpbmcgcmVxdWVzdHMgKCIgKyBpdG9hKG5leHRSZXFJRCkgKwoJCQkiIGV2ZXIgZmlsZWQ7IHNldHRsZWQgYW5kIGNsZWFyZWQgcmVjb3JkcyBhcmUgcmVtb3ZlZCkuICIgKwoJCQkiVXNlIFJlcXVlc3RJbmZvKGlkKSBmb3IgYW55IHNwZWNpZmljIHJlcXVlc3QuXG4iCgl9CglpZiBzdGFsZSA+IDAgewoJCW91dCArPSAiXG4+IFshVElQXVxuPiBBbnlvbmUgbWF5IEV4cGlyZVJlcXVlc3QoaWQpIGEgcmVxdWVzdCBwYXN0ICIgKwoJCQkiaXRzIGV4cGlyeSB0byBmcmVlIGl0cyBzbG90IGFuZCByZWNsYWltIGl0cyBzdG9yYWdlIGRlcG9zaXQ6ICIgKwoJCQlzdHJjb252Lkl0b2Eoc3RhbGUpICsgIiBvZiB0aGUgcmVxdWVzdHMgYWJvdmUgYXJlIGNsZWFyYWJsZS5cbiIKCX0KCXJldHVybiBvdXQKfQoKZnVuYyByZW5kZXJEZXNrKGlkU3RyIHN0cmluZykgc3RyaW5nIHsKCWlkLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChpZFN0ciwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gaW52YWxpZCBkZXNrIGlkXG4iCgl9Cgl2IDo9IGRlc2tzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gdW5rbm93biBkZXNrIGlkIChuZXZlciBvcGVuZWQsIG9yIGNsb3NlZC9yZWFwZWQpXG4iCgl9CglkIDo9IHYuKCpkZXNrKQoJYSwgZ2VyciA6PSBib29rLkdldChkLmFsbG93SUQpCglpZiBnZXJyICE9IG5pbCB7CgkJLy8gVW5yZWFjaGFibGU6IGRyb3BEZXNrIHJlbW92ZXMgdGhlIHJlY29yZCBhbmQgdGhlIGFsbG93YW5jZQoJCS8vIHRvZ2V0aGVyLCBpbiBvbmUgY2FsbC4gUmVuZGVyZWQgcmF0aGVyIHRoYW4gcGFuaWNrZWQgc28gYQoJCS8vIGNvcnJ1cHRlZCBwYWlyIGlzIHZpc2libGUgaW5zdGVhZCBvZiBicmVha2luZyB0aGUgcGFnZS4KCQlyZXR1cm4gIj4gWyFDQVVUSU9OXVxuPiBkZXNrICMiICsgaXRvYShkLmlkKSArCgkJCSIgaGFzIG5vIGJhY2tpbmcgYWxsb3dhbmNlOyB0aGlzIGlzIGEgYnVnLiBSZWFzb246ICIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KGdlcnIuRXJyb3IoKSkgKyAiXG4iCgl9Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJb3V0IDo9ICIjIERlc2sgIyIgKyBpdG9hKGQuaWQpCglpZiBkLmxhYmVsICE9ICIiIHsKCQlvdXQgKz0gIjogIiArIHNhbml0aXplLklubGluZVRleHQoZC5sYWJlbCkKCX0KCW91dCArPSAiXG5cbiIKCW91dCArPSAiLSBvd25lciAoZnVuZHMgdGhlIHBvb2wpOiBgIiArIGQub3duZXIuU3RyaW5nKCkgKyAiYFxuIgoJb3V0ICs9ICItIGFwcHJvdmVyIChkZWNpZGVzKTogYCIgKyBkLmFwcHJvdmVyLlN0cmluZygpICsgImBcbiIKCW91dCArPSAiLSBwZXItd2luZG93IGFwcHJvdmFsIGNhcDogIiArIGl0b2EoYS5UZXJtcy5QZXJQZXJpb2QpICsgRGVub20gKyAiXG4iCglpZiBhLlRlcm1zLlBlcmlvZExlbmd0aCA9PSAwIHsKCQlvdXQgKz0gIi0gd2luZG93OiBvbmUgbGlmZXRpbWUgd2luZG93OyB0aGUgY2FwIG5ldmVyIHJlZmlsbHNcbiIKCX0gZWxzZSB7CgkJb3V0ICs9ICItIHdpbmRvdzogIiArIGl0b2EoYS5UZXJtcy5QZXJpb2RMZW5ndGgpICsKCQkJIiBibG9ja3MsIGFuY2hvcmVkIGF0ICIgKyBpdG9hKGEuQW5jaG9yKSArCgkJCSIgKG5vdyBpbiB3aW5kb3cgIiArIGl0b2Eod2luZG93QXQoYSwgbm93KSkgKyAiKVxuIgoJfQoJaWYgYS5UZXJtcy5Ub3RhbCA9PSAwIHsKCQlvdXQgKz0gIi0gbGlmZXRpbWUgY2FwOiBub25lXG4iCgl9IGVsc2UgewoJCW91dCArPSAiLSBsaWZldGltZSBjYXA6ICIgKyBpdG9hKGEuVGVybXMuVG90YWwpICsgRGVub20gKwoJCQkiICgiICsgaXRvYShhLlNwZW50VG90YWwpICsgIiB1c2VkKVxuIgoJfQoJaWYgYS5UZXJtcy5FeHBpcmVzQXQgPT0gMCB7CgkJb3V0ICs9ICItIGV4cGlyeTogbm9uZSAob25seSB0aGUgb3duZXIgY2FuIGNsb3NlIGl0KVxuIgoJfSBlbHNlIHsKCQlvdXQgKz0gIi0gZXhwaXJ5OiBibG9jayAiICsgaXRvYShhLlRlcm1zLkV4cGlyZXNBdCkgKyAiXG4iCgl9CglvdXQgKz0gIi0gYXBwcm92YWwgZmVlOiAiICsgYnBzKGQuZmVlQnBzKSArICIgKHNuYXBzaG90dGVkIGF0IGRlc2sgb3BlbilcbiIKCW91dCArPSAiLSBhcHByb3ZlZCB0aGlzIHdpbmRvdzogIiArIGl0b2Eoc3BlbnRJbldpbmRvdyhhLCBub3cpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGFwcHJvdmVkIGluIHRvdGFsOiAiICsgaXRvYShkLmFwcHJvdmVkKSArIERlbm9tICsgIiBvdmVyICIgKwoJCWl0b2EoZC5hcHByb3ZhbHMpICsgIiBhcHByb3ZhbHMgKCIgKyBpdG9hKGQucmVqZWN0aW9ucykgKyAiIHJlamVjdGVkKVxuIgoJb3V0ICs9ICItIHBlbmRpbmcgcmVxdWVzdHMgaGVyZTogIiArIGl0b2EoZGVza09wZW4oZC5pZCkpICsgIiBvZiAiICsKCQlpdG9hKE1heE9wZW5QZXJEZXNrKSArICJcbiIKCW91dCArPSAiLSBvcGVuZWQgYXQgYmxvY2s6ICIgKyBpdG9hKGQuY3JlYXRlZEF0KSArICJcbiIKCW91dCArPSAiLSBjdXJyZW50IGhlaWdodDogIiArIGl0b2Eobm93KSArICJcblxuIgoKCWF1dGhvcml6ZWQgOj0gYS5SZW1haW5pbmcobm93KQoJcG9vbCA6PSBwb29sT2YoZC5vd25lci5TdHJpbmcoKSkKCW91dCArPSAiIyMgV2hhdCBjYW4gYmUgYXBwcm92ZWQgcmlnaHQgbm93XG5cbiIKCW91dCArPSAiLSBhdXRob3JpemVkIGJ5IHRoZSB0ZXJtczogIiArIGl0b2EoYXV0aG9yaXplZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBvd25lcidzIHVuc3BlbnQgcG9vbDogIiArIGl0b2EocG9vbCkgKyBEZW5vbSArICJcbiIKCWFwcHJvdmFibGUgOj0gYXV0aG9yaXplZAoJaWYgcG9vbCA8IGFwcHJvdmFibGUgewoJCWFwcHJvdmFibGUgPSBwb29sCgl9CglvdXQgKz0gIi0gKiphcHByb3ZhYmxlOiAiICsgaXRvYShhcHByb3ZhYmxlKSArIERlbm9tICsKCQkiKiogKHRoZSBsZXNzZXIgb2YgdGhlIHR3bylcblxuIgoKCXN3aXRjaCB7CgljYXNlIGEuSXNFeHBpcmVkKG5vdyk6CgkJb3V0ICs9ICJUaGlzIGRlc2sgaGFzICoqZXhwaXJlZCoqLiBBbnlvbmUgbWF5IFJlYXBEZXNrKCIgKyBpdG9hKGQuaWQpICsKCQkJIikgdG8gZnJlZSBpdHMgc2xvdCBhbmQgcmVjbGFpbSBpdHMgc3RvcmFnZSBkZXBvc2l0LiBSZXF1ZXN0cyAiICsKCQkJImZpbGVkIGhlcmUgY2FuIG5vIGxvbmdlciBiZSBhcHByb3ZlZC5cbiIKCWNhc2UgYXBwcm92YWJsZSA9PSAwICYmIGF1dGhvcml6ZWQgPT0gMDoKCQlvdXQgKz0gIk5vdGhpbmcgYXV0aG9yaXplZCBhdCB0aGlzIGhlaWdodCDigJQgdGhlIHdpbmRvdyBjYXAgaXMgc3BlbnQsICIgKwoJCQkidGhlIGxpZmV0aW1lIGNhcCBpcyByZWFjaGVkLCBvciB0aGUgZGVzayBoYXMgbm90IHN0YXJ0ZWQuXG4iCgljYXNlIGFwcHJvdmFibGUgPT0gMDoKCQlvdXQgKz0gIkF1dGhvcml6ZWQgYnV0ICoqbm90IGZ1bmRlZCoqOiB0aGUgb3duZXIncyBwb29sIGNhbm5vdCBjb3ZlciAiICsKCQkJImFuIGFwcHJvdmFsLiBBIHBlbmRpbmcgcmVxdWVzdCBpcyBub3QgYSByZXNlcnZhdGlvbi5cbiIKCWRlZmF1bHQ6CgkJb3V0ICs9ICJBIGNsYWltYW50IG1heSBTdWJtaXQoIiArIGl0b2EoZC5pZCkgKwoJCQkiLCBhbW91bnQsIG1lbW8pIGhlcmUsIGFuZCB0aGUgYXBwcm92ZXIgbWF5IEFwcHJvdmUocmVxSUQpIHVwICIgKwoJCQkidG8gdGhlIGFwcHJvdmFibGUgZmlndXJlLiBUaGUgY2xhaW1hbnQgdGhlbiBDbGFpbSgpcy5cbiIKCX0KCWlmIGEuSGFzUGVuZGluZyB7CgkJb3V0ICs9ICJcbj4gWyFOT1RFXVxuPiBBICoqbG9vc2VyKiogYW1lbmRtZW50IGlzIHF1ZXVlZCBhbmQgdGFrZXMgIiArCgkJCSJlZmZlY3QgYXQgdGhlIG5leHQgd2luZG93IGJvdW5kYXJ5OiBwZXItd2luZG93IGNhcCAiICsKCQkJaXRvYShhLlBlbmRpbmcuUGVyUGVyaW9kKSArIERlbm9tICsgIiwgbGlmZXRpbWUgY2FwICIgKwoJCQlpdG9hKGEuUGVuZGluZy5Ub3RhbCkgKyAiLCBleHBpcnkgIiArIGl0b2EoYS5QZW5kaW5nLkV4cGlyZXNBdCkgKwoJCQkiICgwIG1lYW5zIG5vbmUpLiBVbnRpbCB0aGVuIHRoZSB0ZXJtcyBhYm92ZSBhcmUgd2hhdCBnb3Zlcm4uXG4iCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyUmVxdWVzdChpZFN0ciBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoaWRTdHIsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IGludmFsaWQgcmVxdWVzdCBpZFxuIgoJfQoJdiA6PSByZXF1ZXN0cy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IHVua25vd24gcmVxdWVzdCBpZCAobmV2ZXIgZmlsZWQsIG9yIGFscmVhZHkgIiArCgkJCSJhcHByb3ZlZC9yZWplY3RlZC9yZXRyYWN0ZWQvZXhwaXJlZClcbiIKCX0KCXIgOj0gdi4oKnJlcXVlc3QpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJb3V0IDo9ICIjIFJlcXVlc3QgIyIgKyBpdG9hKHIuaWQpICsgIlxuXG4iCglvdXQgKz0gIi0gY2xhaW1hbnQ6IGAiICsgci5jbGFpbWFudC5TdHJpbmcoKSArICJgXG4iCglvdXQgKz0gIi0gZGVzazogWyMiICsgaXRvYShyLmRlc2tJRCkgKyAiXSgiICsgUmVhbG1QYXRoICsgIjpkZXNrLyIgKwoJCWl0b2Eoci5kZXNrSUQpICsgIilcbiIKCW91dCArPSAiLSBhbW91bnQgcmVxdWVzdGVkIChncm9zcyk6ICIgKyBpdG9hKHIuYW1vdW50KSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGFwcHJvdmFsIGZlZSBpZiBzZXR0bGVkOiAiICsgYnBzKHIuZmVlQnBzKSArCgkJIiAoc25hcHNob3R0ZWQgYXQgc3VibWlzc2lvbilcbiIKCW91dCArPSAiLSBzdWJtaXR0ZWQgYXQgYmxvY2s6ICIgKyBpdG9hKHIuc3VibWl0dGVkQXQpICsgIlxuIgoJb3V0ICs9ICItIGV4cGlyZXMgYXQgYmxvY2s6ICIgKyBpdG9hKHIuZXhwaXJlc0F0KSArICJcbiIKCW91dCArPSAiLSBjdXJyZW50IGhlaWdodDogIiArIGl0b2Eobm93KSArICJcblxuIgoJb3V0ICs9ICIjIyBFeHBlbnNlXG5cbj4gIiArIHNhbml0aXplLklubGluZVRleHQoci5tZW1vKSArICJcblxuIgoJb3V0ICs9ICIjIyBTdGF0dXNcblxuIgoJaWYgYmxvY2tlciA6PSBBcHByb3ZhbEJsb2NrZXIoci5pZCk7IGJsb2NrZXIgIT0gIiIgewoJCW91dCArPSAiPiBbIVdBUk5JTkddXG4+ICoqTm90IGFwcHJvdmFibGU6KiogIiArIGJsb2NrZXIgKyAiXG4iCgl9IGVsc2UgewoJCW91dCArPSAiPiBbIU5PVEVdXG4+ICoqQXBwcm92YWJsZSBub3cuKiogVGhlIGRlc2sncyBhcHByb3ZlciBtYXkgIiArCgkJCSJBcHByb3ZlKCIgKyBpdG9hKHIuaWQpICsgIiksIHdoaWNoIGNyZWRpdHMgdGhlIGNsYWltYW50IGluIHRoZSAiICsKCQkJInNhbWUgdHJhbnNhY3Rpb247IHRoZSBjbGFpbWFudCB0aGVuIENsYWltKClzLlxuIgoJfQoJb3V0ICs9ICJcblRoZSBjbGFpbWFudCBtYXkgUmV0cmFjdCgiICsgaXRvYShyLmlkKSArCgkJIikgYXQgYW55IHRpbWUgd2hpbGUgaXQgaXMgcGVuZGluZy4gTm90aGluZyBoYXMgbW92ZWQgeWV0OiBhICIgKwoJCSJwZW5kaW5nIHJlcXVlc3QgaXMgbm90IGEgcmVzZXJ2YXRpb24uXG4iCglyZXR1cm4gb3V0Cn0KCi8vIC0tLSBpbnRlcm5hbHMgLS0tCgpmdW5jIG11c3REZXNrKGlkIGludDY0KSAqZGVzayB7Cgl2IDo9IGRlc2tzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gZGVzayBpZCIpCgl9CglyZXR1cm4gdi4oKmRlc2spCn0KCmZ1bmMgbXVzdFJlcXVlc3QoaWQgaW50NjQpICpyZXF1ZXN0IHsKCXYgOj0gcmVxdWVzdHMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biByZXF1ZXN0IGlkIikKCX0KCXJldHVybiB2LigqcmVxdWVzdCkKfQoKLy8gbXVzdEFsbG93YW5jZSBmZXRjaGVzIHRoZSBzcGVuZGJvb2sgYWxsb3dhbmNlIGJlaGluZCBhIGRlc2suIFRoZSBwYWlyCi8vIGlzIGNyZWF0ZWQgYW5kIHJlbW92ZWQgdG9nZXRoZXIsIHNvIGEgbWlzc2luZyBhbGxvd2FuY2UgaXMgYSBidWcgaW4KLy8gdGhpcyByZWFsbSByYXRoZXIgdGhhbiBhIHVzZXIgZXJyb3IsIGFuZCBpdCBwYW5pY3MgcmF0aGVyIHRoYW4KLy8gcmVwb3J0aW5nIGEgemVybyB2YWx1ZSB0aGF0IGEgcmVhZGVyIHdvdWxkIHRha2UgZm9yICJubyBhdXRob3JpdHkiLgpmdW5jIG11c3RBbGxvd2FuY2UoZCAqZGVzaykgc3BlbmRib29rLkFsbG93YW5jZSB7CglhLCBlcnIgOj0gYm9vay5HZXQoZC5hbGxvd0lEKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGEKfQoKLy8gd2luZG93QXQgcmV0dXJucyB0aGUgYW5jaG9yZWQgd2luZG93IGluZGV4IGNvbnRhaW5pbmcgbm93LCBhbmQKLy8gc3BlbnRJbldpbmRvdyB3aGF0IHRoYXQgd2luZG93IGhhcyBhcHByb3ZlZC4KLy8KLy8gVGhlc2UgZHVwbGljYXRlIGEgbGluZSBvZiBzcGVuZGJvb2ssIGFuZCB0aGUgZHVwbGljYXRpb24gaXMgZGVsaWJlcmF0ZSwKLy8gYm91bmRlZCwgYW5kIHdvcnRoIGp1c3RpZnlpbmcgYmVjYXVzZSB0aGUgcHJpbWl0aXZlJ3Mgb3duIGF0KCkgY29tbWVudAovLyB3YXJucyBhZ2FpbnN0IGV4YWN0bHkgdGhpcy4gV2hhdCBpcyBOT1QgcmVpbXBsZW1lbnRlZCBpcyB0aGUgcGFydCB0aGF0Ci8vIHdhcm5pbmcgaXMgYWJvdXQ6IHdoaWNoIHRlcm1zIGFyZSBpbiBmb3JjZSBhZnRlciBhIGJvdW5kYXJ5LCBhbmQKLy8gdGhlcmVmb3JlIGV2ZXJ5IGF1dGhvcml0eSBmaWd1cmUgdGhpcyByZWFsbSByZXBvcnRzIOKAlCBSZW1haW5pbmcgYW5kCi8vIEFwcHJvdmFibGUgYm90aCBjYWxsIHRocm91Z2ggdG8gdGhlIHByaW1pdGl2ZSwgYW5kIG5vdGhpbmcgaGVyZQovLyBzZWNvbmQtZ3Vlc3NlcyB0aGVtLgovLwovLyBXaGF0IGlzIGNvcGllZCBpcyBwdXJlIGluZGV4IGFyaXRobWV0aWMgb3ZlciB0aHJlZSBFWFBPUlRFRCBmaWVsZHMgcGx1cwovLyB0aGUgYWxyZWFkeS1kb2N1bWVudGVkIGZhY3QgdGhhdCB0aGUgaW4td2luZG93IHNwZW5kIFJFU0VUUyByYXRoZXIgdGhhbgovLyBjYXJyaWVzLiBUaGUgYWx0ZXJuYXRpdmUgaXMgd29yc2UgdGhhbiB0aGUgZHVwbGljYXRpb246IEFsbG93YW5jZSdzCi8vIFdpbmRvd0luZGV4IGFuZCBTcGVudFdpbmRvdyBhcmUgdGhlIGxhc3QtV1JJVFRFTiBwYWlyLCBzbyBiZXR3ZWVuIGEKLy8gYm91bmRhcnkgYW5kIHRoZSBuZXh0IGFwcHJvdmFsIHRoZXkgZGVzY3JpYmUgYSB3aW5kb3cgdGhlIGNoYWluIGhhcwovLyBsZWZ0LCBhbmQgYSBSZW5kZXIgcHVibGlzaGluZyB0aGVtIHdvdWxkIHByaW50ICJhcHByb3ZlZCB0aGlzIHdpbmRvdzoKLy8gMTAwMDAwIiBpbW1lZGlhdGVseSBhYm92ZSAiYXV0aG9yaXplZCBieSB0aGUgdGVybXM6IDEwMDAwMCIuCi8vCi8vIFRoZSB0d28gYXJlIHBpbm5lZCB0byB0aGUgcHJpbWl0aXZlIGJ5Ci8vIFRlc3RXaW5kb3dSZWZpbGxzQXRBbmNob3JlZEJvdW5kYXJ5IHJhdGhlciB0aGFuIGJ5IGluc3BlY3Rpb246IGl0Ci8vIGFwcHJvdmVzIGFmdGVyIGNyb3NzaW5nIGEgYm91bmRhcnkgYW5kIGFzc2VydHMgYXBwcm92ZWRXaW5kb3cgZXF1YWxzCi8vIHRoYXQgYXBwcm92YWwsIHdoaWNoIGNhbiBvbmx5IGhvbGQgaWYgd2luZG93QXQgYWdyZWVkIHdpdGggc3BlbmRib29rJ3MKLy8gb3duIGluZGV4IGF0IHRoZSBtb21lbnQgb2YgdGhlIHdyaXRlLgpmdW5jIHdpbmRvd0F0KGEgc3BlbmRib29rLkFsbG93YW5jZSwgbm93IGludDY0KSBpbnQ2NCB7CglpZiBhLlRlcm1zLlBlcmlvZExlbmd0aCA9PSAwIHx8IG5vdyA8IGEuQW5jaG9yIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIChub3cgLSBhLkFuY2hvcikgLyBhLlRlcm1zLlBlcmlvZExlbmd0aAp9CgpmdW5jIHNwZW50SW5XaW5kb3coYSBzcGVuZGJvb2suQWxsb3dhbmNlLCBub3cgaW50NjQpIGludDY0IHsKCWlmIHdpbmRvd0F0KGEsIG5vdykgIT0gYS5XaW5kb3dJbmRleCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBhLlNwZW50V2luZG93Cn0KCi8vIGRyb3BEZXNrIHJlbW92ZXMgYSBkZXNrIHJlY29yZCBhbmQgZGVjcmVtZW50cyBpdHMgb3duZXIncyBsaXZlIGNvdW50LgovLyBUaGUgYWxsb3dhbmNlIGl0c2VsZiBpcyByZW1vdmVkIGJ5IHRoZSBzcGVuZGJvb2sgY2FsbCB0aGF0IHByZWNlZGVzCi8vIGV2ZXJ5IGNhbGxlciBvZiB0aGlzIGhlbHBlci4KLy8KLy8gSXQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHJlbW92ZSB0aGUgZGVzaydzIHBlbmRpbmcgcmVxdWVzdHMg4oCUIHNlZSB0aGUKLy8gcGFja2FnZSBkb2MsICJhIGNsb3NlZCBkZXNrIGxlYXZlcyBpdHMgcmVxdWVzdHMgdW4tYXBwcm92YWJsZSIuIEl0cwovLyBvcGVuQnlEZXNrIGNvdW50ZXIgSVMgcmVtb3ZlZCwgYmVjYXVzZSB0aGUgY291bnRlciBleGlzdHMgdG8gYm91bmQgbmV3Ci8vIHN1Ym1pc3Npb25zIGF0IGEgbGl2ZSBkZXNrIGFuZCBhIGRlYWQgZGVzayBhY2NlcHRzIG5vbmU7IHRoZSBzdHJhbmRlZAovLyByZXF1ZXN0cyByZW1haW4gZmluZGFibGUgYnkgaWQgYW5kIGFyZSBzdGlsbCBjb3VudGVkIGFnYWluc3QgdGhlaXIKLy8gY2xhaW1hbnRzJyBvcGVuQnlDbGFpbWFudCwgd2hpY2ggaXMgd2hhdCBib3VuZHMgdGhlbS4KZnVuYyBkcm9wRGVzayhkICpkZXNrKSB7CglkZXNrcy5SZW1vdmUocGFkSUQoZC5pZCkpCglvcGVuQnlEZXNrLlJlbW92ZShwYWRJRChkLmlkKSkKCWRlY093bmVyRGVza3MoZC5vd25lci5TdHJpbmcoKSkKfQoKLy8gZHJvcFJlcXVlc3QgcmVtb3ZlcyBhIHJlcXVlc3QgcmVjb3JkIGFuZCBkZWNyZW1lbnRzIGJvdGggb2YgaXRzCi8vIGNvdW50ZXJzLiBFdmVyeSBjYWxsZXIgaGFzIGFscmVhZHkgZGVjaWRlZCB0aGUgcmVxdWVzdCdzIG91dGNvbWU7Ci8vIHRoaXMgaXMgb25seSB0aGUgYm9va2tlZXBpbmcuCmZ1bmMgZHJvcFJlcXVlc3QociAqcmVxdWVzdCkgewoJcmVxdWVzdHMuUmVtb3ZlKHBhZElEKHIuaWQpKQoJZGVjQ2xhaW1hbnRPcGVuKHIuY2xhaW1hbnQuU3RyaW5nKCkpCgkvLyBBIHJlcXVlc3QgYXQgYSBkZXNrIGNsb3NlZCBzaW5jZSBzdWJtaXNzaW9uIGhhcyBubyBvcGVuQnlEZXNrIGVudHJ5CgkvLyB0byBkZWNyZW1lbnQgKGRyb3BEZXNrIHJlbW92ZWQgaXQpOyBzZXREZXNrT3BlbiBmbG9vcnMgYXQgemVybyBhbmQKCS8vIHJlbW92ZXMgcmF0aGVyIHRoYW4gc3RvcmluZyBhIG5lZ2F0aXZlLCBzbyB0aGlzIGlzIHNhZmUgcmF0aGVyIHRoYW4KCS8vIG1lcmVseSBoYXJtbGVzcy4KCXNldERlc2tPcGVuKHIuZGVza0lELCBkZXNrT3BlbihyLmRlc2tJRCktMSkKfQoKZnVuYyBsYWJlbE9yKGQgKmRlc2spIHN0cmluZyB7CglpZiBkLmxhYmVsID09ICIiIHsKCQlyZXR1cm4gIihubyBsYWJlbCkiCgl9CglyZXR1cm4gZC5sYWJlbAp9CgpmdW5jIHBvb2xPZihrZXkgc3RyaW5nKSBpbnQ2NCB7Cgl2IDo9IHBvb2xzLkdldChrZXkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2LihpbnQ2NCkKfQoKZnVuYyBzZXRQb29sKGtleSBzdHJpbmcsIG4gaW50NjQpIHsKCWlmIG4gPD0gMCB7CgkJcG9vbHMuUmVtb3ZlKGtleSkKCQlyZXR1cm4KCX0KCXBvb2xzLlNldChrZXksIG4pCn0KCmZ1bmMgb3duZXJEZXNrcyhrZXkgc3RyaW5nKSBpbnQ2NCB7Cgl2IDo9IGRlc2tzQnlPd25lci5HZXQoa2V5KQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdi4oaW50NjQpCn0KCmZ1bmMgc2V0T3duZXJEZXNrcyhrZXkgc3RyaW5nLCBuIGludDY0KSB7CglpZiBuIDw9IDAgewoJCWRlc2tzQnlPd25lci5SZW1vdmUoa2V5KQoJCXJldHVybgoJfQoJZGVza3NCeU93bmVyLlNldChrZXksIG4pCn0KCmZ1bmMgZGVjT3duZXJEZXNrcyhrZXkgc3RyaW5nKSB7IHNldE93bmVyRGVza3Moa2V5LCBvd25lckRlc2tzKGtleSktMSkgfQoKZnVuYyBjbGFpbWFudE9wZW4oa2V5IHN0cmluZykgaW50NjQgewoJdiA6PSBvcGVuQnlDbGFpbWFudC5HZXQoa2V5KQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdi4oaW50NjQpCn0KCmZ1bmMgc2V0Q2xhaW1hbnRPcGVuKGtleSBzdHJpbmcsIG4gaW50NjQpIHsKCWlmIG4gPD0gMCB7CgkJb3BlbkJ5Q2xhaW1hbnQuUmVtb3ZlKGtleSkKCQlyZXR1cm4KCX0KCW9wZW5CeUNsYWltYW50LlNldChrZXksIG4pCn0KCmZ1bmMgZGVjQ2xhaW1hbnRPcGVuKGtleSBzdHJpbmcpIHsgc2V0Q2xhaW1hbnRPcGVuKGtleSwgY2xhaW1hbnRPcGVuKGtleSktMSkgfQoKZnVuYyBkZXNrT3BlbihkZXNrSUQgaW50NjQpIGludDY0IHsKCXYgOj0gb3BlbkJ5RGVzay5HZXQocGFkSUQoZGVza0lEKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHYuKGludDY0KQp9CgpmdW5jIHNldERlc2tPcGVuKGRlc2tJRCBpbnQ2NCwgbiBpbnQ2NCkgewoJaWYgbiA8PSAwIHsKCQlvcGVuQnlEZXNrLlJlbW92ZShwYWRJRChkZXNrSUQpKQoJCXJldHVybgoJfQoJb3BlbkJ5RGVzay5TZXQocGFkSUQoZGVza0lEKSwgbikKfQoKZnVuYyBpdG9hKG4gaW50NjQpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdEludChuLCAxMCkgfQoKZnVuYyBib29sc3RyKGIgYm9vbCkgc3RyaW5nIHsKCWlmIGIgewoJCXJldHVybiAidHJ1ZSIKCX0KCXJldHVybiAiZmFsc2UiCn0KCi8vIGJwcyByZW5kZXJzIGEgYmFzaXMtcG9pbnQgZmlndXJlIGFzIGEgaHVtYW4gcGVyY2VudGFnZSwgZXhhY3RseS4KZnVuYyBicHMobiBpbnQ2NCkgc3RyaW5nIHsKCXdob2xlIDo9IG4gLyAxMDAKCWZyYWMgOj0gbiAlIDEwMAoJaWYgZnJhYyA9PSAwIHsKCQlyZXR1cm4gaXRvYSh3aG9sZSkgKyAiJSIKCX0KCWlmIGZyYWMlMTAgPT0gMCB7CgkJcmV0dXJuIGl0b2Eod2hvbGUpICsgIi4iICsgaXRvYShmcmFjLzEwKSArICIlIgoJfQoJcGFkIDo9ICIiCglpZiBmcmFjIDwgMTAgewoJCXBhZCA9ICIwIgoJfQoJcmV0dXJuIGl0b2Eod2hvbGUpICsgIi4iICsgcGFkICsgaXRvYShmcmFjKSArICIlIgp9CgovLyBwYWRJRCBlbmNvZGVzIGFuIGlkIHNvIGF2bCdzIGxleGljYWwgb3JkZXIgbWF0Y2hlcyBudW1lcmljIG9yZGVyLgpmdW5jIHBhZElEKGlkIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChpZCwgMTApCgljb25zdCB3aWR0aCA9IDIwCglpZiBsZW4ocykgPj0gd2lkdGggewoJCXJldHVybiBzCgl9CglyZXR1cm4gemVyb3NbOndpZHRoLWxlbihzKV0gKyBzCn0KCmNvbnN0IHplcm9zID0gIjAwMDAwMDAwMDAwMDAwMDAwMDAwIgoKLy8gY2hlY2tlZEFkZCByZXR1cm5zIGErYiBhbmQgcmVwb3J0cyB3aGV0aGVyIHRoZSBhZGRpdGlvbiBkaWQgbm90Ci8vIG92ZXJmbG93IGludDY0LgpmdW5jIGNoZWNrZWRBZGQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglzdW0gOj0gYSArIGIKCWlmIChiID4gMCAmJiBzdW0gPCBhKSB8fCAoYiA8IDAgJiYgc3VtID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHN1bSwgdHJ1ZQp9CiINNTAwMDAwMDB1Z25vdBITCJTN94QBEgsyNzg3ODR1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAwHjVLkIrGWl35yTh1t9MWJk8YU1bxKPkB7kMxuXsSzo7H2PFBSyB1OE4rIM7bom4Ved+ueHDe2QKHtSEG4d4GxooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}