{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "JOGRs5UnRCKiyaa0DB1I3KT9MmB9pPF3cFabV0hvaQU=",
    "height": "491920",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "76618239",
      "GasUsed": "51078826"
    },
    "tx": "Co+rAgoML3ZtLm1fYWRkcGtnEv2qAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLAqgIKCGRlcG9zaXRzEjxnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZGVwb3NpdHMaj6kCCgxkZXBvc2l0cy5nbm8S/agCLy8gUGFja2FnZSBkZXBvc2l0cyBpcyBhIHJlZnVuZGFibGUgc2VjdXJpdHkgZGVwb3NpdCB3aXRoIGNvbmRpdGlvbi1nYXRlZCwKLy8gcGFydGlhbGx5LWZvcmZlaXRhYmxlIHNldHRsZW1lbnQuCi8vCi8vICMgVGhlIHNoYXBlCi8vCi8vIEEgSE9MREVSIChsYW5kbG9yZCwgc2VydmljZSBwcm92aWRlciwgZXF1aXBtZW50IGxlc3Nvcikgb3BlbnMgYW4gYWdyZWVtZW50Ci8vIG5hbWluZyBhIERFUE9TSVRPUiwgYW4gZXhhY3QgYW1vdW50LCBhIHRlcm0sIGFuZCBhIEZPUkZFSVQgQ0VJTElORyDigJQgdGhlIG1vc3QKLy8gdGhlIGhvbGRlciBtYXkgZXZlciBjbGFpbSBvdXQgb2YgdGhlIGRlcG9zaXQuIFRoZSBkZXBvc2l0b3IgcmVhZHMgYWxsIG9mIGl0LAovLyBpbmNsdWRpbmcgdGhlIG5hbWVkIGFyYml0ZXIsIGFuZCBjb25zZW50cyBieSBGVU5ESU5HLiBBdCB0aGUgZW5kIG9mIHRoZSB0ZXJtCi8vIHRoZSBob2xkZXIgbWF5IGZpbGUgYSBjbGFpbSB1cCB0byB0aGUgY2VpbGluZzsgdGhlIGRlcG9zaXRvciBtYXkgYWNjZXB0IGl0LAovLyBkaXNwdXRlIGl0IHRvIHRoZSBhcmJpdGVyLCBvciBsZXQgaXQgc3RhbmQuIFdoYXRldmVyIGlzIG5vdCBhd2FyZGVkIHRvIHRoZQovLyBob2xkZXIgaXMgcmVmdW5kZWQgdG8gdGhlIGRlcG9zaXRvci4KLy8KLy8gVGhhdCBtYWtlcyB0aGlzIHRoZSBmaXJzdCByZWFsbSBpbiB0aGUgcG9ydGZvbGlvIHdoZXJlIE9ORSBQT1QgU1BMSVRTCi8vIFBBUlRJQUxMWSBCRVRXRUVOIFRXTyBSSVZBTCBDTEFJTUFOVFMgYnkgYSBjb25kaXRpb25hbCBydWxlLCBhbmQgdGhlIGZpcnN0Ci8vIHdoZXJlIHRoZSBkZXBvc2l0b3IncyBvd24gbW9uZXkgaXMgYXQgcmlzayBvZiBwYXJ0aWFsIGxvc3MuIGBjcm93ZGZ1bmRgIGlzCi8vIGFsbC1vci1ub3RoaW5nLCBgYXVjdGlvbmAgaXMgd2lubmVyLXRha2VzLCBgbG9hbnNgIGlzIHByaW5jaXBhbC1vdXQgLwovLyBsYXJnZXItYmFjaywgYHJlaW1idXJzZW1lbnRzYCBpcyBhcHByb3Zlci1nYXRlZCB0byBhIHNpbmdsZSBjbGFpbWFudC4gU2VlCi8vIERJU0NPVkVSWS5tZCBmb3IgdGhlIMKnNyBnYXRlIGFuZCB0aGUgZml2ZSBjYW5kaWRhdGVzIGl0IGtpbGxlZC4KLy8KLy8gIyBMaWZlY3ljbGUKLy8KLy8JT3BlbkFncmVlbWVudCAgLT4gb3BlbiAgICAgICAobm90aGluZyBoZWxkOyBkZXBvc2l0b3IgaGFzIG5vdCBjb25zZW50ZWQpCi8vCUZ1bmQgICAgICAgICAgIC0+IGZ1bmRlZCAgICAgKGRlcG9zaXRvciBhdHRhY2hlcyB0aGUgZXhhY3QgYW1vdW50KQovLwlGaWxlQ2xhaW0gICAgICAtPiBjbGFpbWVkICAgIChob2xkZXIsIGFmdGVyIHRlcm0gZW5kLCB3aXRoaW4gdGhlIGNsYWltIHdpbmRvdykKLy8JRGlzcHV0ZSAgICAgICAgLT4gZGlzcHV0ZWQgICAoZGVwb3NpdG9yLCB3aXRoaW4gdGhlIGRpc3B1dGUgd2luZG93KQovLwlSZXNvbHZlRGlzcHV0ZSAtPiBzZXR0bGVkICAgIChhcmJpdGVyIGF3YXJkcyAwLi5jbGFpbSB0byB0aGUgaG9sZGVyKQovLwovLyBGaXZlIHJvdXRlcyByZWFjaCBgc2V0dGxlZGAsIGFuZCBUSFJFRSBPRiBUSEVNIEFSRSBQRVJNSVNTSU9OTEVTUywgc28gbm8KLy8gdGVybWluYWwgc3RhdGUgZGVwZW5kcyBvbiBhIHBhcnR5IGFjdGluZzoKLy8KLy8JQWNjZXB0Q2xhaW0gICAgICAgZGVwb3NpdG9yIGFncmVlcyAgICAgICAgICAgYXdhcmQgPSBjbGFpbQovLwlTZXR0bGVVbmRpc3B1dGVkICBBTllPTkUsIGRpc3B1dGUgd2luZG93IHVwICBhd2FyZCA9IGNsYWltCi8vCVJlbGVhc2VVbmNsYWltZWQgIEFOWU9ORSwgY2xhaW0gd2luZG93IHVwICAgIGF3YXJkID0gMCAgKGhvbGRlciBuZXZlciBjbGFpbWVkKQovLwlMYXBzZURpc3B1dGUgICAgICBBTllPTkUsIGFyYml0ZXIgc2lsZW50ICAgICBhd2FyZCA9IDAgIChjbGFpbSB1bnN1YnN0YW50aWF0ZWQpCi8vCVJlbGVhc2UgICAgICAgICAgIGhvbGRlciB3YWl2ZXMgZWFybHkgICAgICAgIGF3YXJkID0gMAovLwovLyAjIEN1c3RvZHkKLy8KLy8gQ29pbnMgYXJlIGhlbGQgYnkgdGhlIHJlYWxtIGZyb20gRnVuZCB1bnRpbCBzZXR0bGVtZW50LCB0aGVuIGJlY29tZQovLyBQVUxMLUNMQUlNQUJMRSB0aHJvdWdoIGBwL2ZlZWxlZGdlcmAuIE5vdGhpbmcgaXMgZXZlciBwdXNoZWQ6IGEgc2V0dGxlbWVudAovLyBjcmVkaXRzIGJhbGFuY2VzIGFuZCB0aGUgcGFydGllcyBgQ2xhaW1gIHRoZW0sIHdoaWNoIHJlbW92ZXMgdGhlIGdyaWVmIGFuZAovLyByZWVudHJhbmN5IHN1cmZhY2UgYSBwdXNoIHNldHRsZW1lbnQgd291bGQgaGF2ZS4KLy8KLy8gVGhlIGNvbnNlcnZhdGlvbiBpbnZhcmlhbnQgY2FycmllcyBvbmUgYnVja2V0IG1vcmUgdGhhbiB0aGUgc2libGluZyByZWFsbXM6Ci8vCi8vCUhlbGQgPT0gbG9ja2VkICsgY29udGVzdGVkICsgZmVlbGVkZ2VyLkxpYWJpbGl0aWVzKCkKLy8KLy8gYGxvY2tlZGAgYW5kIGBjb250ZXN0ZWRgIGFyZSBESVNKT0lOVCDigJQgYSBkaXNwdXRlZCBkZXBvc2l0IG1vdmVzIG91dCBvZiBvbmUKLy8gYW5kIGludG8gdGhlIG90aGVyIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiBUaGUgc3BsaXQgZXhpc3RzIGJlY2F1c2UgYQovLyBjb250ZXN0ZWQgZGVwb3NpdCBpcyB0aGUgb25lIGJhbGFuY2Ugd2hvc2UgZGVzdGluYXRpb24gaXMgbm90IHlldCBkZWNpZGVkIGJ5Ci8vIHRoaXMgcmVhbG0ncyBvd24gcnVsZXM7IGtlZXBpbmcgaXQgc2VwYXJhdGUgbWFrZXMgIndoYXQgaXMgdGhlIGFyYml0ZXIKLy8gZGVjaWRpbmcgb3ZlciIgYSByZWFkYWJsZSBudW1iZXIgcmF0aGVyIHRoYW4gYW4gaW5mZXJlbmNlLgovLwovLyAjIFRoZSBmZWUKLy8KLy8gVGhlIHByb3RvY29sIGZlZSBhcHBsaWVzIE9OTFkgdG8gdGhlIHBvcnRpb24gQVdBUkRFRCB0byB0aGUgaG9sZGVyLiBBIHJlZnVuZAovLyB0byB0aGUgZGVwb3NpdG9yIGlzIHJldHVybmVkIGluIGZ1bGwgYXQgZmVlIDAsIG1hdGNoaW5nIGBhdWN0aW9uYCdzIHJ1bGUgdGhhdAovLyBhIHJlZnVuZCBpcyBub3QgYSBmZWUgZXZlbnQuIEEgZnVsbHktcmVmdW5kZWQgZGVwb3NpdCB0aGVyZWZvcmUgY29zdHMgdGhlCi8vIGRlcG9zaXRvciBub3RoaW5nLgovLwovLyAjIFdoYXQgdGhlIGRlcG9zaXRvciBpcyB0cnVzdGluZywgc3RhdGVkIHBsYWlubHkKLy8KLy8gICAtIFRoZSBGT1JGRUlUIENFSUxJTkcgaXMgdGhlIGRlcG9zaXRvcidzIGhhcmQgcHJvdGVjdGlvbiwgYW5kIHRoZXkgY29uc2VudAovLyAgICAgdG8gaXQgYnkgZnVuZGluZy4gTm90aGluZyBjYW4gdGFrZSBtb3JlIHRoYW4gdGhlIGNlaWxpbmcuCi8vICAgLSBJZiBOTyBBUkJJVEVSIGlzIG5hbWVkLCBhbiB1bmFjY2VwdGVkIGNsYWltIFNUQU5EUyBvbmNlIHRoZSBkaXNwdXRlCi8vICAgICB3aW5kb3cgcGFzc2VzLiBUaGF0IGlzIGEgbGVnaXRpbWF0ZSBjb25maWd1cmF0aW9uIOKAlCBhIGRlcG9zaXQgd2l0aCBhIGxvdwovLyAgICAgY2VpbGluZyBhbmQgbm8gYXJiaXRlciDigJQgYW5kIHRoZSBkZXBvc2l0b3Igc2VlcyBgQXJiaXRlcigpID09ICIiYCBiZWZvcmUKLy8gICAgIGZ1bmRpbmcuCi8vICAgLSBJZiBhbiBhcmJpdGVyIElTIG5hbWVkLCBgTGFwc2VEaXNwdXRlYCBhd2FyZHMgdGhlIGNvbnRlc3RlZCBhbW91bnQgdG8gdGhlCi8vICAgICBERVBPU0lUT1IuIEEgZGlzYXBwZWFyZWQgYXJiaXRlciBjYW5ub3Qgc3RyYW5kIGZ1bmRzLCBhbmQgdGhlIGhvbGRlciDigJQKLy8gICAgIHdobyBjaG9zZSB0aGUgYXJiaXRlciDigJQgYmVhcnMgdGhlIGNvc3Qgb2YgdGhhdCBjaG9pY2UgZmFpbGluZy4KLy8gICAtIFJlc2lkdWFsLCBub3QgZml4ZWQgaGVyZTogYSBob3N0aWxlIGRlcG9zaXRvciBjYW4gZGlzcHV0ZSBhIGxlZ2l0aW1hdGUKLy8gICAgIGNsYWltIHRvIGRlbGF5IHNldHRsZW1lbnQgYnkgb25lIGRpc3B1dGUgd2luZG93LiBUaGUgZGVsYXkgaXMgYm91bmRlZCBhbmQKLy8gICAgIGNvc3RzIHRoZSBkZXBvc2l0b3IgdGhlIHNhbWUgd2FpdDsgaXQgaXMgZGlzY2xvc2VkIHJhdGhlciB0aGFuIG1pdGlnYXRlZC4KLy8gICAtIFRoZSByZWFsbSBzZXR0bGVzIE1PTkVZLiBXaGV0aGVyIHRoZSBkYW1hZ2Ugd2FzIHJlYWwgaXMgb2ZmLWNoYWluOyB0aGlzCi8vICAgICByZWFsbSBiaW5kcyB0aGUgY2VpbGluZywgdGhlIHdpbmRvd3MsIGFuZCB0aGUgYXJiaXRlcidzIGF1dGhvcml0eS4KLy8KLy8gIyBTY29wZQovLwovLyBTaW5nbGUtZGVub20gKHVnbm90KSwgc2luZ2xlIGRlcG9zaXRvciBwZXIgYWdyZWVtZW50LCBmbGF0IGNlaWxpbmcuIEdyYWR1YXRlZAovLyBmb3JmZWl0dXJlIG92ZXIgZGFtYWdlIHNldmVyaXR5IChgcC90aWVyc2ApIGlzIGEgZGVsaWJlcmF0ZSB2MiBjYW5kaWRhdGUsIG5vdAovLyBhbiBvbWlzc2lvbiDigJQgc2VlIERJU0NPVkVSWS5tZCDCpzUuCnBhY2thZ2UgZGVwb3NpdHMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY29pbmlvIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBwcm90b2NvbC1mZWUgY2FwOiAxMDAwIGJwcyA9IDEwJS4gVGhlIGZlZSBhcHBsaWVzIG9ubHkKLy8gdG8gdGhlIHBvcnRpb24gQVdBUkRFRCB0byB0aGUgaG9sZGVyLCBuZXZlciB0byBhIHJlZnVuZC4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoMTAwMCkKCi8vIEFncmVlbWVudCBzdGF0dXMgdmFsdWVzLiBTZXR0bGVkIGFuZCBDYW5jZWxsZWQgYXJlIHRlcm1pbmFsLgpjb25zdCAoCglEZXBvc2l0T3BlbiAgICAgID0gIm9wZW4iICAgICAgLy8gY3JlYXRlZDsgdGhlIGRlcG9zaXRvciBoYXMgbm90IGZ1bmRlZAoJRGVwb3NpdEZ1bmRlZCAgICA9ICJmdW5kZWQiICAgIC8vIGZ1bmRlZDsgdGhlIHRlcm0gaXMgcnVubmluZyBvciB0aGUgY2xhaW0gd2luZG93IGlzIG9wZW4KCURlcG9zaXRDbGFpbWVkICAgPSAiY2xhaW1lZCIgICAvLyB0aGUgaG9sZGVyIGZpbGVkIGEgY2xhaW07IHRoZSBkZXBvc2l0b3IgbWF5IGFjY2VwdCBvciBkaXNwdXRlCglEZXBvc2l0RGlzcHV0ZWQgID0gImRpc3B1dGVkIiAgLy8gdGhlIGRlcG9zaXRvciBkaXNwdXRlZDsgdGhlIGFyYml0ZXIgZGVjaWRlcwoJRGVwb3NpdFNldHRsZWQgICA9ICJzZXR0bGVkIiAgIC8vIHNwbGl0IGNyZWRpdGVkOyBib3RoIHBhcnRpZXMgcHVsbAoJRGVwb3NpdENhbmNlbGxlZCA9ICJjYW5jZWxsZWQiIC8vIG5ldmVyIGZ1bmRlZDsgbm90aGluZyBtb3ZlZAopCgovLyBJbnB1dCBib3VuZHMuCmNvbnN0ICgKCS8vIE1pbkRlcG9zaXQgaXMgdGhlIGR1c3QgZmxvb3I7IE1heERlcG9zaXQga2VlcHMgdGhlIHNwbGl0LCB0aGUgY2VpbGluZyBhbmQKCS8vIHRoZSBmZWUgZmFyIGZyb20gaW50NjQgb3ZlcmZsb3cuIFRoZSBkZXBvc2l0b3IgbXVzdCBBVFRBQ0ggdGhlIGRlcG9zaXQsIHNvCgkvLyB0aGUgcmVhbCBjZWlsaW5nIGlzIHRoZWlyIGJhbGFuY2UuCglNaW5EZXBvc2l0ID0gaW50NjQoMTBfMDAwKQoJTWF4RGVwb3NpdCA9IGludDY0KDFfMDAwXzAwMF8wMDBfMDAwKSAvLyAxLDAwMCwwMDAgR05PVAoKCS8vIE1pbkNsYWltIGlzIHRoZSBkdXN0IGZsb29yIGZvciBhIGZvcmZlaXQgY2VpbGluZyBhbmQgZm9yIGFueSBjbGFpbSBmaWxlZAoJLy8gYWdhaW5zdCBpdC4gQSBjZWlsaW5nIGJlbG93IGl0IHdvdWxkIG1ha2UgRmlsZUNsYWltIHVuc2F0aXNmaWFibGUuCglNaW5DbGFpbSA9IGludDY0KDFfMDAwKQoKCS8vIFRlcm0gYW5kIHdpbmRvdyBib3VuZHMsIGluIGJsb2Nrcy4gVGhlIHdpbmRvdyBmbG9vcnMga2VlcCBhIGNvdW50ZXJwYXJ0eQoJLy8gZnJvbSBiZWluZyBnaXZlbiBhIGRlYWRsaW5lIHRoZXkgY2Fubm90IHBoeXNpY2FsbHkgbWVldDsgdGhlIGNlaWxpbmdzIGtlZXAKCS8vIGhlaWdodCBhcml0aG1ldGljIGZhciBmcm9tIG92ZXJmbG93LgoJTWluVGVybSAgID0gaW50NjQoMTApCglNYXhUZXJtICAgPSBpbnQ2NCg3XzUwMF8wMDApCglNaW5XaW5kb3cgPSBpbnQ2NCgxMCkKCU1heFdpbmRvdyA9IGludDY0KDdfNTAwXzAwMCkKCgkvLyBGdW5kV2luZG93IGlzIGhvdyBsb25nIGFuIHVuZnVuZGVkIGFncmVlbWVudCBzdGF5cyBmdW5kYWJsZS4gQWZ0ZXIgaXQsCgkvLyBGdW5kIHJlZnVzZXMgYW5kIENhbmNlbFVuZnVuZGVkIGlzIHBlcm1pc3Npb25sZXNzLCBzbyBhbiBhYmFuZG9uZWQgb2ZmZXIKCS8vIGNhbm5vdCBvY2N1cHkgYSBob2xkZXIncyBzbG90IGZvcmV2ZXIuCglGdW5kV2luZG93ID0gaW50NjQoMV8wMDBfMDAwKQoKCS8vIE1heE1lbW9MZW4gYW5kIE1heFJlYXNvbkxlbiBib3VuZCB0aGUgc3RvcmVkIGZyZWUgdGV4dC4KCU1heE1lbW9MZW4gICA9IDIwMAoJTWF4UmVhc29uTGVuID0gMjAwCgoJLy8gTWF4QWdyZWVtZW50c1BlckhvbGRlciBib3VuZHMgb25lIGhvbGRlcidzIHN0b3JlZCBhZ3JlZW1lbnRzLiBBIHRlcm1pbmFsCgkvLyBhZ3JlZW1lbnQgZG9lcyBOT1QgZnJlZSB0aGUgc2xvdDogYSBzZXR0bGVkIGRlcG9zaXQgaXMgYSBwZXJtYW5lbnQgcmVjb3JkCgkvLyBib3RoIHBhcnRpZXMgYW5kIGFuIGF1ZGl0b3IgbWF5IG5lZWQgdG8gcmVhZC4KCU1heEFncmVlbWVudHNQZXJIb2xkZXIgPSA1MAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyBldmVyeSByZW5kZXJlZCBsaXN0IOKAlCBhbiB1bmJvdW5kZWQgUmVuZGVyIHdhcyBZRUxMT1cgaW4KCS8vIHNldmVyYWwgcHJpb3IgYXVkaXRzIGluIHRoaXMgcG9ydGZvbGlvLgoJUmVuZGVyTGltaXQgPSAyMAopCgp0eXBlIGFncmVlbWVudCBzdHJ1Y3QgewoJaWQgICAgICAgIGludDY0Cglob2xkZXIgICAgYWRkcmVzcwoJZGVwb3NpdG9yIGFkZHJlc3MKCWFyYml0ZXIgICBhZGRyZXNzIC8vICIiID0gbm9uZTsgYSBjbGFpbSB0aGVuIGNhbm5vdCBiZSBkaXNwdXRlZAoJbWVtbyAgICAgIHN0cmluZwoKCWFtb3VudCAgICAgICAgIGludDY0IC8vIHRoZSBkZXBvc2l0OyBGdW5kIG11c3QgYXR0YWNoIGV4YWN0bHkgdGhpcwoJZm9yZmVpdENlaWxpbmcgaW50NjQgLy8gdGhlIG1vc3QgdGhlIGhvbGRlciBtYXkgZXZlciBjbGFpbSwgaW4gW01pbkNsYWltLCBhbW91bnRdCglmZWVCcHMgICAgICAgICBpbnQ2NCAvLyBzbmFwc2hvdCBhdCBvcGVuOyBhcHBsaWVkIE9OTFkgdG8gdGhlIGF3YXJkZWQgcG9ydGlvbgoJdGVybUJsb2NrcyAgICAgaW50NjQKCWNsYWltV2luZG93ICAgIGludDY0CglkaXNwdXRlV2luZG93ICBpbnQ2NAoKCXN0YXR1cyAgICAgICAgc3RyaW5nCgljcmVhdGVkSGVpZ2h0IGludDY0CglmdW5kRGVhZGxpbmUgIGludDY0IC8vIGNyZWF0ZWRIZWlnaHQgKyBGdW5kV2luZG93CglmdW5kZWRIZWlnaHQgIGludDY0IC8vIDAgdW50aWwgZnVuZGVkCgl0ZXJtRW5kICAgICAgIGludDY0IC8vIGZ1bmRlZEhlaWdodCArIHRlcm1CbG9ja3MKCWNsYWltRGVhZGxpbmUgaW50NjQgLy8gdGVybUVuZCArIGNsYWltV2luZG93CgoJY2xhaW1BbW91bnQgICAgIGludDY0CgljbGFpbVJlYXNvbiAgICAgc3RyaW5nCglkaXNwdXRlRGVhZGxpbmUgaW50NjQgLy8gY2xhaW0gaGVpZ2h0ICsgZGlzcHV0ZVdpbmRvdwoJZGlzcHV0ZVJlYXNvbiAgIHN0cmluZwoJYXJiaXRlckRlYWRsaW5lIGludDY0IC8vIGRpc3B1dGUgaGVpZ2h0ICsgZGlzcHV0ZVdpbmRvdwoKCWF3YXJkICAgICAgICAgaW50NjQgLy8gY3JlZGl0ZWQgdG8gdGhlIGhvbGRlciBhdCBzZXR0bGVtZW50CglzZXR0bGVkSGVpZ2h0IGludDY0Cn0KCnZhciAoCglhZG1pbiAgICAgICAgYWRkcmVzcwoJcGVuZGluZ0FkbWluIGFkZHJlc3MKCWZlZVJlY2lwaWVudCBhZGRyZXNzCglmZWVCcHMgICAgICAgaW50NjQgLy8gc25hcHNob3R0ZWQgaW50byBORVcgYWdyZWVtZW50cwoKCXNlbGYgICAgICBhZGRyZXNzCgluZXh0SUQgICAgaW50NjQKCWxvY2tlZCAgICBpbnQ2NCAvLyDOoyBhbW91bnRzIG9mIGZ1bmRlZC9jbGFpbWVkIGFncmVlbWVudHMgKGRlc3RpbmF0aW9uIG5vdCB5ZXQgZGVjaWRlZCBieSBhIHBhcnR5KQoJY29udGVzdGVkIGludDY0IC8vIM6jIGFtb3VudHMgb2YgRElTUFVURUQgYWdyZWVtZW50cyAoYW4gYXJiaXRlciBpcyBkZWNpZGluZykKCglhZ3JlZW1lbnRzID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgICAgICAgLT4gKmFncmVlbWVudAoJaG9sZGVyTnVtICA9IGF2bC5OZXdUcmVlKCkgLy8gaG9sZGVyLlN0cmluZygpIC0+ICppbnQ2NCwgc3RvcmVkIGFncmVlbWVudHMKCWxlZGdlciAgICAgPSBmZWVsZWRnZXIuTXVzdE5ldyhNYXhGZWVCcHMpCikKCmZ1bmMgaW5pdCgpIHsKCWFkbWluID0gdW5zYWZlLk9yaWdpbkNhbGxlcigpCglmZWVSZWNpcGllbnQgPSBhZG1pbgoJc2VsZiA9IHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkKfQoKLy8gLS0tIGhvbGRlciBzaWRlIC0tLQoKLy8gT3BlbkFncmVlbWVudCBvZmZlcnMgYSBkZXBvc2l0IGFncmVlbWVudC4gVGhlIGNhbGxlciBiZWNvbWVzIHRoZSBob2xkZXIgYW5kCi8vIG5hbWVzIHRoZSBgZGVwb3NpdG9yYCwgdGhlIGV4YWN0IGBhbW91bnRgIHRoZXkgbXVzdCBhdHRhY2gsIHRoZSBgdGVybUJsb2Nrc2AKLy8gdGhlIGRlcG9zaXQgaXMgaGVsZCBmb3IsIHRoZSBgY2xhaW1XaW5kb3dgIHRoZSBob2xkZXIgaGFzIHRvIGZpbGUgYSBjbGFpbQovLyBhZnRlciB0aGUgdGVybSBlbmRzLCB0aGUgYGRpc3B1dGVXaW5kb3dgIHRoZSBkZXBvc2l0b3IgaGFzIHRvIGRpc3B1dGUgb25lIChhbmQKLy8gdGhlIGFyYml0ZXIgdGhlbiBoYXMgdG8gcnVsZSksIGFuZCB0aGUgYGZvcmZlaXRDZWlsaW5nYCDigJQgdGhlIG1vc3QgdGhlIGhvbGRlcgovLyBtYXkgZXZlciBjbGFpbSwgaW4gW01pbkNsYWltLCBhbW91bnRdLiBgYXJiaXRlcmAgbWF5IGJlIHRoZSB6ZXJvIGFkZHJlc3MsIGluCi8vIHdoaWNoIGNhc2UgYSBjbGFpbSBjYW5ub3QgYmUgZGlzcHV0ZWQ7IGl0IG1heSBub3QgYmUgZWl0aGVyIHBhcnR5LiBOb3RoaW5nIGlzCi8vIGhlbGQgdW50aWwgdGhlIGRlcG9zaXRvciBGdW5kcywgd2hpY2ggaXMgaG93IHRoZXkgY29uc2VudCB0byBhbGwgb2YgaXQuIFRoZQovLyBjdXJyZW50IHByb3RvY29sIGZlZSBpcyBzbmFwc2hvdHRlZCBpbi4gUmV0dXJucyB0aGUgaWQuCmZ1bmMgT3BlbkFncmVlbWVudChjdXIgcmVhbG0sIGRlcG9zaXRvciBhZGRyZXNzLCBhbW91bnQsIGZvcmZlaXRDZWlsaW5nLCB0ZXJtQmxvY2tzLCBjbGFpbVdpbmRvdywgZGlzcHV0ZVdpbmRvdyBpbnQ2NCwgYXJiaXRlciBhZGRyZXNzLCBtZW1vIHN0cmluZykgaW50NjQgewoJYXNzZXJ0Tm9TZW5kKCkKCWhvbGRlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmICFkZXBvc2l0b3IuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBkZXBvc2l0b3IgYWRkcmVzcyIpCgl9CglpZiBkZXBvc2l0b3IgPT0gaG9sZGVyIHsKCQlwYW5pYygiaG9sZGVyIGFuZCBkZXBvc2l0b3IgbXVzdCBkaWZmZXIiKQoJfQoJaWYgYXJiaXRlciAhPSAiIiB7CgkJaWYgIWFyYml0ZXIuSXNWYWxpZCgpIHsKCQkJcGFuaWMoImludmFsaWQgYXJiaXRlciBhZGRyZXNzIikKCQl9CgkJaWYgYXJiaXRlciA9PSBob2xkZXIgfHwgYXJiaXRlciA9PSBkZXBvc2l0b3IgewoJCQlwYW5pYygidGhlIGFyYml0ZXIgbWF5IG5vdCBiZSBlaXRoZXIgcGFydHkiKQoJCX0KCX0KCWlmIGFtb3VudCA8IE1pbkRlcG9zaXQgfHwgYW1vdW50ID4gTWF4RGVwb3NpdCB7CgkJcGFuaWMoImRlcG9zaXQgbXVzdCBiZSAiICsgaXRvYShNaW5EZXBvc2l0KSArICIuLiIgKyBpdG9hKE1heERlcG9zaXQpICsgRGVub20pCgl9CglpZiBmb3JmZWl0Q2VpbGluZyA8IE1pbkNsYWltIHx8IGZvcmZlaXRDZWlsaW5nID4gYW1vdW50IHsKCQlwYW5pYygiZm9yZmVpdCBjZWlsaW5nIG11c3QgYmUgIiArIGl0b2EoTWluQ2xhaW0pICsgIi4uIiArIGl0b2EoYW1vdW50KSArIERlbm9tKQoJfQoJaWYgdGVybUJsb2NrcyA8IE1pblRlcm0gfHwgdGVybUJsb2NrcyA+IE1heFRlcm0gewoJCXBhbmljKCJ0ZXJtIG11c3QgYmUgIiArIGl0b2EoTWluVGVybSkgKyAiLi4iICsgaXRvYShNYXhUZXJtKSArICIgYmxvY2tzIikKCX0KCWlmIGNsYWltV2luZG93IDwgTWluV2luZG93IHx8IGNsYWltV2luZG93ID4gTWF4V2luZG93IHsKCQlwYW5pYygiY2xhaW0gd2luZG93IG11c3QgYmUgIiArIGl0b2EoTWluV2luZG93KSArICIuLiIgKyBpdG9hKE1heFdpbmRvdykgKyAiIGJsb2NrcyIpCgl9CglpZiBkaXNwdXRlV2luZG93IDwgTWluV2luZG93IHx8IGRpc3B1dGVXaW5kb3cgPiBNYXhXaW5kb3cgewoJCXBhbmljKCJkaXNwdXRlIHdpbmRvdyBtdXN0IGJlICIgKyBpdG9hKE1pbldpbmRvdykgKyAiLi4iICsgaXRvYShNYXhXaW5kb3cpICsgIiBibG9ja3MiKQoJfQoJaWYgbGVuKG1lbW8pID4gTWF4TWVtb0xlbiB7CgkJcGFuaWMoIm1lbW8gbXVzdCBiZSBhdCBtb3N0ICIgKyBpdG9hKE1heE1lbW9MZW4pICsgIiBieXRlcyIpCgl9CgluIDo9IGNvdW50ZXIoaG9sZGVyTnVtLCBob2xkZXIpCglpZiAqbiA+PSBNYXhBZ3JlZW1lbnRzUGVySG9sZGVyIHsKCQlwYW5pYygiaG9sZGVyIGhhcyByZWFjaGVkICIgKyBpdG9hKE1heEFncmVlbWVudHNQZXJIb2xkZXIpICsgIiBzdG9yZWQgYWdyZWVtZW50cyIpCgl9CgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJZGVhZGxpbmUsIG9rIDo9IGFkZENoZWNrZWQobm93LCBGdW5kV2luZG93KQoJaWYgIW9rIHsKCQlwYW5pYygiZnVuZC1kZWFkbGluZSBoZWlnaHQgb3ZlcmZsb3ciKQoJfQoJaWQgOj0gbmV4dElECgluZXh0SUQrKwoJZCA6PSAmYWdyZWVtZW50ewoJCWlkOiAgICAgICAgICAgICBpZCwKCQlob2xkZXI6ICAgICAgICAgaG9sZGVyLAoJCWRlcG9zaXRvcjogICAgICBkZXBvc2l0b3IsCgkJYXJiaXRlcjogICAgICAgIGFyYml0ZXIsCgkJbWVtbzogICAgICAgICAgIG1lbW8sCgkJYW1vdW50OiAgICAgICAgIGFtb3VudCwKCQlmb3JmZWl0Q2VpbGluZzogZm9yZmVpdENlaWxpbmcsCgkJZmVlQnBzOiAgICAgICAgIGZlZUJwcywKCQl0ZXJtQmxvY2tzOiAgICAgdGVybUJsb2NrcywKCQljbGFpbVdpbmRvdzogICAgY2xhaW1XaW5kb3csCgkJZGlzcHV0ZVdpbmRvdzogIGRpc3B1dGVXaW5kb3csCgkJc3RhdHVzOiAgICAgICAgIERlcG9zaXRPcGVuLAoJCWNyZWF0ZWRIZWlnaHQ6ICBub3csCgkJZnVuZERlYWRsaW5lOiAgIGRlYWRsaW5lLAoJfQoJYWdyZWVtZW50cy5TZXQocGFkSUQoaWQpLCBkKQoJKm4rKwoKCWNoYWluLkVtaXQoIkFncmVlbWVudE9wZW5lZCIsCgkJImlkIiwgaXRvYShpZCksCgkJImhvbGRlciIsIGhvbGRlci5TdHJpbmcoKSwKCQkiZGVwb3NpdG9yIiwgZGVwb3NpdG9yLlN0cmluZygpLAoJCSJhcmJpdGVyIiwgYXJiaXRlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJmb3JmZWl0Q2VpbGluZyIsIGl0b2EoZm9yZmVpdENlaWxpbmcpLAoJCSJmdW5kRGVhZGxpbmUiLCBpdG9hKGRlYWRsaW5lKSwKCSkKCXJldHVybiBpZAp9CgovLyBGaWxlQ2xhaW0gY2xhaW1zIGBhbW91bnRgIG9mIHRoZSBkZXBvc2l0IGFnYWluc3QgdGhlIGNlaWxpbmcuIEhvbGRlciBvbmx5LAovLyBvbmx5IG9uY2UsIG9ubHkgYWZ0ZXIgdGhlIHRlcm0gaGFzIGVuZGVkIGFuZCBiZWZvcmUgdGhlIGNsYWltIHdpbmRvdyBjbG9zZXMuCi8vIGBhbW91bnRgIG11c3QgYmUgaW4gW01pbkNsYWltLCBmb3JmZWl0Q2VpbGluZ10uIFRoZSBkZXBvc2l0b3IgbWF5IHRoZW4gYWNjZXB0Ci8vIGl0LCBkaXNwdXRlIGl0IHRvIHRoZSBhcmJpdGVyLCBvciBsZXQgaXQgc3RhbmQuCmZ1bmMgRmlsZUNsYWltKGN1ciByZWFsbSwgaWQsIGFtb3VudCBpbnQ2NCwgcmVhc29uIHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWQgOj0gbXVzdEFncmVlbWVudChpZCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBkLmhvbGRlciB7CgkJcGFuaWMoImhvbGRlciBvbmx5IikKCX0KCWlmIGQuc3RhdHVzICE9IERlcG9zaXRGdW5kZWQgewoJCXBhbmljKCJhZ3JlZW1lbnQgaXMgIiArIGQuc3RhdHVzKQoJfQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgbm93IDwgZC50ZXJtRW5kIHsKCQlwYW5pYygidGhlIHRlcm0gaGFzIG5vdCBlbmRlZDsgaXQgZW5kcyBhdCBoZWlnaHQgIiArIGl0b2EoZC50ZXJtRW5kKSkKCX0KCWlmIG5vdyA+PSBkLmNsYWltRGVhZGxpbmUgewoJCXBhbmljKCJ0aGUgY2xhaW0gd2luZG93IGNsb3NlZCBhdCBoZWlnaHQgIiArIGl0b2EoZC5jbGFpbURlYWRsaW5lKSkKCX0KCWlmIGFtb3VudCA8IE1pbkNsYWltIHx8IGFtb3VudCA+IGQuZm9yZmVpdENlaWxpbmcgewoJCXBhbmljKCJjbGFpbSBtdXN0IGJlICIgKyBpdG9hKE1pbkNsYWltKSArICIuLiIgKyBpdG9hKGQuZm9yZmVpdENlaWxpbmcpICsgRGVub20pCgl9CglpZiBsZW4ocmVhc29uKSA9PSAwIHx8IGxlbihyZWFzb24pID4gTWF4UmVhc29uTGVuIHsKCQlwYW5pYygicmVhc29uIG11c3QgYmUgMS4uIiArIGl0b2EoTWF4UmVhc29uTGVuKSArICIgYnl0ZXMiKQoJfQoJLy8gQ2hlY2tlZCBsaWtlIGV2ZXJ5IG90aGVyIGRlYWRsaW5lLCB0aG91Z2ggdGhlIHdpbmRvdyBib3VuZHMgcHV0IG92ZXJmbG93CgkvLyBvdXQgb2YgcmVhY2guCgl1bnRpbCwgb2sgOj0gYWRkQ2hlY2tlZChub3csIGQuZGlzcHV0ZVdpbmRvdykKCWlmICFvayB7CgkJcGFuaWMoImRpc3B1dGUtZGVhZGxpbmUgaGVpZ2h0IG92ZXJmbG93IikKCX0KCWQuY2xhaW1BbW91bnQgPSBhbW91bnQKCWQuY2xhaW1SZWFzb24gPSByZWFzb24KCWQuZGlzcHV0ZURlYWRsaW5lID0gdW50aWwKCWQuc3RhdHVzID0gRGVwb3NpdENsYWltZWQKCgljaGFpbi5FbWl0KCJDbGFpbUZpbGVkIiwKCQkiaWQiLCBpdG9hKGlkKSwKCQkiaG9sZGVyIiwgZC5ob2xkZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkiZGlzcHV0ZURlYWRsaW5lIiwgaXRvYSh1bnRpbCksCgkpCn0KCi8vIFJlbGVhc2UgcmV0dXJucyB0aGUgd2hvbGUgZGVwb3NpdCB0byB0aGUgZGVwb3NpdG9yIGVhcmx5LiBIb2xkZXIgb25seSwgd2hpbGUKLy8gdGhlIGFncmVlbWVudCBpcyBmdW5kZWQgYW5kIHVuY2xhaW1lZC4gSXQgaXMgdGhlIGhvbGRlciB3YWl2aW5nIHRoZSBjbGFpbSB0aGV5Ci8vIGhhdmUgbm90IHlldCBmaWxlZCDigJQgdGhlIG9uZSByb3V0ZSB0byBzZXR0bGVtZW50IHRoYXQgbmVlZHMgbm8gY2xvY2suCmZ1bmMgUmVsZWFzZShjdXIgcmVhbG0sIGlkIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJZCA6PSBtdXN0QWdyZWVtZW50KGlkKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGQuaG9sZGVyIHsKCQlwYW5pYygiaG9sZGVyIG9ubHkiKQoJfQoJaWYgZC5zdGF0dXMgIT0gRGVwb3NpdEZ1bmRlZCB7CgkJcGFuaWMoImFncmVlbWVudCBpcyAiICsgZC5zdGF0dXMpCgl9CglzZXR0bGUoZCwgMCwgZmFsc2UpCgljaGFpbi5FbWl0KCJTZXR0bGVkIiwKCQkiaWQiLCBpdG9hKGlkKSwKCQkicm91dGUiLCAicmVsZWFzZSIsCgkJImF3YXJkIiwgIjAiLAoJCSJyZWZ1bmQiLCBpdG9hKGQuYW1vdW50KSwKCSkKfQoKLy8gLS0tIGRlcG9zaXRvciBzaWRlIC0tLQoKLy8gRnVuZCBhdHRhY2hlcyB0aGUgZXhhY3QgZGVwb3NpdCBhbmQgc3RhcnRzIHRoZSB0ZXJtLiBUaGUgbmFtZWQgZGVwb3NpdG9yIG9ubHk7Ci8vIHRoZSBhdHRhY2hlZCBhbW91bnQgbXVzdCBlcXVhbCB0aGUgYWdyZWVtZW50J3MgYW1vdW50IGV4YWN0bHksIGFuZCB0aGUgZnVuZAovLyBkZWFkbGluZSBtdXN0IG5vdCBoYXZlIHBhc3NlZC4gRnVuZGluZyBJUyB0aGUgZGVwb3NpdG9yJ3MgY29uc2VudCB0byB0aGUKLy8gY2VpbGluZywgdGhlIHdpbmRvd3MgYW5kIHRoZSBhcmJpdGVyLCBhbGwgb2Ygd2hpY2ggd2VyZSByZWFkYWJsZSBiZWZvcmVoYW5kLgpmdW5jIEZ1bmQoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJZnJvbSwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglpZiBkLnN0YXR1cyAhPSBEZXBvc2l0T3BlbiB7CgkJcGFuaWMoImFncmVlbWVudCBpcyAiICsgZC5zdGF0dXMpCgl9CglpZiBmcm9tICE9IGQuZGVwb3NpdG9yIHsKCQlwYW5pYygib25seSB0aGUgbmFtZWQgZGVwb3NpdG9yIG1heSBmdW5kIHRoaXMgYWdyZWVtZW50IikKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIG5vdyA+PSBkLmZ1bmREZWFkbGluZSB7CgkJcGFuaWMoInRoZSBmdW5kIHdpbmRvdyBjbG9zZWQgYXQgaGVpZ2h0ICIgKyBpdG9hKGQuZnVuZERlYWRsaW5lKSkKCX0KCWlmIGFtb3VudCAhPSBkLmFtb3VudCB7CgkJcGFuaWMoImF0dGFjaCBleGFjdGx5ICIgKyBpdG9hKGQuYW1vdW50KSArIERlbm9tICsgIjsgZ290ICIgKyBpdG9hKGFtb3VudCkpCgl9Cgl0ZXJtRW5kLCBvayA6PSBhZGRDaGVja2VkKG5vdywgZC50ZXJtQmxvY2tzKQoJaWYgIW9rIHsKCQlwYW5pYygidGVybS1lbmQgaGVpZ2h0IG92ZXJmbG93IikKCX0KCWNsYWltRGVhZGxpbmUsIG9rIDo9IGFkZENoZWNrZWQodGVybUVuZCwgZC5jbGFpbVdpbmRvdykKCWlmICFvayB7CgkJcGFuaWMoImNsYWltLWRlYWRsaW5lIGhlaWdodCBvdmVyZmxvdyIpCgl9CgkvLyBjb2luaW8gYWxyZWFkeSByZWNlaXZlZCBgYW1vdW50YCwgc28gSGVsZCByb3NlIGJ5IGFtb3VudDsgbG9ja2luZyBpdCBrZWVwcwoJLy8gSGVsZCA9PSBsb2NrZWQgKyBjb250ZXN0ZWQgKyBMaWFiaWxpdGllcyBleGFjdGx5LgoJbG9ja2VkICs9IGFtb3VudAoJZC5mdW5kZWRIZWlnaHQgPSBub3cKCWQudGVybUVuZCA9IHRlcm1FbmQKCWQuY2xhaW1EZWFkbGluZSA9IGNsYWltRGVhZGxpbmUKCWQuc3RhdHVzID0gRGVwb3NpdEZ1bmRlZAoKCWNoYWluLkVtaXQoIkZ1bmRlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJImRlcG9zaXRvciIsIGZyb20uU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkidGVybUVuZCIsIGl0b2EodGVybUVuZCksCgkJImNsYWltRGVhZGxpbmUiLCBpdG9hKGNsYWltRGVhZGxpbmUpLAoJKQp9CgovLyBBY2NlcHRDbGFpbSBzZXR0bGVzIGF0IHRoZSBjbGFpbWVkIGFtb3VudC4gRGVwb3NpdG9yIG9ubHksIHdoaWxlIGEgY2xhaW0KLy8gc3RhbmRzLiBBY2NlcHRpbmcgZWFybHkgaXMgYWxsb3dlZCDigJQgdGhlIGRpc3B1dGUgd2luZG93IGlzIGEgZGVhZGxpbmUgZm9yCi8vIGRpc3B1dGluZywgbm90IGEgd2FpdGluZyBwZXJpb2QuCmZ1bmMgQWNjZXB0Q2xhaW0oY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWQgOj0gbXVzdEFncmVlbWVudChpZCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBkLmRlcG9zaXRvciB7CgkJcGFuaWMoImRlcG9zaXRvciBvbmx5IikKCX0KCWlmIGQuc3RhdHVzICE9IERlcG9zaXRDbGFpbWVkIHsKCQlwYW5pYygiYWdyZWVtZW50IGlzICIgKyBkLnN0YXR1cykKCX0KCWF3YXJkIDo9IGQuY2xhaW1BbW91bnQKCWNyZWRpdGVkLCBmZWUgOj0gc2V0dGxlKGQsIGF3YXJkLCBmYWxzZSkKCWNoYWluLkVtaXQoIlNldHRsZWQiLAoJCSJpZCIsIGl0b2EoaWQpLAoJCSJyb3V0ZSIsICJhY2NlcHQiLAoJCSJhd2FyZCIsIGl0b2EoYXdhcmQpLAoJCSJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLAoJCSJmZWUiLCBpdG9hKGZlZSksCgkJInJlZnVuZCIsIGl0b2EoZC5hbW91bnQtYXdhcmQpLAoJKQp9CgovLyBEaXNwdXRlIHNlbmRzIGEgc3RhbmRpbmcgY2xhaW0gdG8gdGhlIGFyYml0ZXIuIERlcG9zaXRvciBvbmx5LCBiZWZvcmUgdGhlCi8vIGRpc3B1dGUgZGVhZGxpbmUsIGFuZCBvbmx5IGlmIGFuIGFyYml0ZXIgd2FzIG5hbWVkIOKAlCB3aXRoIG5vIGFyYml0ZXIgdGhlcmUgaXMKLy8gbm9ib2R5IHRvIGRlY2lkZSwgYW5kIHRoZSBkZXBvc2l0b3Igc2F3IHRoYXQgYmVmb3JlIGZ1bmRpbmcuIFRoZSBkZXBvc2l0IG1vdmVzCi8vIGZyb20gYGxvY2tlZGAgaW50byBgY29udGVzdGVkYDsgbm8gY29pbnMgbW92ZS4KZnVuYyBEaXNwdXRlKGN1ciByZWFsbSwgaWQgaW50NjQsIHJlYXNvbiBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZC5kZXBvc2l0b3IgewoJCXBhbmljKCJkZXBvc2l0b3Igb25seSIpCgl9CglpZiBkLnN0YXR1cyAhPSBEZXBvc2l0Q2xhaW1lZCB7CgkJcGFuaWMoImFncmVlbWVudCBpcyAiICsgZC5zdGF0dXMpCgl9CglpZiBkLmFyYml0ZXIgPT0gIiIgewoJCXBhbmljKCJubyBhcmJpdGVyIHdhcyBuYW1lZDsgYSBjbGFpbSBjYW5ub3QgYmUgZGlzcHV0ZWQiKQoJfQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgbm93ID49IGQuZGlzcHV0ZURlYWRsaW5lIHsKCQlwYW5pYygidGhlIGRpc3B1dGUgd2luZG93IGNsb3NlZCBhdCBoZWlnaHQgIiArIGl0b2EoZC5kaXNwdXRlRGVhZGxpbmUpKQoJfQoJaWYgbGVuKHJlYXNvbikgPT0gMCB8fCBsZW4ocmVhc29uKSA+IE1heFJlYXNvbkxlbiB7CgkJcGFuaWMoInJlYXNvbiBtdXN0IGJlIDEuLiIgKyBpdG9hKE1heFJlYXNvbkxlbikgKyAiIGJ5dGVzIikKCX0KCXVudGlsLCBvayA6PSBhZGRDaGVja2VkKG5vdywgZC5kaXNwdXRlV2luZG93KQoJaWYgIW9rIHsKCQlwYW5pYygiYXJiaXRlci1kZWFkbGluZSBoZWlnaHQgb3ZlcmZsb3ciKQoJfQoJbG9ja2VkIC09IGQuYW1vdW50Cgljb250ZXN0ZWQgKz0gZC5hbW91bnQKCWQuZGlzcHV0ZVJlYXNvbiA9IHJlYXNvbgoJZC5hcmJpdGVyRGVhZGxpbmUgPSB1bnRpbAoJZC5zdGF0dXMgPSBEZXBvc2l0RGlzcHV0ZWQKCgljaGFpbi5FbWl0KCJEaXNwdXRlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJImRlcG9zaXRvciIsIGQuZGVwb3NpdG9yLlN0cmluZygpLAoJCSJhcmJpdGVyIiwgZC5hcmJpdGVyLlN0cmluZygpLAoJCSJjbGFpbSIsIGl0b2EoZC5jbGFpbUFtb3VudCksCgkJImFyYml0ZXJEZWFkbGluZSIsIGl0b2EodW50aWwpLAoJKQp9CgovLyAtLS0gYXJiaXRlciAtLS0KCi8vIFJlc29sdmVEaXNwdXRlIHJ1bGVzIG9uIGEgZGlzcHV0ZWQgY2xhaW0uIEFyYml0ZXIgb25seS4gYGF3YXJkVG9Ib2xkZXJgIGlzIGluCi8vIFswLCB0aGUgY2xhaW1lZCBhbW91bnRdIOKAlCB0aGUgYXJiaXRlciBtYXkgcmVkdWNlIGEgY2xhaW0gb3IgZGVueSBpdCBvdXRyaWdodAovLyBidXQgbmV2ZXIgYXdhcmQgbW9yZSB0aGFuIHdhcyBjbGFpbWVkLCB3aGljaCBpcyBpdHNlbGYgY2FwcGVkIGJ5IHRoZSBjZWlsaW5nCi8vIHRoZSBkZXBvc2l0b3IgY29uc2VudGVkIHRvLiBObyBkZWFkbGluZSBpcyBlbmZvcmNlZCBoZXJlOiBhIGxhdGUgcnVsaW5nIGlzCi8vIGJldHRlciB0aGFuIGEgc3RyYW5kZWQgZGVwb3NpdCwgYW5kIGBMYXBzZURpc3B1dGVgIGlzIHRoZSByYWNlIHRoYXQgYm91bmRzIGl0LgpmdW5jIFJlc29sdmVEaXNwdXRlKGN1ciByZWFsbSwgaWQsIGF3YXJkVG9Ib2xkZXIgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZC5hcmJpdGVyIHsKCQlwYW5pYygiYXJiaXRlciBvbmx5IikKCX0KCWlmIGQuc3RhdHVzICE9IERlcG9zaXREaXNwdXRlZCB7CgkJcGFuaWMoImFncmVlbWVudCBpcyAiICsgZC5zdGF0dXMpCgl9CglpZiBhd2FyZFRvSG9sZGVyIDwgMCB8fCBhd2FyZFRvSG9sZGVyID4gZC5jbGFpbUFtb3VudCB7CgkJcGFuaWMoImF3YXJkIG11c3QgYmUgMC4uIiArIGl0b2EoZC5jbGFpbUFtb3VudCkgKyBEZW5vbSkKCX0KCWNyZWRpdGVkLCBmZWUgOj0gc2V0dGxlKGQsIGF3YXJkVG9Ib2xkZXIsIHRydWUpCgljaGFpbi5FbWl0KCJTZXR0bGVkIiwKCQkiaWQiLCBpdG9hKGlkKSwKCQkicm91dGUiLCAiYXJiaXRlciIsCgkJImF3YXJkIiwgaXRvYShhd2FyZFRvSG9sZGVyKSwKCQkiY3JlZGl0ZWQiLCBpdG9hKGNyZWRpdGVkKSwKCQkiZmVlIiwgaXRvYShmZWUpLAoJCSJyZWZ1bmQiLCBpdG9hKGQuYW1vdW50LWF3YXJkVG9Ib2xkZXIpLAoJKQp9CgovLyAtLS0gcGVybWlzc2lvbmxlc3MgdmFsdmVzOiBubyB0ZXJtaW5hbCBzdGF0ZSBkZXBlbmRzIG9uIGEgcGFydHkgYWN0aW5nIC0tLQoKLy8gUmVsZWFzZVVuY2xhaW1lZCByZWZ1bmRzIHRoZSB3aG9sZSBkZXBvc2l0IGJlY2F1c2UgdGhlIGhvbGRlciBuZXZlciBmaWxlZCBhCi8vIGNsYWltIGJlZm9yZSB0aGUgd2luZG93IGNsb3NlZC4gQW55b25lIG1heSBjYWxsIGl0LgpmdW5jIFJlbGVhc2VVbmNsYWltZWQoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWQgOj0gbXVzdEFncmVlbWVudChpZCkKCWlmIGQuc3RhdHVzICE9IERlcG9zaXRGdW5kZWQgewoJCXBhbmljKCJhZ3JlZW1lbnQgaXMgIiArIGQuc3RhdHVzKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgZC5jbGFpbURlYWRsaW5lIHsKCQlwYW5pYygidGhlIGNsYWltIHdpbmRvdyBpcyBvcGVuIHVudGlsIGhlaWdodCAiICsgaXRvYShkLmNsYWltRGVhZGxpbmUpKQoJfQoJc2V0dGxlKGQsIDAsIGZhbHNlKQoJY2hhaW4uRW1pdCgiU2V0dGxlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJInJvdXRlIiwgInVuY2xhaW1lZCIsCgkJImF3YXJkIiwgIjAiLAoJCSJyZWZ1bmQiLCBpdG9hKGQuYW1vdW50KSwKCSkKfQoKLy8gU2V0dGxlVW5kaXNwdXRlZCBzZXR0bGVzIGF0IHRoZSBjbGFpbWVkIGFtb3VudCBiZWNhdXNlIHRoZSBkZXBvc2l0b3IgbmVpdGhlcgovLyBhY2NlcHRlZCBub3IgZGlzcHV0ZWQgYmVmb3JlIHRoZSBkaXNwdXRlIHdpbmRvdyBjbG9zZWQuIEFueW9uZSBtYXkgY2FsbCBpdC4KZnVuYyBTZXR0bGVVbmRpc3B1dGVkKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglpZiBkLnN0YXR1cyAhPSBEZXBvc2l0Q2xhaW1lZCB7CgkJcGFuaWMoImFncmVlbWVudCBpcyAiICsgZC5zdGF0dXMpCgl9CglpZiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPCBkLmRpc3B1dGVEZWFkbGluZSB7CgkJcGFuaWMoInRoZSBkaXNwdXRlIHdpbmRvdyBpcyBvcGVuIHVudGlsIGhlaWdodCAiICsgaXRvYShkLmRpc3B1dGVEZWFkbGluZSkpCgl9Cglhd2FyZCA6PSBkLmNsYWltQW1vdW50CgljcmVkaXRlZCwgZmVlIDo9IHNldHRsZShkLCBhd2FyZCwgZmFsc2UpCgljaGFpbi5FbWl0KCJTZXR0bGVkIiwKCQkiaWQiLCBpdG9hKGlkKSwKCQkicm91dGUiLCAidW5kaXNwdXRlZCIsCgkJImF3YXJkIiwgaXRvYShhd2FyZCksCgkJImNyZWRpdGVkIiwgaXRvYShjcmVkaXRlZCksCgkJImZlZSIsIGl0b2EoZmVlKSwKCQkicmVmdW5kIiwgaXRvYShkLmFtb3VudC1hd2FyZCksCgkpCn0KCi8vIExhcHNlRGlzcHV0ZSByZWZ1bmRzIHRoZSB3aG9sZSBkZXBvc2l0IGJlY2F1c2UgdGhlIGFyYml0ZXIgZGlkIG5vdCBydWxlIGJlZm9yZQovLyB0aGVpciBkZWFkbGluZS4gQW55b25lIG1heSBjYWxsIGl0LiBUaGUgYXdhcmQgaXMgMCwgbm90IHRoZSBjbGFpbTogYW4KLy8gdW5zdWJzdGFudGlhdGVkIGNsYWltIGZhaWxzLiBUaGUgaG9sZGVyIGNob3NlIHRoZSBhcmJpdGVyIGFuZCBiZWFycyB0aGUgY29zdAovLyBvZiB0aGF0IGNob2ljZSBmYWlsaW5nIOKAlCB3aGljaCBpcyBhbHNvIHdoeSBhIGRpc2FwcGVhcmVkIGFyYml0ZXIgY2FuIG5ldmVyCi8vIHN0cmFuZCBhIGRlcG9zaXQuCmZ1bmMgTGFwc2VEaXNwdXRlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglpZiBkLnN0YXR1cyAhPSBEZXBvc2l0RGlzcHV0ZWQgewoJCXBhbmljKCJhZ3JlZW1lbnQgaXMgIiArIGQuc3RhdHVzKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgZC5hcmJpdGVyRGVhZGxpbmUgewoJCXBhbmljKCJ0aGUgYXJiaXRlciBoYXMgdW50aWwgaGVpZ2h0ICIgKyBpdG9hKGQuYXJiaXRlckRlYWRsaW5lKSkKCX0KCXNldHRsZShkLCAwLCB0cnVlKQoJY2hhaW4uRW1pdCgiU2V0dGxlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJInJvdXRlIiwgImxhcHNlZCIsCgkJImF3YXJkIiwgIjAiLAoJCSJyZWZ1bmQiLCBpdG9hKGQuYW1vdW50KSwKCSkKfQoKLy8gQ2FuY2VsVW5mdW5kZWQgYWJhbmRvbnMgYW4gYWdyZWVtZW50IHRoZSBkZXBvc2l0b3IgbmV2ZXIgZnVuZGVkLiBFaXRoZXIgcGFydHkKLy8gbWF5IGNhbmNlbCBhdCBhbnkgdGltZSDigJQgcmVmdXNpbmcgdG8gZnVuZCBpcyB0aGUgZGVwb3NpdG9yJ3MgcmlnaHQgYW5kCi8vIHdpdGhkcmF3aW5nIHRoZSBvZmZlciBpcyB0aGUgaG9sZGVyJ3Mg4oCUIGFuZCBBTllPTkUgbWF5IGNhbmNlbCBvbmNlIHRoZSBmdW5kCi8vIGRlYWRsaW5lIGhhcyBwYXNzZWQsIHNvIGEgZGVhZCBvZmZlciBjYW5ub3QgaG9sZCBhIHNsb3QgZm9yZXZlci4gTm8gY29pbnMgaGF2ZQovLyBldmVyIGJlZW4gaGVsZCwgc28gbm90aGluZyBtb3Zlcy4KZnVuYyBDYW5jZWxVbmZ1bmRlZChjdXIgcmVhbG0sIGlkIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJZCA6PSBtdXN0QWdyZWVtZW50KGlkKQoJaWYgZC5zdGF0dXMgIT0gRGVwb3NpdE9wZW4gewoJCXBhbmljKCJhZ3JlZW1lbnQgaXMgIiArIGQuc3RhdHVzKQoJfQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJcGFydHkgOj0gY2FsbGVyID09IGQuaG9sZGVyIHx8IGNhbGxlciA9PSBkLmRlcG9zaXRvcgoJaWYgIXBhcnR5ICYmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IGQuZnVuZERlYWRsaW5lIHsKCQlwYW5pYygib25seSB0aGUgaG9sZGVyIG9yIHRoZSBkZXBvc2l0b3IgbWF5IGNhbmNlbCBiZWZvcmUgaGVpZ2h0ICIgKyBpdG9hKGQuZnVuZERlYWRsaW5lKSkKCX0KCWQuc3RhdHVzID0gRGVwb3NpdENhbmNlbGxlZAoJY2hhaW4uRW1pdCgiQ2FuY2VsbGVkIiwgImlkIiwgaXRvYShpZCksICJieSIsIGNhbGxlci5TdHJpbmcoKSkKfQoKLy8gLS0tIGNsYWltcyAocHVsbDogcmVmdW5kcywgYXdhcmRzIGFuZCBmZWVzKSAtLS0KCi8vIENsYWltIHNlbmRzIGFtb3VudCB1Z25vdCBvZiB0aGUgY2FsbGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2Ug4oCUIHJlZnVuZHMgYW5kCi8vIGF3YXJkcyBmcm9tIHNldHRsZWQgYWdyZWVtZW50cyDigJQgdG8gdGhlIGNhbGxlci4KZnVuYyBDbGFpbShjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGVyciA6PSBsZWRnZXIuV2l0aGRyYXcoY2FsbGVyLlN0cmluZygpLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIENsYWltQWxsIHNlbmRzIHRoZSBjYWxsZXIncyBlbnRpcmUgY2xhaW1hYmxlIGJhbGFuY2UgdG8gdGhlIGNhbGxlci4KZnVuYyBDbGFpbUFsbChjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gLS0tIGFkbWluaXN0cmF0aW9uICh0d28tc3RlcCB0cmFuc2ZlciwgdGhlIGhvdXNlIHBhdHRlcm4pIC0tLQoKZnVuYyBTZXRGZWVCcHMoY3VyIHJlYWxtLCBicHMgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KCWlmIGJwcyA8IDAgfHwgYnBzID4gTWF4RmVlQnBzIHsKCQlwYW5pYygiZmVlIG11c3QgYmUgMC4uIiArIGl0b2EoTWF4RmVlQnBzKSArICIgYnBzIikKCX0KCWZlZUJwcyA9IGJwcwoJY2hhaW4uRW1pdCgiRmVlU2V0IiwgImJwcyIsIGl0b2EoYnBzKSkKfQoKLy8gU2V0RmVlUmVjaXBpZW50IG5hbWVzIHRoZSBhZGRyZXNzIHRoYXQgbWF5IHdpdGhkcmF3IHRoZSBhY2NydWVkIGZlZSBwb3QuCi8vCi8vIEl0IGRlbGliZXJhdGVseSBkb2VzIE5PVCBlbmZvcmNlIGRpc2pvaW50bmVzcyBmcm9tIGFncmVlbWVudCBwYXJ0aWVzLCBpbgovLyBjb250cmFzdCB0byBPcGVuQWdyZWVtZW50LCB3aGljaCByZWZ1c2VzIGFuIGFyYml0ZXIgZXF1YWwgdG8gZWl0aGVyIHBhcnR5LgovLyBUaGUgdHdvIHJ1bGVzIGFyZSBub3QgY29tcGFyYWJsZSwgYW5kIHRoZSBhc3ltbWV0cnkgaXMgdGhlIHBvaW50OgovLwovLyAgIC0gVGhlIGFyYml0ZXIgcnVsZSBpcyBwZXItYWdyZWVtZW50IGFuZCBjaGVja2VkIGF0IHRoZSBtb21lbnQgdGhlCi8vICAgICBhZ3JlZW1lbnQgaXMgY3JlYXRlZCwgc28gaXQgaXMgYW4gaW52YXJpYW50IG9mIHRoYXQgYWdyZWVtZW50IGZvciBsaWZlLgovLyAgIC0gVGhlIGZlZSByZWNpcGllbnQgaXMgb25lIGdsb2JhbCBvdmVyIGFuIHVuYm91bmRlZCwgZ3Jvd2luZyBzZXQgb2YKLy8gICAgIGFncmVlbWVudHMuIEEgY2hlY2sgaGVyZSBjb3VsZCBvbmx5IHRlc3QgYSBzbmFwc2hvdCwgYW5kIHRoZSB2ZXJ5IG5leHQKLy8gICAgIE9wZW5BZ3JlZW1lbnQgY291bGQgbmFtZSB0aGUgc2l0dGluZyByZWNpcGllbnQgYXMgaG9sZGVyIG9yIGRlcG9zaXRvci4KLy8gICAgIEEgZ3VhcmQgdGhhdCBhbnkgbGF0ZXIgdHJhbnNhY3Rpb24gY2FuIHdhbGsgdGhyb3VnaCBpcyB3b3JzZSB0aGFuIG5vCi8vICAgICBndWFyZDogaXQgcmVhZHMgYXMgYW4gaW52YXJpYW50IGFuZCBpcyBub3Qgb25lLgovLwovLyBOb3RoaW5nIGlzIGF0IHN0YWtlIGluIHRoZSBvdmVybGFwLCB3aGljaCBpcyB3aHkgdGhlIGhvbmVzdCBhbnN3ZXIgaXMgYQovLyBkb2N1bWVudGVkIG9taXNzaW9uIHJhdGhlciB0aGFuIGEgZGVjb3JhdGl2ZSBjaGVjay4gVGhlIGZlZSBpcyBkZXJpdmVkIG9ubHkKLy8gZnJvbSB0aGUgaG9sZGVyJ3MgYXdhcmQgaW5zaWRlIGxlZGdlci5NdXN0RGVwb3NpdCwgbmV2ZXIgZnJvbSB0aGUgcmVmdW5kLCBzbwovLyBhIHJlY2lwaWVudCB3aG8gaXMgYWxzbyBhIGhvbGRlciBjb2xsZWN0cyB0aGUgc2FtZSBjb2lucyBieSB0d28gcm91dGVzCi8vIGluc3RlYWQgb2YgbW9yZSBjb2lucy4gU29sdmVuY3kgaXMgdW5hZmZlY3RlZCBpbiBlaXRoZXIgZGlyZWN0aW9uOgovLyBmZWVsZWRnZXIgYWNjb3VudHMgdXNlciBjcmVkaXQgYW5kIHRoZSBmZWUgcG90IGFzIHNlcGFyYXRlIGJ1Y2tldHMsIGJvdGggYXJlCi8vIGluc2lkZSBsZWRnZXIuTGlhYmlsaXRpZXMoKSwgYW5kIFN3ZWVwRGVub20ncyByZXNlcnZlIGlzCi8vIGxvY2tlZCArIGNvbnRlc3RlZCArIGxlZGdlci5MaWFiaWxpdGllcygpIOKAlCBzbyBhbiBvdmVybGFwcGluZyByZWNpcGllbnQKLy8gY2Fubm90IG1ha2UgdGhlIHN3ZXB0IHN1cnBsdXMgb3ZlcnN0YXRlIHdoYXQgdGhlIHJlYWxtIGlzIGZyZWUgdG8gcmVsZWFzZS4KZnVuYyBTZXRGZWVSZWNpcGllbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgIXJlY2lwaWVudC5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHJlY2lwaWVudCIpCgl9CglmZWVSZWNpcGllbnQgPSByZWNpcGllbnQKCWNoYWluLkVtaXQoIkZlZVJlY2lwaWVudFNldCIsICJ0byIsIHJlY2lwaWVudC5TdHJpbmcoKSkKfQoKZnVuYyBXaXRoZHJhd0ZlZXMoY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGZlZVJlY2lwaWVudCB7CgkJcGFuaWMoImZlZSByZWNpcGllbnQgb25seSIpCgl9CglhbW91bnQgOj0gbGVkZ2VyLldpdGhkcmF3RmVlcygpCglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIGZlZXMgYWNjcnVlZCIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgZmVlUmVjaXBpZW50LCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIGZlZVJlY2lwaWVudC5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gU3dlZXBEZW5vbSByZWNvdmVycyBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgZmVlIHJlY2lwaWVudC4gRm9yIHRoZSBsZWRnZXIKLy8gZGVub20gdGhlIHJlc2VydmUgaXMgbG9ja2VkICsgY29udGVzdGVkICsgTGlhYmlsaXRpZXMoKSDigJQgaGVsZCBkZXBvc2l0cywKLy8gY29udGVzdGVkIGRlcG9zaXRzLCBjbGFpbWFibGUgcmVmdW5kcywgYXdhcmRzIGFuZCB0aGUgZmVlIHBvdCBhcmUgYWxsCi8vIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZS4KZnVuYyBTd2VlcERlbm9tKGN1ciByZWFsbSwgZGVub20gc3RyaW5nKSB7Cglhc3NlcnROb1NlbmQoKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGZlZVJlY2lwaWVudCB7CgkJcGFuaWMoImZlZSByZWNpcGllbnQgb25seSIpCgl9CglyZXNlcnZlIDo9IGludDY0KDApCglpZiBkZW5vbSA9PSBEZW5vbSB7CgkJcmVzZXJ2ZSA9IGxvY2tlZCArIGNvbnRlc3RlZCArIGxlZGdlci5MaWFiaWxpdGllcygpCgl9Cglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBmZWVSZWNpcGllbnQsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiY29pbnMiLCBpdG9hKHN3ZXB0KStkZW5vbSkKfQoKZnVuYyBUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgc3VjY2Vzc29yIGFkZHJlc3MpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KCWlmICFzdWNjZXNzb3IuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBzdWNjZXNzb3IiKQoJfQoJcGVuZGluZ0FkbWluID0gc3VjY2Vzc29yCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVyU3RhZ2VkIiwgInRvIiwgc3VjY2Vzc29yLlN0cmluZygpKQp9CgpmdW5jIEFjY2VwdEFkbWluKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHBlbmRpbmdBZG1pbiA9PSAiIiB8fCBjYWxsZXIgIT0gcGVuZGluZ0FkbWluIHsKCQlwYW5pYygibm8gYWRtaW4gdHJhbnNmZXIgc3RhZ2VkIGZvciBjYWxsZXIiKQoJfQoJYWRtaW4gPSBwZW5kaW5nQWRtaW4KCXBlbmRpbmdBZG1pbiA9ICIiCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVycmVkIiwgInRvIiwgY2FsbGVyLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgKG5vbi1jcm9zc2luZzogY3Jvc3MtcmVhbG0gcmVhZGFibGUpIC0tLQoKLy8gQWdyZWVtZW50SW5mbyByZXR1cm5zIHRoZSB3aG9sZSBhZ3JlZW1lbnQgaW4gb25lIHJlYWQsIHNvIGEgZGVwb3NpdG9yCi8vIGRlY2lkaW5nIHdoZXRoZXIgdG8gZnVuZCBkb2VzIG5vdCBoYXZlIHRvIGNvbXBvc2UgbmluZSBjYWxscy4KZnVuYyBBZ3JlZW1lbnRJbmZvKGlkIGludDY0KSAoaG9sZGVyLCBkZXBvc2l0b3IsIGFyYml0ZXIgYWRkcmVzcywgYW1vdW50LCBmb3JmZWl0Q2VpbGluZywgZmVlQnBzLCB0ZXJtRW5kLCBjbGFpbURlYWRsaW5lLCBkaXNwdXRlRGVhZGxpbmUsIGFyYml0ZXJEZWFkbGluZSwgY2xhaW1BbW91bnQsIGF3YXJkIGludDY0LCBzdGF0dXMgc3RyaW5nKSB7CglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglyZXR1cm4gZC5ob2xkZXIsIGQuZGVwb3NpdG9yLCBkLmFyYml0ZXIsIGQuYW1vdW50LCBkLmZvcmZlaXRDZWlsaW5nLCBkLmZlZUJwcywKCQlkLnRlcm1FbmQsIGQuY2xhaW1EZWFkbGluZSwgZC5kaXNwdXRlRGVhZGxpbmUsIGQuYXJiaXRlckRlYWRsaW5lLAoJCWQuY2xhaW1BbW91bnQsIGQuYXdhcmQsIGQuc3RhdHVzCn0KCmZ1bmMgTWVtbyhpZCBpbnQ2NCkgc3RyaW5nICAgICAgICAgIHsgcmV0dXJuIG11c3RBZ3JlZW1lbnQoaWQpLm1lbW8gfQpmdW5jIENsYWltUmVhc29uKGlkIGludDY0KSBzdHJpbmcgICB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5jbGFpbVJlYXNvbiB9CmZ1bmMgRGlzcHV0ZVJlYXNvbihpZCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RBZ3JlZW1lbnQoaWQpLmRpc3B1dGVSZWFzb24gfQoKZnVuYyBIb2xkZXIoaWQgaW50NjQpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuaG9sZGVyIH0KZnVuYyBEZXBvc2l0b3IoaWQgaW50NjQpIGFkZHJlc3MgICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuZGVwb3NpdG9yIH0KZnVuYyBBcmJpdGVyKGlkIGludDY0KSBhZGRyZXNzICAgICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuYXJiaXRlciB9CmZ1bmMgQW1vdW50KGlkIGludDY0KSBpbnQ2NCAgICAgICAgIHsgcmV0dXJuIG11c3RBZ3JlZW1lbnQoaWQpLmFtb3VudCB9CmZ1bmMgRm9yZmVpdENlaWxpbmcoaWQgaW50NjQpIGludDY0IHsgcmV0dXJuIG11c3RBZ3JlZW1lbnQoaWQpLmZvcmZlaXRDZWlsaW5nIH0KZnVuYyBGZWVCcHNPZihpZCBpbnQ2NCkgaW50NjQgICAgICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuZmVlQnBzIH0KZnVuYyBTdGF0dXMoaWQgaW50NjQpIHN0cmluZyAgICAgICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuc3RhdHVzIH0KZnVuYyBDbGFpbUFtb3VudChpZCBpbnQ2NCkgaW50NjQgICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuY2xhaW1BbW91bnQgfQpmdW5jIEF3YXJkKGlkIGludDY0KSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5hd2FyZCB9CmZ1bmMgVGVybUVuZChpZCBpbnQ2NCkgaW50NjQgICAgICAgIHsgcmV0dXJuIG11c3RBZ3JlZW1lbnQoaWQpLnRlcm1FbmQgfQpmdW5jIENsYWltRGVhZGxpbmUoaWQgaW50NjQpIGludDY0ICB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5jbGFpbURlYWRsaW5lIH0KZnVuYyBGdW5kRGVhZGxpbmUoaWQgaW50NjQpIGludDY0ICAgeyByZXR1cm4gbXVzdEFncmVlbWVudChpZCkuZnVuZERlYWRsaW5lIH0KCi8vIERpc3B1dGVEZWFkbGluZU9mIGlzIHRoZSBsYXN0IGhlaWdodCBhdCB3aGljaCB0aGUgZGVwb3NpdG9yIG1heSBEaXNwdXRlIGEKLy8gc3RhbmRpbmcgY2xhaW07IEFyYml0ZXJEZWFkbGluZU9mIGlzIHRoZSBsYXN0IGhlaWdodCBhdCB3aGljaCB0aGUgYXJiaXRlcidzCi8vIHJ1bGluZyBwcmUtZW1wdHMgTGFwc2VEaXNwdXRlLiBCb3RoIGFyZSAwIHVudGlsIHRoZSByZWxldmFudCBzdGFnZSBpcyBsaXZlLgpmdW5jIERpc3B1dGVEZWFkbGluZU9mKGlkIGludDY0KSBpbnQ2NCB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5kaXNwdXRlRGVhZGxpbmUgfQpmdW5jIEFyYml0ZXJEZWFkbGluZU9mKGlkIGludDY0KSBpbnQ2NCB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5hcmJpdGVyRGVhZGxpbmUgfQoKZnVuYyBDcmVhdGVkSGVpZ2h0KGlkIGludDY0KSBpbnQ2NCB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5jcmVhdGVkSGVpZ2h0IH0KZnVuYyBGdW5kZWRIZWlnaHQoaWQgaW50NjQpIGludDY0ICB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5mdW5kZWRIZWlnaHQgfQpmdW5jIFNldHRsZWRIZWlnaHQoaWQgaW50NjQpIGludDY0IHsgcmV0dXJuIG11c3RBZ3JlZW1lbnQoaWQpLnNldHRsZWRIZWlnaHQgfQoKLy8gUmVmdW5kIGlzIHRoZSBhbW91bnQgdGhlIGRlcG9zaXRvciBnZXRzIGJhY2ssIGtub3duIG9ubHkgb25jZSBzZXR0bGVkLgpmdW5jIFJlZnVuZChpZCBpbnQ2NCkgaW50NjQgewoJZCA6PSBtdXN0QWdyZWVtZW50KGlkKQoJaWYgZC5zdGF0dXMgIT0gRGVwb3NpdFNldHRsZWQgewoJCXBhbmljKCJhZ3JlZW1lbnQgaXMgIiArIGQuc3RhdHVzICsgIjsgdGhlIHNwbGl0IGlzIG5vdCBkZWNpZGVkIikKCX0KCXJldHVybiBkLmFtb3VudCAtIGQuYXdhcmQKfQoKLy8gTWF4Q2xhaW1hYmxlIGlzIHRoZSBtb3N0IHRoZSBob2xkZXIgY291bGQgc3RpbGwgdGFrZSBvdXQgb2YgdGhpcyBhZ3JlZW1lbnQuCi8vIEl0IGlzIHRoZSBjZWlsaW5nIHdoaWxlIHRoZSBkZXBvc2l0IGlzIGZ1bmRlZCwgdGhlIGZpbGVkIGNsYWltIG9uY2Ugb25lCi8vIHN0YW5kcywgYW5kIDAgb25jZSB0aGUgYWdyZWVtZW50IGlzIHRlcm1pbmFsLgpmdW5jIE1heENsYWltYWJsZShpZCBpbnQ2NCkgaW50NjQgewoJZCA6PSBtdXN0QWdyZWVtZW50KGlkKQoJc3dpdGNoIGQuc3RhdHVzIHsKCWNhc2UgRGVwb3NpdE9wZW4sIERlcG9zaXRGdW5kZWQ6CgkJcmV0dXJuIGQuZm9yZmVpdENlaWxpbmcKCWNhc2UgRGVwb3NpdENsYWltZWQsIERlcG9zaXREaXNwdXRlZDoKCQlyZXR1cm4gZC5jbGFpbUFtb3VudAoJZGVmYXVsdDoKCQlyZXR1cm4gMAoJfQp9CgpmdW5jIElzU2V0dGxlZChpZCBpbnQ2NCkgYm9vbCB7IHJldHVybiBtdXN0QWdyZWVtZW50KGlkKS5zdGF0dXMgPT0gRGVwb3NpdFNldHRsZWQgfQoKLy8gSXNDbGFpbWFibGUgcmVwb3J0cyB3aGV0aGVyIEZpbGVDbGFpbSB3b3VsZCBiZSBhY2NlcHRlZCBhdCB0aGlzIGhlaWdodC4KZnVuYyBJc0NsYWltYWJsZShpZCBpbnQ2NCkgYm9vbCB7CglkIDo9IG11c3RBZ3JlZW1lbnQoaWQpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglyZXR1cm4gZC5zdGF0dXMgPT0gRGVwb3NpdEZ1bmRlZCAmJiBub3cgPj0gZC50ZXJtRW5kICYmIG5vdyA8IGQuY2xhaW1EZWFkbGluZQp9CgovLyBJc0Rpc3B1dGFibGUgcmVwb3J0cyB3aGV0aGVyIERpc3B1dGUgd291bGQgYmUgYWNjZXB0ZWQgYXQgdGhpcyBoZWlnaHQuCmZ1bmMgSXNEaXNwdXRhYmxlKGlkIGludDY0KSBib29sIHsKCWQgOj0gbXVzdEFncmVlbWVudChpZCkKCXJldHVybiBkLnN0YXR1cyA9PSBEZXBvc2l0Q2xhaW1lZCAmJiBkLmFyYml0ZXIgIT0gIiIgJiYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgZC5kaXNwdXRlRGVhZGxpbmUKfQoKLy8gUGVuZGluZ1ZhbHZlIG5hbWVzIHRoZSBwZXJtaXNzaW9ubGVzcyBjYWxsIHRoaXMgYWdyZWVtZW50IGlzIHJlYWR5IGZvciwgb3IgIiIKLy8gd2hlbiBub25lIGlzLiBJdCBpcyB0aGUgb25lIHZpZXcgYSBrZWVwZXIgbmVlZHMuCmZ1bmMgUGVuZGluZ1ZhbHZlKGlkIGludDY0KSBzdHJpbmcgewoJZCA6PSBtdXN0QWdyZWVtZW50KGlkKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJc3dpdGNoIGQuc3RhdHVzIHsKCWNhc2UgRGVwb3NpdE9wZW46CgkJaWYgbm93ID49IGQuZnVuZERlYWRsaW5lIHsKCQkJcmV0dXJuICJDYW5jZWxVbmZ1bmRlZCIKCQl9CgljYXNlIERlcG9zaXRGdW5kZWQ6CgkJaWYgbm93ID49IGQuY2xhaW1EZWFkbGluZSB7CgkJCXJldHVybiAiUmVsZWFzZVVuY2xhaW1lZCIKCQl9CgljYXNlIERlcG9zaXRDbGFpbWVkOgoJCWlmIG5vdyA+PSBkLmRpc3B1dGVEZWFkbGluZSB7CgkJCXJldHVybiAiU2V0dGxlVW5kaXNwdXRlZCIKCQl9CgljYXNlIERlcG9zaXREaXNwdXRlZDoKCQlpZiBub3cgPj0gZC5hcmJpdGVyRGVhZGxpbmUgewoJCQlyZXR1cm4gIkxhcHNlRGlzcHV0ZSIKCQl9Cgl9CglyZXR1cm4gIiIKfQoKZnVuYyBIYXNBZ3JlZW1lbnQoaWQgaW50NjQpIGJvb2wgeyByZXR1cm4gYWdyZWVtZW50cy5HZXQocGFkSUQoaWQpKSAhPSBuaWwgfQoKZnVuYyBBZ3JlZW1lbnRzT2YoaG9sZGVyIGFkZHJlc3MpIGludDY0IHsKCXYgOj0gaG9sZGVyTnVtLkdldChob2xkZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiAqdi4oKmludDY0KQp9CgpmdW5jIEFkbWluKCkgYWRkcmVzcyAgICAgICAgICAgICAgeyByZXR1cm4gYWRtaW4gfQpmdW5jIFBlbmRpbmdBZG1pbigpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gcGVuZGluZ0FkbWluIH0KZnVuYyBGZWVSZWNpcGllbnQoKSBhZGRyZXNzICAgICAgIHsgcmV0dXJuIGZlZVJlY2lwaWVudCB9CmZ1bmMgRmVlQnBzKCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBmZWVCcHMgfQpmdW5jIE51bUFncmVlbWVudHMoKSBpbnQ2NCAgICAgICAgeyByZXR1cm4gbmV4dElEIH0KZnVuYyBDbGFpbWFibGVPZihhIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYS5TdHJpbmcoKSkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gbGVkZ2VyLkZlZXNBY2NydWVkKCkgfQpmdW5jIExpYWJpbGl0aWVzKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gbGVkZ2VyLkxpYWJpbGl0aWVzKCkgfQpmdW5jIExvY2tlZCgpIGludDY0ICAgICAgICAgICAgICAgeyByZXR1cm4gbG9ja2VkIH0KZnVuYyBDb250ZXN0ZWQoKSBpbnQ2NCAgICAgICAgICAgIHsgcmV0dXJuIGNvbnRlc3RlZCB9CmZ1bmMgSGVsZCgpIGludDY0ICAgICAgICAgICAgICAgICB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgICAgICAgICAgICB7IHJldHVybiBzZWxmIH0KZnVuYyBIZWlnaHQoKSBpbnQ2NCAgICAgICAgICAgICAgIHsgcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB9CgovLyAtLS0gaW50ZXJuYWxzIC0tLQoKLy8gc2V0dGxlIGNyZWRpdHMgdGhlIHNwbGl0IGFuZCBtb3ZlcyB0aGUgZGVwb3NpdCBvdXQgb2YgaXRzIGN1c3RvZHkgYnVja2V0LiBUaGUKLy8gY2FsbGVyIGhhcyBhbHJlYWR5IGVzdGFibGlzaGVkIHRoZSByb3V0ZSdzIGF1dGhvcml0eSBhbmQgdGltaW5nOyBgYXdhcmRgIGlzIGluCi8vIFswLCBhbW91bnRdIGFuZCBgZnJvbUNvbnRlc3RlZGAgc2F5cyB3aGljaCBidWNrZXQgdGhlIGRlcG9zaXQgc2l0cyBpbi4KLy8KLy8gQ29uc2VydmF0aW9uLCBpbiBkZWx0YSBmb3JtOiBIZWxkIGlzIHVuY2hhbmdlZDsgbG9ja2VkIE9SIGNvbnRlc3RlZCBmYWxscyBieQovLyBhbW91bnQ7IExpYWJpbGl0aWVzIHJpc2VzIGJ5IGF3YXJkICsgKGFtb3VudC1hd2FyZCkgPT0gYW1vdW50LiBTbwovLyBIZWxkID09IGxvY2tlZCArIGNvbnRlc3RlZCArIExpYWJpbGl0aWVzIGlzIHByZXNlcnZlZCBleGFjdGx5LgovLwovLyBUaGUgZmVlIGlzIGNoYXJnZWQgT05MWSBvbiB0aGUgYXdhcmQuIFRoZSByZWZ1bmQgaXMgZGVwb3NpdGVkIGF0IGZlZSAwLCBzbyBhCi8vIGZ1bGx5LXJlZnVuZGVkIGRlcG9zaXQgcmV0dXJucyB0byB0aGUgZGVwb3NpdG9yIGluIGZ1bGwuCmZ1bmMgc2V0dGxlKGQgKmFncmVlbWVudCwgYXdhcmQgaW50NjQsIGZyb21Db250ZXN0ZWQgYm9vbCkgKGNyZWRpdGVkLCBmZWUgaW50NjQpIHsKCWlmIGF3YXJkIDwgMCB8fCBhd2FyZCA+IGQuYW1vdW50IHsKCQkvLyBVbnJlYWNoYWJsZTogZXZlcnkgcm91dGUgYm91bmRzIHRoZSBhd2FyZCBieSBjbGFpbUFtb3VudCwgaXRzZWxmCgkJLy8gYm91bmRlZCBieSBmb3JmZWl0Q2VpbGluZyA8PSBhbW91bnQuIEtlcHQgYXMgYSBzb2x2ZW5jeSBiYWNrc3RvcC4KCQlwYW5pYygiYXdhcmQgb3V0IG9mIHJhbmdlIikKCX0KCWlmIGZyb21Db250ZXN0ZWQgewoJCWNvbnRlc3RlZCAtPSBkLmFtb3VudAoJfSBlbHNlIHsKCQlsb2NrZWQgLT0gZC5hbW91bnQKCX0KCWlmIGF3YXJkID4gMCB7CgkJY3JlZGl0ZWQsIGZlZSA9IGxlZGdlci5NdXN0RGVwb3NpdChkLmhvbGRlci5TdHJpbmcoKSwgYXdhcmQsIGQuZmVlQnBzKQoJfQoJaWYgcmVmdW5kIDo9IGQuYW1vdW50IC0gYXdhcmQ7IHJlZnVuZCA+IDAgewoJCWxlZGdlci5NdXN0RGVwb3NpdChkLmRlcG9zaXRvci5TdHJpbmcoKSwgcmVmdW5kLCAwKQoJfQoJZC5hd2FyZCA9IGF3YXJkCglkLnNldHRsZWRIZWlnaHQgPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWQuc3RhdHVzID0gRGVwb3NpdFNldHRsZWQKCXJldHVybiBjcmVkaXRlZCwgZmVlCn0KCmZ1bmMgbXVzdEFncmVlbWVudChpZCBpbnQ2NCkgKmFncmVlbWVudCB7Cgl2IDo9IGFncmVlbWVudHMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBhZ3JlZW1lbnQgIiArIGl0b2EoaWQpKQoJfQoJcmV0dXJuIHYuKCphZ3JlZW1lbnQpCn0KCmZ1bmMgYXNzZXJ0Tm9TZW5kKCkgewoJaWYgIXVuc2FmZS5PcmlnaW5TZW5kKCkuSXNaZXJvKCkgewoJCXBhbmljKCJ0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCmZ1bmMgY291bnRlcih0cmVlICphdmwuVHJlZSwgYSBhZGRyZXNzKSAqaW50NjQgewoJayA6PSBhLlN0cmluZygpCglpZiB2IDo9IHRyZWUuR2V0KGspOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCppbnQ2NCkKCX0KCW4gOj0gaW50NjQoMCkKCXRyZWUuU2V0KGssICZuKQoJcmV0dXJuICZuCn0KCmZ1bmMgYWRkQ2hlY2tlZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXMgOj0gYSArIGIKCWlmIChiID4gMCAmJiBzIDwgYSkgfHwgKGIgPCAwICYmIHMgPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gcywgdHJ1ZQp9CgpmdW5jIHBhZElEKGlkIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChpZCwgMTApCglmb3IgbGVuKHMpIDwgMTIgewoJCXMgPSAiMCIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CgpmdW5jIGFkZHJTdHIoYSBhZGRyZXNzKSBzdHJpbmcgewoJaWYgYSA9PSAiIiB7CgkJcmV0dXJuICIobm9uZSkiCgl9CglyZXR1cm4gYS5TdHJpbmcoKQp9CgpmdW5jIGhhc1ByZWZpeChzLCBwIHN0cmluZykgYm9vbCB7IHJldHVybiBsZW4ocykgPj0gbGVuKHApICYmIHNbOmxlbihwKV0gPT0gcCB9CgovLyAtLS0gUmVuZGVyIC0tLQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJIb21lKCkKCWNhc2UgaGFzUHJlZml4KHBhdGgsICJhZ3JlZW1lbnQvIik6CgkJcmV0dXJuIHJlbmRlckFncmVlbWVudChwYXRoW2xlbigiYWdyZWVtZW50LyIpOl0pCglkZWZhdWx0OgoJCXJldHVybiAidW5rbm93biBwYXRoOyB0cnkgXCJcIiBvciBcImFncmVlbWVudC88aWQ+XCJcbiIKCX0KfQoKZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsKCW91dCA6PSAiIyBkZXBvc2l0cyDigJQgcmVmdW5kYWJsZSBzZWN1cml0eSBkZXBvc2l0cyB3aXRoIGNvbmRpdGlvbi1nYXRlZCBmb3JmZWl0dXJlXG5cbiIKCW91dCArPSAiQWdyZWVtZW50czogIiArIGl0b2EobmV4dElEKSArICIgwrcgaGVsZCBkZXBvc2l0czogIiArIGl0b2EobG9ja2VkKSArIERlbm9tICsKCQkiIMK3IGNvbnRlc3RlZDogIiArIGl0b2EoY29udGVzdGVkKSArIERlbm9tICsKCQkiIMK3IGNsYWltYWJsZStmZWVzOiAiICsgaXRvYShsZWRnZXIuTGlhYmlsaXRpZXMoKSkgKyBEZW5vbSArCgkJIiDCtyBmZWVzIGFjY3J1ZWQ6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuXG4iCglvdXQgKz0gIkEgaG9sZGVyIG9mZmVycyBhbiBhZ3JlZW1lbnQgd2l0aCBhICoqZm9yZmVpdCBjZWlsaW5nKio7IHRoZSBkZXBvc2l0b3IgY29uc2VudHMgYnkgZnVuZGluZyBpdC4gIiArCgkJIkF0IHRoZSBlbmQgb2YgdGhlIHRlcm0gdGhlIGhvbGRlciBtYXkgY2xhaW0gdXAgdG8gdGhlIGNlaWxpbmcsIHRoZSBkZXBvc2l0b3IgbWF5IGFjY2VwdCBvciBkaXNwdXRlLCAiICsKCQkiYW5kIHdoYXRldmVyIGlzIG5vdCBhd2FyZGVkIGlzIHJlZnVuZGVkLiBTZXR0bGVtZW50cyBhcmUgcHVsbC1jbGFpbWFibGUsIG5ldmVyIHB1c2hlZC5cblxuIgoJb3V0ICs9ICJ8IGlkIHwgaG9sZGVyIHwgZGVwb3NpdG9yIHwgYW1vdW50IHwgY2VpbGluZyB8IGNsYWltIHwgc3RhdHVzIHxcbnwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG4iCglzaG93biA6PSBpbnQ2NCgwKQoJZm9yIGlkIDo9IG5leHRJRCAtIDE7IGlkID49IDAgJiYgc2hvd24gPCBSZW5kZXJMaW1pdDsgaWQtLSB7CgkJdiA6PSBhZ3JlZW1lbnRzLkdldChwYWRJRChpZCkpCgkJaWYgdiA9PSBuaWwgewoJCQljb250aW51ZQoJCX0KCQlkIDo9IHYuKCphZ3JlZW1lbnQpCgkJb3V0ICs9ICJ8ICIgKyBpdG9hKGQuaWQpICsgIiB8ICIgKyBzYW5pdGl6ZS5UYWJsZUNlbGwoZC5ob2xkZXIuU3RyaW5nKCkpICsgIiB8ICIgKwoJCQlzYW5pdGl6ZS5UYWJsZUNlbGwoZC5kZXBvc2l0b3IuU3RyaW5nKCkpICsgIiB8ICIgKyBpdG9hKGQuYW1vdW50KSArIERlbm9tICsgIiB8ICIgKwoJCQlpdG9hKGQuZm9yZmVpdENlaWxpbmcpICsgRGVub20gKyAiIHwgIiArIGl0b2EoZC5jbGFpbUFtb3VudCkgKyBEZW5vbSArICIgfCAiICsKCQkJZC5zdGF0dXMgKyAiIHxcbiIKCQlzaG93bisrCgl9CglpZiBuZXh0SUQgPiBzaG93biB7CgkJb3V0ICs9ICJcbigiICsgaXRvYShzaG93bikgKyAiIG1vc3QgcmVjZW50IG9mICIgKyBpdG9hKG5leHRJRCkgKyAiKVxuIgoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlckFncmVlbWVudChpZFN0ciBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoaWRTdHIsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiYmFkIGFncmVlbWVudCBpZFxuIgoJfQoJdiA6PSBhZ3JlZW1lbnRzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICJ1bmtub3duIGFncmVlbWVudCAiICsgaWRTdHIgKyAiXG4iCgl9CglkIDo9IHYuKCphZ3JlZW1lbnQpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgkvLyBUaGVzZSBmb3VyIHNsb3RzIGNhcnJ5IGFuIG93bi1wYWNrYWdlIHN0YXR1cyBjb25zdGFudCBhbmQgYmVjaDMyIGFkZHJlc3NlcywKCS8vIHNvIHNhbml0aXplLklubGluZVRleHQgaXMgdGhlIElERU5USVRZIG9uIGV2ZXJ5IHJlYWNoYWJsZSBpbnB1dCBhbmQgdGhpcyBpcwoJLy8gbm90IGFuIGluamVjdGlvbiByZXBhaXIuIEl0IGlzIGhlcmUgYmVjYXVzZSByZW5kZXJIb21lIHdyYXBzIHRoZSBzYW1lIHR3bwoJLy8gYWRkcmVzc2VzIChhcyBzYW5pdGl6ZS5UYWJsZUNlbGwsIHRoZSB0YWJsZS1jb250ZXh0IGFuYWxvZ3VlKSBhbmQgYW4KCS8vIGFzeW1tZXRyeSBiZXR3ZWVuIHR3byByZW5kZXJlcnMgb3ZlciBvbmUgZGF0YSBzZXQgaXMgaG93IHRoZSB3cmFwcGVkIHNpZGUKCS8vIGdldHMgZGVsZXRlZCBsYXRlciB0byAibWF0Y2giLiBUaGUgd3JhcCBpcyB3aGF0IHN1cnZpdmVzIGEgcmVmYWN0b3IgdGhhdAoJLy8gcHV0cyBub24tY29uc3RhbnQgZGF0YSBpbiBhIHNsb3Q7IHRvb2xzL3Rlc3RfZGVwb3NpdHNfc2Fib3RhZ2Uuc2ggZm9vdGVyCgkvLyBub24tY2FzZSAoZSkgcmVjb3JkcyB0aGF0IG5vIGZpeHR1cmUgY2FuIGRpc3Rpbmd1aXNoIGl0IHRvZGF5LgoJb3V0IDo9ICIjIGFncmVlbWVudCAiICsgaXRvYShkLmlkKSArICIg4oCUICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGQuc3RhdHVzKSArICJcblxuIgoJb3V0ICs9ICItIGhvbGRlcjogIiArIHNhbml0aXplLklubGluZVRleHQoZC5ob2xkZXIuU3RyaW5nKCkpICsgIlxuIgoJb3V0ICs9ICItIGRlcG9zaXRvcjogIiArIHNhbml0aXplLklubGluZVRleHQoZC5kZXBvc2l0b3IuU3RyaW5nKCkpICsgIlxuIgoJb3V0ICs9ICItIGFyYml0ZXI6ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGFkZHJTdHIoZC5hcmJpdGVyKSkKCWlmIGQuYXJiaXRlciA9PSAiIiB7CgkJb3V0ICs9ICIg4oCUICoqYSBjbGFpbSBjYW5ub3QgYmUgZGlzcHV0ZWQqKiIKCX0KCW91dCArPSAiXG4iCglpZiBkLm1lbW8gIT0gIiIgewoJCW91dCArPSAiLSBtZW1vOiAiICsgc2FuaXRpemUuSW5saW5lVGV4dChkLm1lbW8pICsgIlxuIgoJfQoJb3V0ICs9ICItIGRlcG9zaXQ6ICIgKyBpdG9hKGQuYW1vdW50KSArIERlbm9tICsgIiDCtyBmb3JmZWl0IGNlaWxpbmc6ICIgKyBpdG9hKGQuZm9yZmVpdENlaWxpbmcpICsKCQlEZW5vbSArICIgwrcgZmVlIG9uIHRoZSBhd2FyZDogIiArIGl0b2EoZC5mZWVCcHMpICsgIiBicHNcbiIKCW91dCArPSAiLSB0ZXJtICIgKyBpdG9hKGQudGVybUJsb2NrcykgKyAiIGJsb2NrcyDCtyBjbGFpbSB3aW5kb3cgIiArIGl0b2EoZC5jbGFpbVdpbmRvdykgKwoJCSIgwrcgZGlzcHV0ZSB3aW5kb3cgIiArIGl0b2EoZC5kaXNwdXRlV2luZG93KSArICIgwrcgb3BlbmVkIGF0IGhlaWdodCAiICsgaXRvYShkLmNyZWF0ZWRIZWlnaHQpICsgIlxuIgoKCXN3aXRjaCBkLnN0YXR1cyB7CgljYXNlIERlcG9zaXRPcGVuOgoJCW91dCArPSAiLSBhd2FpdGluZyBmdW5kaW5nIGJ5IHRoZSBkZXBvc2l0b3IgdW50aWwgaGVpZ2h0ICIgKyBpdG9hKGQuZnVuZERlYWRsaW5lKSArICJcbiIKCWNhc2UgRGVwb3NpdEZ1bmRlZDoKCQlpZiBub3cgPCBkLnRlcm1FbmQgewoJCQlvdXQgKz0gIi0gdGVybSBydW5uaW5nIMK3IGVuZHMgYXQgaGVpZ2h0ICIgKyBpdG9hKGQudGVybUVuZCkgKwoJCQkJIiAoIiArIGl0b2EoZC50ZXJtRW5kLW5vdykgKyAiIGJsb2NrcylcbiIKCQl9IGVsc2UgaWYgbm93IDwgZC5jbGFpbURlYWRsaW5lIHsKCQkJb3V0ICs9ICItIGNsYWltIHdpbmRvdyBPUEVOIHVudGlsIGhlaWdodCAiICsgaXRvYShkLmNsYWltRGVhZGxpbmUpICsKCQkJCSIgwrcgdGhlIGhvbGRlciBtYXkgY2xhaW0gdXAgdG8gIiArIGl0b2EoZC5mb3JmZWl0Q2VpbGluZykgKyBEZW5vbSArICJcbiIKCQl9IGVsc2UgewoJCQlvdXQgKz0gIi0gbm8gY2xhaW0gd2FzIGZpbGVkIMK3IGFueW9uZSBtYXkgY2FsbCBSZWxlYXNlVW5jbGFpbWVkIGZvciBhIGZ1bGwgcmVmdW5kXG4iCgkJfQoJY2FzZSBEZXBvc2l0Q2xhaW1lZDoKCQlvdXQgKz0gIi0gY2xhaW06ICIgKyBpdG9hKGQuY2xhaW1BbW91bnQpICsgRGVub20gKyAiIOKAlCAiICsgc2FuaXRpemUuSW5saW5lVGV4dChkLmNsYWltUmVhc29uKSArICJcbiIKCQlpZiBub3cgPCBkLmRpc3B1dGVEZWFkbGluZSB7CgkJCW91dCArPSAiLSB0aGUgZGVwb3NpdG9yIG1heSBhY2NlcHQgb3IgZGlzcHV0ZSB1bnRpbCBoZWlnaHQgIiArIGl0b2EoZC5kaXNwdXRlRGVhZGxpbmUpICsgIlxuIgoJCX0gZWxzZSB7CgkJCW91dCArPSAiLSBkaXNwdXRlIHdpbmRvdyBjbG9zZWQgwrcgYW55b25lIG1heSBjYWxsIFNldHRsZVVuZGlzcHV0ZWRcbiIKCQl9CgljYXNlIERlcG9zaXREaXNwdXRlZDoKCQlvdXQgKz0gIi0gY2xhaW06ICIgKyBpdG9hKGQuY2xhaW1BbW91bnQpICsgRGVub20gKyAiIOKAlCAiICsgc2FuaXRpemUuSW5saW5lVGV4dChkLmNsYWltUmVhc29uKSArICJcbiIKCQlvdXQgKz0gIi0gZGlzcHV0ZWQ6ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGQuZGlzcHV0ZVJlYXNvbikgKyAiXG4iCgkJaWYgbm93IDwgZC5hcmJpdGVyRGVhZGxpbmUgewoJCQlvdXQgKz0gIi0gdGhlIGFyYml0ZXIgcnVsZXMgYnkgaGVpZ2h0ICIgKyBpdG9hKGQuYXJiaXRlckRlYWRsaW5lKSArICJcbiIKCQl9IGVsc2UgewoJCQlvdXQgKz0gIi0gdGhlIGFyYml0ZXIgZGlkIG5vdCBydWxlIMK3IGFueW9uZSBtYXkgY2FsbCBMYXBzZURpc3B1dGUgZm9yIGEgZnVsbCByZWZ1bmRcbiIKCQl9CgljYXNlIERlcG9zaXRTZXR0bGVkOgoJCW91dCArPSAiLSBzZXR0bGVkIGF0IGhlaWdodCAiICsgaXRvYShkLnNldHRsZWRIZWlnaHQpICsgIiDCtyBhd2FyZGVkIHRvIHRoZSBob2xkZXIgIiArCgkJCWl0b2EoZC5hd2FyZCkgKyBEZW5vbSArICIgwrcgcmVmdW5kZWQgdG8gdGhlIGRlcG9zaXRvciAiICsgaXRvYShkLmFtb3VudC1kLmF3YXJkKSArIERlbm9tICsgIlxuIgoJCW91dCArPSAiLSBib3RoIHNpZGVzIGFyZSBwdWxsLWNsYWltYWJsZSB3aXRoIENsYWltIC8gQ2xhaW1BbGxcbiIKCWNhc2UgRGVwb3NpdENhbmNlbGxlZDoKCQlvdXQgKz0gIi0gY2FuY2VsbGVkIGJlZm9yZSBmdW5kaW5nIMK3IG5vIGNvaW5zIHdlcmUgZXZlciBoZWxkXG4iCgl9CglyZXR1cm4gb3V0Cn0KGmMKC2dub21vZC50b21sElRtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2RlcG9zaXRzIgpnbm8gPSAiMC45IgoiDTEwMDAwMDAwdWdub3QSEgj+54hJEgsxNTMyMzh1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAOnT1Z8OXij91jkng8jvuI3xkAVJRT0Y09maT6Q/mxxhLm5dhLm35Vzm89ClgstOIqtFpVrXJrWWou4wIpdGzzxooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}