{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "CPeawmX51ZiH+TMuHEFteGHPhNEwxzBglrm6mLbuy8A=",
    "height": "355260",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "67126404",
      "GasUsed": "44750936"
    },
    "tx": "CqiEAgoML3ZtLm1fYWRkcGtnEpaEAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLZgwIKBGxvdHMSOGduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9sb3RzGl8KC2dub21vZC50b21sElBtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2xvdHMiCmdubyA9ICIwLjkiChq0ggIKCGxvdHMuZ25vEqaCAi8vIFBhY2thZ2UgbG90cyBpcyB0aGUgY29zdCBvZiBnb29kcyBjb25zdW1lZCBhcyBhIHB1cmUgZnVuY3Rpb24gb2YgaG93IG11Y2gKLy8gb2YgYSBsb3QgaGFzIGJlZW4gY29uc3VtZWQuCi8vCi8vIEEgcmVhbG0gc3RvcmVzIHJlY2VpcHRzIG9mIGEgc3RvY2sta2VlcGluZyB1bml0IOKAlCBlYWNoIGEgcXVhbnRpdHkgYW5kIHdoYXQKLy8gd2FzIHBhaWQgZm9yIGl0IOKAlCBhbmQgYXNrcyB0aGlzIHBhY2thZ2Ugd2hhdCB0aGUgZ29vZHMgaXQganVzdCBzaGlwcGVkIGNvc3QuCi8vIE5vdGhpbmcgaGVyZSByZWFkcyB0aGUgY2hhaW4sIGhvbGRzIGNvaW5zLCBvciBrbm93cyB3aGF0IGEgbGVkZ2VyIGlzLCBzbyBhCi8vIHJlYWxtIGNhbiB0ZXN0IGEgeWVhciBvZiBpdHMgb3duIGludmVudG9yeSBjb3N0aW5nIHdpdGhvdXQgYSBub2RlLgovLwovLwlwLCBfIDo9IE5ld1Bvb2woRklGTywgNjQpCi8vCXAuUmVjZWl2ZSgxMDAsIDI1MDApICAgICAgICAgICAgIC8vIDEwMCB1bml0cyBmb3IgMjUwMCBpbiB0b3RhbAovLwlwLlJlY2VpdmUoNTAsIDE0MDApICAgICAgICAgICAgICAvLyBhIHNlY29uZCwgZGVhcmVyIHJlY2VpcHQKLy8JY29ncywgXyA6PSBwLkNvbnN1bWUoMTIwKSAgICAgICAgLy8gd2hhdCB0aGUgc2hpcG1lbnQgY29zdDogREVSSVZFRAovLwlvbkhhbmQsIF8gOj0gcC5Db3N0T25IYW5kKCkgICAgICAvLyB3aGF0IGlzIGxlZnQgaXMgd29ydGgKLy8KLy8gIyBUaGUgYW1vdW50IGlzIG5ldmVyIGEgcGFyYW1ldGVyCi8vCi8vIFRoaXMgaXMgdGhlIHRoZXNpcyB0aGUgcmVzdCBvZiB0aGUgcGFja2FnZSBzZXJ2ZXMuIEEgY2FsbGVyIHNheXMgaG93ICptYW55KgovLyB1bml0cyBsZWZ0IHRoZSBzaGVsZjsgaXQgbmV2ZXIgc2F5cyB3aGF0IHRoZXkgY29zdC4gVGhlIGNvc3QgaXMgY29tcHV0ZWQgZnJvbQovLyB0aGUgbG90cyB0aGUgdW5pdHMgY2FtZSBvdXQgb2YsIHNvIGEgcmVhbG0gY2Fubm90IHBvc3QgYSBjb3N0IG9mIGdvb2RzIHNvbGQKLy8gdGhhdCBkaXNhZ3JlZXMgd2l0aCB0aGUgaW52ZW50b3J5IGl0IGhvbGRzIOKAlCBub3QgYmVjYXVzZSBpdCBpcyBjYXJlZnVsLCBidXQKLy8gYmVjYXVzZSB0aGVyZSBpcyBubyBhcmd1bWVudCB0aHJvdWdoIHdoaWNoIHRoZSB0d28gY291bGQgYmUgbWFkZSB0byBkaXNhZ3JlZS4KLy8KLy8gW3AvLi4uL2RlcHJlY2lhdGlvbl0gbWFrZXMgdGhlIHNhbWUgbW92ZSBmb3IgYSBjYXBpdGFsIGFzc2V0LCB3aGVyZSB0aGUKLy8gY2hhcmdlIGlzIGEgZnVuY3Rpb24gb2YgcGVyaW9kcyBlbGFwc2VkLiBIZXJlIGl0IGlzIHNoYXJwZW5lZDogYSBkZXByZWNpYXRpb24KLy8gc2NoZWR1bGUgaXMgZml4ZWQgYXQgYWNxdWlzaXRpb24gYW5kIGEgY2FsbGVyIHN1cHBsaWVzIG9ubHkgdGltZSwgd2hpbGUgYW4KLy8gaW52ZW50b3J5IHBvb2wgaXMgbXV0YXRlZCBieSBldmVyeSByZWNlaXB0LCBhbmQgdGhlIGZ1bmN0aW9uIHN0aWxsIGhvbGRzLgovLwovLyAjIFdoeSB0aGUgY29zdCBpcyBhIGRpZmZlcmVuY2Ugb2YgYSBwdXJlIGZ1bmN0aW9uLCBhbmQgbm90IGEgcnVubmluZyBhdmVyYWdlCi8vCi8vIFRoZSBvYnZpb3VzIGltcGxlbWVudGF0aW9uIGtlZXBzIGEgcmVtYWluaW5nIHF1YW50aXR5IGFuZCBhIHJlbWFpbmluZyBjb3N0Ci8vIGFuZCwgZm9yIGEgc2hpcG1lbnQgb2YgbiB1bml0cywgY2hhcmdlcwovLwovLwlyZW1haW5pbmdDb3N0ICogbiAvIHJlbWFpbmluZ1F1YW50aXR5Ci8vCi8vIEl0IGlzIHdyb25nIGluIGEgd2F5IHRoYXQgaXMgc3BlY2lmaWMgYW5kIHF1aWV0LiBUaGUgZGl2aXNpb24gdHJ1bmNhdGVzLCBhbmQKLy8gd2hhdCBpdCB0cnVuY2F0ZXMgaXMgcmV0YWluZWQgaW4gdGhlIGxvdCByYXRoZXIgdGhhbiBjaGFyZ2VkLCBzbyB0aGUgY29zdAovLyBjaGFyZ2VkIGZvciB0aGUgZmlyc3QgayB1bml0cyBvdXQgb2YgYSBsb3QgKipkZXBlbmRzIG9uIGhvdyB0aG9zZSBrIHVuaXRzCi8vIHdlcmUgc2xpY2VkIGludG8gc2hpcG1lbnRzKiouIE1lYXN1cmVkLCB3aXRoIHRoZSB3aG9sZSBsb3QncyBsaWZlIGV2YWx1YXRlZDoKLy8KLy8JbG90KFF0eT03LCBDb3N0PTEwKSBjb25zdW1lZCBhcyBbMSwxLDFdCi8vCSAgICBuYWl2ZSAgICAgICAtPiBbMSwgMSwgMV0gICB0b3RhbCAzCi8vCSAgICB0ZWxlc2NvcGluZyAtPiBbMSwgMSwgMl0gICB0b3RhbCA0Ci8vCi8vIE5vdGhpbmcgaGVyZSBpcyBhbiBhY2N1bXVsYXRvci4gW0xvdC5Db3N0QXRdIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUKLy8gY3VtdWxhdGl2ZSB1bml0cyBjb25zdW1lZCwKLy8KLy8JQ29zdEF0KGspID09IENvc3QqayAvIFF0eQovLwovLyBhbmQgW0xvdC5UYWtlXSBpcyBpdHMgZGlmZmVyZW5jZSBhdCB0d28gcG9pbnRzLiBTbyBjaGFyZ2VzICoqdGVsZXNjb3BlKiog4oCUCi8vCi8vCVRha2UoYeKGkmIpICsgVGFrZShi4oaSYykgPT0gVGFrZShh4oaSYykKLy8KLy8g4oCUIGJ5IGNvbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBieSBjYXJlZnVsIHJlbWFpbmRlciBhcml0aG1ldGljLCBhbmQgdGhlcmUgaXMgbm8KLy8gc3RvcmVkIHJlbWFpbmluZyBjb3N0IHRoYXQgY291bGQgZHJpZnQgZnJvbSB0aGUgbG90IGF0IGFsbC4gQSByZWFsbSB0aGF0Ci8vIGxvc2VzIHRyYWNrIG9mIHdoYXQgaXQgaGFzIGNoYXJnZWQgY2FuIHJlY29tcHV0ZSBpdCBmcm9tIHRoZSBxdWFudGl0aWVzLgovLwovLyAjIFdoYXQgdGhlIG5haXZlIGZvcm0gYWN0dWFsbHkgZ2V0cyB3cm9uZywgc3RhdGVkIHByZWNpc2VseQovLwovLyBJdCAqKm1pcy10aW1lcyoqIGNvc3Q7IGl0IGRvZXMgbm90IGxvc2UgaXQuIE92ZXIgYSBsb3QncyB3aG9sZSBsaWZlIHRoZSBuYWl2ZQovLyBmb3JtIGNoYXJnZXMgZXhhY3RseSBDb3N0LCBiZWNhdXNlIHRoZSBzaGlwbWVudCB0aGF0IGV4aGF1c3RzIHRoZSBsb3QgaGFzCi8vIGBuID09IHJlbWFpbmluZ1F1YW50aXR5YCBhbmQgc28gY2hhcmdlcyB0aGUgd2hvbGUgcmVtYWluZGVyLiBTYXlpbmcgIml0IGxvc2VzCi8vIG1vbmV5IiB3b3VsZCBiZSBhIHN0cm9uZ2VyIGFuZCBmYWxzZSBjbGFpbSwgYW5kIGEgcmVhZGVyIHdobyBjaGVja3MgdGhlCi8vIHRvdGFscyB3b3VsZCBjb3JyZWN0bHkgY29uY2x1ZGUgdGhlIHdhcm5pbmcgd2FzIG92ZXJzdGF0ZWQgYW5kIGlnbm9yZSB0aGUKLy8gcmVhbCBkZWZlY3QuIFRoZSByZWFsIGRlZmVjdCBpcyB0aGF0IGEgKnBlcmlvZCdzKiBjb3N0IG9mIGdvb2RzIHNvbGQsIGFuZCB0aGUKLy8gaW52ZW50b3J5IHZhbHVlIGNhcnJpZWQgYXQgYW55IG1vbWVudCBiZWZvcmUgZXhoYXVzdGlvbiwgYm90aCBkZXBlbmQgb24KLy8gc2hpcG1lbnQgc2xpY2luZyDigJQgd2hpY2ggaXMgYSBtaXNzdGF0ZW1lbnQgb2YgYm90aCB0aGUgaW5jb21lIHN0YXRlbWVudCBhbmQKLy8gdGhlIGJhbGFuY2Ugc2hlZXQsIGZvciBhIHF1YW50aXR5IG5vYm9keSBjaG9zZS4KLy8KLy8gTWVhc3VyZWQgYnkgZGlmZmVyZW50aWFsIHN3ZWVwIGFnYWluc3QgZXhhY3QgYXJpdGhtZXRpYywgb3ZlciBxdWFudGl0aWVzIDEKLy8gdG8gMTIgYW5kIGNvc3RzIDEgdG8gNTAsIGV2YWx1YXRpbmcgKipldmVyeSBvcmRlcmVkIGNvbXBvc2l0aW9uKiogb2YgdGhlCi8vIHF1YW50aXR5IChzbyBldmVyeSB3YXkgb2Ygc2xpY2luZyBhIGxvdCdzIHdob2xlIGxpZmUgaW50byBzaGlwbWVudHMpOgovLwovLwljb21wb3NpdGlvbnMgZXZhbHVhdGVkICAgICAgICAgICAyMDQ3NTAKLy8JbmFpdmUgcGF0aC1kZXBlbmRlbnQgICAgICAgICAgICAgMTA4MzIwICAgb3ZlciAyNjAgb2YgNjAwIChRdHksQ29zdCkgcGFpcnMKLy8JdGVsZXNjb3BpbmcgcGF0aC1kZXBlbmRlbnQgICAgICAgICAgICAwCi8vCW5haXZlIGNvbnNlcnZhdGlvbiBmYWlsdXJlcyAgICAgICAgICAgMAovLwl0ZWxlc2NvcGluZyBjb25zZXJ2YXRpb24gZmFpbHVyZXMgICAgIDAKLy8Jd29yc3QgbmFpdmUgbWlzLXRpbWluZyAgICAgICAgICAgIDMgdW5pdHMgb2YgY29zdCwgYXQgUXR5PTEyIENvc3Q9NgovLwovLyAiUGF0aC1kZXBlbmRlbnQiIGhhcyBhIGRlZmluaXRpb24sIGJlY2F1c2UgdGhlIGNvdW50IGlzIHdvcnRobGVzcyB3aXRob3V0Ci8vIG9uZTogYSBjb21wb3NpdGlvbiBpcyBwYXRoLWRlcGVuZGVudCBpZiB0aGUgY3VtdWxhdGl2ZSBjb3N0IGNoYXJnZWQgYWZ0ZXIKLy8gc29tZSBwcmVmaXggb2YgaXQgZGlmZmVycyBmcm9tIHRoZSBjdW11bGF0aXZlIGNvc3QgdGhlIHNhbWUgbnVtYmVyIG9mIHVuaXRzCi8vIHdvdWxkIGhhdmUgY2FycmllZCBoYWQgdGhleSBzaGlwcGVkIG9uZSBhdCBhIHRpbWUuIFRoZSB0d28gemVyb2VzIG9uIHRoZQovLyBjb25zZXJ2YXRpb24gbGluZXMgYXJlIHRoZSBldmlkZW5jZSBmb3IgdGhlIHBhcmFncmFwaCBhYm92ZSDigJQgdGhlIG5haXZlIGZvcm0KLy8gcmVhY2hlcyB0aGUgcmlnaHQgdG90YWwgZXZlcnkgdGltZSBhbmQgZ2V0cyB0aGVyZSB3cm9uZ2x5IOKAlCBhbmQgdGhlIHdvcnN0Ci8vIGNhc2UgaXMgaGFsZiBvZiBhIHNtYWxsIGxvdCdzIGNvc3QsIG5vdCBhIHJvdW5kaW5nIGNydW1iLgovLwovLyAjIFRoZSB3ZWlnaHRlZC1hdmVyYWdlIG1ldGhvZCByZS1hbmNob3JzIGF0IGV2ZXJ5IHJlY2VpcHQsIGFuZCBtdXN0Ci8vCi8vIFVuZGVyIFtXQVZHXSBhIHJlY2VpcHQgbWVyZ2VzIGludG8gdGhlIHNpbmdsZSBsaXZlIGxvdDogdGhlIG1lcmdlZCBsb3QncwovLyBxdWFudGl0eSBpcyB3aGF0IHJlbWFpbmVkIHBsdXMgd2hhdCBhcnJpdmVkLCBpdHMgY29zdCBpcyB3aGF0IHJlbWFpbmVkICp3YXMKLy8gd29ydGgqIHBsdXMgd2hhdCBhcnJpdmVkIGNvc3QsIGFuZCBpdHMgY29uc3VtZWQgY291bnQgcmVzZXRzIHRvIHplcm8uIFRoZQovLyByZXNldCBpcyBub3QgYm9va2tlZXBpbmcgY29udmVuaWVuY2UgYW5kIGlzIG5vdCBhIGRlZmVjdCDigJQgaXQgaXMgZm9yY2VkLgovLyBDb3N0QXQgaXMgYSBmdW5jdGlvbiBvZiB0aGUgbG90J3Mgb3duIFF0eSBhbmQgQ29zdCwgYW5kIGEgcmVjZWlwdCBjaGFuZ2VzCi8vIGJvdGgsIHNvIGEgY29uc3VtZWQgY291bnQgbWVhc3VyZWQgYWdhaW5zdCB0aGUgb2xkIHBhaXIgbWVhbnMgbm90aGluZwovLyBhZ2FpbnN0IHRoZSBuZXcgb25lLiBUZWxlc2NvcGluZyB0aGVyZWZvcmUgaG9sZHMgKip3aXRoaW4gYW4gYW5jaG9yIGVwb2NoKiosCi8vIGFuZCBhY3Jvc3MgdGhlIHJlLWFuY2hvciB3aGF0IGhvbGRzIGluc3RlYWQgaXMgZXhhY3QgY29zdCBuZXV0cmFsaXR5OiB0aGUKLy8gbWVyZ2VkIGxvdCdzIGNvc3QgaXMgdGhlIG91dGdvaW5nIGxvdCdzIHJlbWFpbmluZyBjb3N0IHBsdXMgdGhlIHJlY2VpcHQncywKLy8gd2l0aCBub3RoaW5nIGRyb3BwZWQgYW5kIG5vdGhpbmcgaW52ZW50ZWQuIFtQb29sLkNyb3NzRm9vdENvc3RdIGlzIHdoYXQKLy8gcHJvdmVzIGl0LCBhbmQgaXQgaXMgYXNzZXJ0ZWQgb3ZlciByZWNlaXB0L2NvbnN1bWUgaW50ZXJsZWF2aW5ncyBpbiB0aGUKLy8gc3VpdGUuCi8vCi8vIFRoZSBhc3ltbWV0cnkgdGhpcyBjcmVhdGVzIGlzIHdvcnRoIGtub3dpbmcgYmVmb3JlIGNob29zaW5nIGEgbWV0aG9kOiBXQVZHCi8vIGNhbiAqKnJlZnVzZSoqIGEgcmVjZWlwdCB0aGF0IEZJRk8gYW5kIExJRk8gYWNjZXB0LCBiZWNhdXNlIHRoZSBtZXJnZWQgbG90Ci8vIG11c3Qgc2F0aXNmeSB0aGUgb3ZlcmZsb3cgcHJlY29uZGl0aW9uIGBDb3N0IDw9IG1heEludDY0L1F0eWAgdGhhdCB0d28KLy8gc2VwYXJhdGUgbG90cyB3b3VsZCBlYWNoIHNhdGlzZnkgb24gdGhlaXIgb3duLiBTZWUgW1Bvb2wuUmVjZWl2ZV0uCi8vCi8vICMgQW4gZXJyb3IgcmV0dXJuIGRvZXMgbm90IHJldmVydCBhIEdubyB0cmFuc2FjdGlvbgovLwovLyBPbmx5IGEgcGFuaWMgcmV2ZXJ0cy4gU28gZXZlcnkgbXV0YXRpbmcgbWV0aG9kIGhlcmUgc3RhZ2VzIGl0cyB3aG9sZSBlZmZlY3QKLy8g4oCUIGEgY29weSBvZiB0aGUgbG90cyBpdCB3aWxsIHRvdWNoLCBhbmQgdGhlIHRvdGFsIGl0IHdpbGwgY2hhcmdlIOKAlCBhbmQKLy8gY29tbWl0cyBvbmx5IG9uY2UgdGhlIGxhc3Qgc3RlcCBoYXMgc3VjY2VlZGVkLiBBIG1ldGhvZCB0aGF0IHJldHVybmVkIGFuCi8vIGVycm9yIGFmdGVyIG11dGF0aW5nIGhhbGYgdGhlIHBvb2wgd291bGQgbGVhdmUgYSByZWFsbSBob2xkaW5nIGludmVudG9yeQovLyB3aG9zZSBjb3N0IGhhZCBiZWVuIHBhcnRseSBjaGFyZ2VkLCB3aXRoIHRoZSByZWFsbSdzIG93biBlcnJvciBoYW5kbGluZwovLyB1bmFibGUgdG8gdW5kbyBpdCwgYW5kIHRoZSByZWFsbSB3b3VsZCBoYXZlIG5vIHdheSB0byBkZXRlY3QgaXQgc2hvcnQgb2YgYQovLyBjcm9zcy1mb290LiBUaGlzIHBhY2thZ2UgZG9lcyBub3QgcGFuaWMgb24gY2FsbGVyIGVycm9yOyBpdCByZXR1cm5zIGVycm9ycwovLyBhbmQga2VlcHMgdGhlIHBvb2wgdW50b3VjaGVkIHdoZW4gaXQgZG9lcy4KLy8KLy8gIyBXaGF0IHRoaXMgcGFja2FnZSBkb2VzIG5vdCBjbGFpbQovLwovLyAgIC0gKipObyBub3ZlbHR5IGZvciBGSUZPLCBMSUZPIG9yIHdlaWdodGVkIGF2ZXJhZ2UuKiogVGhleSBhcmUgdGV4dGJvb2sgYW5kCi8vICAgICBvbGRlciB0aGFuIHNvZnR3YXJlLiBXaGF0IHdhcyBub3QgZm91bmQgaW4gdGhlIHNlYXJjaGVkIHNvdXJjZXMgaXMgYW4KLy8gICAgIG9uLWNoYWluIGludGVnZXIgaW1wbGVtZW50YXRpb24gd2l0aCBhIHBhdGgtaW5kZXBlbmRlbnQgY29zdCBmdW5jdGlvbjsKLy8gICAgIHNlZSBESVNDT1ZFUlkubWQuCi8vICAgLSAqKk5vdGhpbmcgYWJvdXQgbW9uZXkuKiogQSBsb3QgY29zdCBpcyBhIG51bWJlciBpbiBhIHJlY29yZC4gVGhpcyBwYWNrYWdlCi8vICAgICBuZXZlciBzZWVzIGEgY29pbiwgbmV2ZXIgaG9sZHMgdmFsdWUsIGFuZCBhIHJlYWxtIHVzaW5nIGl0IG11c3Qgbm90IGluZmVyCi8vICAgICBjdXN0b2R5IGZyb20gaXQuCi8vICAgLSAqKk5vIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uLioqIFRoZSBmb3VyIG1ldGhvZHMgYSB0ZXh0Ym9vayBsaXN0cyBhcmUKLy8gICAgIHRocmVlIGhlcmUuIFNwZWNpZmljIGlkZW50aWZpY2F0aW9uIOKAlCB0aGUgc2hpcHBlciBuYW1pbmcgd2hpY2ggbG90IGEgdW5pdAovLyAgICAgY2FtZSBmcm9tIOKAlCB3b3VsZCBtYWtlIHRoZSBjb25zdW1lZCBhbW91bnQgZGVwZW5kIG9uIGEgY2FsbGVyLXN1cHBsaWVkCi8vICAgICBjaG9pY2UsIHdoaWNoIGlzIHRoZSBvbmUgdGhpbmcgdGhlIHRoZXNpcyBhYm92ZSBydWxlcyBvdXQuIEEgcmVhbG0gdGhhdAovLyAgICAgbmVlZHMgaXQgc2hvdWxkIGhvbGQgb25lIHBvb2wgcGVyIGlkZW50aWZpZWQgbG90LgovLyAgIC0gKipObyB1bml0cyBvZiBtZWFzdXJlLCBubyBjdXJyZW5jeSwgbm8gU0tVIGlkZW50aXR5LioqIEEgcXVhbnRpdHkgaXMgYW4KLy8gICAgIGludGVnZXIgYW5kIGEgY29zdCBpcyBhbiBpbnRlZ2VyLiBEZWNpZGluZyB0aGF0IHRoZXkgYXJlIGtpbG9ncmFtcyBhbmQKLy8gICAgIHRob3VzYW5kdGhzIG9mIGEgdWdub3QsIGFuZCB0aGF0IHRoaXMgcG9vbCBpcyB0aGUgb25lIGZvciBTS1UgIkEtMSIsIGlzCi8vICAgICB0aGUgcmVhbG0ncyBqb2IuCi8vICAgLSAqKk5vIG5lZ2F0aXZlIGludmVudG9yeSwgbm8gd3JpdGUtb2Zmcywgbm8gcmV2YWx1YXRpb24uKiogQ29uc3VtaW5nIG1vcmUKLy8gICAgIHRoYW4gaXMgb24gaGFuZCBpcyBbRXJySW5zdWZmaWNpZW50XSwgbmV2ZXIgYSBuZWdhdGl2ZSBsb3QuIFNocmlua2FnZSBhbmQKLy8gICAgIGxvd2VyLW9mLWNvc3Qtb3ItbWFya2V0IGFyZSBub3QgaGVyZTsgYSByZWFsbSB0aGF0IG5lZWRzIHRoZW0gbmVlZHMgYQovLyAgICAgZm91cnRoIGFuZCBmaWZ0aCBhY2NvdW50IGFuZCBzaG91bGQgc2F5IHNvIGluIGl0cyBvd24gY2hhcnQuCi8vCi8vIFtwLy4uLi9kZXByZWNpYXRpb25dOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2RlcHJlY2lhdGlvbgpwYWNrYWdlIGxvdHMKCmltcG9ydCAiZXJyb3JzIgoKLy8gTWF4TG90c0xpbWl0IGJvdW5kcyB0aGUgbGl2ZSBsb3RzIGEgc2luZ2xlIHBvb2wgbWF5IGhvbGQsIGFuZCBzbyBib3VuZHMKLy8gZXZlcnkgd2FsayBpbiB0aGlzIHBhY2thZ2U6IFtQb29sLkNvc3RPbkhhbmRdLCBbUG9vbC5RdHlPbkhhbmRdLAovLyBbUG9vbC5Db25zdW1lXSBhbmQgYm90aCBjcm9zcy1mb290cyBhcmUgTyhsaXZlIGxvdHMpLgovLwovLyBXaGF0IHRoZSBib3VuZCBjb3N0cyBpcyBzdGF0ZWQgcmF0aGVyIHRoYW4gd2F2ZWQgYXQuIEEgcG9vbCBhdCB0aGUgbGltaXQKLy8gbWFrZXMgQ29uc3VtZSBzY2FuIHVwIHRvIDEwMjQgbG90cyBhbmQgdGhlIGNyb3NzLWZvb3RzIHdhbGsgdGhlbSBhbGwsIGFuZCBhCi8vIHJlYWxtIHRoYXQgcmVuZGVycyBtYW55IHBvb2xzIGluIG9uZSBxdWVyeSBtdWx0aXBsaWVzIHRoYXQuIFRoZSBsaW1pdCBpcyB0aGUKLy8gY2VpbGluZyBhIGNhbGxlciBtYXkgYXNrIGZvciwgbm90IGEgcmVjb21tZW5kYXRpb246IGEgY2FsbGVyIHBhc3NlcyBpdHMgb3duCi8vIHNtYWxsZXIgY2FwIHRvIFtOZXdQb29sXSBhbmQgc2hvdWxkLCBiZWNhdXNlIGV4aGF1c3RlZCBsb3RzIGFyZSBkcm9wcGVkIGJ1dAovLyBsaXZlIG9uZXMgYXJlIG5vdCwgYW5kIGEgcG9vbCBmZWQgbWFueSBzbWFsbCByZWNlaXB0cyBhbmQgY29uc3VtZWQgaW4gbGFyZ2UKLy8gc2hpcG1lbnRzIGlzIHRoZSBzaGFwZSB0aGF0IGZpbGxzIHVwLgpjb25zdCBNYXhMb3RzTGltaXQgPSAxMDI0Cgp2YXIgKAoJLy8gRXJyQmFkUXR5IGlzIHJldHVybmVkIHdoZW4gYSBxdWFudGl0eSBpcyBub3QgcG9zaXRpdmUuIEEgemVyby1xdWFudGl0eQoJLy8gcmVjZWlwdCBpcyBub3QgYSBsb3QgYW5kIGEgemVyby1xdWFudGl0eSBzaGlwbWVudCBpcyBub3QgYW4gZXZlbnQ7CgkvLyBhY2NlcHRpbmcgZWl0aGVyIHdvdWxkIGhhdmUgYSByZWFsbSBwb3N0IGFuIGVudHJ5IGZvciBub3RoaW5nLgoJRXJyQmFkUXR5ID0gZXJyb3JzLk5ldygibG90czogcXVhbnRpdHkgbXVzdCBiZSBwb3NpdGl2ZSIpCgoJLy8gRXJyQmFkQ29zdCBpcyByZXR1cm5lZCB3aGVuIGEgY29zdCBpcyBuZWdhdGl2ZS4gWmVybyBpcyBhbGxvd2VkOiBnb29kcwoJLy8gcmVjZWl2ZWQgYXQgbm8gY29zdCBhcmUgb3JkaW5hcnkg4oCUIGRvbmF0ZWQgc3RvY2ssIHNhbXBsZXMsIGEKCS8vIHByb21vdGlvbmFsIGFsbG93YW5jZSB0aGF0IHplcm9lZCB0aGUgaW52b2ljZSDigJQgYW5kIHRoZXkgY29uc3VtZQoJLy8gZXhhY3RseSB6ZXJvIGNvc3QgZm9yIHRoZWlyIHdob2xlIGxpZmUsIHdoaWNoIGlzIHRoZSByaWdodCBhbnN3ZXIgYW5kCgkvLyBub3QgYSBkZWdlbmVyYXRlIG9uZS4KCUVyckJhZENvc3QgPSBlcnJvcnMuTmV3KCJsb3RzOiBjb3N0IG11c3Qgbm90IGJlIG5lZ2F0aXZlIikKCgkvLyBFcnJCYWRDb25zdW1lZCBpcyByZXR1cm5lZCB3aGVuIGEgbG90J3MgY29uc3VtZWQgY291bnQgaXMgbmVnYXRpdmUgb3IKCS8vIGV4Y2VlZHMgaXRzIHF1YW50aXR5LiBJdCBpcyByZWFjaGFibGUgb25seSBvbiBhIGxvdCBhIGNhbGxlciBidWlsdCBieQoJLy8gaGFuZDsgbG90cyB0aGlzIHBhY2thZ2UgcHJvZHVjZXMgYWx3YXlzIHNhdGlzZnkgaXQuCglFcnJCYWRDb25zdW1lZCA9IGVycm9ycy5OZXcoImxvdHM6IGNvbnN1bWVkIG11c3QgYmUgaW4gWzAsIHF0eV0iKQoKCS8vIEVyckJhZFNlcSBpcyByZXR1cm5lZCB3aGVuIGEgbG90J3MgcmVjZWlwdCBzZXF1ZW5jZSBpcyBuZWdhdGl2ZS4KCUVyckJhZFNlcSA9IGVycm9ycy5OZXcoImxvdHM6IHNlcSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpCgoJLy8gRXJyQmFkTWV0aG9kIGlzIHJldHVybmVkIGZvciBhIG1ldGhvZCBvdXRzaWRlIHRoZSBkZWNsYXJlZCBzZXQuCglFcnJCYWRNZXRob2QgPSBlcnJvcnMuTmV3KCJsb3RzOiB1bmtub3duIG1ldGhvZCIpCgoJLy8gRXJyQmFkTWF4TG90cyBpcyByZXR1cm5lZCB3aGVuIGEgcG9vbCdzIGxvdCBjYXAgaXMgbm90IHBvc2l0aXZlIG9yCgkvLyBleGNlZWRzIE1heExvdHNMaW1pdC4KCUVyckJhZE1heExvdHMgPSBlcnJvcnMuTmV3KCJsb3RzOiBtYXhMb3RzIG11c3QgYmUgaW4gWzEsIE1heExvdHNMaW1pdF0iKQoKCS8vIEVyclBvb2xGdWxsIGlzIHJldHVybmVkIHdoZW4gYSByZWNlaXB0IHdvdWxkIGV4Y2VlZCB0aGUgcG9vbCdzIG93biBsb3QKCS8vIGNhcC4gSXQgaXMgZmFpbC1jbG9zZWQ6IHRoZSByZWNlaXB0IGlzIHJlZnVzZWQgYW5kIHRoZSBwb29sIGlzCgkvLyB1bnRvdWNoZWQsIHNvIGEgcmVhbG0gc2VlcyBhIHJlZnVzZWQgcmVjZWlwdCByYXRoZXIgdGhhbiBzaWxlbnRseQoJLy8gbWVyZ2VkIG9yIGRyb3BwZWQgc3RvY2suCglFcnJQb29sRnVsbCA9IGVycm9ycy5OZXcoImxvdHM6IGxvdCBjYXAgcmVhY2hlZCIpCgoJLy8gRXJySW5zdWZmaWNpZW50IGlzIHJldHVybmVkIHdoZW4gYSBzaGlwbWVudCBleGNlZWRzIHRoZSBxdWFudGl0eSBvbgoJLy8gaGFuZC4gVGhlcmUgaXMgbm8gcGFydGlhbCBmaWxsIGFuZCBubyBuZWdhdGl2ZSBpbnZlbnRvcnk6IGEgcmVhbG0gdGhhdAoJLy8gd2FudHMgdG8gc2hpcCB3aGF0IGl0IGNhbiBtdXN0IGFzayBRdHlPbkhhbmQgZmlyc3QgYW5kIGRlY2lkZS4KCUVyckluc3VmZmljaWVudCA9IGVycm9ycy5OZXcoImxvdHM6IHF1YW50aXR5IGV4Y2VlZHMgcXVhbnRpdHkgb24gaGFuZCIpCgoJLy8gRXJyU2VxRXhoYXVzdGVkIGlzIHJldHVybmVkIHdoZW4gdGhlIHJlY2VpcHQgc2VxdWVuY2Ugc3BhY2UgaXMgc3BlbnQuCgkvLyBVbnJlYWNoYWJsZSBpbiBwcmFjdGljZSBhbmQgY2hlY2tlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGFsdGVybmF0aXZlIGlzCgkvLyB0d28gbG90cyBzaGFyaW5nIGEgc2VxdWVuY2UgYW5kIGEgc2lsZW50bHkgbm9uLWRldGVybWluaXN0aWMgb3JkZXIuCglFcnJTZXFFeGhhdXN0ZWQgPSBlcnJvcnMuTmV3KCJsb3RzOiByZWNlaXB0IHNlcXVlbmNlIHNwYWNlIGV4aGF1c3RlZCIpCgoJLy8gRXJyT3ZlcmZsb3cgaXMgcmV0dXJuZWQgd2hlbiB0aGUgYXJpdGhtZXRpYyB3b3VsZCB3cmFwLiBNb3N0IG92ZXJmbG93CgkvLyBpcyBleGNsdWRlZCBieSBhIHByZWNvbmRpdGlvbiBlc3RhYmxpc2hlZCB3aGVuIGEgbG90IGlzIGNvbnN0cnVjdGVkOwoJLy8gc2VlIExvdC5jaGVjayBhbmQgUG9vbC5SZWNlaXZlLgoJRXJyT3ZlcmZsb3cgPSBlcnJvcnMuTmV3KCJsb3RzOiBpbnQ2NCBvdmVyZmxvdyIpCikKCi8vIFRoZSBib3VuZCBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCByYXRoZXIgdGhhbiBhcyB0aGUgdXN1YWwKLy8gYGludDY0KDEpPDw2MyAtIDFgIGlkaW9tLCB3aGljaCBkb2VzIG5vdCBjb21waWxlOiB0aGUgc2hpZnQgaXMgZXZhbHVhdGVkIGluCi8vIHRoZSBhbHJlYWR5LXR5cGVkIGludDY0IGFuZCBvdmVyZmxvd3MgYmVmb3JlIHRoZSBzdWJ0cmFjdGlvbiBjYW4gYnJpbmcgaXQKLy8gYmFjayBpbiByYW5nZS4gSXQgaXMgYSBjb21waWxlIGVycm9yIGhlcmUgcmF0aGVyIHRoYW4gYSB3cm9uZyBudW1iZXIsIGJ1dCBpdAovLyBpcyB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgYXJpdGhtZXRpYyB0aGlzIHBhY2thZ2UgZXhpc3RzIHRvIGdldCByaWdodCwgc28gaXQKLy8gaXMgd29ydGggbmFtaW5nLgpjb25zdCBtYXhJbnQ2NCBpbnQ2NCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKCi8vIE1ldGhvZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggbG90cyBhcmUgY29uc3VtZWQuCnR5cGUgTWV0aG9kIHVpbnQ4Cgpjb25zdCAoCgkvLyBGSUZPIGNvbnN1bWVzIHRoZSBlYXJsaWVzdC1yZWNlaXZlZCBsaXZlIGxvdCBmaXJzdC4KCUZJRk8gTWV0aG9kID0gMQoKCS8vIExJRk8gY29uc3VtZXMgdGhlIGxhdGVzdC1yZWNlaXZlZCBsaXZlIGxvdCBmaXJzdC4KCUxJRk8gTWV0aG9kID0gMgoKCS8vIFdBVkcga2VlcHMgb25lIGxvdCwgbWVyZ2luZyBldmVyeSByZWNlaXB0IGludG8gaXQgYXQgYSB3ZWlnaHRlZAoJLy8gYXZlcmFnZS4gU2VlIHRoZSBwYWNrYWdlIGRvYyBvbiB3aHkgdGhlIG1lcmdlIHJlLWFuY2hvcnMuCglXQVZHIE1ldGhvZCA9IDMKKQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIG0gaXMgYSBtZXRob2QgdGhpcyBwYWNrYWdlIGltcGxlbWVudHMuCmZ1bmMgKG0gTWV0aG9kKSBWYWxpZCgpIGJvb2wgeyByZXR1cm4gbSA9PSBGSUZPIHx8IG0gPT0gTElGTyB8fCBtID09IFdBVkcgfQoKLy8gU3RyaW5nIG5hbWVzIHRoZSBtZXRob2QuIFRoZSB6ZXJvIE1ldGhvZCBpcyAiaW52YWxpZCIgcmF0aGVyIHRoYW4gZW1wdHksIHNvCi8vIGEgY2FsbGVyIHRoYXQgcmVuZGVycyBpdCB3aXRob3V0IGNoZWNraW5nIFZhbGlkIHByaW50cyBzb21ldGhpbmcgdGhhdCByZWFkcwovLyBhcyB3cm9uZyBpbnN0ZWFkIG9mIHNvbWV0aGluZyB0aGF0IHJlYWRzIGFzIG1pc3NpbmcuCmZ1bmMgKG0gTWV0aG9kKSBTdHJpbmcoKSBzdHJpbmcgewoJc3dpdGNoIG0gewoJY2FzZSBGSUZPOgoJCXJldHVybiAiZmlmbyIKCWNhc2UgTElGTzoKCQlyZXR1cm4gImxpZm8iCgljYXNlIFdBVkc6CgkJcmV0dXJuICJ3ZWlnaHRlZC1hdmVyYWdlIgoJfQoJcmV0dXJuICJpbnZhbGlkIgp9CgovLyBMb3QgaXMgb25lIHJlY2VpcHQgb2Ygc3RvY2s6IGEgcXVhbnRpdHksIHdoYXQgd2FzIHBhaWQgZm9yIGFsbCBvZiBpdCwgYW5kIGhvdwovLyBtdWNoIG9mIGl0IGhhcyBzaW5jZSBiZWVuIGNvbnN1bWVkLiBJdCBpcyBhIHZhbHVlLCBpcyBzYWZlIHRvIGNvcHksIGFuZCBldmVyeQovLyBtZXRob2QgdmFsaWRhdGVzIGl0cyByZWNlaXZlciwgc28gYSBoYW5kLWJ1aWx0IG9yIHplcm8gTG90IGZhaWxzIHJhdGhlciB0aGFuCi8vIHJldHVybmluZyBhIHBsYXVzaWJsZSBudW1iZXIuCi8vCi8vIENvbnN0cnVjdCB3aXRoIFtOZXdMb3RdIHNvIHRoZSBvdmVyZmxvdyBwcmVjb25kaXRpb24gaXMgY2hlY2tlZCBvbmNlIHJhdGhlcgovLyB0aGFuIG9uIGV2ZXJ5IGNhbGwuIFRoZSBmaWVsZHMgYXJlIGV4cG9ydGVkIGJlY2F1c2UgYSByZWFsbSBtdXN0IGJlIGFibGUgdG8KLy8gcmVuZGVyIGEgbG90IGFuZCBwZXJzaXN0IGl0LCBhbmQgYmVjYXVzZSBbUG9vbC5Mb3RzXSBoYW5kcyBvdXQgY29waWVzLgp0eXBlIExvdCBzdHJ1Y3QgewoJLy8gUXR5IGlzIHRoZSBxdWFudGl0eSByZWNlaXZlZC4gSXQgbmV2ZXIgY2hhbmdlczogY29uc3VtcHRpb24gbW92ZXMKCS8vIENvbnN1bWVkLCBub3QgUXR5LCBiZWNhdXNlIENvc3RBdCBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBvcmlnaW5hbCBwYWlyCgkvLyBhbmQgcmVkdWNpbmcgUXR5IHdvdWxkIHJlZGVmaW5lIHRoZSBmdW5jdGlvbiB1bmRlciBpdHMgb3duIGNhbGxlcnMuCglRdHkgaW50NjQKCgkvLyBDb3N0IGlzIHdoYXQgdGhlIHdob2xlIG9mIFF0eSBjb3N0LiBJdCBuZXZlciBjaGFuZ2VzIGVpdGhlciwgZm9yIHRoZQoJLy8gc2FtZSByZWFzb24g4oCUIGV4Y2VwdCB1bmRlciBbV0FWR10sIHdoZXJlIGEgcmVjZWlwdCByZXBsYWNlcyB0aGUgbG90CgkvLyB3aXRoIGEgZnJlc2hseSBhbmNob3JlZCBvbmUgcmF0aGVyIHRoYW4gZWRpdGluZyB0aGlzIGZpZWxkLgoJQ29zdCBpbnQ2NAoKCS8vIENvbnN1bWVkIGlzIHRoZSBjdW11bGF0aXZlIHF1YW50aXR5IGNvbnN1bWVkIGZyb20gdGhpcyBsb3QsIGluCgkvLyBbMCwgUXR5XS4gSXQgaXMgdGhlIHNvbGUgYXJndW1lbnQgb2YgdGhlIGNvc3QgZnVuY3Rpb24uCglDb25zdW1lZCBpbnQ2NAoKCS8vIFNlcSBpcyB0aGUgcmVjZWlwdCBvcmRlciB3aXRoaW4gYSBwb29sLCBhc3NpZ25lZCBieSBbUG9vbC5SZWNlaXZlXS4KCS8vIEl0IG9yZGVycyBsb3RzIGZvciBGSUZPIGFuZCBMSUZPIGFuZCAqKm5ldmVyIGVudGVycyBhIGNvc3QKCS8vIGNvbXB1dGF0aW9uKio6IHR3byBsb3RzIHdpdGggdGhlIHNhbWUgUXR5IGFuZCBDb3N0IGNvc3QgdGhlIHNhbWUgdG8KCS8vIGNvbnN1bWUgd2hhdGV2ZXIgdGhlaXIgc2VxdWVuY2UsIHdoaWNoIGlzIHdoeSB0aGUgb3JkZXJpbmcgZGVjaXNpb24KCS8vIGFuZCB0aGUgY29zdGluZyBhcml0aG1ldGljIGNhbiBiZSByZXZpZXdlZCBzZXBhcmF0ZWx5LgoJU2VxIGludDY0Cn0KCi8vIE5ld0xvdCB2YWxpZGF0ZXMgYW5kIHJldHVybnMgYSBsb3Qgb2YgcXR5IHVuaXRzIGNvc3RpbmcgY29zdCBpbiB0b3RhbC4gU2VxCi8vIGlzIHplcm87IFtQb29sLlJlY2VpdmVdIGFzc2lnbnMgaXQuCmZ1bmMgTmV3TG90KHF0eSwgY29zdCBpbnQ2NCkgKExvdCwgZXJyb3IpIHsKCWwgOj0gTG90e1F0eTogcXR5LCBDb3N0OiBjb3N0fQoJaWYgZXJyIDo9IGwuY2hlY2soKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIExvdHt9LCBlcnIKCX0KCXJldHVybiBsLCBuaWwKfQoKLy8gY2hlY2sgdmFsaWRhdGVzIGV2ZXJ5IGZpZWxkIGFuZCwgY3JpdGljYWxseSwgdGhlIG92ZXJmbG93IHByZWNvbmRpdGlvbiB0aGF0Ci8vIGxldHMgW0xvdC5Db3N0QXRdIGJlIGEgdG90YWwgZnVuY3Rpb24gb24gYSBjb25zdHJ1Y3RlZCBsb3QuIEEgemVybyBMb3QKLy8gZmFpbHMsIHdoaWNoIGlzIHdoeSBldmVyeSBtZXRob2QgY2FsbHMgY2hlY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgaXRzCi8vIHJlY2VpdmVyLgpmdW5jIChsIExvdCkgY2hlY2soKSBlcnJvciB7CglpZiBsLlF0eSA8PSAwIHsKCQlyZXR1cm4gRXJyQmFkUXR5Cgl9CglpZiBsLkNvc3QgPCAwIHsKCQlyZXR1cm4gRXJyQmFkQ29zdAoJfQoJaWYgbC5Db25zdW1lZCA8IDAgfHwgbC5Db25zdW1lZCA+IGwuUXR5IHsKCQlyZXR1cm4gRXJyQmFkQ29uc3VtZWQKCX0KCWlmIGwuU2VxIDwgMCB7CgkJcmV0dXJuIEVyckJhZFNlcQoJfQoJLy8gQ29zdCprIGlzIHRoZSBvbmx5IHByb2R1Y3QgaW4gdGhpcyBwYWNrYWdlJ3MgY29zdCBmdW5jdGlvbiBhbmQKCS8vIGsgPD0gUXR5LCBzbyBDb3N0KlF0eSBib3VuZHMgaXQuIFF0eSA+PSAxIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQsIHNvCgkvLyB0aGUgZGl2aXNpb24gaXMgc2FmZS4KCWlmIGwuQ29zdCA+IG1heEludDY0L2wuUXR5IHsKCQlyZXR1cm4gRXJyT3ZlcmZsb3cKCX0KCXJldHVybiBuaWwKfQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBsb3QgaXMgd2VsbC1mb3JtZWQuIEEgemVybyBMb3QgaXMgbm90LgpmdW5jIChsIExvdCkgVmFsaWQoKSBib29sIHsgcmV0dXJuIGwuY2hlY2soKSA9PSBuaWwgfQoKLy8gUmVtYWluaW5nIGlzIFF0eSAtIENvbnN1bWVkOiB0aGUgcXVhbnRpdHkgc3RpbGwgb24gdGhlIHNoZWxmIGZyb20gdGhpcyBsb3QuCi8vCi8vIEl0IGRvZXMgbm90IHZhbGlkYXRlLCBhbmQgaXQgaXMgdGhlIG9ubHkgbWV0aG9kIGhlcmUgdGhhdCBkb2VzIG5vdC4gT24gYW4KLy8gaWxsLWZvcm1lZCBsb3QgaXQgcmV0dXJucyBhbiBhcmJpdHJhcnkgbnVtYmVyIOKAlCBMb3R7UXR5OiAxLCBDb25zdW1lZDoKLy8gbWluSW50NjR9IHdyYXBzLiBBIHplcm8gcmVzdWx0IG1lYW5zICJleGhhdXN0ZWQsIG9yIGludmFsaWQiLCBuZXZlcgovLyAiZXhoYXVzdGVkIiBhbG9uZTsgdXNlIFtMb3QuRXhoYXVzdGVkXSwgd2hpY2ggZG9lcyB2YWxpZGF0ZS4gR3VhcmQgYQovLyBjYWxsZXItc3VwcGxpZWQgbG90IHdpdGggW0xvdC5WYWxpZF0gYmVmb3JlIHF1b3RpbmcgUmVtYWluaW5nIGZyb20gaXQuCmZ1bmMgKGwgTG90KSBSZW1haW5pbmcoKSBpbnQ2NCB7IHJldHVybiBsLlF0eSAtIGwuQ29uc3VtZWQgfQoKLy8gRXhoYXVzdGVkIHJlcG9ydHMgd2hldGhlciBhIHdlbGwtZm9ybWVkIGxvdCBoYXMgbm90aGluZyBsZWZ0LiBBbiBpbnZhbGlkIGxvdAovLyBpcyBub3QgZXhoYXVzdGVkIOKAlCBpdCBpcyBpbnZhbGlkLCBhbmQgY29uZmxhdGluZyB0aGUgdHdvIGlzIGhvdyBhIGJhZCBsb3QKLy8gZ2V0cyBzaWxlbnRseSBkcm9wcGVkIGJ5IFtQb29sLkNvbnN1bWVdJ3MgaG91c2VrZWVwaW5nLgpmdW5jIChsIExvdCkgRXhoYXVzdGVkKCkgYm9vbCB7IHJldHVybiBsLlZhbGlkKCkgJiYgbC5SZW1haW5pbmcoKSA9PSAwIH0KCi8vIENvc3RBdCByZXR1cm5zIHRoZSBjdW11bGF0aXZlIGNvc3QgY29uc3VtZWQgZnJvbSB0aGlzIGxvdCBvbmNlIGsgdW5pdHMgaW4KLy8gdG90YWwgaGF2ZSBiZWVuIGNvbnN1bWVkIGZyb20gaXQ6Ci8vCi8vCUNvc3RBdChrKSA9PSBDb3N0KmsgLyBRdHkKLy8KLy8gSXQgaXMgdGhlIG9uZSBmdW5jdGlvbiBpbiB0aGlzIHBhY2thZ2UsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgZGVmaW5lZCBmcm9tCi8vIGl0LiBJdCBpcyBtb25vdG9uZSBub24tZGVjcmVhc2luZyBpbiBrLCB6ZXJvIGF0IGsgPT0gMCwgYW5kICoqZXhhY3RseSBDb3N0IGF0Ci8vIGsgPT0gUXR5Kiog4oCUIHRoYXQgZW5kcG9pbnQgaXMgbm90IGFuIGFwcHJveGltYXRpb24sIGJlY2F1c2UgQ29zdCpRdHkvUXR5IGlzCi8vIGV4YWN0IGluIGludGVnZXJzLCBhbmQgaXQgaXMgd2hhdCBtYWtlcyBhIGxvdCdzIHdob2xlIGxpZmUgY2hhcmdlIGV4YWN0bHkKLy8gd2hhdCB0aGUgbG90IGNvc3QgYW5kIG1ha2VzIGRyb3BwaW5nIGFuIGV4aGF1c3RlZCBsb3QgY29zdC1uZXV0cmFsLgovLwovLyBrIG91dHNpZGUgWzAsIFF0eV0gaXMgW0VyckJhZENvbnN1bWVkXSByYXRoZXIgdGhhbiBhIGNsYW1wOiBhIGNsYW1wIHdvdWxkIGxldAovLyBhIGNhbGxlcidzIG9mZi1ieS1vbmUgcmVhZCBhcyBhIHZhbGlkIGNvc3QgYXQgdGhlIGJvdW5kYXJ5LgpmdW5jIChsIExvdCkgQ29zdEF0KGsgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBsLmNoZWNrKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCWlmIGsgPCAwIHx8IGsgPiBsLlF0eSB7CgkJcmV0dXJuIDAsIEVyckJhZENvbnN1bWVkCgl9CgkvLyBDYW5ub3Qgb3ZlcmZsb3c6IGNoZWNrIGVzdGFibGlzaGVkIENvc3QgPD0gbWF4SW50NjQvUXR5IGFuZCBrIDw9IFF0eS4KCXJldHVybiAobC5Db3N0ICogaykgLyBsLlF0eSwgbmlsCn0KCi8vIENvbnN1bWVkQ29zdCByZXR1cm5zIHRoZSBjb3N0IGNvbnN1bWVkIGZyb20gdGhpcyBsb3Qgc28gZmFyOiBDb3N0QXQoQ29uc3VtZWQpLgpmdW5jIChsIExvdCkgQ29uc3VtZWRDb3N0KCkgKGludDY0LCBlcnJvcikgeyByZXR1cm4gbC5Db3N0QXQobC5Db25zdW1lZCkgfQoKLy8gUmVtYWluaW5nQ29zdCByZXR1cm5zIHdoYXQgdGhlIHVuaXRzIHN0aWxsIG9uIHRoZSBzaGVsZiBhcmUgY2FycmllZCBhdDoKLy8gQ29zdCAtIENvbnN1bWVkQ29zdC4gSXQgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBDb3N0QXQgc28gdGhlIHR3byBjYW4gbmV2ZXIKLy8gZGlzYWdyZWUsIHdoaWNoIGlzIHRoZSBzYW1lIHJlYXNvbiBbTG90LlRha2VdIGlzLiBJdCBpcyB6ZXJvIGV4YWN0bHkgd2hlbiB0aGUKLy8gbG90IGlzIGV4aGF1c3RlZC4KZnVuYyAobCBMb3QpIFJlbWFpbmluZ0Nvc3QoKSAoaW50NjQsIGVycm9yKSB7CgljLCBlcnIgOj0gbC5Db25zdW1lZENvc3QoKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoJLy8gTm9uLW5lZ2F0aXZlIGFuZCBjYW5ub3Qgb3ZlcmZsb3c6IENvc3RBdCBpcyBpbiBbMCwgQ29zdF0uCglyZXR1cm4gbC5Db3N0IC0gYywgbmlsCn0KCi8vIFRha2UgY29uc3VtZXMgbiB1bml0cyBmcm9tIHRoZSBsb3QsIHJldHVybmluZyB0aGUgYWR2YW5jZWQgbG90IGFuZCB0aGUgY29zdAovLyBvZiB0aG9zZSB1bml0cy4gVGhlIHJlY2VpdmVyIGlzIGEgdmFsdWUsIHNvIGEgZmFpbGVkIFRha2UgY2Fubm90IGhhdmUKLy8gbXV0YXRlZCBhbnl0aGluZyB0aGUgY2FsbGVyIGhvbGRzIOKAlCB0aGUgYXRvbWljaXR5IHRoZSBwYWNrYWdlIGRvYyBkZXNjcmliZXMKLy8gaXMgc3RydWN0dXJhbCBhdCB0aGlzIGxldmVsIGFuZCBoYXMgdG8gYmUgYnVpbHQgYnkgaGFuZCBvbmUgbGV2ZWwgdXAsIGluCi8vIFtQb29sLkNvbnN1bWVdLgovLwovLyBUaGUgY2hhcmdlIGlzIHRoZSBkaWZmZXJlbmNlIG9mIFtMb3QuQ29zdEF0XSBhdCB0aGUgdHdvIGNvbnN1bWVkIGNvdW50cywKLy8gd2hpY2ggbWFrZXMgY2hhcmdlcyB0ZWxlc2NvcGUgZXhhY3RseToKLy8KLy8JVGFrZShh4oaSYikgKyBUYWtlKGLihpJjKSA9PSBUYWtlKGHihpJjKSAgIGZvciBhIDw9IGIgPD0gYwovLwovLyBTbyBob3cgYSByZWFsbSBzbGljZXMgaXRzIHNoaXBtZW50cyBjYW5ub3QgY2hhbmdlIHdoYXQgYSBsb3QgY2hhcmdlcyBpbgovLyB0b3RhbCwgbm9yIHdoYXQgaXQgaGFzIGNoYXJnZWQgYnkgYW55IHBvaW50IGluIGl0cyBsaWZlLiBUaGUgY2hhcmdlIGlzIG5ldmVyCi8vIG5lZ2F0aXZlOyBuIG11c3QgYmUgcG9zaXRpdmUgYW5kIHdpdGhpbiBbTG90LlJlbWFpbmluZ10uCmZ1bmMgKGwgTG90KSBUYWtlKG4gaW50NjQpIChMb3QsIGludDY0LCBlcnJvcikgewoJaWYgZXJyIDo9IGwuY2hlY2soKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIExvdHt9LCAwLCBlcnIKCX0KCWlmIG4gPD0gMCB7CgkJcmV0dXJuIExvdHt9LCAwLCBFcnJCYWRRdHkKCX0KCWlmIG4gPiBsLlJlbWFpbmluZygpIHsKCQlyZXR1cm4gTG90e30sIDAsIEVyckluc3VmZmljaWVudAoJfQoJYmVmb3JlLCBlcnIgOj0gbC5Db3N0QXQobC5Db25zdW1lZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBMb3R7fSwgMCwgZXJyCgl9CglhZnRlciwgZXJyIDo9IGwuQ29zdEF0KGwuQ29uc3VtZWQgKyBuKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIExvdHt9LCAwLCBlcnIKCX0KCWwuQ29uc3VtZWQgKz0gbgoJLy8gYWZ0ZXIgPj0gYmVmb3JlIGJlY2F1c2UgQ29zdEF0IGlzIG1vbm90b25lIG5vbi1kZWNyZWFzaW5nLCBzbyB0aGUKCS8vIGRpZmZlcmVuY2UgaXMgbm9uLW5lZ2F0aXZlIGFuZCBjYW5ub3Qgb3ZlcmZsb3c6IGJvdGggbGllIGluIFswLCBDb3N0XS4KCXJldHVybiBsLCBhZnRlciAtIGJlZm9yZSwgbmlsCn0KCi8vIFBvb2wgaXMgdGhlIGxpdmUgbG90cyBvZiBvbmUgc3RvY2sta2VlcGluZyB1bml0IHVuZGVyIG9uZSBjb25zdW1wdGlvbgovLyBtZXRob2QsIHBsdXMgdGhlIGZvdXIgY3VtdWxhdGl2ZSBjb3VudGVycyB0aGUgY3Jvc3MtZm9vdHMgY29tcGFyZSBhZ2FpbnN0LgovLwovLyBJdCBpcyBhIHBvaW50ZXIgdHlwZSB3aXRoIHVuZXhwb3J0ZWQgc3RhdGUgYmVjYXVzZSB0aGUgY291bnRlcnMgYW5kIHRoZSBsb3RzCi8vIG11c3QgbW92ZSB0b2dldGhlciDigJQgYSByZWFsbSBob2xkaW5nIGEgbXV0YWJsZSB2aWV3IG9mIG9uZSB3aXRob3V0IHRoZSBvdGhlcgovLyBjb3VsZCBsZWF2ZSB0aGUgcG9vbCBzdGF0aW5nIGEgY29zdCBvbiBoYW5kIGl0cyBvd24gcmVjZWlwdHMgY29udHJhZGljdC4KLy8gW1Bvb2wuTG90c10gdGhlcmVmb3JlIHJldHVybnMgY29waWVzLgp0eXBlIFBvb2wgc3RydWN0IHsKCW1ldGhvZCAgTWV0aG9kCgltYXhMb3RzIGludAoJbG90cyAgICBbXUxvdAoJbmV4dFNlcSBpbnQ2NAoKCS8vIFRoZSBjb3VudGVycy4gRWFjaCBpcyBtb25vdG9uZSBub24tZGVjcmVhc2luZyBhbmQgZWFjaCBpcyBtYWludGFpbmVkCgkvLyBpbmRlcGVuZGVudGx5IG9mIHRoZSBsb3RzLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQ6IGEgY3Jvc3MtZm9vdAoJLy8gY29tcGFyZXMgYSBjb3VudGVyIGFnYWluc3QgYSB3YWxrIG9mIHRoZSBsb3RzLCBzbyBhIGJ1ZyBpbiBlaXRoZXIgb25lCgkvLyBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIGNhbmNlbGxpbmcuCglyZWN2UXR5ICBpbnQ2NAoJcmVjdkNvc3QgaW50NjQKCWNvbnNRdHkgIGludDY0CgljaGdDb3N0ICBpbnQ2NAp9CgovLyBOZXdQb29sIHZhbGlkYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBwb29sIGNvbnN1bWluZyBsb3RzIGluIHRoZSBnaXZlbgovLyBvcmRlciBhbmQgaG9sZGluZyBhdCBtb3N0IG1heExvdHMgbGl2ZSBsb3RzLgpmdW5jIE5ld1Bvb2wobWV0aG9kIE1ldGhvZCwgbWF4TG90cyBpbnQpICgqUG9vbCwgZXJyb3IpIHsKCWlmICFtZXRob2QuVmFsaWQoKSB7CgkJcmV0dXJuIG5pbCwgRXJyQmFkTWV0aG9kCgl9CglpZiBtYXhMb3RzIDw9IDAgfHwgbWF4TG90cyA+IE1heExvdHNMaW1pdCB7CgkJcmV0dXJuIG5pbCwgRXJyQmFkTWF4TG90cwoJfQoJcmV0dXJuICZQb29se21ldGhvZDogbWV0aG9kLCBtYXhMb3RzOiBtYXhMb3RzLCBuZXh0U2VxOiAxfSwgbmlsCn0KCi8vIE11c3ROZXdQb29sIGlzIE5ld1Bvb2wsIHBhbmlja2luZyBvbiBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24uIEl0IGlzIGZvciBhCi8vIHJlYWxtJ3MgaW5pdCwgd2hlcmUgYSBjb25maWd1cmF0aW9uIGVycm9yIGlzIGEgZGVwbG95bWVudCBidWcgYW5kIHNob3VsZAovLyBhYm9ydCB0aGUgdHJhbnNhY3Rpb24gcmF0aGVyIHRoYW4gYmUgaGFuZGxlZC4KZnVuYyBNdXN0TmV3UG9vbChtZXRob2QgTWV0aG9kLCBtYXhMb3RzIGludCkgKlBvb2wgewoJcCwgZXJyIDo9IE5ld1Bvb2wobWV0aG9kLCBtYXhMb3RzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHAKfQoKLy8gTWV0aG9kIGlzIHRoZSBjb25zdW1wdGlvbiBvcmRlciwgZml4ZWQgYXQgY29uc3RydWN0aW9uLiBJdCBpcyBkZWxpYmVyYXRlbHkKLy8gaW1tdXRhYmxlOiBjaGFuZ2luZyBpdCBtaWQtbGlmZSB3b3VsZCByZWNvc3Qgbm90aGluZyBhbHJlYWR5IGNoYXJnZWQgYnV0Ci8vIHdvdWxkIGNoYW5nZSB3aGF0IHRoZSBuZXh0IHNoaXBtZW50IGNvc3RzLCB3aGljaCBpcyBhIHJlc3RhdGVtZW50IGEKLy8gc3ViLWxlZGdlciBtdXN0IG5vdCBiZSBhYmxlIHRvIG1ha2Ugc2lsZW50bHkuIEEgcmVhbG0gdGhhdCBtdXN0IHN3aXRjaAovLyBtZXRob2RzIG9wZW5zIGEgbmV3IHBvb2wgYW5kIGRpc2Nsb3NlcyBpdC4KZnVuYyAocCAqUG9vbCkgTWV0aG9kKCkgTWV0aG9kIHsgcmV0dXJuIHAubWV0aG9kIH0KCi8vIE1heExvdHMgaXMgdGhlIHBvb2wncyBvd24gbGl2ZS1sb3QgY2FwLgpmdW5jIChwICpQb29sKSBNYXhMb3RzKCkgaW50IHsgcmV0dXJuIHAubWF4TG90cyB9CgovLyBMb3RDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGxpdmUgbG90cy4gRXhoYXVzdGVkIGxvdHMgYXJlIGRyb3BwZWQgYnkKLy8gW1Bvb2wuQ29uc3VtZV0sIHNvIHRoaXMgaXMgbm90IHRoZSBudW1iZXIgb2YgcmVjZWlwdHM7IHRoYXQgaXMKLy8gW1Bvb2wuUmVjZWlwdENvdW50XS4KZnVuYyAocCAqUG9vbCkgTG90Q291bnQoKSBpbnQgeyByZXR1cm4gbGVuKHAubG90cykgfQoKLy8gUmVjZWlwdENvdW50IGlzIGhvdyBtYW55IHJlY2VpcHRzIHRoZSBwb29sIGhhcyB0YWtlbiwgaW5jbHVkaW5nIHRob3NlIHdob3NlCi8vIGxvdHMgYXJlIGV4aGF1c3RlZCBhbmQgZHJvcHBlZCwgYW5kIGluY2x1ZGluZyBXQVZHIG1lcmdlcy4KLy8KLy8gVGhlIGNsYW1wIGlzIG5vdCBkZWZlbnNpdmUgbm9pc2UuIG5leHRTZXEgaXMgMSBvbiBhIGNvbnN0cnVjdGVkIHBvb2wsIHNvIGEKLy8gemVyby12YWx1ZSBQb29sIOKAlCBvbmUgYSByZWFsbSBkZWNsYXJlZCByYXRoZXIgdGhhbiBidWlsdCB3aXRoIFtOZXdQb29sXSDigJQKLy8gd291bGQgb3RoZXJ3aXNlIHJlcG9ydCAqKm1pbnVzIG9uZSByZWNlaXB0KiosIGFuIGFmZmlybWF0aXZlbHkgd3JvbmcgbnVtYmVyCi8vIHJlbmRlcmVkIGFzIGZhY3QuIFRoYXQgaXMgdGhlIG9wcG9zaXRlIG9mIHRoZSBjaG9pY2UgW01ldGhvZC5TdHJpbmddIG1ha2VzCi8vIHR3ZW50eSBsaW5lcyB1cCwgd2hlcmUgdGhlIHplcm8gdmFsdWUgZGVsaWJlcmF0ZWx5IHJlYWRzICJpbnZhbGlkIiBzbyBhCi8vIGNhbGxlciB3aG8gc2tpcHBlZCB0aGUgY2hlY2sgcHJpbnRzIHNvbWV0aGluZyB0aGF0IHJlYWRzIGFzIHdyb25nIHJhdGhlciB0aGFuCi8vIGFzIG1pc3NpbmcuIEEgY291bnQgaGFzIG5vIHN1Y2ggd29yZCwgc28gdGhlIGhvbmVzdCBhbnN3ZXIgZm9yIGEgcG9vbCB0aGF0Ci8vIGhhcyB0YWtlbiBubyByZWNlaXB0cyBpcyB6ZXJvLiBUcmFuc2FjdGluZyBvbiB0aGF0IHBvb2wgaXMgc3RpbGwgcmVmdXNlZDoKLy8gW1Bvb2wuUmVjZWl2ZV0gYW5kIFtQb29sLkNvbnN1bWVdIGJvdGggcmV0dXJuIFtFcnJCYWRNZXRob2RdLgpmdW5jIChwICpQb29sKSBSZWNlaXB0Q291bnQoKSBpbnQ2NCB7CglpZiBwLm5leHRTZXEgPD0gMCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBwLm5leHRTZXEgLSAxCn0KCi8vIExvdHMgcmV0dXJucyB0aGUgbGl2ZSBsb3RzIGluIHJlY2VpcHQgb3JkZXIsIGFzIGNvcGllcy4gTXV0YXRpbmcgdGhlIHJlc3VsdAovLyBkb2VzIG5vdCBhZmZlY3QgdGhlIHBvb2wuCmZ1bmMgKHAgKlBvb2wpIExvdHMoKSBbXUxvdCB7CglvdXQgOj0gbWFrZShbXUxvdCwgbGVuKHAubG90cykpCgljb3B5KG91dCwgcC5sb3RzKQoJcmV0dXJuIG91dAp9CgovLyBMb3QgcmV0dXJucyB0aGUgaSd0aCBsaXZlIGxvdCBpbiByZWNlaXB0IG9yZGVyLCBhbmQgd2hldGhlciBpIHdhcyBpbiByYW5nZS4KZnVuYyAocCAqUG9vbCkgTG90KGkgaW50KSAoTG90LCBib29sKSB7CglpZiBpIDwgMCB8fCBpID49IGxlbihwLmxvdHMpIHsKCQlyZXR1cm4gTG90e30sIGZhbHNlCgl9CglyZXR1cm4gcC5sb3RzW2ldLCB0cnVlCn0KCi8vIFJlY2VpdmVkUXR5IGlzIHRoZSBjdW11bGF0aXZlIHF1YW50aXR5IHJlY2VpdmVkLgpmdW5jIChwICpQb29sKSBSZWNlaXZlZFF0eSgpIGludDY0IHsgcmV0dXJuIHAucmVjdlF0eSB9CgovLyBSZWNlaXZlZENvc3QgaXMgdGhlIGN1bXVsYXRpdmUgY29zdCByZWNlaXZlZC4KZnVuYyAocCAqUG9vbCkgUmVjZWl2ZWRDb3N0KCkgaW50NjQgeyByZXR1cm4gcC5yZWN2Q29zdCB9CgovLyBDb25zdW1lZFF0eSBpcyB0aGUgY3VtdWxhdGl2ZSBxdWFudGl0eSBjb25zdW1lZC4KZnVuYyAocCAqUG9vbCkgQ29uc3VtZWRRdHkoKSBpbnQ2NCB7IHJldHVybiBwLmNvbnNRdHkgfQoKLy8gQ2hhcmdlZENvc3QgaXMgdGhlIGN1bXVsYXRpdmUgY29zdCBjaGFyZ2VkIG91dCBieSBbUG9vbC5Db25zdW1lXS4gVGhpcyBpcwovLyB0aGUgZmlndXJlIGEgcmVhbG0gcG9zdHMgYXMgY29zdCBvZiBnb29kcyBzb2xkLCBhbmQgaXQgaXMgZGVyaXZlZDogbm8gY2FsbGVyCi8vIGhhcyBldmVyIHN1cHBsaWVkIGl0LgpmdW5jIChwICpQb29sKSBDaGFyZ2VkQ29zdCgpIGludDY0IHsgcmV0dXJuIHAuY2hnQ29zdCB9CgovLyBRdHlPbkhhbmQgd2Fsa3MgdGhlIGxpdmUgbG90cyBhbmQgc3VtcyB3aGF0IHJlbWFpbnMuIEl0IGlzIGRlcml2ZWQgZnJvbSB0aGUKLy8gbG90cyByYXRoZXIgdGhhbiByZWFkIGZyb20gYSBjb3VudGVyLCB3aGljaCBpcyB3aGF0IG1ha2VzCi8vIFtQb29sLkNyb3NzRm9vdFF0eV0gYSBjb21wYXJpc29uIG9mIHR3byB0aGluZ3MgcmF0aGVyIHRoYW4gYSB0YXV0b2xvZ3kuCi8vCi8vIEl0IGNhbm5vdCBvdmVyZmxvdzogZXZlcnkgbG90J3MgcmVtYWluaW5nIHF1YW50aXR5IGlzIG5vbi1uZWdhdGl2ZSBhbmQgdGhlaXIKLy8gc3VtIGlzIGJvdW5kZWQgYnkgcmVjdlF0eSwgd2hpY2ggW1Bvb2wuUmVjZWl2ZV0gcmVmdXNlZCB0byBsZXQgb3ZlcmZsb3cuCmZ1bmMgKHAgKlBvb2wpIFF0eU9uSGFuZCgpIGludDY0IHsKCXRvdGFsIDo9IGludDY0KDApCglmb3IgXywgbCA6PSByYW5nZSBwLmxvdHMgewoJCXRvdGFsICs9IGwuUmVtYWluaW5nKCkKCX0KCXJldHVybiB0b3RhbAp9CgovLyBDb3N0T25IYW5kIHdhbGtzIHRoZSBsaXZlIGxvdHMgYW5kIHN1bXMgd2hhdCB0aGV5IGFyZSBjYXJyaWVkIGF0OiB0aGUKLy8gaW52ZW50b3J5IHZhbHVlIGEgcmVhbG0gcmVwb3J0cyBvbiBpdHMgYmFsYW5jZSBzaGVldC4gRGVyaXZlZCwgZm9yIHRoZSBzYW1lCi8vIHJlYXNvbiBhcyBbUG9vbC5RdHlPbkhhbmRdLgovLwovLyBJdCByZXR1cm5zIGFuIGVycm9yIGJlY2F1c2UgYSBsb3QgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbiBtYWtlcyB0aGUgc3VtCi8vIG1lYW5pbmdsZXNzLCBhbmQgYmVjYXVzZSB0aGUgcnVubmluZyB0b3RhbCBpcyBvdmVyZmxvdy1jaGVja2VkLiBUaGF0IGNoZWNrCi8vIGlzIGJlbGlldmVkIHVucmVhY2hhYmxlIOKAlCB0aGUgc3VtIGlzIGJvdW5kZWQgYnkgcmVjdkNvc3QsIHdob3NlIG93bgovLyBhY2N1bXVsYXRpb24gUmVjZWl2ZSBndWFyZHMg4oCUIGFuZCBpdCBpcyB3cml0dGVuIGFueXdheSwgYmVjYXVzZSAidW5yZWFjaGFibGUiCi8vIGlzIGFuIGFyZ3VtZW50IGFib3V0IGNvZGUgdGhhdCBtYXkgYmUgZWRpdGVkIGFuZCB0aGUgY29zdCBvZiBiZWluZyB3cm9uZwovLyBoZXJlIGlzIGEgbmVnYXRpdmUgaW52ZW50b3J5IHZhbHVlLgpmdW5jIChwICpQb29sKSBDb3N0T25IYW5kKCkgKGludDY0LCBlcnJvcikgewoJdG90YWwgOj0gaW50NjQoMCkKCWZvciBfLCBsIDo9IHJhbmdlIHAubG90cyB7CgkJYywgZXJyIDo9IGwuUmVtYWluaW5nQ29zdCgpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAwLCBlcnIKCQl9CgkJaWYgdG90YWwgPiBtYXhJbnQ2NC1jIHsKCQkJcmV0dXJuIDAsIEVyck92ZXJmbG93CgkJfQoJCXRvdGFsICs9IGMKCX0KCXJldHVybiB0b3RhbCwgbmlsCn0KCi8vIFJlY2VpdmUgcmVjb3JkcyBhIHJlY2VpcHQgb2YgcXR5IHVuaXRzIGNvc3RpbmcgY29zdCBpbiB0b3RhbC4KLy8KLy8gVW5kZXIgRklGTyBhbmQgTElGTyBpdCBhcHBlbmRzIGEgbG90LCByZWZ1c2luZyB3aXRoIFtFcnJQb29sRnVsbF0gYXQgdGhlCi8vIHBvb2wncyBjYXAuIFVuZGVyIFdBVkcgaXQgbWVyZ2VzIGludG8gdGhlIHNpbmdsZSBsaXZlIGxvdCwgcmUtYW5jaG9yaW5nIGl0OgovLyB0aGUgbWVyZ2VkIGxvdCBjYXJyaWVzIHRoZSByZW1haW5pbmcgcXVhbnRpdHkgcGx1cyBxdHksIHRoZSByZW1haW5pbmcgY29zdAovLyBwbHVzIGNvc3QsIGFuZCBhIGNvbnN1bWVkIGNvdW50IG9mIHplcm8uIFNlZSB0aGUgcGFja2FnZSBkb2Mgb24gd2h5IHRoZQovLyByZS1hbmNob3IgaXMgZm9yY2VkIHJhdGhlciB0aGFuIGNob3Nlbi4KLy8KLy8gVGhlIG1lcmdlIGlzIHdoZXJlIFdBVkcgY2FuIHJlZnVzZSB3aGF0IHRoZSBvdGhlciB0d28gbWV0aG9kcyBhY2NlcHQuIEEKLy8gbWVyZ2VkIGxvdCBtdXN0IHNhdGlzZnkgdGhlIHNhbWUgcHJlY29uZGl0aW9uIGV2ZXJ5IGxvdCBkb2VzLAovLyBgQ29zdCA8PSBtYXhJbnQ2NC9RdHlgLCBhbmQgdHdvIHNlcGFyYXRlbHktaGVsZCBsb3RzIGVhY2ggc2F0aXNmeWluZyBpdCBkbwovLyBub3QgaW1wbHkgdGhlaXIgbWVyZ2UgZG9lcy4gVGhhdCByZXR1cm5zIFtFcnJPdmVyZmxvd10gYW5kIGxlYXZlcyB0aGUgcG9vbAovLyBleGFjdGx5IGFzIGl0IHdhcywgc28gdGhlIHJlY2VpcHQgaXMgcmVmdXNlZCByYXRoZXIgdGhhbiBwYXJ0bHkgYXBwbGllZCDigJQKLy8gYnV0IGEgcmVhbG0gbXVzdCBoYW5kbGUgaXQsIGJlY2F1c2UgdW5kZXIgV0FWRyBpdCBpcyBhIHByb3BlcnR5IG9mIHRoZQovLyAqaGlzdG9yeSogYW5kIG5vdCBvbmx5IG9mIHRoZSBhcmd1bWVudHMuCi8vCi8vIE5vdGhpbmcgaXMgY29tbWl0dGVkIHVudGlsIGV2ZXJ5IGNoZWNrIGhhcyBwYXNzZWQ6IG9uIGFueSBlcnJvciB0aGUgcG9vbCBpcwovLyB1bnRvdWNoZWQsIGluY2x1ZGluZyBpdHMgY291bnRlcnMuCmZ1bmMgKHAgKlBvb2wpIFJlY2VpdmUocXR5LCBjb3N0IGludDY0KSBlcnJvciB7CglpZiAhcC5tZXRob2QuVmFsaWQoKSB7CgkJcmV0dXJuIEVyckJhZE1ldGhvZAoJfQoJaWYgcXR5IDw9IDAgewoJCXJldHVybiBFcnJCYWRRdHkKCX0KCWlmIGNvc3QgPCAwIHsKCQlyZXR1cm4gRXJyQmFkQ29zdAoJfQoJaWYgcC5uZXh0U2VxID09IG1heEludDY0IHsKCQlyZXR1cm4gRXJyU2VxRXhoYXVzdGVkCgl9CglpZiBwLnJlY3ZRdHkgPiBtYXhJbnQ2NC1xdHkgewoJCXJldHVybiBFcnJPdmVyZmxvdwoJfQoJaWYgcC5yZWN2Q29zdCA+IG1heEludDY0LWNvc3QgewoJCXJldHVybiBFcnJPdmVyZmxvdwoJfQoKCS8vIFN0YWdlIHRoZSBsb3QgdGhlIHJlY2VpcHQgcHJvZHVjZXMsIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHBvb2wuCgl2YXIgc3RhZ2VkIFtdTG90CglpZiBwLm1ldGhvZCA9PSBXQVZHICYmIGxlbihwLmxvdHMpID4gMCB7CgkJLy8gV0FWRyBob2xkcyBhdCBtb3N0IG9uZSBsb3QgYnkgY29uc3RydWN0aW9uIOKAlCB0aGUgbWV0aG9kIGlzCgkJLy8gaW1tdXRhYmxlIGFuZCB0aGlzIGJyYW5jaCBpcyB0aGUgb25seSB3YXkgYSBzZWNvbmQgb25lIGNvdWxkCgkJLy8gYXJyaXZlIOKAlCBzbyBtZXJnaW5nIGludG8gaW5kZXggMCBpcyBtZXJnaW5nIGludG8gdGhlIG9ubHkgbG90LgoJCS8vIFRoZSBndWFyZCBpcyBrZXB0IGJlY2F1c2UgdGhhdCBhcmd1bWVudCBpcyBhYm91dCB0aGUgd2hvbGUKCQkvLyBwYWNrYWdlIHJhdGhlciB0aGFuIGFib3V0IHRoaXMgZnVuY3Rpb24uCgkJaWYgbGVuKHAubG90cykgIT0gMSB7CgkJCXJldHVybiBFcnJCYWRNZXRob2QKCQl9CgkJY3VyIDo9IHAubG90c1swXQoJCXJlbSA6PSBjdXIuUmVtYWluaW5nKCkKCQlyZW1Db3N0LCBlcnIgOj0gY3VyLlJlbWFpbmluZ0Nvc3QoKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJCWlmIHJlbSA+IG1heEludDY0LXF0eSB7CgkJCXJldHVybiBFcnJPdmVyZmxvdwoJCX0KCQlpZiByZW1Db3N0ID4gbWF4SW50NjQtY29zdCB7CgkJCXJldHVybiBFcnJPdmVyZmxvdwoJCX0KCQltZXJnZWQgOj0gTG90e1F0eTogcmVtICsgcXR5LCBDb3N0OiByZW1Db3N0ICsgY29zdCwgU2VxOiBjdXIuU2VxfQoJCWlmIGVyciA6PSBtZXJnZWQuY2hlY2soKTsgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9CgkJc3RhZ2VkID0gW11Mb3R7bWVyZ2VkfQoJfSBlbHNlIHsKCQlpZiBsZW4ocC5sb3RzKSA+PSBwLm1heExvdHMgewoJCQlyZXR1cm4gRXJyUG9vbEZ1bGwKCQl9CgkJZnJlc2gsIGVyciA6PSBOZXdMb3QocXR5LCBjb3N0KQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZXJyCgkJfQoJCWZyZXNoLlNlcSA9IHAubmV4dFNlcQoJCXN0YWdlZCA9IG1ha2UoW11Mb3QsIDAsIGxlbihwLmxvdHMpKzEpCgkJc3RhZ2VkID0gYXBwZW5kKHN0YWdlZCwgcC5sb3RzLi4uKQoJCXN0YWdlZCA9IGFwcGVuZChzdGFnZWQsIGZyZXNoKQoJfQoKCS8vIENvbW1pdC4KCXAubG90cyA9IHN0YWdlZAoJcC5uZXh0U2VxKysKCXAucmVjdlF0eSArPSBxdHkKCXAucmVjdkNvc3QgKz0gY29zdAoJcmV0dXJuIG5pbAp9CgovLyBDb25zdW1lIHNoaXBzIHF0eSB1bml0cyBhbmQgcmV0dXJucyB3aGF0IHRoZXkgY29zdC4KLy8KLy8gVGhlIGNvc3QgaXMgZGVyaXZlZCBmcm9tIHRoZSBsb3RzIHRoZSB1bml0cyBjYW1lIG91dCBvZiwgaW4gdGhlIHBvb2wncwovLyBkZWNsYXJlZCBvcmRlciwgYW5kIGlzIG5ldmVyIGEgcGFyYW1ldGVyLiBMb3RzIHRoYXQgdGhlIHNoaXBtZW50IGV4aGF1c3RzCi8vIGFyZSBkcm9wcGVkLCB3aGljaCBpcyBjb3N0LW5ldXRyYWwgYmVjYXVzZSBbTG90LkNvc3RBdF0gaXMgZXhhY3QgYXQgUXR5LgovLwovLyBJdCBpcyBhbGwtb3Itbm90aGluZyBpbiBib3RoIHNlbnNlcy4gQSBzaGlwbWVudCBsYXJnZXIgdGhhbgovLyBbUG9vbC5RdHlPbkhhbmRdIGlzIFtFcnJJbnN1ZmZpY2llbnRdIHdpdGggdGhlIHBvb2wgdW50b3VjaGVkIOKAlCB0aGVyZSBpcyBubwovLyBwYXJ0aWFsIGZpbGwg4oCUIGFuZCB0aGUgd2hvbGUgZWZmZWN0IGlzIHN0YWdlZCBvbiBhIGNvcHkgYW5kIGNvbW1pdHRlZCBvbmx5Ci8vIGFmdGVyIHRoZSBsYXN0IGxvdCBoYXMgYmVlbiB0YWtlbiBmcm9tIHN1Y2Nlc3NmdWxseSwgYmVjYXVzZSBhbiBlcnJvciByZXR1cm4KLy8gZG9lcyBub3QgcmV2ZXJ0IGEgR25vIHRyYW5zYWN0aW9uLiBBIHBvb2wgbGVmdCBoYWxmLWNvbnN1bWVkIHdpdGggaXRzCi8vIGNvdW50ZXJzIHVubW92ZWQgd291bGQgc3RhdGUgYSBjb3N0IG9uIGhhbmQgaXRzIGxvdHMgY29udHJhZGljdCwgZGV0ZWN0YWJsZQovLyBvbmx5IGJ5IGEgY3Jvc3MtZm9vdC4KZnVuYyAocCAqUG9vbCkgQ29uc3VtZShxdHkgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCWlmICFwLm1ldGhvZC5WYWxpZCgpIHsKCQlyZXR1cm4gMCwgRXJyQmFkTWV0aG9kCgl9CglpZiBxdHkgPD0gMCB7CgkJcmV0dXJuIDAsIEVyckJhZFF0eQoJfQoJaWYgcXR5ID4gcC5RdHlPbkhhbmQoKSB7CgkJcmV0dXJuIDAsIEVyckluc3VmZmljaWVudAoJfQoKCXN0YWdlZCA6PSBtYWtlKFtdTG90LCBsZW4ocC5sb3RzKSkKCWNvcHkoc3RhZ2VkLCBwLmxvdHMpCgoJdG90YWwgOj0gaW50NjQoMCkKCWxlZnQgOj0gcXR5Cglmb3IgXywgaSA6PSByYW5nZSBwLm9yZGVyKCkgewoJCWlmIGxlZnQgPT0gMCB7CgkJCWJyZWFrCgkJfQoJCWF2YWlsIDo9IHN0YWdlZFtpXS5SZW1haW5pbmcoKQoJCWlmIGF2YWlsIDw9IDAgewoJCQljb250aW51ZQoJCX0KCQl0YWtlIDo9IGF2YWlsCgkJaWYgbGVmdCA8IHRha2UgewoJCQl0YWtlID0gbGVmdAoJCX0KCQlhZHZhbmNlZCwgY2hhcmdlLCBlcnIgOj0gc3RhZ2VkW2ldLlRha2UodGFrZSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIDAsIGVycgoJCX0KCQkvLyBDYW5ub3Qgb3ZlcmZsb3c6IHRoZSBzdW0gb2YgY2hhcmdlcyBpcyBib3VuZGVkIGJ5IHRoZSBwb29sJ3MKCQkvLyBjb3N0IG9uIGhhbmQsIGl0c2VsZiBib3VuZGVkIGJ5IHJlY3ZDb3N0LiBDaGVja2VkIGFueXdheSwgZm9yCgkJLy8gdGhlIHJlYXNvbiBnaXZlbiBvbiBDb3N0T25IYW5kLgoJCWlmIHRvdGFsID4gbWF4SW50NjQtY2hhcmdlIHsKCQkJcmV0dXJuIDAsIEVyck92ZXJmbG93CgkJfQoJCXN0YWdlZFtpXSA9IGFkdmFuY2VkCgkJdG90YWwgKz0gY2hhcmdlCgkJbGVmdCAtPSB0YWtlCgl9CglpZiBsZWZ0ICE9IDAgewoJCS8vIFVucmVhY2hhYmxlOiB0aGUgUXR5T25IYW5kIGNoZWNrIGFib3ZlIGVzdGFibGlzaGVkIHRoYXQgdGhlIGxpdmUKCQkvLyBsb3RzIGhvbGQgYXQgbGVhc3QgcXR5IHVuaXRzLiBSZXBvcnRlZCByYXRoZXIgdGhhbiBpZ25vcmVkLAoJCS8vIGJlY2F1c2UgcmVhY2hpbmcgaXQgd291bGQgbWVhbiBRdHlPbkhhbmQgYW5kIHRoZSBsb3RzIGRpc2FncmVlLAoJCS8vIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBhIGNyb3NzLWZvb3QgZXhpc3RzIHRvIGNhdGNoLgoJCXJldHVybiAwLCBFcnJJbnN1ZmZpY2llbnQKCX0KCgkvLyBDaGVja2VkIHJhdGhlciB0aGFuIGFyZ3VlZCwgYW5kIHBsYWNlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBzbyBhCgkvLyByZWZ1c2FsIHN0aWxsIGxlYXZlcyB0aGUgcG9vbCBleGFjdGx5IGFzIGl0IHdhcy4KCS8vCgkvLyBUaGUgaW52YXJpYW50cyBjb25zUXR5IDw9IHJlY3ZRdHkgYW5kIGNoZ0Nvc3QgPD0gcmVjdkNvc3QgZG8gaG9sZCBvdmVyCgkvLyB0aGlzIHBhY2thZ2UncyBwdWJsaWMgQVBJIOKAlCBib3RoIGNvdW50ZXJzIGFyZSB1bmV4cG9ydGVkIHdpdGggbm8gc2V0dGVyLAoJLy8gYW5kIFJlY2VpdmUgcmVmdXNlcyBhIHJlY2VpcHQgYXQgZWl0aGVyIGNlaWxpbmcg4oCUIHNvIG5laXRoZXIgYWRkIGNhbgoJLy8gb3ZlcmZsb3cgdG9kYXkuIFRoYXQgaXMgYW4gYXJndW1lbnQgYWJvdXQgdGhlICpjdXJyZW50KiBjYWxsIGdyYXBoLCBhbmQKCS8vIGl0IGlzIHRoZSBzYW1lIGFyZ3VtZW50IENvc3RPbkhhbmQgZGVjbGluZXMgdG8gcmVzdCBvbiB0d2VudHkgbGluZXMgdXA6CgkvLyAidW5yZWFjaGFibGUiIGlzIGEgY2xhaW0gYWJvdXQgY29kZSB0aGF0IG1heSBiZSBlZGl0ZWQsIGFuZCB0aGVzZSB0d28KCS8vIGFkZHMgd2VyZSB0aGUgb25seSBydW5uaW5nIHN1bXMgaW4gdGhlIHBhY2thZ2Ugd2l0aG91dCBhIGd1YXJkIGluIGZyb250CgkvLyBvZiB0aGVtLiBUaGUgY29zdCBvZiBiZWluZyB3cm9uZyBpcyBhIG5lZ2F0aXZlIHF1YW50aXR5IGNvbnN1bWVkIGFuZCBhCgkvLyBuZWdhdGl2ZSBjb3N0IG9mIGdvb2RzIHNvbGQsIHdoaWNoIGEgY3Jvc3MtZm9vdCB3b3VsZCB0aGVuIHJlcG9ydCBhcyB0aGUKCS8vIHBvb2wncyBvd24gZmFpbHVyZS4KCWlmIHAuY29uc1F0eSA+IG1heEludDY0LXF0eSB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CglpZiBwLmNoZ0Nvc3QgPiBtYXhJbnQ2NC10b3RhbCB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CgoJLy8gQ29tbWl0LgoJcC5sb3RzID0gZHJvcEV4aGF1c3RlZChzdGFnZWQpCglwLmNvbnNRdHkgKz0gcXR5CglwLmNoZ0Nvc3QgKz0gdG90YWwKCXJldHVybiB0b3RhbCwgbmlsCn0KCi8vIG9yZGVyIHJldHVybnMgdGhlIGluZGljZXMgb2YgcC5sb3RzIGluIGNvbnN1bXB0aW9uIG9yZGVyLiBGSUZPIGFuZCBXQVZHCi8vIGNvbnN1bWUgaW4gcmVjZWlwdCBvcmRlcjsgTElGTyByZXZlcnNlcyBpdC4gV0FWRyBob2xkcyBvbmUgbG90LCBzbyB0aGUgdHdvCi8vIG9yZGVycyBjb2luY2lkZSBmb3IgaXQgYW5kIGl0IGlzIGdyb3VwZWQgd2l0aCBGSUZPIHJhdGhlciB0aGFuIGdpdmVuIGEgY2FzZQovLyB0aGF0IGNvdWxkIG5ldmVyIGJlIGRpc3Rpbmd1aXNoZWQgYnkgYSB0ZXN0LgpmdW5jIChwICpQb29sKSBvcmRlcigpIFtdaW50IHsKCW91dCA6PSBtYWtlKFtdaW50LCBsZW4ocC5sb3RzKSkKCWZvciBpIDo9IHJhbmdlIHAubG90cyB7CgkJaWYgcC5tZXRob2QgPT0gTElGTyB7CgkJCW91dFtpXSA9IGxlbihwLmxvdHMpIC0gMSAtIGkKCQl9IGVsc2UgewoJCQlvdXRbaV0gPSBpCgkJfQoJfQoJcmV0dXJuIG91dAp9CgovLyBkcm9wRXhoYXVzdGVkIHJldHVybnMgdGhlIGxvdHMgd2l0aCB0aGUgZXhoYXVzdGVkIG9uZXMgcmVtb3ZlZCwgcHJlc2VydmluZwovLyByZWNlaXB0IG9yZGVyLgovLwovLyBJdCBpcyBjb3N0LW5ldXRyYWwsIGFuZCB0aGF0IGlzIGEgcHJvcGVydHkgb2YgW0xvdC5Db3N0QXRdIHJhdGhlciB0aGFuIG9mCi8vIHRoaXMgZnVuY3Rpb246IGFuIGV4aGF1c3RlZCBsb3QgaGFzIENvbnN1bWVkID09IFF0eSwgc28gaXRzIGNvbnN1bWVkIGNvc3QgaXMKLy8gQ29zdCpRdHkvUXR5IOKAlCBleGFjdGx5IENvc3QsIGluIGludGVnZXJzLCB3aXRoIG5vIHJlbWFpbmRlciDigJQgYW5kIGl0cwovLyByZW1haW5pbmcgY29zdCBpcyB0aGVyZWZvcmUgZXhhY3RseSB6ZXJvLiBEcm9wcGluZyBpdCByZW1vdmVzIGEgemVybyBmcm9tCi8vIHRoZSBzdW0gW1Bvb2wuQ29zdE9uSGFuZF0gd2Fsa3MuIFdlcmUgdGhlIGNvc3QgZnVuY3Rpb24gaW5leGFjdCBhdCB0aGUKLy8gZW5kcG9pbnQsIHRoaXMgaG91c2VrZWVwaW5nIHdvdWxkIHF1aWV0bHkgZGVzdHJveSB2YWx1ZSwgd2hpY2ggaXMgd2h5IHRoZQovLyBlbmRwb2ludCBpcyBhc3NlcnRlZCBpbiB0aGUgc3VpdGUgcmF0aGVyIHRoYW4gYXNzdW1lZCBoZXJlLgovLwovLyBBbiAqKmludmFsaWQqKiBsb3QgaXMgbm90IGRyb3BwZWQuIFtMb3QuRXhoYXVzdGVkXSByZXF1aXJlcyB2YWxpZGl0eSwgc28gYQovLyBtYWxmb3JtZWQgbG90IHN1cnZpdmVzIGhvdXNla2VlcGluZyBhbmQga2VlcHMgZmFpbGluZyBbUG9vbC5Db3N0T25IYW5kXSwKLy8gcmF0aGVyIHRoYW4gYmVpbmcgc2lsZW50bHkgc3dlcHQgb3V0IG9mIGEgcG9vbCB3aG9zZSBjb3VudGVycyBzdGlsbCBjb3VudCBpdC4KZnVuYyBkcm9wRXhoYXVzdGVkKGluIFtdTG90KSBbXUxvdCB7CglvdXQgOj0gbWFrZShbXUxvdCwgMCwgbGVuKGluKSkKCWZvciBfLCBsIDo9IHJhbmdlIGluIHsKCQlpZiBsLkV4aGF1c3RlZCgpIHsKCQkJY29udGludWUKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgbCkKCX0KCXJldHVybiBvdXQKfQoKLy8gQ3Jvc3NGb290Q29zdCByZXBvcnRzIHRoZSBwb29sJ3MgY29zdCBpZGVudGl0eToKLy8KLy8JY29zdCByZWNlaXZlZCA9PSBjb3N0IGNoYXJnZWQgb3V0ICsgY29zdCBvbiBoYW5kCi8vCi8vIFRoZSBsZWZ0IHNpZGUgYW5kIHRoZSBmaXJzdCByaWdodC1oYW5kIHRlcm0gYXJlIGN1bXVsYXRpdmUgY291bnRlcnM7IHRoZQovLyBzZWNvbmQgaXMgYSB3YWxrIG9mIHRoZSBsaXZlIGxvdHMuIFNvIHRoaXMgY29tcGFyZXMgdHdvIGluZGVwZW5kZW50Ci8vIGRlcml2YXRpb25zLCBhbmQgaXQgaXMgdGhlIHN0cm9uZyBvbmUgb2YgdGhlIHBhaXI6IGl0IGlzIHdoYXQgcHJvdmVzIHRoZSBXQVZHCi8vIHJlLWFuY2hvciBsb3NlcyBub3RoaW5nLCB0aGF0IGRyb3BwaW5nIGV4aGF1c3RlZCBsb3RzIGlzIGNvc3QtbmV1dHJhbCwgYW5kCi8vIHRoYXQgbm8gc2hpcG1lbnQgY2hhcmdlZCBjb3N0IHRoYXQgd2FzIG5ldmVyIHJlY2VpdmVkLgovLwovLyBmb290cyBpcyBmYWxzZSBpZiB0aGUgaWRlbnRpdHkgZmFpbHMgKipvciBpZiB0aGUgd2FsayBmYWlsZWQqKiwgYW5kIG9uSGFuZCBpcwovLyB6ZXJvIGluIHRoZSBzZWNvbmQgY2FzZS4gQSBjYWxsZXIgdGhhdCB3YW50cyB0byB0ZWxsIHRob3NlIGFwYXJ0IGNhbGxzCi8vIFtQb29sLkNvc3RPbkhhbmRdIGRpcmVjdGx5OyBhIGNhbGxlciB0aGF0IG9ubHkgd2FudHMgdG8ga25vdyB3aGV0aGVyIHRoZQovLyBzdWItbGVkZ2VyIGlzIHNvdW5kIGRvZXMgbm90IG5lZWQgdG8sIGJlY2F1c2UgbmVpdGhlciBpcyBzb3VuZC4KZnVuYyAocCAqUG9vbCkgQ3Jvc3NGb290Q29zdCgpIChyZWNlaXZlZCwgY2hhcmdlZCwgb25IYW5kIGludDY0LCBmb290cyBib29sKSB7CglvbkhhbmQsIGVyciA6PSBwLkNvc3RPbkhhbmQoKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIHAucmVjdkNvc3QsIHAuY2hnQ29zdCwgMCwgZmFsc2UKCX0KCXJldHVybiBwLnJlY3ZDb3N0LCBwLmNoZ0Nvc3QsIG9uSGFuZCwgcC5yZWN2Q29zdCA9PSBwLmNoZ0Nvc3Qrb25IYW5kCn0KCi8vIENyb3NzRm9vdFF0eSByZXBvcnRzIHRoZSBwb29sJ3MgcXVhbnRpdHkgaWRlbnRpdHk6Ci8vCi8vCXF1YW50aXR5IHJlY2VpdmVkID09IHF1YW50aXR5IGNvbnN1bWVkICsgcXVhbnRpdHkgb24gaGFuZAovLwovLyBJdCBpcyB0aGUgd2Vha2VyIG9mIHRoZSBwYWlyIGFuZCBpcyAqKm5vdCBpbXBsaWVkKiogYnkgW1Bvb2wuQ3Jvc3NGb290Q29zdF0sCi8vIHdoaWNoIGlzIHdoeSBib3RoIGV4aXN0LiBDb3N0cyBhcmUgZGVyaXZlZCBmcm9tIHF1YW50aXRpZXMsIHNvIGEgcXVhbnRpdHkKLy8gdGhhdCB3ZW50IG1pc3NpbmcgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZWQgaXRzIG93biBsb3QncyBjb3N0IGFyaXRobWV0aWMg4oCUIGEKLy8gbG90IGRyb3BwZWQgd2hpbGUgc3RpbGwgaG9sZGluZyB1bml0cyBpdCBoYWQgY2hhcmdlZCBub3RoaW5nIGZvciwgc2F5IOKAlAovLyBmb290cyBwZXJmZWN0bHkgb24gY29zdCBhbmQgZmFpbHMgaGVyZS4gQSByZWFsbSdzIGludmFyaWFudCBzaG91bGQgYXNzZXJ0Ci8vIGJvdGguCmZ1bmMgKHAgKlBvb2wpIENyb3NzRm9vdFF0eSgpIChyZWNlaXZlZCwgY29uc3VtZWQsIG9uSGFuZCBpbnQ2NCwgZm9vdHMgYm9vbCkgewoJb25IYW5kID0gcC5RdHlPbkhhbmQoKQoJcmV0dXJuIHAucmVjdlF0eSwgcC5jb25zUXR5LCBvbkhhbmQsIHAucmVjdlF0eSA9PSBwLmNvbnNRdHkrb25IYW5kCn0KIg0xMDAwMDAwMHVnbm90EhIIiJKCQBILMTM0MjU0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQFSvrRDqjW0xFttHWxmUaDXvtcPOnqxN724v0+81vJS+TVNv1jeuHbUKtW97RIaxJFMzdop07GZ3XpKpiqnxv74aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}