{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "yvHFowGrWcNK4xvmCApY7YX1g1KMUSLurON6dzD9Hi8=",
    "height": "484253",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "44203783",
      "GasUsed": "29469179"
    },
    "tx": "CuymAQoML3ZtLm1fYWRkcGtnEtqmAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKdpgEKBWxvYW5zEjlnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvbG9hbnMaYAoLZ25vbW9kLnRvbWwSUW1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvbG9hbnMiCmdubyA9ICIwLjkiChr1pAEKCWxvYW5zLmdubxLmpAEvLyBSZWFsbSBsb2FucyBpcyBhbiB1bnNlY3VyZWQgdGVybSBsb2FuIHdpdGggYSBmaXhlZCBpbnN0YWxsbWVudCBzY2hlZHVsZSBhbmQKLy8gYSBmbGF0IGZpbmFuY2UgY2hhcmdlLCBob2xkaW5nIHJlYWwgdWdub3QuIEEgTEVOREVSIG9wZW5zIGEgbG9hbiB0byBhIG5hbWVkCi8vIEJPUlJPV0VSIGJ5IGF0dGFjaGluZyB0aGUgcHJpbmNpcGFsLCB3aGljaCB0aGUgcmVhbG0gZGlzYnVyc2VzIHRvIHRoZQovLyBib3Jyb3dlciBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbjsgdGhlIGJvcnJvd2VyIFJFUEFZUyBvdmVyIGEgZml4ZWQgbnVtYmVyIG9mCi8vIGluc3RhbGxtZW50czsgZWFjaCByZXBheW1lbnQgY3JlZGl0cyB0aGUgbGVuZGVyJ3MgcHVsbC1jbGFpbWFibGUgYmFsYW5jZSwKLy8gdGhlIHByb3RvY29sIGZlZSBzcGxpdHRpbmcgb2ZmIGF0IHRoZSBsZWRnZXIuIEEgbG9hbiB3aG9zZSBpbnN0YWxsbWVudHMgZ28KLy8gdW5wYWlkIHBhc3QgYSBncmFjZSB3aW5kb3cgaXMgcGVybWlzc2lvbmxlc3NseSBERUZBVUxULWFibGUg4oCUIGEgcmVjb3JkZWQKLy8gc3RhdGUsIG5vdCBhIHNlaXp1cmUsIGJlY2F1c2UgdjEgaXMgdW5zZWN1cmVkLgovLwovLyBJdCBpcyB0aGUgb25lIGZpbmFuY2lhbCBwcmltaXRpdmUgdGhpcyBwb3J0Zm9saW8gbmV2ZXIgaGFkOiBDUkVESVQuIFRoZQovLyBhY2NvdW50aW5nIHJlYWxtcyBSRUNPUkQgb2JsaWdhdGlvbnMgKHIvaW52b2ljZXMsIHIvcmVjZWl2YWJsZXMg4oCUIHAvYWdpbmcncwovLyBvd24gZG9jIGxpc3RzICJpbnZvaWNlcywgbG9hbnMsIGR1ZXMiKSBhbmQgdGhlIGRpc2J1cnNlbWVudCByZWFsbXMgcGF5IGEKLy8gS05PV04gVE9UQUwgb3V0IG9uIGEgc2NoZWR1bGUgKHIvdmVzdGluZywgci9wYXlyb2xsLCByL2J1ZGdldHMpLiBBIGxvYW4gaXMKLy8gdGhlIGFzeW1tZXRyaWMgb3Bwb3NpdGU6IHByaW5jaXBhbCBPVVQgb25jZSwgYSBMQVJHRVIgdG90YWwgYmFjayBvdmVyIHRpbWUsCi8vIHBsdXMgdGhlIGZpbmFuY2UgY2hhcmdlIGFuZCB0aGUgZGVmYXVsdCBzdGF0ZSBhIGRpc2J1cnNlbWVudCByZWFsbSBoYXMgbm8KLy8gdXNlIGZvci4gU2VlIFtvbnl4L3IvbG9hbnMvRElTQ09WRVJZLm1kXS4KLy8KLy8gIyBDdXN0b2R5IOKAlCB0aGUgY29uc2VydmF0aW9uIGludmFyaWFudCBpcyB0aGUgcHJvZHVjdAovLwovLyBUaGlzIGlzIHRoZSBmaXJzdCBjdXN0b2RpYWwgcmVhbG0gdGhlIGZhY3RvcnkgaGFzIHNlbGVjdGVkIHNpbmNlIHRoZQovLyBwdWJsaXNoZXJzIChyL2xhdGVmZWVzLCByL2Nhc2hmbG93KSwgc28gdGhlIG1vbmV0YXJ5IGludmFyaWFudCBnb3Zlcm5zIGl0Ci8vIGV4YWN0bHkgYXMgaXQgZG9lcyByL3N1YnNjcmlwdGlvbnMgYW5kIHIvbWV0ZXJzOgovLwovLwlIZWxkID09IM6jIGxlbmRlci1jbGFpbWFibGUgKyBmZWUgcG90ICAgKD09IGZlZWxlZGdlci5MaWFiaWxpdGllcygpKQovLwovLyBUaGUgcHJpbmNpcGFsIGlzIE5FVkVSIGhlbGQgYWNyb3NzIGEgdHJhbnNhY3Rpb246IFtPcGVuXSByZWNlaXZlcyBpdCBhbmQKLy8gcGF5cyBpdCBvdXQgdG8gdGhlIGJvcnJvd2VyIGluIHRoZSBzYW1lIGNhbGwsIHNvIHRoZSBvbmx5IGNvaW5zIHRoaXMgcmVhbG0KLy8gZXZlciBob2xkcyBhcmUgcmVwYXltZW50cyBhd2FpdGluZyB0aGUgbGVuZGVyJ3MgW0NsYWltXS4gQSBzdHVjayBvcgovLyBhYmFuZG9uZWQgbG9hbiB0aGVyZWZvcmUgc3RyYW5kcyBubyBwcmluY2lwYWwg4oCUIGl0IHdhcyBkaXNidXJzZWQg4oCUIGFuZCB0aGUKLy8gb25seSB2YWx1ZSBhdCByaXNrIGlzIHRoZSBsZW5kZXIncyBleHBlY3RlZCByZXR1cm4sIHdoaWNoIGlzIHRoZSByZWFsIG5hdHVyZQovLyBvZiB1bnNlY3VyZWQgY3JlZGl0IGFuZCBpcyBkaXNjbG9zZWQsIG5vdCBlbmdpbmVlcmVkIGF3YXkuCi8vCi8vICMgVGhlIGZpbmFuY2UgY2hhcmdlIGlzIEZMQVQgaW4gdjEsIGFuZCB0aGF0IGlzIGEgc2NvcGUgZGVjaXNpb24KLy8KLy8gVGhlIHRvdGFsIHJlcGF5YWJsZSBpcyBgcHJpbmNpcGFsICsgZmxvb3IocHJpbmNpcGFsIMOXIHJhdGVCcHMgLyAxMDAwMClgIOKAlCBhCi8vIGZsYXQgY2hhcmdlIG92ZXIgdGhlIHdob2xlIHRlcm0sIE5PVCBjb21wb3VuZGluZyBhbmQgTk9UIGFjY3J1aW5nIHBlciBibG9jay4KLy8gUGVyLWluc3RhbGxtZW50IGlzIGBjZWlsKHRvdGFsIC8gaW5zdGFsbG1lbnRzKWAgd2l0aCB0aGUgcm91bmRpbmcgcmVtYWluZGVyCi8vIG9uIHRoZSBGSU5BTCBpbnN0YWxsbWVudCwgc28gdGhlIGluc3RhbGxtZW50cyBzdW0gdG8gZXhhY3RseSB0aGUgdG90YWwgKHRoZQovLyBjcm9zcy1mb290KS4gQ29tcG91bmRpbmcgaW50ZXJlc3QgYW5kIGEgdGllcmVkLWJ5LWR1cmF0aW9uIHJhdGUgKHdoaWNoCi8vIHAvdGllcnMgY291bGQgcHJpY2UpIGFyZSBhIHYyOiBwcmljaW5nIHRoZW0gaW4gdjEgd291bGQgYWRkIGFuIGFjY3J1YWwKLy8gc3VyZmFjZSB3aG9zZSBidWdzIGFyZSB0aGUgb25lcyBsZW5kaW5nIGF1ZGl0cyBtb3N0IG9mdGVuIGZpbmQuCi8vCi8vICMgRGVmYXVsdCBpcyBhIHN0YXRlLCBub3QgYSBzZWl6dXJlIOKAlCB0aGVyZSBpcyBubyBjb2xsYXRlcmFsIGluIHYxCi8vCi8vIEEgYm9ycm93ZXIgcGFzdCB0aGUgZ3JhY2Ugd2luZG93IHdobyBoYXMgbm90IHJlcGFpZCBpbiBmdWxsIGlzIERlZmF1bHQtYWJsZQovLyBieSBhbnlvbmUgKGxpa2UgdGhlIHNpYmxpbmcgcmVhbG1zJyB2YWx2ZXMpLiBJdCBmcmVlemVzIHRoZSBsb2FuIGFuZCByZWNvcmRzCi8vIHRoZSBzaG9ydGZhbGw7IG5vIGNvaW5zIG1vdmUsIGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyB0byBzZWl6ZS4gU2VjdXJlZAovLyBsZW5kaW5nIGlzIGEgdjIuCi8vCi8vIFJFQUxNLUNBTExFUiBDQVZFQVQsIGluaGVyaXRlZCBmcm9tIHRoZSBzaWJsaW5nczogY29pbmlvJ3MgcmVjZWlwdCBndWFyZAovLyBhZG1pdHMgb25seSBFT0EgcGF5ZXJzLCBzbyB0aGUgTEVOREVSICh3aG8gZnVuZHMgT3BlbikgYW5kIGFueSBSRVBBWUVSICh3aG8KLy8gZnVuZHMgUmVwYXkpIGFyZSBFT0FzLiBUaGUgQk9SUk9XRVIgaXMgYSBwYXJhbWV0ZXIg4oCUIGNvaW5pby5QYXlvdXQgZGVsaXZlcnMKLy8gdGhlIHByaW5jaXBhbCB0byBhbnkgdmFsaWQgYWRkcmVzcywgaW5jbHVkaW5nIGEgcmVhbG0g4oCUIGJ1dCBhIHJlYWxtIGJvcnJvd2VyCi8vIGNvdWxkIG5ldmVyIFJlcGF5IChSZXBheSBpcyBwYXlhYmxlLCBFT0Etb25seSksIHNvIG5hbWluZyBvbmUgaXMgdGhlCi8vIGxlbmRlcidzIG93biBmb290Z3VuIChhbiB1bi1yZXBheWFibGUgZ2lmdCksIG5vdCBhIHJlYWxtIG9yIHRoaXJkLXBhcnR5Ci8vIGhhemFyZC4gYXNzZXJ0Tm9TZW5kIHJlYWRzIHRoZSBPUklHSU4gZW52ZWxvcGUsIHNvIGV2ZXJ5IG5vbi1wYXlhYmxlCi8vIGZ1bmN0aW9uIHJlZnVzZXMgYW55IHRyYW5zYWN0aW9uIHRoYXQgYXR0YWNoZWQgY29pbnMgYW55d2hlcmUuCnBhY2thZ2UgbG9hbnMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY29pbmlvIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBwcm90b2NvbC1mZWUgY2FwOiAxMDAwIGJwcyA9IDEwJS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoMTAwMCkKCi8vIExvYW4gc3RhdHVzIHZhbHVlcy4gUmVwYWlkIGFuZCBEZWZhdWx0ZWQgYXJlIHRlcm1pbmFsLgpjb25zdCAoCglMb2FuQWN0aXZlICAgID0gImFjdGl2ZSIKCUxvYW5SZXBhaWQgICAgPSAicmVwYWlkIgoJTG9hbkRlZmF1bHRlZCA9ICJkZWZhdWx0ZWQiCikKCi8vIElucHV0IGJvdW5kcy4KY29uc3QgKAoJLy8gTWluUHJpbmNpcGFsIGtlZXBzIGEgbG9hbiBmcm9tIGJlaW5nIGR1c3Q7IE1heFByaW5jaXBhbCBrZWVwcwoJLy8gcHJpbmNpcGFsIMOXIHJhdGVCcHMgYW5kIHRoZSB0b3RhbCBmYXIgZnJvbSBpbnQ2NCBvdmVyZmxvdyAodGhlCgkvLyBjaGVja2VkIGFyaXRobWV0aWMgc3RpbGwgZ3VhcmRzIGl0KS4gVGhlIGxlbmRlciBtdXN0IEFUVEFDSCB0aGUKCS8vIHByaW5jaXBhbCwgc28gdGhlIHJlYWwgY2VpbGluZyBpcyB0aGVpciBiYWxhbmNlLgoJTWluUHJpbmNpcGFsID0gaW50NjQoMV8wMDApCglNYXhQcmluY2lwYWwgPSBpbnQ2NCgxXzAwMF8wMDBfMDAwXzAwMCkgLy8gMSwwMDAsMDAwIEdOT1QKCgkvLyBNYXhSYXRlQnBzIGNhcHMgdGhlIGZsYXQgZmluYW5jZSBjaGFyZ2UgYXQgMTAwJSBvZiBwcmluY2lwYWwgb3ZlciB0aGUKCS8vIHdob2xlIHRlcm0uIEEgMCByYXRlIGlzIGEgbGVnaXRpbWF0ZSBpbnRlcmVzdC1mcmVlIGxvYW4uCglNYXhSYXRlQnBzID0gaW50NjQoMTBfMDAwKQoKCS8vIEluc3RhbGxtZW50LWNvdW50IGFuZCBwZXJpb2QgYm91bmRzLiBUaGUgcGVyaW9kIGJvdW5kcyBtYXRjaCB0aGUKCS8vIHNpYmxpbmcgcmVhbG1zOiB0aGUgZmxvb3Iga2VlcHMgcmVwYXltZW50IG9mZiBhIHBlci1ibG9jayB0cmVhZG1pbGwsCgkvLyB0aGUgY2VpbGluZyBrZWVwcyBzY2hlZHVsZSBhcml0aG1ldGljIGZhciBmcm9tIG92ZXJmbG93LgoJTWluSW5zdGFsbG1lbnRzID0gaW50NjQoMSkKCU1heEluc3RhbGxtZW50cyA9IGludDY0KDYwKQoJTWluUGVyaW9kQmxvY2tzID0gaW50NjQoMTApCglNYXhQZXJpb2RCbG9ja3MgPSBpbnQ2NCg3XzUwMF8wMDApCgoJLy8gTWF4TG9hbnNQZXJMZW5kZXIgYm91bmRzIG9uZSBsZW5kZXIncyBzdG9yZWQgbG9hbnM7IHRlcm1pbmFsIGxvYW5zIGRvCgkvLyBOT1QgZnJlZSB0aGUgc2xvdCwgYmVjYXVzZSBhIFJlcGFpZC9EZWZhdWx0ZWQgbG9hbiBpcyBhIHBlcm1hbmVudAoJLy8gcmVjb3JkIGEgYm9ycm93ZXIgYW5kIGF1ZGl0b3IgbWF5IG5lZWQgdG8gcmVhZC4KCU1heExvYW5zUGVyTGVuZGVyID0gNTAKCgkvLyBSZW5kZXJMaW1pdCBib3VuZHMgZXZlcnkgcmVuZGVyZWQgbGlzdCDigJQgYW4gdW5ib3VuZGVkIFJlbmRlciB3YXMKCS8vIFlFTExPVyBpbiB0aHJlZSBwcmlvciBhdWRpdHMuCglSZW5kZXJMaW1pdCA9IDIwCikKCnR5cGUgbG9hbiBzdHJ1Y3QgewoJaWQgICAgICAgICAgaW50NjQKCWxlbmRlciAgICAgIGFkZHJlc3MKCWJvcnJvd2VyICAgIGFkZHJlc3MKCXByaW5jaXBhbCAgIGludDY0Cgl0b3RhbCAgICAgICBpbnQ2NCAvLyBwcmluY2lwYWwgKyBmaW5hbmNlIGNoYXJnZSwgdGhlIHN1bSByZXBheWFibGUKCWluc3RhbGxtZW50cyBpbnQ2NAoJcGVyaW9kQmxvY2tzIGludDY0CglmZWVCcHMgICAgICBpbnQ2NCAvLyBzbmFwc2hvdHRlZCBhdCBPcGVuLCBzcGxpdCBvZmYgZWFjaCByZXBheW1lbnQKCXN0YXJ0SGVpZ2h0IGludDY0IC8vIGRpc2J1cnNlbWVudCBoZWlnaHQ7IGluc3RhbGxtZW50IGsgZHVlIGF0IHN0YXJ0ICsga8K3cGVyaW9kCglyZXBhaWQgICAgICBpbnQ2NCAvLyBjdW11bGF0aXZlIHJlcGFpZCB0b3dhcmQgdG90YWwKCXN0YXR1cyAgICAgIHN0cmluZwp9Cgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MKCXBlbmRpbmdBZG1pbiBhZGRyZXNzCglmZWVSZWNpcGllbnQgYWRkcmVzcwoJZmVlQnBzICAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGludG8gTkVXIGxvYW5zCgoJc2VsZiAgICBhZGRyZXNzCgluZXh0SUQgIGludDY0CgoJbG9hbnMgICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpICAgICAgICAtPiAqbG9hbgoJbGVuZGVyTnVtICA9IGF2bC5OZXdUcmVlKCkgLy8gbGVuZGVyLlN0cmluZygpICAtPiAqaW50NjQsIHN0b3JlZCBsb2FucwoJbGVkZ2VyICAgICA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gbGVuZGVyIHNpZGUgLS0tCgovLyBPcGVuIGZ1bmRzIGEgbG9hbjogdGhlIGNhbGxlciAodGhlIGxlbmRlcikgYXR0YWNoZXMgdGhlIHByaW5jaXBhbCwgd2hpY2ggaXMKLy8gZGlzYnVyc2VkIHRvIGJvcnJvd2VyIGluIHRoaXMgc2FtZSB0cmFuc2FjdGlvbiwgYW5kIHRoZSBsb2FuIGlzIHJlY29yZGVkCi8vIHdpdGggYSBmbGF0IGZpbmFuY2UgY2hhcmdlIG9mIHJhdGVCcHMgb2YgdGhlIHByaW5jaXBhbCwgcmVwYXlhYmxlIG92ZXIKLy8gYGluc3RhbGxtZW50c2AgaW5zdGFsbG1lbnRzIG9mIGBwZXJpb2RCbG9ja3NgIGJsb2NrcyBlYWNoLiBUaGUgY3VycmVudAovLyBwcm90b2NvbCBmZWUgaXMgc25hcHNob3R0ZWQgaW4uIFJldHVybnMgdGhlIGxvYW4gaWQuCmZ1bmMgT3BlbihjdXIgcmVhbG0sIGJvcnJvd2VyIGFkZHJlc3MsIHJhdGVCcHMsIGluc3RhbGxtZW50cywgcGVyaW9kQmxvY2tzIGludDY0KSBpbnQ2NCB7CglsZW5kZXIsIHByaW5jaXBhbCA6PSBjb2luaW8uUmVjZWl2ZSgwLCBjdXIsIERlbm9tKQoJaWYgIWJvcnJvd2VyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYm9ycm93ZXIiKQoJfQoJaWYgYm9ycm93ZXIgPT0gbGVuZGVyIHsKCQlwYW5pYygibGVuZGVyIGFuZCBib3Jyb3dlciBtdXN0IGRpZmZlciIpCgl9CglpZiBwcmluY2lwYWwgPCBNaW5QcmluY2lwYWwgfHwgcHJpbmNpcGFsID4gTWF4UHJpbmNpcGFsIHsKCQlwYW5pYygicHJpbmNpcGFsIG11c3QgYmUgIiArIGl0b2EoTWluUHJpbmNpcGFsKSArICIuLiIgKyBpdG9hKE1heFByaW5jaXBhbCkgKyBEZW5vbSkKCX0KCWlmIHJhdGVCcHMgPCAwIHx8IHJhdGVCcHMgPiBNYXhSYXRlQnBzIHsKCQlwYW5pYygicmF0ZUJwcyBtdXN0IGJlIDAuLiIgKyBpdG9hKE1heFJhdGVCcHMpKQoJfQoJaWYgaW5zdGFsbG1lbnRzIDwgTWluSW5zdGFsbG1lbnRzIHx8IGluc3RhbGxtZW50cyA+IE1heEluc3RhbGxtZW50cyB7CgkJcGFuaWMoImluc3RhbGxtZW50cyBtdXN0IGJlICIgKyBpdG9hKE1pbkluc3RhbGxtZW50cykgKyAiLi4iICsgaXRvYShNYXhJbnN0YWxsbWVudHMpKQoJfQoJaWYgcGVyaW9kQmxvY2tzIDwgTWluUGVyaW9kQmxvY2tzIHx8IHBlcmlvZEJsb2NrcyA+IE1heFBlcmlvZEJsb2NrcyB7CgkJcGFuaWMoInBlcmlvZEJsb2NrcyBtdXN0IGJlICIgKyBpdG9hKE1pblBlcmlvZEJsb2NrcykgKyAiLi4iICsgaXRvYShNYXhQZXJpb2RCbG9ja3MpKQoJfQoJY2hhcmdlLCBvayA6PSBtdWxEaXZDaGVja2VkKHByaW5jaXBhbCwgcmF0ZUJwcywgMTBfMDAwKQoJaWYgIW9rIHsKCQlwYW5pYygiZmluYW5jZSBjaGFyZ2Ugb3ZlcmZsb3ciKQoJfQoJdG90YWwsIG9rIDo9IGFkZENoZWNrZWQocHJpbmNpcGFsLCBjaGFyZ2UpCglpZiAhb2sgewoJCXBhbmljKCJ0b3RhbCBvdmVyZmxvdyIpCgl9CgoJbiA6PSBjb3VudGVyKGxlbmRlck51bSwgbGVuZGVyKQoJaWYgKm4gPj0gTWF4TG9hbnNQZXJMZW5kZXIgewoJCXBhbmljKCJwZXItbGVuZGVyIGxvYW4gbGltaXQgcmVhY2hlZCIpCgl9CgoJLy8gRGlzYnVyc2UgdGhlIHByaW5jaXBhbCB0byB0aGUgYm9ycm93ZXIgaW4gdGhpcyBzYW1lIHRyYW5zYWN0aW9uLCBzbyB0aGUKCS8vIHJlYWxtIGhvbGRzIG5vdGhpbmcgZnJvbSBpdC4gY29pbmlvLlBheW91dCBwYW5pY3Mgb24gZmFpbHVyZSwgcmV2ZXJ0aW5nCgkvLyB0aGUgcmVjZWlwdCBhYm92ZSB3aXRoIGl0LgoJY29pbmlvLlBheW91dCgwLCBjdXIsIGJvcnJvd2VyLCBEZW5vbSwgcHJpbmNpcGFsKQoKCWlkIDo9IG5leHRJRAoJbmV4dElEKysKCWxvYW5zLlNldChwYWRJRChpZCksICZsb2FuewoJCWlkOiAgICAgICAgICAgaWQsCgkJbGVuZGVyOiAgICAgICBsZW5kZXIsCgkJYm9ycm93ZXI6ICAgICBib3Jyb3dlciwKCQlwcmluY2lwYWw6ICAgIHByaW5jaXBhbCwKCQl0b3RhbDogICAgICAgIHRvdGFsLAoJCWluc3RhbGxtZW50czogaW5zdGFsbG1lbnRzLAoJCXBlcmlvZEJsb2NrczogcGVyaW9kQmxvY2tzLAoJCWZlZUJwczogICAgICAgZmVlQnBzLAoJCXN0YXJ0SGVpZ2h0OiAgcnVudGltZS5DaGFpbkhlaWdodCgpLAoJCXN0YXR1czogICAgICAgTG9hbkFjdGl2ZSwKCX0pCgkqbisrCgoJY2hhaW4uRW1pdCgiTG9hbk9wZW5lZCIsCgkJImxvYW5JZCIsIGl0b2EoaWQpLAoJCSJsZW5kZXIiLCBsZW5kZXIuU3RyaW5nKCksCgkJImJvcnJvd2VyIiwgYm9ycm93ZXIuU3RyaW5nKCksCgkJInByaW5jaXBhbCIsIGl0b2EocHJpbmNpcGFsKSwKCQkidG90YWwiLCBpdG9hKHRvdGFsKSwKCQkiaW5zdGFsbG1lbnRzIiwgaXRvYShpbnN0YWxsbWVudHMpLAoJCSJmZWVCcHMiLCBpdG9hKGZlZUJwcyksCgkpCglyZXR1cm4gaWQKfQoKLy8gQ2xhaW0gc2VuZHMgYW1vdW50IHVnbm90IG9mIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZSAocmVwYXltZW50cwovLyBjb2xsZWN0ZWQgb24gdGhlaXIgbG9hbnMsIG5ldCBvZiB0aGUgcHJvdG9jb2wgZmVlKSBiYWNrIHRvIHRoZSBjYWxsZXIuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3KGNhbGxlci5TdHJpbmcoKSwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBDbGFpbUFsbCBzZW5kcyB0aGUgY2FsbGVyJ3MgZW50aXJlIGNsYWltYWJsZSBiYWxhbmNlIGJhY2sgdG8gdGhlIGNhbGxlci4KZnVuYyBDbGFpbUFsbChjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gLS0tIGJvcnJvd2VyIHNpZGUgLS0tCgovLyBSZXBheSBwYXlzIHRvd2FyZCB0aGUgY2FsbGVyJ3Mgb3duIGxvYW4uIFRoZSBjYWxsZXIgbXVzdCBiZSB0aGUgbG9hbidzCi8vIGJvcnJvd2VyOyB0aGUgYXR0YWNoZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUgYW5kIG11c3Qgbm90IGV4Y2VlZCB0aGUKLy8gb3V0c3RhbmRpbmcgYmFsYW5jZS4gVGhlIHBheW1lbnQgY3JlZGl0cyB0aGUgbGVuZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UgKHRoZQovLyBwcm90b2NvbCBmZWUgc3BsaXR0aW5nIG9mZiBhdCB0aGUgbGVkZ2VyKTsgd2hlbiB0aGUgY3VtdWxhdGl2ZSByZXBhaWQgZXF1YWxzCi8vIHRoZSB0b3RhbCwgdGhlIGxvYW4gaXMgUmVwYWlkLiBSZXBheWluZyBhaGVhZCBvZiBzY2hlZHVsZSBpcyBhbGxvd2VkLgpmdW5jIFJlcGF5KGN1ciByZWFsbSwgbG9hbklEIGludDY0KSB7CglwYXllciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCglsIDo9IG11c3RMb2FuKGxvYW5JRCkKCWlmIHBheWVyICE9IGwuYm9ycm93ZXIgewoJCXBhbmljKCJvbmx5IHRoZSBib3Jyb3dlciBtYXkgcmVwYXkgdGhpcyBsb2FuIikKCX0KCWlmIGwuc3RhdHVzICE9IExvYW5BY3RpdmUgewoJCXBhbmljKCJsb2FuIGlzICIgKyBsLnN0YXR1cykKCX0KCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYXR0YWNoIGEgcG9zaXRpdmUgcmVwYXltZW50IikKCX0KCW91dHN0YW5kaW5nIDo9IGwudG90YWwgLSBsLnJlcGFpZAoJaWYgYW1vdW50ID4gb3V0c3RhbmRpbmcgewoJCXBhbmljKCJyZXBheW1lbnQgIiArIGl0b2EoYW1vdW50KSArICIgZXhjZWVkcyB0aGUgb3V0c3RhbmRpbmcgYmFsYW5jZSAiICsgaXRvYShvdXRzdGFuZGluZykpCgl9CgoJY3JlZGl0ZWQsIGZlZSA6PSBsZWRnZXIuTXVzdERlcG9zaXQobC5sZW5kZXIuU3RyaW5nKCksIGFtb3VudCwgbC5mZWVCcHMpCglsLnJlcGFpZCArPSBhbW91bnQKCWlmIGwucmVwYWlkID09IGwudG90YWwgewoJCWwuc3RhdHVzID0gTG9hblJlcGFpZAoJfQoKCWNoYWluLkVtaXQoIlJlcGFpZCIsCgkJImxvYW5JZCIsIGl0b2EobG9hbklEKSwKCQkiYm9ycm93ZXIiLCBsLmJvcnJvd2VyLlN0cmluZygpLAoJCSJhbW91bnQiLCBpdG9hKGFtb3VudCksCgkJInJlcGFpZFRvdGFsIiwgaXRvYShsLnJlcGFpZCksCgkJImNyZWRpdGVkIiwgaXRvYShjcmVkaXRlZCksCgkJImZlZSIsIGl0b2EoZmVlKSwKCQkic3RhdHVzIiwgbC5zdGF0dXMsCgkpCn0KCi8vIERlZmF1bHQgbWFya3MgYW4gYWN0aXZlIGxvYW4gZGVmYXVsdGVkIG9uY2UgaXQgaXMgcGFzdCBpdHMgZ3JhY2Ugd2luZG93IOKAlAovLyB0aGUgZmluYWwgaW5zdGFsbG1lbnQncyBkdWUgaGVpZ2h0IHBsdXMgb25lIG1vcmUgcGVyaW9kIOKAlCBhbmQgbm90IHJlcGFpZCBpbgovLyBmdWxsLiBQZXJtaXNzaW9ubGVzcyBieSBkZXNpZ246IG5vIGxvYW4ncyB0ZXJtaW5hbCBzdGF0ZSBtYXkgZGVwZW5kIG9uCi8vIGVpdGhlciBwYXJ0eSBhY3RpbmcuIE5vIGNvaW5zIG1vdmU7IHRoZSBzaG9ydGZhbGwgaXMgcmVjb3JkZWQuCmZ1bmMgRGVmYXVsdChjdXIgcmVhbG0sIGxvYW5JRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWwgOj0gbXVzdExvYW4obG9hbklEKQoJaWYgbC5zdGF0dXMgIT0gTG9hbkFjdGl2ZSB7CgkJcGFuaWMoImxvYW4gaXMgIiArIGwuc3RhdHVzKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgZGVmYXVsdGFibGVBdChsKSB7CgkJcGFuaWMoIm5vdCBkZWZhdWx0YWJsZSB1bnRpbCBoZWlnaHQgIiArIGl0b2EoZGVmYXVsdGFibGVBdChsKSkpCgl9CglsLnN0YXR1cyA9IExvYW5EZWZhdWx0ZWQKCWNoYWluLkVtaXQoIkRlZmF1bHRlZCIsCgkJImxvYW5JZCIsIGl0b2EobG9hbklEKSwKCQkibGVuZGVyIiwgbC5sZW5kZXIuU3RyaW5nKCksCgkJImJvcnJvd2VyIiwgbC5ib3Jyb3dlci5TdHJpbmcoKSwKCQkic2hvcnRmYWxsIiwgaXRvYShsLnRvdGFsLWwucmVwYWlkKSwKCSkKfQoKLy8gLS0tIGFkbWluaXN0cmF0aW9uICh0d28tc3RlcCB0cmFuc2ZlciwgdGhlIGhvdXNlIHBhdHRlcm4pIC0tLQoKZnVuYyBTZXRGZWVCcHMoY3VyIHJlYWxtLCBicHMgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KCWlmIGJwcyA8IDAgfHwgYnBzID4gTWF4RmVlQnBzIHsKCQlwYW5pYygiZmVlIG11c3QgYmUgMC4uIiArIGl0b2EoTWF4RmVlQnBzKSArICIgYnBzIikKCX0KCWZlZUJwcyA9IGJwcwoJY2hhaW4uRW1pdCgiRmVlU2V0IiwgImJwcyIsIGl0b2EoYnBzKSkKfQoKZnVuYyBTZXRGZWVSZWNpcGllbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgIXJlY2lwaWVudC5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHJlY2lwaWVudCIpCgl9CglmZWVSZWNpcGllbnQgPSByZWNpcGllbnQKCWNoYWluLkVtaXQoIkZlZVJlY2lwaWVudFNldCIsICJ0byIsIHJlY2lwaWVudC5TdHJpbmcoKSkKfQoKZnVuYyBXaXRoZHJhd0ZlZXMoY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGZlZVJlY2lwaWVudCB7CgkJcGFuaWMoImZlZSByZWNpcGllbnQgb25seSIpCgl9CglhbW91bnQgOj0gbGVkZ2VyLldpdGhkcmF3RmVlcygpCglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIGZlZXMgYWNjcnVlZCIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgZmVlUmVjaXBpZW50LCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIGZlZVJlY2lwaWVudC5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gU3dlZXBEZW5vbSByZWNvdmVycyBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgZmVlIHJlY2lwaWVudC4gRm9yIHRoZSBsZWRnZXIKLy8gZGVub20gdGhlIHJlc2VydmUgaXMgTGlhYmlsaXRpZXMoKSDigJQgbGVuZGVyIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdCBhcmUKLy8gc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlLgpmdW5jIFN3ZWVwRGVub20oY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygiZmVlIHJlY2lwaWVudCBvbmx5IikKCX0KCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gbGVkZ2VyLkxpYWJpbGl0aWVzKCkKCX0KCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgZGVub20sIHJlc2VydmUpCgljaGFpbi5FbWl0KCJTdXJwbHVzU3dlcHQiLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJjb2lucyIsIGl0b2Eoc3dlcHQpK2Rlbm9tKQp9CgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBzdWNjZXNzb3IgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgIXN1Y2Nlc3Nvci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHN1Y2Nlc3NvciIpCgl9CglwZW5kaW5nQWRtaW4gPSBzdWNjZXNzb3IKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJTdGFnZWQiLCAidG8iLCBzdWNjZXNzb3IuU3RyaW5nKCkpCn0KCmZ1bmMgQWNjZXB0QWRtaW4oY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgcGVuZGluZ0FkbWluID09ICIiIHx8IGNhbGxlciAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJubyBhZG1pbiB0cmFuc2ZlciBzdGFnZWQgZm9yIGNhbGxlciIpCgl9CglhZG1pbiA9IHBlbmRpbmdBZG1pbgoJcGVuZGluZ0FkbWluID0gIiIKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJyZWQiLCAidG8iLCBjYWxsZXIuU3RyaW5nKCkpCn0KCi8vIC0tLSB2aWV3cyAobm9uLWNyb3NzaW5nOiBjcm9zcy1yZWFsbSByZWFkYWJsZSkgLS0tCgovLyBMb2FuSW5mbyByZXR1cm5zIGEgbG9hbidzIHRlcm1zIGFuZCBzdGF0ZS4KZnVuYyBMb2FuSW5mbyhsb2FuSUQgaW50NjQpIChsZW5kZXIsIGJvcnJvd2VyIGFkZHJlc3MsIHByaW5jaXBhbCwgdG90YWwsIHJlcGFpZCwgaW5zdGFsbG1lbnRzLCBwZXJpb2RCbG9ja3MsIHN0YXJ0SGVpZ2h0IGludDY0LCBzdGF0dXMgc3RyaW5nKSB7CglsIDo9IG11c3RMb2FuKGxvYW5JRCkKCXJldHVybiBsLmxlbmRlciwgbC5ib3Jyb3dlciwgbC5wcmluY2lwYWwsIGwudG90YWwsIGwucmVwYWlkLCBsLmluc3RhbGxtZW50cywgbC5wZXJpb2RCbG9ja3MsIGwuc3RhcnRIZWlnaHQsIGwuc3RhdHVzCn0KCi8vIEluc3RhbGxtZW50QW1vdW50IGlzIHRoZSBwZXItaW5zdGFsbG1lbnQgYW1vdW50OiBjZWlsKHRvdGFsL2luc3RhbGxtZW50cyksCi8vIHdpdGggdGhlIHJvdW5kaW5nIHJlbWFpbmRlciBjYXJyaWVkIG9uIHRoZSBGSU5BTCBpbnN0YWxsbWVudCBzbyB0aGUKLy8gaW5zdGFsbG1lbnRzIHN1bSB0byBleGFjdGx5IHRoZSB0b3RhbC4KZnVuYyBJbnN0YWxsbWVudEFtb3VudChsb2FuSUQgaW50NjQpIGludDY0IHsKCWwgOj0gbXVzdExvYW4obG9hbklEKQoJcmV0dXJuIGNlaWxEaXYobC50b3RhbCwgbC5pbnN0YWxsbWVudHMpCn0KCi8vIE91dHN0YW5kaW5nIGlzIHRvdGFsIOKIkiByZXBhaWQuCmZ1bmMgT3V0c3RhbmRpbmcobG9hbklEIGludDY0KSBpbnQ2NCB7CglsIDo9IG11c3RMb2FuKGxvYW5JRCkKCXJldHVybiBsLnRvdGFsIC0gbC5yZXBhaWQKfQoKLy8gU2NoZWR1bGVkRHVlIGlzIHRoZSBjdW11bGF0aXZlIGFtb3VudCB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcmVwYWlkIGJ5IHRoZQovLyBjdXJyZW50IGhlaWdodDogdGhlIHN1bSBvZiBldmVyeSBpbnN0YWxsbWVudCB3aG9zZSBkdWUgaGVpZ2h0IGhhcyBwYXNzZWQsCi8vIGNhcHBlZCBhdCB0aGUgdG90YWwuIEluc3RhbGxtZW50IGsgKDEtYmFzZWQpIGlzIGR1ZSBhdCBzdGFydCArIGvCt3BlcmlvZC4KZnVuYyBTY2hlZHVsZWREdWUobG9hbklEIGludDY0KSBpbnQ2NCB7CglsIDo9IG11c3RMb2FuKGxvYW5JRCkKCXJldHVybiBzY2hlZHVsZWREdWUobCwgcnVudGltZS5DaGFpbkhlaWdodCgpKQp9CgovLyBBbW91bnREdWVOb3cgaXMgaG93IGZhciBiZWhpbmQgc2NoZWR1bGUgdGhlIGJvcnJvd2VyIGlzIHJpZ2h0IG5vdzoKLy8gU2NoZWR1bGVkRHVlIOKIkiByZXBhaWQsIGZsb29yZWQgYXQgemVybyAoYSBib3Jyb3dlciB3aG8gaGFzIHByZXBhaWQgaXMgbm90Ci8vIGJlaGluZCkuCmZ1bmMgQW1vdW50RHVlTm93KGxvYW5JRCBpbnQ2NCkgaW50NjQgewoJbCA6PSBtdXN0TG9hbihsb2FuSUQpCglkdWUgOj0gc2NoZWR1bGVkRHVlKGwsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgLSBsLnJlcGFpZAoJaWYgZHVlIDwgMCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBkdWUKfQoKLy8gRGVmYXVsdGFibGVBdCBpcyB0aGUgaGVpZ2h0IGF0IG9yIGFmdGVyIHdoaWNoIGFuIHVucGFpZCBsb2FuIG1heSBiZQovLyBEZWZhdWx0ZWQ6IHRoZSBmaW5hbCBpbnN0YWxsbWVudCdzIGR1ZSBoZWlnaHQgcGx1cyBvbmUgZ3JhY2UgcGVyaW9kLgpmdW5jIERlZmF1bHRhYmxlQXQobG9hbklEIGludDY0KSBpbnQ2NCB7IHJldHVybiBkZWZhdWx0YWJsZUF0KG11c3RMb2FuKGxvYW5JRCkpIH0KCi8vIElzRGVmYXVsdGFibGUgcmVwb3J0cyB3aGV0aGVyIHRoZSBsb2FuIG1heSBiZSBEZWZhdWx0ZWQgcmlnaHQgbm93LgpmdW5jIElzRGVmYXVsdGFibGUobG9hbklEIGludDY0KSBib29sIHsKCWwgOj0gbXVzdExvYW4obG9hbklEKQoJcmV0dXJuIGwuc3RhdHVzID09IExvYW5BY3RpdmUgJiYgcnVudGltZS5DaGFpbkhlaWdodCgpID49IGRlZmF1bHRhYmxlQXQobCkgJiYgbC5yZXBhaWQgPCBsLnRvdGFsCn0KCmZ1bmMgSGFzTG9hbihsb2FuSUQgaW50NjQpIGJvb2wgeyByZXR1cm4gbG9hbnMuR2V0KHBhZElEKGxvYW5JRCkpICE9IG5pbCB9CgpmdW5jIExvYW5zT2YobGVuZGVyIGFkZHJlc3MpIGludDY0IHsKCXYgOj0gbGVuZGVyTnVtLkdldChsZW5kZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiAqdi4oKmludDY0KQp9CgpmdW5jIEFkbWluKCkgYWRkcmVzcyAgICAgICAgICAgICAgeyByZXR1cm4gYWRtaW4gfQpmdW5jIFBlbmRpbmdBZG1pbigpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gcGVuZGluZ0FkbWluIH0KZnVuYyBGZWVSZWNpcGllbnQoKSBhZGRyZXNzICAgICAgIHsgcmV0dXJuIGZlZVJlY2lwaWVudCB9CmZ1bmMgRmVlQnBzKCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBmZWVCcHMgfQpmdW5jIE51bUxvYW5zKCkgaW50NjQgICAgICAgICAgICAgeyByZXR1cm4gbmV4dElEIH0KZnVuYyBDbGFpbWFibGVPZihhIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYS5TdHJpbmcoKSkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gbGVkZ2VyLkZlZXNBY2NydWVkKCkgfQpmdW5jIExpYWJpbGl0aWVzKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gbGVkZ2VyLkxpYWJpbGl0aWVzKCkgfQpmdW5jIEhlbGQoKSBpbnQ2NCAgICAgICAgICAgICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzICAgICAgICAgICAgeyByZXR1cm4gc2VsZiB9CmZ1bmMgSGVpZ2h0KCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIGludGVybmFscyAtLS0KCi8vIHNjaGVkdWxlZER1ZSBpcyB0aGUgY3VtdWxhdGl2ZSBhbW91bnQgb3dlZCBieSBgbm93YDogayBpbnN0YWxsbWVudHMnIHdvcnRoCi8vIHdoZXJlIGsgaXMgaG93IG1hbnkgaW5zdGFsbG1lbnQgZHVlLWhlaWdodHMgaGF2ZSBwYXNzZWQsIGNhcHBlZCBhdCB0b3RhbC4KZnVuYyBzY2hlZHVsZWREdWUobCAqbG9hbiwgbm93IGludDY0KSBpbnQ2NCB7CglpZiBub3cgPCBsLnN0YXJ0SGVpZ2h0IHsKCQlyZXR1cm4gMAoJfQoJZWxhcHNlZCA6PSAobm93IC0gbC5zdGFydEhlaWdodCkgLyBsLnBlcmlvZEJsb2NrcyAvLyBpbnN0YWxsbWVudHMgd2hvc2UgZHVlIGhlaWdodCBwYXNzZWQKCWlmIGVsYXBzZWQgPj0gbC5pbnN0YWxsbWVudHMgewoJCXJldHVybiBsLnRvdGFsCgl9CglpZiBlbGFwc2VkIDw9IDAgewoJCXJldHVybiAwCgl9CgkvLyBrIGluc3RhbGxtZW50cyBvZiBjZWlsKHRvdGFsL04pIGVhY2gsIGJ1dCBuZXZlciBtb3JlIHRoYW4gdGhlIHRvdGFsLgoJcGVyIDo9IGNlaWxEaXYobC50b3RhbCwgbC5pbnN0YWxsbWVudHMpCglkdWUsIG9rIDo9IG11bENoZWNrZWQocGVyLCBlbGFwc2VkKQoJaWYgIW9rIHx8IGR1ZSA+IGwudG90YWwgewoJCXJldHVybiBsLnRvdGFsCgl9CglyZXR1cm4gZHVlCn0KCi8vIGRlZmF1bHRhYmxlQXQgaXMgdGhlIGZpbmFsIGluc3RhbGxtZW50J3MgZHVlIGhlaWdodCBwbHVzIG9uZSBncmFjZSBwZXJpb2QuCmZ1bmMgZGVmYXVsdGFibGVBdChsICpsb2FuKSBpbnQ2NCB7CglyZXR1cm4gbC5zdGFydEhlaWdodCArIChsLmluc3RhbGxtZW50cysxKSpsLnBlcmlvZEJsb2Nrcwp9CgpmdW5jIG11c3RMb2FuKGlkIGludDY0KSAqbG9hbiB7Cgl2IDo9IGxvYW5zLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gbG9hbiAiICsgaXRvYShpZCkpCgl9CglyZXR1cm4gdi4oKmxvYW4pCn0KCmZ1bmMgYXNzZXJ0Tm9TZW5kKCkgewoJaWYgIXVuc2FmZS5PcmlnaW5TZW5kKCkuSXNaZXJvKCkgewoJCXBhbmljKCJ0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCmZ1bmMgY291bnRlcih0cmVlICphdmwuVHJlZSwgYSBhZGRyZXNzKSAqaW50NjQgewoJayA6PSBhLlN0cmluZygpCglpZiB2IDo9IHRyZWUuR2V0KGspOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCppbnQ2NCkKCX0KCW4gOj0gaW50NjQoMCkKCXRyZWUuU2V0KGssICZuKQoJcmV0dXJuICZuCn0KCi8vIGNlaWxEaXYgcmV0dXJucyBjZWlsKGEvYikgZm9yIHBvc2l0aXZlIGI7IGEsYiBhc3N1bWVkIG5vbi1uZWdhdGl2ZSBhbmQgYj4wCi8vIChpbnN0YWxsbWVudHMgPj0gTWluSW5zdGFsbG1lbnRzID49IDEpLgpmdW5jIGNlaWxEaXYoYSwgYiBpbnQ2NCkgaW50NjQgewoJaWYgYSA8PSAwIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIChhICsgYiAtIDEpIC8gYgp9CgpmdW5jIGFkZENoZWNrZWQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglzIDo9IGEgKyBiCglpZiAoYiA+IDAgJiYgcyA8IGEpIHx8IChiIDwgMCAmJiBzID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHMsIHRydWUKfQoKZnVuYyBtdWxDaGVja2VkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJaWYgYSA9PSAwIHx8IGIgPT0gMCB7CgkJcmV0dXJuIDAsIHRydWUKCX0KCXAgOj0gYSAqIGIKCWlmIHAvYiAhPSBhIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBwLCB0cnVlCn0KCi8vIG11bERpdkNoZWNrZWQgcmV0dXJucyBmbG9vcihhKmIvZCkgd2l0aG91dCBvdmVyZmxvd2luZyBvbiB0aGUgaW50ZXJtZWRpYXRlCi8vIHByb2R1Y3QsIGJ5IGRpdmlkaW5nIGJlZm9yZSBtdWx0aXBseWluZyB3aGVyZSBpdCBjYW4gYW5kIGNoZWNraW5nIHRoZQovLyBwcm9kdWN0IG90aGVyd2lzZS4gSGVyZSBkIGlzIDEwMDAwIGFuZCBhLGIgYXJlIGJvdW5kZWQsIHNvIHRoZSBzaW1wbGUKLy8gY2hlY2tlZCBwcm9kdWN0IHN1ZmZpY2VzOyB0aGUgaGVscGVyIG5hbWVzIHRoZSBpbnRlbnQgYW5kIGd1YXJkcyBpdC4KZnVuYyBtdWxEaXZDaGVja2VkKGEsIGIsIGQgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcCwgb2sgOj0gbXVsQ2hlY2tlZChhLCBiKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBwIC8gZCwgdHJ1ZQp9CgpmdW5jIHBhZElEKGlkIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChpZCwgMTApCglmb3IgbGVuKHMpIDwgMTIgewoJCXMgPSAiMCIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CgovLyAtLS0gUmVuZGVyIC0tLQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJIb21lKCkKCWNhc2UgaGFzUHJlZml4KHBhdGgsICJsb2FuLyIpOgoJCXJldHVybiByZW5kZXJMb2FuKHBhdGhbbGVuKCJsb2FuLyIpOl0pCglkZWZhdWx0OgoJCXJldHVybiAidW5rbm93biBwYXRoOyB0cnkgXCJcIiBvciBcImxvYW4vPGlkPlwiXG4iCgl9Cn0KCmZ1bmMgcmVuZGVySG9tZSgpIHN0cmluZyB7CglvdXQgOj0gIiMgbG9hbnMg4oCUIHVuc2VjdXJlZCB0ZXJtIGxvYW5zIHdpdGggYSBmbGF0IGZpbmFuY2UgY2hhcmdlXG5cbiIKCW91dCArPSAiTG9hbnM6ICIgKyBpdG9hKG5leHRJRCkgKyAiIMK3IGNsYWltYWJsZStmZWVzIGhlbGQ6ICIgKyBpdG9hKGxlZGdlci5MaWFiaWxpdGllcygpKSArIERlbm9tICsKCQkiIMK3IGZlZXMgYWNjcnVlZDogIiArIGl0b2EobGVkZ2VyLkZlZXNBY2NydWVkKCkpICsgRGVub20gKyAiXG5cbiIKCW91dCArPSAiVGhlIHJlYWxtIG5ldmVyIGhvbGRzIHByaW5jaXBhbCAoaXQgaXMgZGlzYnVyc2VkIGF0IE9wZW4pOyB0aGUgY29pbnMgaXQgaG9sZHMgYXJlIHJlcGF5bWVudHMgYXdhaXRpbmcgQ2xhaW0uXG5cbiIKCW91dCArPSAifCBpZCB8IGxlbmRlciB8IGJvcnJvd2VyIHwgcHJpbmNpcGFsIHwgdG90YWwgfCByZXBhaWQgfCBzdGF0dXMgfFxufC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIKCXNob3duIDo9IGludDY0KDApCglmb3IgaWQgOj0gbmV4dElEIC0gMTsgaWQgPj0gMCAmJiBzaG93biA8IFJlbmRlckxpbWl0OyBpZC0tIHsKCQl2IDo9IGxvYW5zLkdldChwYWRJRChpZCkpCgkJaWYgdiA9PSBuaWwgewoJCQljb250aW51ZQoJCX0KCQlsIDo9IHYuKCpsb2FuKQoJCW91dCArPSAifCAiICsgaXRvYShsLmlkKSArICIgfCAiICsgc2FuaXRpemUuVGFibGVDZWxsKGwubGVuZGVyLlN0cmluZygpKSArICIgfCAiICsKCQkJc2FuaXRpemUuVGFibGVDZWxsKGwuYm9ycm93ZXIuU3RyaW5nKCkpICsgIiB8ICIgKyBpdG9hKGwucHJpbmNpcGFsKSArIERlbm9tICsgIiB8ICIgKwoJCQlpdG9hKGwudG90YWwpICsgRGVub20gKyAiIHwgIiArIGl0b2EobC5yZXBhaWQpICsgRGVub20gKyAiIHwgIiArIGwuc3RhdHVzICsgIiB8XG4iCgkJc2hvd24rKwoJfQoJaWYgbmV4dElEID4gc2hvd24gewoJCW91dCArPSAiXG4oIiArIGl0b2Eoc2hvd24pICsgIiBtb3N0IHJlY2VudCBvZiAiICsgaXRvYShuZXh0SUQpICsgIilcbiIKCX0KCXJldHVybiBvdXQKfQoKZnVuYyByZW5kZXJMb2FuKGlkU3RyIHN0cmluZykgc3RyaW5nIHsKCWlkLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChpZFN0ciwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICJiYWQgbG9hbiBpZFxuIgoJfQoJdiA6PSBsb2Fucy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAidW5rbm93biBsb2FuICIgKyBpZFN0ciArICJcbiIKCX0KCWwgOj0gdi4oKmxvYW4pCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglvdXQgOj0gIiMgbG9hbiAiICsgaXRvYShsLmlkKSArICJcblxuIgoJb3V0ICs9ICItIGxlbmRlcjogIiArIGwubGVuZGVyLlN0cmluZygpICsgIlxuIgoJb3V0ICs9ICItIGJvcnJvd2VyOiAiICsgbC5ib3Jyb3dlci5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBwcmluY2lwYWwgIiArIGl0b2EobC5wcmluY2lwYWwpICsgRGVub20gKyAiLCB0b3RhbCByZXBheWFibGUgIiArIGl0b2EobC50b3RhbCkgKyBEZW5vbSArCgkJIiAoZmluYW5jZSBjaGFyZ2UgIiArIGl0b2EobC50b3RhbC1sLnByaW5jaXBhbCkgKyBEZW5vbSArICIpXG4iCglvdXQgKz0gIi0gIiArIGl0b2EobC5pbnN0YWxsbWVudHMpICsgIiBpbnN0YWxsbWVudHMgb2YgfiIgKyBpdG9hKGNlaWxEaXYobC50b3RhbCwgbC5pbnN0YWxsbWVudHMpKSArCgkJRGVub20gKyAiIGV2ZXJ5ICIgKyBpdG9hKGwucGVyaW9kQmxvY2tzKSArICIgYmxvY2tzLCBmcm9tIGhlaWdodCAiICsgaXRvYShsLnN0YXJ0SGVpZ2h0KSArICJcbiIKCW91dCArPSAiLSByZXBhaWQgIiArIGl0b2EobC5yZXBhaWQpICsgRGVub20gKyAiIMK3IG91dHN0YW5kaW5nICIgKyBpdG9hKGwudG90YWwtbC5yZXBhaWQpICsgRGVub20gKwoJCSIgwrcgc3RhdHVzICIgKyBsLnN0YXR1cyArICJcbiIKCWlmIGwuc3RhdHVzID09IExvYW5BY3RpdmUgewoJCWJlaGluZCA6PSBzY2hlZHVsZWREdWUobCwgbm93KSAtIGwucmVwYWlkCgkJaWYgYmVoaW5kIDwgMCB7CgkJCWJlaGluZCA9IDAKCQl9CgkJb3V0ICs9ICItIHNjaGVkdWxlZC1kdWUgYnkgbm93ICIgKyBpdG9hKHNjaGVkdWxlZER1ZShsLCBub3cpKSArIERlbm9tICsgIiDCtyBiZWhpbmQgIiArIGl0b2EoYmVoaW5kKSArCgkJCURlbm9tICsgIiDCtyBkZWZhdWx0YWJsZSBhdCBoZWlnaHQgIiArIGl0b2EoZGVmYXVsdGFibGVBdChsKSkgKyAiXG4iCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgaGFzUHJlZml4KHMsIHAgc3RyaW5nKSBib29sIHsgcmV0dXJuIGxlbihzKSA+PSBsZW4ocCkgJiYgc1s6bGVuKHApXSA9PSBwIH0KIg0xMDAwMDAwMHVnbm90EhEIjvyTKhIKODg0MDh1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAHMZ4CkSbYd+3TYTK0CwTXal5ZyD5EfwnngqN0CikJ/4TPQZO+0iDIHvFevXAr1C8SBwR04/KRjNKqk6CIu343hooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}