{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "PxaV6n+iNUwVrH55UJAocid94YP/5g5Xg11qRS4TxGI=",
    "height": "362562",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "66956046",
      "GasUsed": "44637364"
    },
    "tx": "CtKDAgoML3ZtLm1fYWRkcGtnEsCDAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKDgwIKBWFnaW5nEjlnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYWdpbmca24ECCglhZ2luZy5nbm8SzIECLy8gUGFja2FnZSBhZ2luZyBwYXJ0aXRpb25zIGEgc2V0IG9mIHVucGFpZCBvYmxpZ2F0aW9ucyBieSBob3cgbG9uZyBlYWNoIGhhcwovLyBiZWVuIHBhc3QgZHVlLCBhbmQgcHJpY2VzIHRoZSByZXN1bHRpbmcgc2NoZWR1bGUgaW50byBhIHNpbmdsZSBleHBlY3RlZAovLyBsb3NzLgovLwovLyBBIHJlYWxtIGhvbGRzIHRoZSBvYmxpZ2F0aW9ucyDigJQgaW52b2ljZXMsIGxvYW5zLCBkdWVzIOKAlCBhbmQgYXNrcyB0aGlzCi8vIHBhY2thZ2UgdHdvIHF1ZXN0aW9uczogaG93IGlzIHdoYXQgSSBhbSBvd2VkIGRpc3RyaWJ1dGVkIGFjcm9zcyBhZ2UgYmFuZHMsCi8vIGFuZCB3aGF0IHNob3VsZCBJIGV4cGVjdCBub3QgdG8gY29sbGVjdC4gTm90aGluZyBoZXJlIHJlYWRzIHRoZSBjaGFpbiwgaG9sZHMKLy8gc3RhdGUsIG9yIGtub3dzIHdoYXQgYW4gaW52b2ljZSBpcywgc28gYSByZWFsbSBjYW4gdGVzdCBhIHllYXIgb2YgaXRzIG93bgovLyByZWNlaXZhYmxlcyB3aXRob3V0IGEgbm9kZS4KLy8KLy8JcywgXyA6PSBOZXcoW11pbnQ2NHszMCwgNjAsIDkwfSwgW11pbnQ2NHswLCAxMDAwLCAyNTAwLCA1MDAwfSkKLy8JcmVwLCBlcnIgOj0gcy5SZXBvcnRBdChvYnMsIG5vdykgICAvLyBmb3VyIGJ1Y2tldCB0b3RhbHMgYW5kIHRoZWlyIHN1bQovLwlsb3NzLCBlcnIgOj0gcy5Qcm92aXNpb24ocmVwKSAgICAgIC8vIHRoZSBleHBlY3RlZCBjcmVkaXQgbG9zcwovLwovLyBUaGUgdHdvIHN0ZXBzIGFyZSBzZXBhcmFibGUgb24gcHVycG9zZTogdGhlIHJlcG9ydCBpcyB0aGUgbGluZSBpdGVtcyBhCi8vIHJlYWRlciBzZWVzLCBhbmQgdGhlIHByb3Zpc2lvbiBpcyB0aGUgb25lIG51bWJlciB0aGF0IGdvZXMgaW4gYSBsZWRnZXIuCi8vIFtTY2hlZHVsZS5Qcm92aXNpb25Gb3JdIGRvZXMgYm90aCBpbiBvbmUgY2FsbCBmb3IgYSBjYWxsZXIgdGhhdCBvbmx5IHdhbnRzCi8vIHRoZSBudW1iZXIuCi8vCi8vICMgVGhlIG91dHB1dCBpcyBhIHByb3Zpc2lvbiwgYW5kIG5ldmVyIGFuIGFsbG93YW5jZQovLwovLyBUaGUgdGV4dGJvb2sgbmFtZSBmb3IgdGhpcyBudW1iZXIgaXMgImFsbG93YW5jZSBmb3IgZG91YnRmdWwgYWNjb3VudHMiLCBhbmQKLy8gdGhhdCB3b3JkIGlzIG5vdCBhdmFpbGFibGUgaGVyZS4gYGFsbG93YW5jZWAgYWxyZWFkeSBtZWFucyBhICpzcGVuZGluZyoKLy8gYWxsb3dhbmNlIGFjcm9zcyB0aGlzIHBvcnRmb2xpbyDigJQgaW5jbHVkaW5nIFtwL3NwZW5kYm9va10ncyBgQWxsb3dhbmNlYAovLyB0eXBlIOKAlCBhbmQgaXQgbWVhbnMgYW4gYXBwcm92ZS90cmFuc2ZlckZyb20gcXVvdGEgYWNyb3NzIHRoZSB3aWRlcgovLyBlY29zeXN0ZW0ncyBHUkMyMCByZWFsbXMuIEEgdHlwZSBuYW1lZCBgQWxsb3dhbmNlYCBpbiBhIHBhY2thZ2UgaW1wb3J0ZWQKLy8gYmVzaWRlIGVpdGhlciBvZiB0aG9zZSB3b3VsZCByZWFkIGFzIHRoZSB3cm9uZyB0aGluZyBhdCBldmVyeSBjYWxsIHNpdGUsIHNvCi8vIHRoZSBsb3NzIG51bWJlciBpcyBgUHJvdmlzaW9uYCB0aHJvdWdob3V0LiBTZWUgRElTQ09WRVJZLm1kIMKnIDQuCi8vCi8vICMgV2h5IHRoZSBmbG9vciBpcyB0YWtlbiBwZXIgYnVja2V0LCBhbmQgZXhhY3RseSB3aGF0IHRoYXQgY29zdHMKLy8KLy8gVGhlIHByb3Zpc2lvbiBpcyB0aGUgc3VtIG9mIHBlci1idWNrZXQgZmxvb3JzOgovLwovLwlQcm92aXNpb24gPSDOoyBmbG9vcihidWNrZXThtaIgw5cgcmF0ZeG1oiAvIFJhdGVTY2FsZSkKLy8KLy8gbm90IG9uZSBmbG9vciB0YWtlbiBhdCB0aGUgZW5kIG9mIGFuIGV4YWN0IHJhdGlvbmFsIHRvdGFsLiBUaG9zZSBhcmUKLy8gZGlmZmVyZW50IG51bWJlcnMsIGFuZCB3aGljaCBvbmUgYSBwYWNrYWdlIHNoaXBwZWQgaXMgaW52aXNpYmxlIGluIGFueSB0ZXN0Ci8vIHRoYXQgaGFwcGVucyB0byB1c2Ugcm91bmQgcmF0ZXMuCi8vCi8vIFBlci1idWNrZXQgaXMgY2hvc2VuIGJlY2F1c2UgW1NjaGVkdWxlLlByb3Zpc2lvbkJ5QnVja2V0XSBpcyB0aGUgbGluZS1pdGVtCi8vIGNvbHVtbiBhIHJlYWRlciBzZWVzIG5leHQgdG8gdGhlIGJ1Y2tldCB0b3RhbHMsIGFuZCBsaW5lIGl0ZW1zIHRoYXQgZG8gbm90Ci8vIGFkZCB1cCB0byB0aGUgc3RhdGVkIHRvdGFsIGFyZSBhIGJvb2trZWVwaW5nIGRlZmVjdCByZWdhcmRsZXNzIG9mIHdoaWNoCi8vIHRvdGFsIGlzICJtb3JlIGFjY3VyYXRlIi4gW1NjaGVkdWxlLlByb3Zpc2lvbl0gaXMgKmRlZmluZWQqIGFzIHRoZSBzdW0gb2YKLy8gdGhhdCBjb2x1bW4sIHNvIHRoZSB0d28gY2Fubm90IGRpc2FncmVlIOKAlCB0aGUgc2FtZSBkaXNjaXBsaW5lCi8vIFtwL2RlcHJlY2lhdGlvbl0gdXNlcyB0byBkZWZpbmUgYENoYXJnZWAgaW4gdGVybXMgb2YgYENhcnJ5aW5nQXRgLgovLwovLyBUaGUgY29zdCBvZiB0aGF0IGNob2ljZSBpcyBhIHJlYWwgYW5kIG1lYXN1cmFibGUgd2Vha2VuaW5nIG9mIHRoZSBvYnZpb3VzCi8vIGludmFyaWFudCwgYW5kIGl0IGlzIHN0YXRlZCBoZXJlIGJlY2F1c2UgdGhlIGRpc2NvdmVyeSByZWNvcmQgZm9yIHRoaXMKLy8gcGFja2FnZSBhc3NlcnRlZCB0aGUgc3Ryb25nIGZvcm0gYW5kIHRoZSBzdHJvbmcgZm9ybSBpcyBmYWxzZToKLy8KLy8JRkFMU0U6IGZvciBhIGZpeGVkIHVucGFpZCBzZXQsIFByb3Zpc2lvbiBpcyBub24tZGVjcmVhc2luZyBpbiBub3cuCi8vCi8vIFRoZSBjb3VudGVyZXhhbXBsZSBpcyBzbWFsbCBlbm91Z2ggdG8gc3RhdGUgaW4gZnVsbC4gVGFrZSBlZGdlcyBgWzMwXWAgYW5kCi8vIHJhdGVzIGBbNTAwMCwgNTAwMF1gIOKAlCBvbmUgYm91bmRhcnksIHRoZSBzYW1lIDUwJSBlaXRoZXIgc2lkZSDigJQgYW5kIHR3bwovLyBvYmxpZ2F0aW9ucyBvZiBhbW91bnQgMS4gV2hpbGUgYm90aCBzaXQgaW4gYnVja2V0IDAgdGhlIGJ1Y2tldHMgYXJlCi8vIGBbMiwgMF1gIGFuZCB0aGUgcHJvdmlzaW9uIGlzIGBmbG9vcigyw5c1MDAwLzEwMDAwKSA9IDFgLiBMZXQgb25lIGFnZSBwYXN0Ci8vIDMwOiB0aGUgYnVja2V0cyBiZWNvbWUgYFsxLCAxXWAsIGVhY2ggZmxvb3JzIHRvIGAwYCwgYW5kIHRoZSBwcm92aXNpb24gaXMKLy8gYDBgLiAqKkl0IGZlbGwgYXMgdGhlIHJlY2VpdmFibGVzIGdvdCBvbGRlcioqLCB3aXRoIG5vIHBheW1lbnQgYW5kIG5vIGNoYW5nZQovLyBvZiByYXRlLiBPbmUgZmxvb3IgYXQgdGhlIGVuZCB3b3VsZCBoYXZlIHJldHVybmVkIDEgaW4gYm90aCBzdGF0ZXMuCi8vCi8vIFdoYXQgaXMgdHJ1ZSwgYW5kIHdoYXQgW1Rlc3RQcm92aXNpb25OZWFybHlNb25vdG9uZV0gYXNzZXJ0czoKLy8KLy8gICAtIFRoZSBleGFjdCByYXRpb25hbCBwcm92aXNpb24gzqMgYnVja2V04bWiw5dyYXRl4bWiL1JhdGVTY2FsZSAqKmlzKioKLy8gICAgIG5vbi1kZWNyZWFzaW5nIGluIGBub3dgLCBiZWNhdXNlIGFuIG9ibGlnYXRpb24gb25seSBldmVyIG1vdmVzIHRvIGEKLy8gICAgIGhpZ2hlci1pbmRleGVkIGJ1Y2tldCBhbmQgW05ld10gcmVxdWlyZXMgdGhlIHJhdGVzIHRvIGJlCi8vICAgICBub24tZGVjcmVhc2luZy4gVGhhdCBpcyB0aGUgZWNvbm9taWMgY2xhaW0sIGFuZCBpdCBzdXJ2aXZlcy4KLy8gICAtIFRoZSBpbnRlZ2VyIHByb3Zpc2lvbiBpcyBub24tZGVjcmVhc2luZyAqKnRvIHdpdGhpbiBmZXdlciB0aGFuCi8vICAgICBOdW1CdWNrZXRzIHVuaXRzKio6IGVhY2ggYnVja2V0IGxvc2VzIHN0cmljdGx5IGxlc3MgdGhhbiAxIHRvIGl0cwovLyAgICAgZmxvb3IsIGFuZCBvbmx5IGEgbm9uLWVtcHR5IGJ1Y2tldCBsb3NlcyBhbnl0aGluZywgc28KLy8gICAgIGBQcm92aXNpb24obGF0ZXIpID4gUHJvdmlzaW9uKGVhcmxpZXIpIC0gbWluKE51bUJ1Y2tldHMsIGxlbihvYnMpKWAuCi8vICAgICBUaGF0IGJvdW5kIGlzICoqYXR0YWluZWQqKiwgbm90IG1lcmVseSBzb3VuZCwgYW5kIHRoZSBmaWd1cmUgaXMgbGVmdAovLyAgICAgdG8gW1Rlc3RUaGVNb25vdG9uaWNpdHlCb3VuZElzQXR0YWluZWRdIHJhdGhlciB0aGFuIHJlc3RhdGVkIGhlcmU6Ci8vICAgICBhdCBhIGZsYXQgcmF0ZSBvZiBgUmF0ZVNjYWxlLTFgLCBgbmAgb2JsaWdhdGlvbnMgb2YgYW1vdW50IDEgcHJpY2UgdG8KLy8gICAgIGBuLTFgIHdoZW4gdGhleSBzaGFyZSBhIGJ1Y2tldCBhbmQgdG8gMCB3aGVuIHRoZXkgYXJlIG9uZSBwZXIgYnVja2V0LAovLyAgICAgc28gdGhlIGRyb3AgaXMgZXhhY3RseSBgbWluKE51bUJ1Y2tldHMsIGxlbihvYnMpKSAtIDFgIGF0IGV2ZXJ5Ci8vICAgICBidWNrZXQgY291bnQgdGhpcyBwYWNrYWdlIGFsbG93cy4gTm8gc2xhY2sgaXMgYXZhaWxhYmxlIHRvIGFuCi8vICAgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHdhbnRlZCBzb21lLgovLwovLyBUaGUgcmFuZG9tIHN3ZWVwIGluIFtUZXN0UHJvdmlzaW9uTmVhcmx5TW9ub3RvbmVdIHJlcG9ydHMgYSBmYXIgc21hbGxlcgovLyBsYXJnZXN0IGRyb3AgdGhhbiB0aGF0LCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgc3dlZXAKLy8gcmF0aGVyIHRoYW4gb2YgdGhlIHBhY2thZ2U6IHdpdGggcmFuZG9tbHkgZHJhd24gcmF0ZXMgdGhlIHNoYXBlIHRoYXQgbG9zZXMKLy8gdGhlIG1vc3QgdG8gdGhlIGZsb29ycyBlc3NlbnRpYWxseSBuZXZlciBjb21lcyB1cC4gQm90aCBydW4sIGFuZCB0aGUKLy8gY29uc3RydWN0ZWQgb25lIGlzIHRoZSBvbmUgdGhlIGJvdW5kIGlzIHF1b3RlZCBmcm9tLgovLwovLyBTbyB0aGUgcHJvdmlzaW9uIGlzIHNhZmUgdG8gcmUtcnVuIGFuZCBzYWZlIHRvIHJlLXJ1biBvZnRlbiDigJQgaXQgY2Fubm90Ci8vIHdhbmRlciB1cHdhcmQsIGFuZCBpdCBjYW5ub3QgZmFsbCBieSBtb3JlIHRoYW4gYSByb3VuZGluZyB1bml0IHBlciBidWNrZXQuCi8vIEl0IGlzIG5vdCBhIG1vbm90b25lIGZ1bmN0aW9uLCBhbmQgYSByZWFsbSB0aGF0IGdhdGVzIG9uCi8vIGBwcm92aXNpb24gPj0gbGFzdFByb3Zpc2lvbmAgd2lsbCBldmVudHVhbGx5IGJlIHdyb25nIGJ5IG9uZS4gW1Rlc3RGbG9vcklzUGVyQnVja2V0Tm90QXRUaGVFbmRdCi8vIHBpbnMgdGhlIGNvdW50ZXJleGFtcGxlIGl0c2VsZiwgc28gYSBsYXRlciAiZml4IiB0aGF0IHF1aWV0bHkgbW92ZXMgdG8gYQovLyBzaW5nbGUgZmxvb3IgYXQgdGhlIGVuZCBmYWlscyB0aGUgc3VpdGUgcmF0aGVyIHRoYW4gc2lsZW50bHkgY2hhbmdpbmcgZXZlcnkKLy8gcHVibGlzaGVkIG51bWJlci4KLy8KLy8gIyBXaHkgdGhlIHJhdGVzIG11c3QgYmUgbm9uLWRlY3JlYXNpbmcKLy8KLy8gW05ld10gcmVmdXNlcyBhIHJhdGUgc2NoZWR1bGUgdGhhdCBmYWxscyBhbnl3aGVyZS4gVHdvIHJlYXNvbnMsIGFuZCB0aGUKLy8gc2Vjb25kIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lOgovLwovLyAgIC0gSXQgaXMgdGhlIGRvbWFpbiBjbGFpbS4gQW4gb2xkZXIgcmVjZWl2YWJsZSBpcyBub3QgbW9yZSBsaWtlbHkgdG8gYmUKLy8gICAgIGNvbGxlY3RlZCB0aGFuIGEgeW91bmdlciBvbmUuIEEgc2NoZWR1bGUgdGhhdCBzYXlzIG90aGVyd2lzZSBpcyBhbG1vc3QKLy8gICAgIGFsd2F5cyBhIHRyYW5zcG9zZWQgYXJyYXksIHdoaWNoIGlzIGEgcmVhbCBhbmQgc2lsZW50IGF1dGhvcmluZyBlcnJvcjoKLy8gICAgIGB7NTAwMCwgMjUwMCwgMTAwMCwgMH1gIGlzIGEgcGxhdXNpYmxlLWxvb2tpbmcgYXJndW1lbnQgYW5kIHByaWNlcyBhCi8vICAgICBwb3J0Zm9saW8gaW5zaWRlLW91dC4KLy8gICAtIFdpdGhvdXQgaXQgdGhlICpleGFjdCByYXRpb25hbCogbW9ub3RvbmljaXR5IGFib3ZlIGZhaWxzIHRvbywgYW5kIHRoZW4KLy8gICAgIG5vdGhpbmcgaXMgbGVmdC4gQW4gb2JsaWdhdGlvbiBjcm9zc2luZyBhbiBlZGdlIGludG8gYSBjaGVhcGVyIGJ1Y2tldAovLyAgICAgcmVkdWNlcyB0aGUgZXhhY3QgcHJvdmlzaW9uLCBzbyB0aGUgb25seSBpbnZhcmlhbnQgdGhpcyBwYWNrYWdlIG9mZmVycwovLyAgICAgd291bGQgYmUgZmFsc2UgaW4gaXRzIHN0cm9uZyBmb3JtIGFzIHdlbGwgYXMgaXRzIGludGVnZXIgZm9ybS4KLy8KLy8gIyBXaHkgYSBub3QteWV0LWR1ZSBvYmxpZ2F0aW9uIGlzIHJlZnVzZWQKLy8KLy8gQW4gb2JsaWdhdGlvbiB3aXRoIGBEdWVBdCA+IG5vd2AgaGFzIG5vIGFnZSwgYW5kIHRoZSBjaG9pY2VzIGFyZSB0byByZWZ1c2UKLy8gaXQgb3IgdG8gcHV0IGl0IGluIHRoZSB5b3VuZ2VzdCBidWNrZXQuIEJ1Y2tldGluZyBpdCB3b3VsZCBiZSBzaWxlbnQgYW5kCi8vIHdvdWxkIGluZmxhdGUgZXZlcnkgcHJvdmlzaW9uIGJ5IHdoYXRldmVyIHRoZSB5b3VuZ2VzdCByYXRlIGlzIGFwcGxpZWQgdG8KLy8gbW9uZXkgdGhhdCBub2JvZHkgaXMgbGF0ZSBwYXlpbmcuIFNvIGl0IGlzIFtFcnJOb3RZZXREdWVdLCBmb2xsb3dpbmcKLy8gYHIvYm9va3NgJyBgVGVzdEtpbmRPZlJlcG9ydHNJbnZhbGlkUmF0aGVyVGhhbkJ1Y2tldGluZ2Ag4oCUIHJlZnVzZWQsIG5vdAovLyBzaWxlbnRseSBidWNrZXRlZC4KLy8KLy8gVGhlICJjdXJyZW50IiBjb2x1bW4gb2YgYSBjb252ZW50aW9uYWwgYWdpbmcgcmVwb3J0IGlzIHRoZXJlZm9yZSB0aGUKLy8gY2FsbGVyJ3MsIGFuZCB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGl0OiBvbiBbci9pbnZvaWNlc10gaXQgaXMKLy8gYE91dHN0YW5kaW5nRnJvbSAtIE92ZXJkdWVGcm9tYC4gVGhpcyBwYWNrYWdlIGRlc2NyaWJlcyB0aGUgcGFzdC1kdWUgdGFpbAovLyBhbmQgZGVjbGluZXMgdG8gZ3Vlc3MgYWJvdXQgdGhlIHJlc3QuCi8vCi8vICMgVGhlIGRlZ2VuZXJhdGUgdHdvLWJ1Y2tldCBjYXNlLCBhbmQgdGhlIG9mZi1ieS1vbmUgaW4gaXQKLy8KLy8gQSB0d28tYnVja2V0IHNjaGVkdWxlIHdpdGggZWRnZSBgMWAgYW5kIHJhdGVzIGB7MCwgUmF0ZVNjYWxlfWAgcmVwcm9kdWNlcwovLyBbci9pbnZvaWNlc10nIGBPdmVyZHVlRnJvbWAgZXhhY3RseSwgb3ZlciB0aGUgb2JsaWdhdGlvbnMgd2hvc2UgYER1ZUF0YCBoYXMKLy8gYXJyaXZlZDogZXZlcnl0aGluZyBzdHJpY3RseSBwYXN0IGR1ZSBpcyBwcmljZWQgYXQgMTAwJSBhbmQgZXZlcnl0aGluZyBlbHNlCi8vIGF0IDAlLgovLwovLyBUaGUgZWRnZSBpcyAqKjEgYW5kIG5vdCAwKiosIHdoaWNoIGlzIHdvcnRoIHRoZSBzZW50ZW5jZSBiZWNhdXNlCi8vIERJU0NPVkVSWS5tZCDCpyAxIHNheXMgMCBhbmQgaXMgd3JvbmcuIGBpc092ZXJkdWVgIGlzIGBub3cgPiBkdWVIZWlnaHRgLAovLyBzdHJpY3RseSDigJQgYW4gaW52b2ljZSBhdCBleGFjdGx5IGl0cyBkdWUgaGVpZ2h0IGlzIGR1ZSBhbmQgbm90IHlldCBsYXRlLCBzbwovLyB0aGF0IGludm9pY2UgaGFzIGFnZSAwIGFuZCBtdXN0IGxhbmQgaW4gdGhlICp1bnByaWNlZCogYnVja2V0LiBFZGdlIDAgbWFrZXMKLy8gYnVja2V0IDAgZW1wdHkgYW5kIHByaWNlcyBpdCBhdCAxMDAlLCBvdmVyc3RhdGluZyB0aGUgbG9zcyBieSBldmVyeSBpbnZvaWNlCi8vIGR1ZSBwcmVjaXNlbHkgdG9kYXkuIEFuIG9mZi1ieS1vbmUgb24gYSBoYWxmLW9wZW4gYm91bmRhcnkgaXMgdGhlIGRlZmVjdAovLyBjbGFzcyB0aGlzIHBhY2thZ2UgaXMgbW9zdCBleHBvc2VkIHRvLCBhbmQgdGhlIGRpc2NvdmVyeSByZWNvcmQgc2hpcHBlZCBvbmUKLy8gaW4gdGhlIHZlcnkgY2xhaW0gdGhhdCBpZGVudGlmaWVkIHRoZSBjb25zdW1lci4KLy8KLy8gRWRnZSAwIGlzIG5vdyByZWZ1c2VkIG91dHJpZ2h0IOKAlCBbRXJyQmFkRWRnZXNdLCBzZWUgY2hlY2sg4oCUIHNvIHRoZQovLyBvdmVyc3RhdGVtZW50IGRlc2NyaWJlZCBhYm92ZSBpcyBubyBsb25nZXIgZXhwcmVzc2libGUgcmF0aGVyIHRoYW4gbWVyZWx5Ci8vIGRvY3VtZW50ZWQuIEl0IHdhcyBleHByZXNzaWJsZSwgYW5kIGFjY2VwdGVkLCB1bnRpbCB0aGUgcHJlLWRlcGxveW1lbnQgYXVkaXQKLy8gZm91bmQgaXQ6IEFVRElULm1kIFkyLiBBIHBhcmFncmFwaCBuYW1pbmcgYSBkZWZlY3QgY2xhc3Mgd2hpbGUgdGhlIHZhbGlkYXRvcgovLyBhZG1pdHRlZCBhbiBpbnN0YW5jZSBvZiBpdCBpcyB0aGUgc2hhcGUgd29ydGggcmVtZW1iZXJpbmcgaGVyZS4KLy8KLy8gTm90ZSBhbHNvIHdoYXQgYW4gYEFtb3VudGAgaXMgaW4gdGhhdCBjb3JyZXNwb25kZW5jZTogYE92ZXJkdWVGcm9tYCBzdW1zCi8vIGBhbW91bnQgLSBwYWlkYCwgdGhlIHVucGFpZCByZW1haW5kZXIuIFtPYmxpZ2F0aW9uLkFtb3VudF0gaXMgdGhhdAovLyByZW1haW5kZXIgYW5kIG5vdCBhIGZhY2UgYW1vdW50LiBBIGNhbGxlciB0aGF0IHBhc3NlcyBmYWNlIGFtb3VudHMgcHJpY2VzCi8vIG1vbmV5IGl0IGhhcyBhbHJlYWR5IGNvbGxlY3RlZC4KLy8KLy8gIyBXaGF0IGJvdW5kcyB0aGUgd29yawovLwovLyBCdWNrZXQgbG9va3VwIGlzIGEgbGluZWFyIHNjYW4gb3ZlciB0aGUgZWRnZXMsIHdoaWNoIGlzIGNoZWFwZXIgdGhhbiBhCi8vIGJpbmFyeSBzZWFyY2ggYXQgdGhlc2Ugc2l6ZXMgYW5kIGlzIHRoZSBzaGFwZSBhbiBhdWRpdG9yIGNhbiBjaGVjayBieQovLyByZWFkaW5nLiBbTWF4QnVja2V0c10gaXMgMTYsIHNvIHRoZXJlIGFyZSBhdCBtb3N0IDE1IGVkZ2VzLCBhbmQKLy8gW01heE9ibGlnYXRpb25zXSBpcyAxMDI0OiBvbmUgW1NjaGVkdWxlLlJlcG9ydEF0XSB0aGVyZWZvcmUgcGVyZm9ybXMgYXQKLy8gbW9zdCAxNSwzNjAgY29tcGFyaXNvbnMgcGx1cyAxMDI0IGFkZGl0aW9ucywgYW5kIFtTY2hlZHVsZS5Qcm92aXNpb25dCi8vIHBlcmZvcm1zIGF0IG1vc3QgMTYgbXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMuIEV2ZXJ5IGV4cG9ydGVkIG1ldGhvZAovLyByZS1ydW5zIGBjaGVja2AsIHdoaWNoIGNvc3RzIGF0IG1vc3QgMzEgZnVydGhlciBjb21wYXJpc29ucy4KLy8KLy8gVGhvc2UgYXJlIHRoZSBmaWd1cmVzLCBub3QgYW4gYXNzZXJ0aW9uIHRoYXQgdGhleSBhcmUgYWZmb3JkYWJsZS4gQSByZWFsbQovLyB0aGF0IGFnZXMgc2V2ZXJhbCBwb3J0Zm9saW9zIGluIG9uZSB0cmFuc2FjdGlvbiwgb3IgZG9lcyBpdCBpbnNpZGUgYQovLyBgUmVuZGVyYCwgbXVzdCBzaXplIHRoZW0gYWdhaW5zdCB0aGUgZ2FzIGl0IGhhcy4gVGhpcyBwYWNrYWdlIGJvdW5kcyB0aGUKLy8gd29yazsgaXQgZG9lcyBub3QgcHJpY2UgaXQuCi8vCi8vICMgV2hhdCB0aGlzIHBhY2thZ2UgZG9lcyBub3QgY2xhaW0KLy8KLy8gICAtICoqTm8gbm92ZWx0eSBmb3IgcGFydGl0aW9uaW5nIHRpbWUgaW50byBidWNrZXRzLioqIFtwL3R3YXBdIG9uCi8vICAgICBnbm9sYW5kLTEgcXVhbnRpc2VzIGFuIG9ic2VydmF0aW9uIHNlcmllcyBpbnRvIGZpeGVkLXdpZHRoIHdpbmRvd3MgYW5kCi8vICAgICB3YXMgcmVhZCBpbiBmdWxsIGJlZm9yZSB0aGlzIHdhcyB3cml0dGVuOyB3aGF0IHdhcyBub3QgZm91bmQgaW4gdGhlCi8vICAgICBzZWFyY2hlZCBzb3VyY2VzIGlzIHRoZSBkb21haW4gbW9kZWwg4oCUIG9ibGlnYXRpb25zLCBhIHBhc3QtZHVlIGFnZSwgYQovLyAgICAgcGVyLWJhbmQgbG9zcyByYXRlLCBhIHByb3Zpc2lvbi4gU2VlIERJU0NPVkVSWS5tZCDCpyAxIGFuZCDCpyAzLgovLyAgIC0gKipOb3RoaW5nIGFib3V0IG1vbmV5LioqIEEgcHJvdmlzaW9uIGlzIGFuIGVzdGltYXRlIGluIGEgcmVwb3J0LiBUaGlzCi8vICAgICBwYWNrYWdlIG5ldmVyIHNlZXMgYSBjb2luLCBhbmQgYSByZWFsbSB1c2luZyBpdCBtdXN0IG5vdCBpbmZlciBjdXN0b2R5Ci8vICAgICBvciBhIHRyYW5zZmVyIGZyb20gaXQuCi8vICAgLSAqKk5vIHVuaXQgb2YgdGltZSwgZGVsaWJlcmF0ZWx5LioqIGBEdWVBdGAsIGBub3dgIGFuZCB0aGUgZWRnZXMgYXJlCi8vICAgICBpbnQ2NCBpbiB3aGF0ZXZlciB1bml0IHRoZSBjYWxsZXIga2VlcHMgY29uc2lzdGVudGx5IOKAlCBibG9jayBoZWlnaHRzIG9yCi8vICAgICB1bml4IHNlY29uZHMuIFRoZSBydWxlIGFuZCBpdHMgcmF0aW9uYWxlIGFyZSBhZG9wdGVkIGZyb20KLy8gICAgIFtwL21vdWwveC9nYW1lcy9hY2NydWFsXTogcHJlZmVyIGEgdGltZXN0YW1wLCBiZWNhdXNlIGEgaGVpZ2h0LWluZGV4ZWQKLy8gICAgIGJhbmQgZHJpZnRzIGluIHdhbGwtY2xvY2sgdGVybXMgZXZlcnkgdGltZSB0aGUgY2hhaW4ncyBibG9jayB0aW1lCi8vICAgICBtb3Zlcy4gIjMwIGRheXMiIGlzIHRoZSBjYWxsZXIncyBhcml0aG1ldGljLCBub3QgYSBjb25zdGFudCBoZXJlLiBTZWUKLy8gICAgIERJU0NPVkVSWS5tZCDCpyA0LCB3aGljaCBhdHRyaWJ1dGVzIHRoZSBkZWNpc2lvbi4KLy8gICAtICoqTm8gb3BpbmlvbiBvbiB3aGVyZSB0aGUgcmF0ZXMgY29tZSBmcm9tLioqIFBpY2tpbmcgbG9zcyByYXRlcyBpcyB0aGUKLy8gICAgIHdob2xlIG9mIGNyZWRpdCBwb2xpY3kgYW5kIG5vbmUgb2YgaXQgaXMgaW4gdGhpcyBwYWNrYWdlLiBUaGUgcmF0ZXMgYXJlCi8vICAgICBhbiBpbnB1dCwgdmFsaWRhdGVkIGZvciBzaGFwZSBhbmQgb3JkZXJpbmcgYW5kIG5ldmVyIGZvciBwbGF1c2liaWxpdHkuCi8vICAgLSAqKk5vIHdyaXRlLW9mZiwgbm8gcmVjb3ZlcnksIG5vIHJvbGwtZm9yd2FyZC4qKiBBIHByb3Zpc2lvbiBpcyBhIHBvaW50Ci8vICAgICBlc3RpbWF0ZSBmcm9tIG9uZSBzbmFwc2hvdC4gTW92aW5nIGEgcmVjZWl2YWJsZSBvdXQgb2YgdGhlIHBvb2wsIGFuZAovLyAgICAgcmV2ZXJzaW5nIGl0IHdoZW4gYSBwYXltZW50IGFycml2ZXMgbGF0ZSwgYXJlIGEgcmVhbG0ncyBqb2IgYmVjYXVzZQovLyAgICAgYm90aCBhcmUgc3RhdGUgY2hhbmdlcyBhbmQgbm90aGluZyBoZXJlIGhvbGRzIHN0YXRlLgovLwovLyBbcC9zcGVuZGJvb2tdOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3NwZW5kYm9vawovLyBbcC9kZXByZWNpYXRpb25dOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2RlcHJlY2lhdGlvbgovLyBbci9pbnZvaWNlc106IC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvaW52b2ljZXMKLy8gW3AvdHdhcF06IC9wL21vdWwveC90d2FwL3YwCi8vIFtwL21vdWwveC9nYW1lcy9hY2NydWFsXTogL3AvbW91bC94L2dhbWVzL2FjY3J1YWwvdjAKcGFja2FnZSBhZ2luZwoKaW1wb3J0ICJlcnJvcnMiCgovLyBSYXRlU2NhbGUgaXMgdGhlIGRlbm9taW5hdG9yIGV2ZXJ5IGxvc3MgcmF0ZSBpcyBleHByZXNzZWQgYWdhaW5zdCwgc28gYQovLyByYXRlIGlzIGluIGJhc2lzIHBvaW50czogMCBpcyAwJSwgMjUwMCBpcyAyNSUsIDEwMDAwIGlzIDEwMCUuCi8vCi8vIEl0IGlzIGEgY29uc3RhbnQgcmF0aGVyIHRoYW4gYSBwZXItc2NoZWR1bGUgZmllbGQgb24gcHVycG9zZS4gQSBzY2hlZHVsZQovLyBjYXJyeWluZyBpdHMgb3duIGRlbm9taW5hdG9yIGxldHMgdHdvIHNjaGVkdWxlcyBpbiBvbmUgcmVhbG0gYmUgcHJpY2VkIG9uCi8vIGRpZmZlcmVudCBzY2FsZXMsIGFuZCB0aGUgZmlyc3Qgc3ltcHRvbSBvZiB0aGF0IGlzIGEgcHJvdmlzaW9uIHdyb25nIGJ5IGEKLy8gZmFjdG9yIG9mIGEgaHVuZHJlZCB3aXRoIGV2ZXJ5IGluZGl2aWR1YWwgbnVtYmVyIGxvb2tpbmcgcmVhc29uYWJsZS4KY29uc3QgUmF0ZVNjYWxlIGludDY0ID0gMTAwMDAKCi8vIE1heEJ1Y2tldHMgYm91bmRzIHRoZSBudW1iZXIgb2YgYWdlIGJhbmRzLCBhbmQgc28gYm91bmRzIHRoZSBlZGdlIHNjYW4gaW4KLy8gW1NjaGVkdWxlLkJ1Y2tldE9mXSBhbmQgdGhlIGxvb3BzIGluIFtTY2hlZHVsZS5SZXBvcnRBdF0gYW5kCi8vIFtTY2hlZHVsZS5Qcm92aXNpb25dLiAxNiBpcyBwYXN0IHRoZSBwb2ludCB3aGVyZSBhIGJhbmQgaXMgbWVhbmluZ2Z1bDogYQovLyBjb252ZW50aW9uYWwgYWdpbmcgcmVwb3J0IHVzZXMgZm91ciBvciBmaXZlLgovLwovLyBUaGUgbWluaW11bSBpcyAyLCBhbmQgdGhhdCBpcyBhIHJlZnVzYWwgcmF0aGVyIHRoYW4gYW4gb21pc3Npb24uIEEKLy8gb25lLWJ1Y2tldCBzY2hlZHVsZSBoYXMgbm8gZWRnZXMsIGFwcGxpZXMgb25lIHJhdGUgdG8gdGhlIHdob2xlIGJhbGFuY2UsCi8vIGFuZCBpcyBhIGZsYXQtcmF0ZSBwcm92aXNpb24gcmF0aGVyIHRoYW4gYW4gYWdpbmcgc2NoZWR1bGUg4oCUIGxlZ2l0aW1hdGUKLy8gYXJpdGhtZXRpYywgYmV0dGVyIHNhaWQgYXMgYGZsb29yKHRvdGFsICogcmF0ZSAvIFJhdGVTY2FsZSlgIGF0IHRoZSBjYWxsCi8vIHNpdGUsIHdoZXJlIGEgcmVhZGVyIGNhbiBzZWUgdGhhdCBubyBhZ2luZyBoYXBwZW5lZC4KY29uc3QgTWF4QnVja2V0cyA9IDE2CgovLyBNYXhPYmxpZ2F0aW9ucyBib3VuZHMgaG93IG1hbnkgb2JsaWdhdGlvbnMgb25lIFtTY2hlZHVsZS5SZXBvcnRBdF0gY2FsbAovLyB3aWxsIGFjY2VwdCwgZm9sbG93aW5nIFtwL2xvdHNdJyBvd24gMTAyNCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlCi8vIGNhbGxlcidzIHNsaWNlIGxlbmd0aCBpcyB0aGUgb25seSB0aGluZyB0aGF0IGJvdW5kcyB0aGUgbG9vcCwgYW5kIGFuCi8vIHVuYm91bmRlZCBsb29wIG92ZXIgY2FsbGVyLXN1cHBsaWVkIGRhdGEgaXMgYSBnYXMgaGF6YXJkIGEgcmVhbG0gY2Fubm90Ci8vIHNpemUgaW4gYWR2YW5jZS4KLy8KLy8gV2hhdCB0aGUgYm91bmQgY29zdHM6IGEgcmVhbG0gd2l0aCBtb3JlIHRoYW4gMTAyNCBvcGVuIG9ibGlnYXRpb25zIG11c3QKLy8gcmVwb3J0IGluIGNodW5rcyBhbmQgYWRkIHRoZSBwcm92aXNpb25zLCBhbmQgdGhhdCBzdW0gaXMgKipub3QqKiB0aGUKLy8gcHJvdmlzaW9uIG9mIHRoZSB3aG9sZS4gRWFjaCBjaHVuayBmbG9vcnMgaXRzIG93biBidWNrZXRzLCBzbyBjaHVua2luZwovLyBsb3NlcyB1cCB0byBvbmUgdW5pdCBwZXIgYnVja2V0IHBlciBjaHVuayDigJQgdGhlIHNhbWUgZWZmZWN0IHRoZSBwYWNrYWdlIGRvYwovLyBib3VuZHMgZm9yIHRoZSBjbG9jaywgYXJyaXZpbmcgYnkgYSBkaWZmZXJlbnQgcm91dGUuIEEgcmVhbG0gdGhhdCBuZWVkcyB0aGUKLy8gZXhhY3QgZmlndXJlIG92ZXIgYSBsYXJnZXIgcG9vbCBtdXN0IGFjY3VtdWxhdGUgdGhlIGJ1Y2tldCB0b3RhbHMgaXRzZWxmCi8vIGFuZCBjYWxsIFtTY2hlZHVsZS5Qcm92aXNpb25dIG9uY2Ugb24gdGhlIGNvbWJpbmVkIHJlcG9ydCwgd2hpY2ggaXMKLy8gc3VwcG9ydGVkOiBgUHJvdmlzaW9uYCB0YWtlcyBhIFtSZXBvcnRdIGFuZCBkb2VzIG5vdCBjYXJlIHdoZXJlIGl0IGNhbWUKLy8gZnJvbS4KLy8KLy8gW3AvbG90c106IC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvbG90cwpjb25zdCBNYXhPYmxpZ2F0aW9ucyA9IDEwMjQKCnZhciAoCgkvLyBFcnJCYWRCdWNrZXRDb3VudCBpcyByZXR1cm5lZCB3aGVuIGEgc2NoZWR1bGUgd291bGQgaGF2ZSBmZXdlciB0aGFuIDIKCS8vIG9yIG1vcmUgdGhhbiBNYXhCdWNrZXRzIGJ1Y2tldHMuIFRoZSBidWNrZXQgY291bnQgaXMgbGVuKGVkZ2VzKSsxLCBzbwoJLy8gdGhpcyBpcyBhIHN0YXRlbWVudCBhYm91dCB0aGUgZWRnZSBzbGljZTogaXQgbXVzdCBob2xkIGJldHdlZW4gMSBhbmQKCS8vIE1heEJ1Y2tldHMtMSBlbnRyaWVzLiBBIG5pbCBvciBlbXB0eSBlZGdlIHNsaWNlIGxhbmRzIGhlcmUsIHdoaWNoIGlzCgkvLyB3aGF0IG1ha2VzIHRoZSB6ZXJvIFNjaGVkdWxlIGludmFsaWQuCglFcnJCYWRCdWNrZXRDb3VudCA9IGVycm9ycy5OZXcoImFnaW5nOiBidWNrZXQgY291bnQgbXVzdCBiZSBpbiBbMiwgTWF4QnVja2V0c10iKQoKCS8vIEVyckJhZEVkZ2VzIGlzIHJldHVybmVkIHdoZW4gdGhlIGVkZ2VzIGFyZSBub3QgcG9zaXRpdmUgYW5kIHN0cmljdGx5CgkvLyBpbmNyZWFzaW5nLiBFcXVhbCBhZGphY2VudCBlZGdlcyB3b3VsZCBkZWZpbmUgYW4gZW1wdHkgYnVja2V0LCB3aGljaAoJLy8gaXMgbm90IGFuIGVycm9yIGluIGFyaXRobWV0aWMgYnV0IGlzIGFsd2F5cyBhbiBhdXRob3JpbmcgbWlzdGFrZTogaXQKCS8vIHNpbGVudGx5IHJlZHVjZXMgdGhlIHNjaGVkdWxlJ3MgcmVzb2x1dGlvbiB3aGlsZSBldmVyeSBidWNrZXQgdG90YWwKCS8vIHN0aWxsIHJlcG9ydHMuCgkvLwoJLy8gUG9zaXRpdmUgYW5kIG5vdCBtZXJlbHkgbm9uLW5lZ2F0aXZlLCBmb3IgdGhlIHNhbWUgcmVhc29uIG9uZSBzdGVwCgkvLyBlYXJsaWVyOiBhIGZpcnN0IGVkZ2Ugb2YgMCBtYWtlcyBidWNrZXQgMCB0aGUgZW1wdHkgcmFuZ2UgWzAsMCkuIFRoZQoJLy8gcmF0aW9uYWxlIGhlcmUgaXMgdGhlIHdob2xlIG9mIHRoZSBhcmd1bWVudCBmb3IgcmVmdXNpbmcgaXQsIHdoaWNoIGlzCgkvLyB3aHkgdGhlIGNoZWNrIG5vdyByZWFjaGVzIHRoZSBmaXJzdCBlZGdlIHRvbzsgc2VlIGNoZWNrLgoJRXJyQmFkRWRnZXMgPSBlcnJvcnMuTmV3KCJhZ2luZzogZWRnZXMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgc3RyaWN0bHkgaW5jcmVhc2luZyIpCgoJLy8gRXJyQmFkUmF0ZUNvdW50IGlzIHJldHVybmVkIHdoZW4gbGVuKHJhdGVzKSAhPSBsZW4oZWRnZXMpKzEuIFRoZQoJLy8gb2ZmLWJ5LW9uZSBoZXJlIGlzIHRoZSBtb3N0IGxpa2VseSB3YXkgdG8gYnVpbGQgYSB3cm9uZyBzY2hlZHVsZSB0aGF0CgkvLyBzdGlsbCBsb29rcyByaWdodCwgc28gaXQgaXMgbmFtZWQgYXBhcnQgZnJvbSBFcnJCYWRSYXRlOiBhIHJlYWRlcgoJLy8gc2VlaW5nIHRoaXMgZXJyb3Iga25vd3MgdG8gY291bnQsIG5vdCB0byBsb29rIGF0IHZhbHVlcy4KCUVyckJhZFJhdGVDb3VudCA9IGVycm9ycy5OZXcoImFnaW5nOiBuZWVkIGV4YWN0bHkgb25lIHJhdGUgcGVyIGJ1Y2tldCwgd2hpY2ggaXMgbGVuKGVkZ2VzKSsxIikKCgkvLyBFcnJCYWRSYXRlIGlzIHJldHVybmVkIHdoZW4gYSByYXRlIGlzIG5lZ2F0aXZlIG9yIGV4Y2VlZHMgUmF0ZVNjYWxlLgoJLy8gQSByYXRlIGFib3ZlIDEwMCUgd291bGQgcHJvdmlzaW9uIG1vcmUgdGhhbiBpcyBvd2VkOyBhIG5lZ2F0aXZlIHJhdGUKCS8vIHdvdWxkIHByb3Zpc2lvbiBhIGdhaW4uCglFcnJCYWRSYXRlID0gZXJyb3JzLk5ldygiYWdpbmc6IGVhY2ggcmF0ZSBtdXN0IGJlIGluIFswLCBSYXRlU2NhbGVdIikKCgkvLyBFcnJSYXRlc0RlY3JlYXNlIGlzIHJldHVybmVkIHdoZW4gdGhlIHJhdGVzIGZhbGwgYW55d2hlcmUgYWNyb3NzIHRoZQoJLy8gYnVja2V0cy4gU2VlIHRoZSBwYWNrYWdlIGRvYzogaXQgaXMgYm90aCB0aGUgZG9tYWluIGNsYWltIGFuZCB0aGUKCS8vIHByZWNvbmRpdGlvbiBmb3IgdGhlIG9ubHkgbW9ub3RvbmljaXR5IHRoaXMgcGFja2FnZSBvZmZlcnMuCglFcnJSYXRlc0RlY3JlYXNlID0gZXJyb3JzLk5ldygiYWdpbmc6IHJhdGVzIG11c3Qgbm90IGRlY3JlYXNlIGFzIGJ1Y2tldHMgYWdlIikKCgkvLyBFcnJOb3RZZXREdWUgaXMgcmV0dXJuZWQgZm9yIGFuIG9ibGlnYXRpb24gd2hvc2UgRHVlQXQgaGFzIG5vdAoJLy8gYXJyaXZlZCwgYW5kIGJ5IEJ1Y2tldE9mIGZvciBhIG5lZ2F0aXZlIGFnZSDigJQgd2hpY2ggaXMgdGhlIHNhbWUKCS8vIGNvbmRpdGlvbiBleHByZXNzZWQgaW4gYWdlIHRlcm1zLiBSZWZ1c2VkIHJhdGhlciB0aGFuIGJ1Y2tldGVkOyBzZWUKCS8vIHRoZSBwYWNrYWdlIGRvYy4KCUVyck5vdFlldER1ZSA9IGVycm9ycy5OZXcoImFnaW5nOiBvYmxpZ2F0aW9uIGlzIG5vdCB5ZXQgZHVlIGFuZCBoYXMgbm8gYWdlIikKCgkvLyBFcnJCYWRBbW91bnQgaXMgcmV0dXJuZWQgZm9yIGFuIG9ibGlnYXRpb24gYW1vdW50IHRoYXQgaXMgbm90CgkvLyBwb3NpdGl2ZS4gWmVybyBpcyByZWZ1c2VkIGFzIHdlbGwgYXMgbmVnYXRpdmU6IGEgemVybyBvYmxpZ2F0aW9uCgkvLyBjb25zdW1lcyBvbmUgb2YgdGhlIE1heE9ibGlnYXRpb25zIHNsb3RzIGFuZCBjaGFuZ2VzIG5vdGhpbmcsIHNvIGl0CgkvLyBpcyBhIGNhbGxlciBidWcgd29ydGggc3VyZmFjaW5nIHJhdGhlciB0aGFuIGEgZnJlZSBuby1vcC4KCUVyckJhZEFtb3VudCA9IGVycm9ycy5OZXcoImFnaW5nOiBvYmxpZ2F0aW9uIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCgkvLyBFcnJUb29NYW55T2JsaWdhdGlvbnMgaXMgcmV0dXJuZWQgd2hlbiBtb3JlIHRoYW4gTWF4T2JsaWdhdGlvbnMgYXJlCgkvLyBwYXNzZWQgaW4gb25lIGNhbGwuIFNlZSBNYXhPYmxpZ2F0aW9ucyBvbiBjaHVua2luZywgYW5kIG9uIHdoeSB0aGUKCS8vIGNodW5rZWQgc3VtIGlzIG5vdCB0aGUgc2FtZSBudW1iZXIuCglFcnJUb29NYW55T2JsaWdhdGlvbnMgPSBlcnJvcnMuTmV3KCJhZ2luZzogbW9yZSB0aGFuIE1heE9ibGlnYXRpb25zIGluIG9uZSByZXBvcnQiKQoKCS8vIEVyckJhZFJlcG9ydCBpcyByZXR1cm5lZCBieSBQcm92aXNpb24gd2hlbiBhIHJlcG9ydCdzIGJ1Y2tldCBjb3VudAoJLy8gZG9lcyBub3QgbWF0Y2ggdGhlIHNjaGVkdWxlJ3MuIEl0IGlzIHRoZSBvbmx5IHN0cnVjdHVyYWwgY2hlY2sKCS8vIGF2YWlsYWJsZTogYSBSZXBvcnQgY2FycmllcyBubyBpZGVudGl0eSwgc28gdHdvIHNjaGVkdWxlcyB3aXRoIHRoZQoJLy8gc2FtZSBidWNrZXQgY291bnQgYWNjZXB0IGVhY2ggb3RoZXIncyByZXBvcnRzLiBBIFJlcG9ydCBtdXN0CgkvLyB0aGVyZWZvcmUgbm90IG91dGxpdmUgdGhlIFNjaGVkdWxlIHRoYXQgcHJvZHVjZWQgaXQ7IHByZWZlcgoJLy8gUHJvdmlzaW9uRm9yLCB3aGljaCBtYWtlcyB0aGF0IGltcG9zc2libGUuCglFcnJCYWRSZXBvcnQgPSBlcnJvcnMuTmV3KCJhZ2luZzogcmVwb3J0IGJ1Y2tldCBjb3VudCBkb2VzIG5vdCBtYXRjaCB0aGUgc2NoZWR1bGUiKQoKCS8vIEVyckNyb3NzRm9vdCBpcyByZXR1cm5lZCBieSBQcm92aXNpb24gd2hlbiBhIHJlcG9ydCdzIGJ1Y2tldCB0b3RhbHMKCS8vIGRvIG5vdCBzdW0gdG8gaXRzIHN0YXRlZCBUb3RhbC4gUmVwb3J0cyBidWlsdCBieSBSZXBvcnRBdCBhbHdheXMKCS8vIGNyb3NzLWZvb3QgYnkgY29uc3RydWN0aW9uLCBzbyB0aGlzIGZpcmVzIG9ubHkgZm9yIGEgY2FsbGVyLWJ1aWx0IG9yCgkvLyBtdXRhdGVkIFJlcG9ydCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aHkgaXQgaXMgYW4gZXJyb3IgaGVyZSBhbmQgbm90CgkvLyBtZXJlbHkgYW4gYXNzZXJ0aW9uIGluIHRoZSB0ZXN0IHN1aXRlLgoJRXJyQ3Jvc3NGb290ID0gZXJyb3JzLk5ldygiYWdpbmc6IHJlcG9ydCBidWNrZXRzIGRvIG5vdCBzdW0gdG8gaXRzIHRvdGFsIikKCgkvLyBFcnJCYWRCdWNrZXRJbmRleCBpcyByZXR1cm5lZCBieSB0aGUgcGVyLWJ1Y2tldCBhY2Nlc3NvcnMgZm9yIGFuCgkvLyBpbmRleCBvdXRzaWRlIFswLCBOdW1CdWNrZXRzKS4KCUVyckJhZEJ1Y2tldEluZGV4ID0gZXJyb3JzLk5ldygiYWdpbmc6IGJ1Y2tldCBpbmRleCBvdXQgb2YgcmFuZ2UiKQoKCS8vIEVyck92ZXJmbG93IGlzIHJldHVybmVkIHdoZW4gdGhlIGFyaXRobWV0aWMgd291bGQgd3JhcDogYW4gYWdlIHRoYXQKCS8vIGRvZXMgbm90IGZpdCBpbiBhbiBpbnQ2NCwgYSBidWNrZXQgdG90YWwgb3IgcmVwb3J0IHRvdGFsIHRoYXQgZXhjZWVkcwoJLy8gd2hhdCBjYW4gYmUgcHJpY2VkIGF0IFJhdGVTY2FsZSwgb3IgYSBzdW0gb2YgYW1vdW50cyB0aGF0IGRvZXMgbm90CgkvLyBmaXQuIEV2ZXJ5IG90aGVyIG92ZXJmbG93IGlzIGV4Y2x1ZGVkIGJ5IHRoZSBjb25zdHJ1Y3Rpb24tdGltZQoJLy8gY2hlY2tzOyBzZWUgY2hlY2suCgkvLwoJLy8gVGhlIHByaWNpbmcgYm91bmQgaXMgZW5mb3JjZWQgaW4gYm90aCBwbGFjZXMgaXQgaXMgcmVhY2hhYmxlLCB3aGljaCBpcwoJLy8gZGVsaWJlcmF0ZSBhbmQgbm90IHJlZHVuZGFudDogUmVwb3J0QXQgYm91bmRzIHRoZSBydW5uaW5nIHRvdGFsIHNvCgkvLyB0aGF0IGEgcmVwb3J0IGl0IHJldHVybnMgY2FuIGFsd2F5cyBiZSBwcmljZWQsIGFuZCBQcm92aXNpb25CeUJ1Y2tldAoJLy8gYm91bmRzIGVhY2ggYnVja2V0IGJlY2F1c2UgaXQgYWxzbyBhY2NlcHRzIGNhbGxlci1idWlsdCByZXBvcnRzIGl0CgkvLyBuZXZlciBwcm9kdWNlZC4gRHJvcHBpbmcgZWl0aGVyIG9uZSBpcyBhIHJlYWNoYWJsZSBkZWZlY3QsIGFuZCBlYWNoCgkvLyBoYXMgaXRzIG93biBzYWJvdGFnZSBjYXNlLgoJRXJyT3ZlcmZsb3cgPSBlcnJvcnMuTmV3KCJhZ2luZzogaW50NjQgb3ZlcmZsb3ciKQopCgovLyBtYXhJbnQ2NCBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCByYXRoZXIgdGhhbiBhcyBgaW50NjQoMSk8PDYzIC0gMWAsIHdoaWNoCi8vIGRvZXMgbm90IGNvbXBpbGU6IHRoZSBzaGlmdCBpcyBldmFsdWF0ZWQgaW4gdGhlIGFscmVhZHktdHlwZWQgaW50NjQgYW5kCi8vIG92ZXJmbG93cyBiZWZvcmUgdGhlIHN1YnRyYWN0aW9uIGJyaW5ncyBpdCBiYWNrLiBUaGUgc2FtZSBub3RlIGlzIGluCi8vIFtwL2RlcHJlY2lhdGlvbl07IGl0IGlzIHJlcGVhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIHNhbWUgc2hhcGUgYXMgdGhlCi8vIGFyaXRobWV0aWMgdGhpcyBwYWNrYWdlIGV4aXN0cyB0byBnZXQgcmlnaHQuCmNvbnN0IG1heEludDY0IGludDY0ID0gOTIyMzM3MjAzNjg1NDc3NTgwNwoKLy8gT2JsaWdhdGlvbiBpcyBvbmUgdGhpbmcgb3dlZCwgYXMgdGhlIHBhaXIgdGhpcyBwYWNrYWdlIG5lZWRzOiBob3cgbXVjaCBpcwovLyBzdGlsbCB1bnBhaWQgYW5kIHdoZW4gaXQgZmVsbCBkdWUuCi8vCi8vIEFtb3VudCBpcyB0aGUgdW5wYWlkIHJlbWFpbmRlciwgbm90IGEgZmFjZSBhbW91bnQg4oCUIG9uIFtyL2ludm9pY2VzXSB0aGF0IGlzCi8vIGBhbW91bnQgLSBwYWlkYC4gRHVlQXQgaXMgaW4gdGhlIGNhbGxlcidzIHRpbWUgdW5pdCwgY29uc2lzdGVudGx5IHdpdGggdGhlCi8vIGBub3dgIHBhc3NlZCB0byBbU2NoZWR1bGUuUmVwb3J0QXRdIGFuZCB3aXRoIHRoZSBzY2hlZHVsZSdzIGVkZ2VzLgovLwovLyBJdCBpcyBhIHZhbHVlIGFuZCBjYXJyaWVzIG5vIGlkZW50aXR5LiBUaGlzIHBhY2thZ2UgY2Fubm90IHRlbGwgdHdvCi8vIG9ibGlnYXRpb25zIGFwYXJ0IGFuZCBkb2VzIG5vdCB0cnk6IHRoZSBzYW1lIG9ibGlnYXRpb24gcGFzc2VkIHR3aWNlIGlzCi8vIGNvdW50ZWQgdHdpY2UsIGFuZCBkZWR1cGxpY2F0aW9uIGlzIHRoZSBjYWxsZXIncywgYmVjYXVzZSBvbmx5IHRoZSBjYWxsZXIKLy8ga25vd3Mgd2hhdCBtYWtlcyBvbmUgb2YgaXRzIHJlY2VpdmFibGVzIHRoZSBzYW1lIGFzIGFub3RoZXIuCnR5cGUgT2JsaWdhdGlvbiBzdHJ1Y3QgewoJQW1vdW50IGludDY0CglEdWVBdCAgaW50NjQKfQoKLy8gUmVwb3J0IGlzIG9uZSBhZ2luZyBzbmFwc2hvdDogdGhlIHVucGFpZCB0b3RhbCBpbiBlYWNoIGJ1Y2tldCwgeW91bmdlc3QKLy8gZmlyc3QsIGFuZCB0aGVpciBzdW0uCi8vCi8vIEl0cyBmaWVsZHMgYXJlIGV4cG9ydGVkIHNvIGEgY2FsbGVyIGNhbiByZW5kZXIgdGhlIGxpbmUgaXRlbXMsIGFuZCBzbyBhCi8vIHJlYWxtIGNhbiBhY2N1bXVsYXRlIGJ1Y2tldHMgYWNyb3NzIHNldmVyYWwgW1NjaGVkdWxlLlJlcG9ydEF0XSBjYWxscyBhbmQKLy8gcHJpY2UgdGhlbSBpbiBvbmUgZ28g4oCUIHNlZSBbTWF4T2JsaWdhdGlvbnNdLiBUaGUgY29zdCBvZiBleHBvcnRpbmcgdGhlbSBpcwovLyB0aGF0IGEgUmVwb3J0IGNhbiBiZSBidWlsdCBvciBtdXRhdGVkIGludG8gc29tZXRoaW5nIGluY29uc2lzdGVudCwgd2hpY2ggaXMKLy8gd2h5IFtTY2hlZHVsZS5Qcm92aXNpb25dIHJlLWRlcml2ZXMgbm90aGluZyBhbmQgaW5zdGVhZCB2YWxpZGF0ZXM6IGJ1Y2tldAovLyBjb3VudCBhZ2FpbnN0IHRoZSBzY2hlZHVsZSwgZWFjaCBidWNrZXQgbm9uLW5lZ2F0aXZlLCBhbmQgdGhlIGNyb3NzLWZvb3QuCi8vCi8vIEEgUmVwb3J0IGNhcnJpZXMgbm8gcmVmZXJlbmNlIHRvIHRoZSBTY2hlZHVsZSB0aGF0IG1hZGUgaXQuIFR3byBzY2hlZHVsZXMKLy8gd2l0aCB0aGUgc2FtZSBidWNrZXQgY291bnQgd2lsbCBhY2NlcHQgZWFjaCBvdGhlcidzIHJlcG9ydHMgYW5kIHNpbGVudGx5Ci8vIHByaWNlIHRoZW0gb24gdGhlIHdyb25nIHJhdGVzLCBzbyBhIFJlcG9ydCBtdXN0IG5vdCBvdXRsaXZlIGl0cyBTY2hlZHVsZS4KLy8gW1NjaGVkdWxlLlByb3Zpc2lvbkZvcl0gZXhpc3RzIHRvIHJlbW92ZSB0aGUgb3Bwb3J0dW5pdHkuCnR5cGUgUmVwb3J0IHN0cnVjdCB7CgkvLyBCdWNrZXRzIGhvbGRzIHRoZSB1bnBhaWQgdG90YWwgcGVyIGJ1Y2tldCwgaW5kZXggMCBiZWluZyB0aGUKCS8vIHlvdW5nZXN0LiBJdHMgbGVuZ3RoIGlzIHRoZSBzY2hlZHVsZSdzIE51bUJ1Y2tldHMuCglCdWNrZXRzIFtdaW50NjQKCgkvLyBUb3RhbCBpcyB0aGUgc3VtIG9mIEJ1Y2tldHMuIEl0IGlzIHN0b3JlZCByYXRoZXIgdGhhbiByZWNvbXB1dGVkIHNvCgkvLyB0aGF0IFByb3Zpc2lvbiBoYXMgc29tZXRoaW5nIHRvIGNyb3NzLWZvb3QgYWdhaW5zdC4KCVRvdGFsIGludDY0Cn0KCi8vIFNjaGVkdWxlIGlzIGFuIGFnaW5nIHNjaGVkdWxlOiB0aGUgYWdlIGJvdW5kYXJpZXMgYW5kIHRoZSBsb3NzIHJhdGUgZm9yCi8vIGVhY2ggcmVzdWx0aW5nIGJhbmQuCi8vCi8vIEl0cyBmaWVsZHMgYXJlIHVuZXhwb3J0ZWQgYW5kIHRoZSBhY2Nlc3NvcnMgY29weSwgd2hpY2ggaXMgYSBkZWxpYmVyYXRlCi8vIGRlcGFydHVyZSBmcm9tIFtwL2RlcHJlY2lhdGlvbl0ncyBhbGwtc2NhbGFyIGV4cG9ydGVkIFNjaGVkdWxlLiBBIHNjaGVkdWxlCi8vIGhvbGRpbmcgc2xpY2VzIGlzIG5vdCBzYWZlbHkgY29weWFibGU6IGEgY2FsbGVyIHRoYXQga2VwdCB0aGUgc2xpY2UgaXQKLy8gcGFzc2VkIHRvIFtOZXddIGNvdWxkIG11dGF0ZSB0aGUgZWRnZXMgYWZ0ZXIgdmFsaWRhdGlvbiBhbmQgZXZlcnkKLy8gc3Vic2VxdWVudCBjYWxsIHdvdWxkIHByaWNlIGFnYWluc3QgYSBzY2hlZHVsZSB0aGF0IG5ldmVyIHBhc3NlZCBgY2hlY2tgLgovLyBDb25zdHJ1Y3Qgd2l0aCBbTmV3XS4KdHlwZSBTY2hlZHVsZSBzdHJ1Y3QgewoJLy8gZWRnZXMgaG9sZHMgdGhlIGJ1Y2tldCBib3VuZGFyaWVzLCBzdHJpY3RseSBpbmNyZWFzaW5nIGFuZAoJLy8gbm9uLW5lZ2F0aXZlLiBCdWNrZXQgaSBpcyB0aGUgaGFsZi1vcGVuIGFnZSByYW5nZQoJLy8gW2VkZ2VzW2ktMV0sIGVkZ2VzW2ldKSwgd2l0aCBidWNrZXQgMCBzdGFydGluZyBhdCAwIGFuZCB0aGUgbGFzdAoJLy8gYnVja2V0IHVuYm91bmRlZCBhYm92ZS4KCWVkZ2VzIFtdaW50NjQKCgkvLyByYXRlcyBob2xkcyBvbmUgbG9zcyByYXRlIHBlciBidWNrZXQgaW4gdW5pdHMgb2YgUmF0ZVNjYWxlLAoJLy8gbm9uLWRlY3JlYXNpbmcuIGxlbihyYXRlcykgPT0gbGVuKGVkZ2VzKSsxLgoJcmF0ZXMgW11pbnQ2NAp9CgovLyBOZXcgdmFsaWRhdGVzIGFuZCByZXR1cm5zIGEgc2NoZWR1bGUuIFRoZSBlZGdlcyBhcmUgdGhlIGFnZSBib3VuZGFyaWVzLAovLyBwb3NpdGl2ZSBhbmQgc3RyaWN0bHkgaW5jcmVhc2luZzsgdGhlIHJhdGVzIGFyZSBvbmUgcGVyIGJ1Y2tldCwgc28gb25lCi8vIG1vcmUgdGhhbiB0aGVyZSBhcmUgZWRnZXMsIGVhY2ggaW4gWzAsIFJhdGVTY2FsZV0gYW5kIG5vbi1kZWNyZWFzaW5nLgovLwovLyBQb3NpdGl2ZSwgc28gdGhlIHNtYWxsZXN0IGxlZ2FsIGZpcnN0IGVkZ2UgaXMgMSBhbmQgdGhlIHNtYWxsZXN0IGxlZ2FsCi8vIHNjaGVkdWxlIGlzIGBOZXcoW11pbnQ2NHsxfSwgW11pbnQ2NHswLCBSYXRlU2NhbGV9KWAg4oCUIHdoaWNoIGlzIGV4YWN0bHkgdGhlCi8vIGRlZ2VuZXJhdGUgc3RyaWN0bHktb3ZlcmR1ZSBzY2hlZHVsZSB0aGUgcGFja2FnZSBkb2MgZGVzY3JpYmVzLiBBIGZpcnN0IGVkZ2UKLy8gb2YgMCBpcyBbRXJyQmFkRWRnZXNdOiBpdCB3b3VsZCBkZWZpbmUgYW4gZW1wdHkgYnVja2V0IDAuCi8vCi8vCU5ldyhbXWludDY0ezMwLCA2MCwgOTB9LCBbXWludDY0ezAsIDEwMDAsIDI1MDAsIDUwMDB9KQovLwovLyByZWFkcyBhczogbm90aGluZyBwcm92aXNpb25lZCB1bmRlciAzMCBwYXN0IGR1ZSwgMTAlIGZyb20gMzAgdG8gNTksIDI1JQovLyBmcm9tIDYwIHRvIDg5LCA1MCUgZnJvbSA5MCBvbi4KLy8KLy8gQm90aCBzbGljZXMgYXJlIGNvcGllZCwgc28gdGhlIGNhbGxlciBtYXkgcmV1c2Ugb3IgbXV0YXRlIGl0cyBvd24uCmZ1bmMgTmV3KGVkZ2VzLCByYXRlcyBbXWludDY0KSAoU2NoZWR1bGUsIGVycm9yKSB7CgllIDo9IG1ha2UoW11pbnQ2NCwgbGVuKGVkZ2VzKSkKCWNvcHkoZSwgZWRnZXMpCglyIDo9IG1ha2UoW11pbnQ2NCwgbGVuKHJhdGVzKSkKCWNvcHkociwgcmF0ZXMpCglzIDo9IFNjaGVkdWxle2VkZ2VzOiBlLCByYXRlczogcn0KCWlmIGVyciA6PSBzLmNoZWNrKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBTY2hlZHVsZXt9LCBlcnIKCX0KCXJldHVybiBzLCBuaWwKfQoKLy8gY2hlY2sgdmFsaWRhdGVzIGV2ZXJ5IGZpZWxkIGFuZCBlc3RhYmxpc2hlcyB0aGUgb3ZlcmZsb3cgcHJlY29uZGl0aW9uIHRoYXQKLy8gbGV0cyBbU2NoZWR1bGUuUHJvdmlzaW9uXSBtdWx0aXBseSB3aXRob3V0IGEgZ3VhcmQgcGVyIHRlcm0uCi8vCi8vIEV2ZXJ5IGV4cG9ydGVkIG1ldGhvZCBjYWxscyBpdCByYXRoZXIgdGhhbiB0cnVzdGluZyBpdHMgcmVjZWl2ZXIsIHNvIHRoZQovLyB6ZXJvIFNjaGVkdWxlIGZhaWxzIGV2ZXJ5d2hlcmUgaW5zdGVhZCBvZiBwcmljaW5nIGFnYWluc3QgbmlsIHNsaWNlcy4gVGhlCi8vIGNvc3QgaXMgYXQgbW9zdCAzMSBjb21wYXJpc29ucyBwZXIgY2FsbDsgc2VlIHRoZSBwYWNrYWdlIGRvYyBvbiBib3VuZHMuCmZ1bmMgKHMgU2NoZWR1bGUpIGNoZWNrKCkgZXJyb3IgewoJaWYgbGVuKHMuZWRnZXMpIDwgMSB8fCBsZW4ocy5lZGdlcykgPiBNYXhCdWNrZXRzLTEgewoJCXJldHVybiBFcnJCYWRCdWNrZXRDb3VudAoJfQoJaWYgbGVuKHMucmF0ZXMpICE9IGxlbihzLmVkZ2VzKSsxIHsKCQlyZXR1cm4gRXJyQmFkUmF0ZUNvdW50Cgl9CgkvLyBgPD0gMGAgYW5kIG5vdCBgPCAwYC4gQnVja2V0IDAgaXMgdGhlIGhhbGYtb3BlbiByYW5nZSBbMCwgZWRnZXNbMF0pLCBzbwoJLy8gYW4gZWRnZXNbMF0gb2YgMCBtYWtlcyBpdCBbMCwwKSDigJQgb2NjdXBpYWJsZSBieSBub3RoaW5nLCBmb3IgZXZlcnkgaW5wdXQsCgkvLyBmb3JldmVyIOKAlCB3aGlsZSBOdW1CdWNrZXRzIHN0aWxsIHJlcG9ydHMgaXQgYW5kIGV2ZXJ5IGJ1Y2tldCB0b3RhbCBzdGlsbAoJLy8gcHJpbnRzLiBUaGF0IGlzIHByZWNpc2VseSB0aGUgY29uZGl0aW9uIEVyckJhZEVkZ2VzIHJlZnVzZXMgYmV0d2VlbgoJLy8gYWRqYWNlbnQgZWRnZXMsIGFuZCB0aGUgZmlyc3QgZWRnZSB3YXMgdGhlIG9uZSBwbGFjZSB0aGUgcnVsZSBkaWQgbm90CgkvLyByZWFjaC4gU2hpcHBlZCBhcyBgPCAwYCBhbmQgY29ycmVjdGVkIGJlZm9yZSBkZXBsb3ltZW50OyB0aGUgbWVhc3VyZW1lbnQKCS8vIGFuZCB0aGUgYXVkaXQgZmluZGluZyBhcmUgaW4gQVVESVQubWQgWTIuCglpZiBzLmVkZ2VzWzBdIDw9IDAgewoJCXJldHVybiBFcnJCYWRFZGdlcwoJfQoJZm9yIGkgOj0gMTsgaSA8IGxlbihzLmVkZ2VzKTsgaSsrIHsKCQlpZiBzLmVkZ2VzW2ldIDw9IHMuZWRnZXNbaS0xXSB7CgkJCXJldHVybiBFcnJCYWRFZGdlcwoJCX0KCX0KCWZvciBpLCByYXRlIDo9IHJhbmdlIHMucmF0ZXMgewoJCWlmIHJhdGUgPCAwIHx8IHJhdGUgPiBSYXRlU2NhbGUgewoJCQlyZXR1cm4gRXJyQmFkUmF0ZQoJCX0KCQlpZiBpID4gMCAmJiByYXRlIDwgcy5yYXRlc1tpLTFdIHsKCQkJcmV0dXJuIEVyclJhdGVzRGVjcmVhc2UKCQl9Cgl9CglyZXR1cm4gbmlsCn0KCi8vIFZhbGlkIHJlcG9ydHMgd2hldGhlciB0aGUgc2NoZWR1bGUgaXMgd2VsbC1mb3JtZWQuIEEgemVybyBTY2hlZHVsZSBpcyBub3QuCmZ1bmMgKHMgU2NoZWR1bGUpIFZhbGlkKCkgYm9vbCB7IHJldHVybiBzLmNoZWNrKCkgPT0gbmlsIH0KCi8vIE51bUJ1Y2tldHMgaXMgdGhlIG51bWJlciBvZiBhZ2UgYmFuZHMsIHdoaWNoIGlzIG9uZSBtb3JlIHRoYW4gdGhlIG51bWJlciBvZgovLyBlZGdlcy4gSXQgcmV0dXJucyAwIGZvciBhbiBpbnZhbGlkIHNjaGVkdWxlLCBpbmNsdWRpbmcgdGhlIHplcm8gdmFsdWUsIHNvIGEKLy8gY2FsbGVyIHRoYXQgc2tpcHBlZCBbU2NoZWR1bGUuVmFsaWRdIGdldHMgYSBudW1iZXIgdGhhdCByZWFkcyBhcyB3cm9uZwovLyByYXRoZXIgdGhhbiBvbmUgdGhhdCByZWFkcyBhcyBhIG9uZS1idWNrZXQgc2NoZWR1bGUuCmZ1bmMgKHMgU2NoZWR1bGUpIE51bUJ1Y2tldHMoKSBpbnQgewoJaWYgcy5jaGVjaygpICE9IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBsZW4ocy5lZGdlcykgKyAxCn0KCi8vIEVkZ2VzIHJldHVybnMgYSBjb3B5IG9mIHRoZSBidWNrZXQgYm91bmRhcmllcy4KZnVuYyAocyBTY2hlZHVsZSkgRWRnZXMoKSBbXWludDY0IHsKCW91dCA6PSBtYWtlKFtdaW50NjQsIGxlbihzLmVkZ2VzKSkKCWNvcHkob3V0LCBzLmVkZ2VzKQoJcmV0dXJuIG91dAp9CgovLyBSYXRlcyByZXR1cm5zIGEgY29weSBvZiB0aGUgcGVyLWJ1Y2tldCBsb3NzIHJhdGVzLCBpbiB1bml0cyBvZiBbUmF0ZVNjYWxlXS4KZnVuYyAocyBTY2hlZHVsZSkgUmF0ZXMoKSBbXWludDY0IHsKCW91dCA6PSBtYWtlKFtdaW50NjQsIGxlbihzLnJhdGVzKSkKCWNvcHkob3V0LCBzLnJhdGVzKQoJcmV0dXJuIG91dAp9CgovLyBCdWNrZXRSYW5nZSByZXR1cm5zIHRoZSBoYWxmLW9wZW4gYWdlIHJhbmdlIG9mIGJ1Y2tldCBpIGFzCi8vIFtsbywgaGkpLCB0b2dldGhlciB3aXRoIHdoZXRoZXIgaXQgaXMgdW5ib3VuZGVkIGFib3ZlIOKAlCB3aGljaCBpcyB0cnVlIGZvcgovLyB0aGUgbGFzdCBidWNrZXQgYW5kIG9ubHkgdGhlIGxhc3QgYnVja2V0LCB3aGVyZSBoaSBpcyBtZWFuaW5nbGVzcy4KLy8KLy8gSXQgZXhpc3RzIHNvIHRoYXQgYSBjYWxsZXIgcmVuZGVyaW5nIGxpbmUgaXRlbXMgZG9lcyBub3QgaGF2ZSB0bwovLyByZWNvbnN0cnVjdCB0aGUgaGFsZi1vcGVuIGNvbnZlbnRpb24gZnJvbSBbU2NoZWR1bGUuRWRnZXNdLiBUaGF0Ci8vIHJlY29uc3RydWN0aW9uIGlzIHdoZXJlIGFuIG9mZi1ieS1vbmUgbGl2ZXMsIGFuZCB0aGlzIHBhY2thZ2UgaGFzIGFscmVhZHkKLy8gc2hpcHBlZCBvbmUgb2YgdGhvc2UgaW4gaXRzIG93biBkaXNjb3ZlcnkgcmVjb3JkOyBzZWUgdGhlIHBhY2thZ2UgZG9jLgpmdW5jIChzIFNjaGVkdWxlKSBCdWNrZXRSYW5nZShpIGludCkgKGxvLCBoaSBpbnQ2NCwgdW5ib3VuZGVkIGJvb2wsIGVyciBlcnJvcikgewoJaWYgZXJyIDo9IHMuY2hlY2soKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGZhbHNlLCBlcnIKCX0KCWlmIGkgPCAwIHx8IGkgPiBsZW4ocy5lZGdlcykgewoJCXJldHVybiAwLCAwLCBmYWxzZSwgRXJyQmFkQnVja2V0SW5kZXgKCX0KCWlmIGkgPiAwIHsKCQlsbyA9IHMuZWRnZXNbaS0xXQoJfQoJaWYgaSA9PSBsZW4ocy5lZGdlcykgewoJCXJldHVybiBsbywgMCwgdHJ1ZSwgbmlsCgl9CglyZXR1cm4gbG8sIHMuZWRnZXNbaV0sIGZhbHNlLCBuaWwKfQoKLy8gQWdlIHJldHVybnMgaG93IGxvbmcgYW4gb2JsaWdhdGlvbiBoYXMgYmVlbiBkdWU6IG5vdyAtIGR1ZUF0LgovLwovLyBaZXJvIGlzIGEgbGVnaXRpbWF0ZSBhZ2UgYW5kIG1lYW5zICJkdWUgZXhhY3RseSBub3csIG5vdCB5ZXQgbGF0ZSIuIEEKLy8gYGR1ZUF0YCBpbiB0aGUgZnV0dXJlIGlzIFtFcnJOb3RZZXREdWVdIHJhdGhlciB0aGFuIGEgbmVnYXRpdmUgYWdlOyBzZWUgdGhlCi8vIHBhY2thZ2UgZG9jIG9uIHdoeSBpdCBpcyByZWZ1c2VkIHJhdGhlciB0aGFuIGJ1Y2tldGVkLgovLwovLyBUaGUgc3BhbiBpcyBtZWFzdXJlZCBpbiB1aW50NjQgYW5kIHRoZSByZWFzb24gaXMgdGhlIHdob2xlIGNvcnJlY3RuZXNzCi8vIGFyZ3VtZW50LCBhZG9wdGVkIHZlcmJhdGltIGZyb20gW3AvZGVwcmVjaWF0aW9uXSdzIGBQZXJpb2RzYC4gYG5vdyA+PSBkdWVBdGAKLy8gaXMgZW5mb3JjZWQgZmlyc3QsIHNvIHRoZSB0cnVlIGRpZmZlcmVuY2UgaXMgbm9uLW5lZ2F0aXZlOyBpdHMgbGFyZ2VzdAovLyB2YWx1ZSBpcyBtYXhJbnQ2NCAtIG1pbkludDY0ID0gMl42NCAtIDEsIHdoaWNoIGRvZXMgbm90IGZpdCBpbiBhbiBpbnQ2NCBhbmQKLy8gZml0cyBleGFjdGx5IGluIGEgdWludDY0LiBpbnQ2NCBzdWJ0cmFjdGlvbiB3cmFwcyB0d28ncy1jb21wbGVtZW50LCBzbyB0aGUKLy8gYml0IHBhdHRlcm4gb2Ygbm93IC0gZHVlQXQgaXMgYWxyZWFkeSB0aGUgbG93IDY0IGJpdHMgb2YgdGhlIHRydWUKLy8gZGlmZmVyZW5jZSwgYW5kIHJlYWRpbmcgaXQgYXMgYSB1aW50NjQgcmVjb3ZlcnMgdGhhdCBkaWZmZXJlbmNlIHdpdGggbm8KLy8gbG9zcyBhbmQgbm8gcmVhY2hhYmxlIHdyYXAuIFtFcnJPdmVyZmxvd10gdGhlcmVmb3JlIG1lYW5zIGV4YWN0bHkgb25lIHRoaW5nCi8vIGhlcmUg4oCUIHRoZSB0cnVlIGFnZSBleGNlZWRzIG1heEludDY0IOKAlCBhbmQgdGhlIHN1YnRyYWN0aW9uIG5lZWRzIG5vIGd1YXJkLgpmdW5jIEFnZShkdWVBdCwgbm93IGludDY0KSAoaW50NjQsIGVycm9yKSB7CglpZiBub3cgPCBkdWVBdCB7CgkJcmV0dXJuIDAsIEVyck5vdFlldER1ZQoJfQoJc3BhbiA6PSB1aW50NjQobm93KSAtIHVpbnQ2NChkdWVBdCkKCWlmIHNwYW4gPiB1aW50NjQobWF4SW50NjQpIHsKCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCX0KCXJldHVybiBpbnQ2NChzcGFuKSwgbmlsCn0KCi8vIEJ1Y2tldE9mIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBidWNrZXQgYW4gYWdlIGZhbGxzIGluOiAwIGZvciB0aGUKLy8geW91bmdlc3QsIE51bUJ1Y2tldHMtMSBmb3IgdGhlIHVuYm91bmRlZCBvbGRlc3QuCi8vCi8vIFRoZSBwYXJ0aXRpb24gaXMgaGFsZi1vcGVuLCBbbG8sIGhpKSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdCBleGhhdXN0aXZlIGFuZAovLyBkaXNqb2ludCBvdmVyIGV2ZXJ5IG5vbi1uZWdhdGl2ZSBhZ2Ugd2l0aCBubyBib3VuZGFyeSBzaGFyZWQgYnkgdHdvCi8vIGJ1Y2tldHMuIEFuIGFnZSBlcXVhbCB0byBhbiBlZGdlIGJlbG9uZ3MgdG8gdGhlICoqb2xkZXIqKiBidWNrZXQsIHNvIGVkZ2UKLy8gMzAgbWVhbnMgIjMwIGFuZCBvdmVyIGlzIGluIHRoZSBuZXh0IGJhbmQiLgovLwovLyBBIG5lZ2F0aXZlIGFnZSBpcyBbRXJyTm90WWV0RHVlXSwgdGhlIHNhbWUgZXJyb3IgW0FnZV0gcmV0dXJucyBmb3IgdGhlIHNhbWUKLy8gY29uZGl0aW9uLgpmdW5jIChzIFNjaGVkdWxlKSBCdWNrZXRPZihhZ2UgaW50NjQpIChpbnQsIGVycm9yKSB7CglpZiBlcnIgOj0gcy5jaGVjaygpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglpZiBhZ2UgPCAwIHsKCQlyZXR1cm4gMCwgRXJyTm90WWV0RHVlCgl9Cglmb3IgaSwgZWRnZSA6PSByYW5nZSBzLmVkZ2VzIHsKCQlpZiBhZ2UgPCBlZGdlIHsKCQkJcmV0dXJuIGksIG5pbAoJCX0KCX0KCXJldHVybiBsZW4ocy5lZGdlcyksIG5pbAp9CgovLyBSZXBvcnRBdCBwYXJ0aXRpb25zIHRoZSBvYmxpZ2F0aW9ucyBieSBhZ2UgYXQgdGltZSBgbm93YCBhbmQgcmV0dXJucyB0aGUKLy8gcGVyLWJ1Y2tldCB1bnBhaWQgdG90YWxzIGFuZCB0aGVpciBzdW0uCi8vCi8vIEV2ZXJ5IG9ibGlnYXRpb24gbXVzdCBiZSBkdWUg4oCUIGBEdWVBdCA8PSBub3dgIOKAlCBhbmQgbXVzdCBjYXJyeSBhIHBvc2l0aXZlCi8vIGFtb3VudDsgdGhlIGZpcnN0IHRoYXQgaXMgbm90IGZhaWxzIHRoZSB3aG9sZSBjYWxsLCBiZWNhdXNlIGEgcGFydGlhbCByZXBvcnQKLy8gdGhhdCBzaWxlbnRseSBkcm9wcGVkIGEgcmVjZWl2YWJsZSBpcyB3b3JzZSB0aGFuIG5vIHJlcG9ydC4gV2hpY2gKLy8gb2JsaWdhdGlvbiBmYWlsZWQgaXMgbm90IGluIHRoZSBlcnJvcjogYSBzZW50aW5lbCBjYXJyaWVzIG5vIGluZGV4LCBhbmQKLy8gd3JhcHBpbmcgd2FzIG5vdCB3b3J0aCBhIGRlcGVuZGVuY3kgaGVyZS4gQSBjYWxsZXIgdGhhdCBuZWVkcyB0byBsb2NhdGUgdGhlCi8vIGJhZCBlbnRyeSBoYXMgW0FnZV0gYW5kIFtPYmxpZ2F0aW9uLkFtb3VudF0gYW5kIGNhbiBmaW5kIGl0IGluIG9uZSBwYXNzLgovLwovLyBBbiBlbXB0eSBzbGljZSBpcyBsZWdpdGltYXRlIGFuZCByZXR1cm5zIGEgemVyb2VkIHJlcG9ydCwgbm90IGFuIGVycm9yOiBhCi8vIHJlYWxtIHdpdGggbm90aGluZyBvdXRzdGFuZGluZyBoYXMgYSBwcm92aXNpb24gb2YgemVybyBhbmQgc2hvdWxkIG5vdCBoYXZlCi8vIHRvIHNwZWNpYWwtY2FzZSBpdC4KLy8KLy8gQ29zdDogYXQgbW9zdCBNYXhPYmxpZ2F0aW9ucyDDlyAoTWF4QnVja2V0cy0xKSBjb21wYXJpc29uczsgc2VlIHRoZSBwYWNrYWdlCi8vIGRvYy4KZnVuYyAocyBTY2hlZHVsZSkgUmVwb3J0QXQob2JzIFtdT2JsaWdhdGlvbiwgbm93IGludDY0KSAoUmVwb3J0LCBlcnJvcikgewoJaWYgZXJyIDo9IHMuY2hlY2soKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIFJlcG9ydHt9LCBlcnIKCX0KCWlmIGxlbihvYnMpID4gTWF4T2JsaWdhdGlvbnMgewoJCXJldHVybiBSZXBvcnR7fSwgRXJyVG9vTWFueU9ibGlnYXRpb25zCgl9CglidWNrZXRzIDo9IG1ha2UoW11pbnQ2NCwgbGVuKHMuZWRnZXMpKzEpCgl2YXIgdG90YWwgaW50NjQKCWZvciBfLCBvYiA6PSByYW5nZSBvYnMgewoJCWlmIG9iLkFtb3VudCA8PSAwIHsKCQkJcmV0dXJuIFJlcG9ydHt9LCBFcnJCYWRBbW91bnQKCQl9CgkJYWdlLCBlcnIgOj0gQWdlKG9iLkR1ZUF0LCBub3cpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBSZXBvcnR7fSwgZXJyCgkJfQoJCWksIGVyciA6PSBzLkJ1Y2tldE9mKGFnZSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIFJlcG9ydHt9LCBlcnIKCQl9CgkJLy8gR3VhcmQgdGhlIHJ1bm5pbmcgdG90YWwgZmlyc3Q6IGl0IGRvbWluYXRlcyBldmVyeSBidWNrZXQsIHNvIGEKCQkvLyB0b3RhbCB0aGF0IGZpdHMgaW1wbGllcyBldmVyeSBidWNrZXQgZml0cy4KCQlpZiBvYi5BbW91bnQgPiBtYXhJbnQ2NC10b3RhbCB7CgkJCXJldHVybiBSZXBvcnR7fSwgRXJyT3ZlcmZsb3cKCQl9CgkJdG90YWwgKz0gb2IuQW1vdW50CgkJLy8gQW5kIGVzdGFibGlzaCB0aGUgUFJJQ0lORyBwcmVjb25kaXRpb24gaGVyZSwgbm90IG9uZSBjYWxsIGxhdGVyLgoJCS8vIFRoZSBndWFyZCBhYm92ZSBvbmx5IHNheXMgdGhlIHRvdGFsIGRvZXMgbm90IHdyYXA7IHByaWNpbmcgbmVlZHMKCQkvLyB0aGUgc3Ryb25nZXIgYGIgPD0gbWF4SW50NjQvUmF0ZVNjYWxlYCB0aGF0IFByb3Zpc2lvbkJ5QnVja2V0CgkJLy8gZW5mb3JjZXMgcGVyIGJ1Y2tldCwgYW5kIHRoZSB0b3RhbCBkb21pbmF0ZXMgZXZlcnkgYnVja2V0IGluIHRoZQoJCS8vIHNhbWUgZGlyZWN0aW9uLiBXaXRob3V0IHRoaXMgbGluZSBSZXBvcnRBdCByZXR1cm5lZCwgd2l0aCBhIG5pbAoJCS8vIGVycm9yLCByZXBvcnRzIHRoYXQgUHJvdmlzaW9uIHRoZW4gcmVmdXNlZCB3aXRoIEVyck92ZXJmbG93IOKAlCB0aGUKCQkvLyB0d28gdGhyZXNob2xkcyBkaWZmZXJlZCBieSBSYXRlU2NhbGUsIGEgZmFjdG9yIG9mIDEwLDAwMC4gTWVhc3VyZWQKCQkvLyBiZWZvcmUgdGhlIGZpeDogb25lIG9ibGlnYXRpb24gb2YgbWF4SW50NjQgcmVwb3J0ZWQgY2xlYW5seSBhbmQKCQkvLyBwcmljZWQgYXMgRXJyT3ZlcmZsb3cuIFNlZSBBVURJVC5tZCBZMS4KCQkvLwoJCS8vIEJvdGggZ3VhcmRzIGFyZSBrZXB0IGFuZCBib3RoIGFyZSByZWFjaGFibGU6IHRoaXMgb25lIGZpcmVzIG9uIGFuCgkJLy8gYWNjdW11bGF0aW9uIHRoYXQgY2Fubm90IGJlIHByaWNlZCwgdGhlIG9uZSBhYm92ZSBvbiBhIHNpbmdsZQoJCS8vIGFtb3VudCB3aXRoaW4gUmF0ZVNjYWxlIG9mIG1heEludDY0LCB3aGljaCB0aGlzIG9uZSBjYW5ub3Qgc2VlCgkJLy8gYmVjYXVzZSBgbWF4SW50NjQtdG90YWxgIGlzIHRoZSBxdWFudGl0eSB0aGF0IHdyYXBzIHRoZXJlLgoJCWlmIHRvdGFsID4gbWF4SW50NjQvUmF0ZVNjYWxlIHsKCQkJcmV0dXJuIFJlcG9ydHt9LCBFcnJPdmVyZmxvdwoJCX0KCQlidWNrZXRzW2ldICs9IG9iLkFtb3VudAoJfQoJcmV0dXJuIFJlcG9ydHtCdWNrZXRzOiBidWNrZXRzLCBUb3RhbDogdG90YWx9LCBuaWwKfQoKLy8gUHJvdmlzaW9uQnlCdWNrZXQgcmV0dXJucyB0aGUgZXhwZWN0ZWQgY3JlZGl0IGxvc3MgcGVyIGJ1Y2tldDogdGhlCi8vIGxpbmUtaXRlbSBjb2x1bW4sIHlvdW5nZXN0IGZpcnN0LgovLwovLyBFYWNoIGVudHJ5IGlzIGBmbG9vcihidWNrZXThtaIgw5cgcmF0ZeG1oiAvIFJhdGVTY2FsZSlgLCB0aGUgZmxvb3IgdGFrZW4gcGVyCi8vIGJ1Y2tldCBzbyB0aGF0IHRoaXMgY29sdW1uIHN1bXMgdG8gZXhhY3RseSB3aGF0IFtTY2hlZHVsZS5Qcm92aXNpb25dCi8vIHJlcG9ydHMuIFNlZSB0aGUgcGFja2FnZSBkb2MgZm9yIHdoYXQgdGhhdCBjaG9pY2UgY29zdHMsIHdpdGggdGhlCi8vIGNvdW50ZXJleGFtcGxlIGluIGZ1bGwuCi8vCi8vIFRoZSByZXBvcnQgaXMgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQ6IGl0cyBidWNrZXQgY291bnQgbXVzdCBtYXRjaAovLyB0aGUgc2NoZWR1bGUsIGV2ZXJ5IGJ1Y2tldCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYW5kIHRoZSBidWNrZXRzIG11c3Qgc3VtCi8vIHRvIHRoZSByZXBvcnQncyBzdGF0ZWQgVG90YWwgKFtFcnJDcm9zc0Zvb3RdKS4gQSByZXBvcnQgZnJvbQovLyBbU2NoZWR1bGUuUmVwb3J0QXRdIHNhdGlzZmllcyBhbGwgdGhyZWUgYnkgY29uc3RydWN0aW9uLgovLwovLyBBIGZvdXJ0aCBwcm9wZXJ0eSBpcyBuZWVkZWQgYW5kIGlzIE5PVCBvbmUgb2YgdGhlIHRocmVlOiBldmVyeSBidWNrZXQgbXVzdAovLyBiZSBhdCBtb3N0IG1heEludDY0L1JhdGVTY2FsZSwgb3IgdGhlIG11bHRpcGxpY2F0aW9uIGJlbG93IHdyYXBzLiBTYXkgaXQKLy8gc2VwYXJhdGVseSBiZWNhdXNlIHRoZSB0aHJlZS1pdGVtIHNlbnRlbmNlIGFib3ZlIHdhcyB0cnVlLCBjb21wbGV0ZSBhYm91dAovLyB0aGUgdGhyZWUsIGFuZCBzdGlsbCByZWFkIGFzICJhIFJlcG9ydEF0IHJlcG9ydCBhbHdheXMgcHJpY2VzIiDigJQgd2hpY2ggaXQKLy8gZGlkIG5vdCBndWFyYW50ZWUuIFJlcG9ydEF0IG5vdyBib3VuZHMgaXRzIHJ1bm5pbmcgdG90YWwgYnkgdGhlIHNhbWUKLy8gcXVhbnRpdHksIHNvIHRoZSBpbXBsaWNhdHVyZSBpcyB0cnVlOyBpdCBpcyB0cnVlIGJlY2F1c2Ugb2YgYSBsaW5lIGluCi8vIFJlcG9ydEF0LCBub3QgYmVjYXVzZSBvZiBhbnl0aGluZyBoZXJlLiBTZWUgQVVESVQubWQgWTEuCmZ1bmMgKHMgU2NoZWR1bGUpIFByb3Zpc2lvbkJ5QnVja2V0KHIgUmVwb3J0KSAoW11pbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBzLmNoZWNrKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgbGVuKHIuQnVja2V0cykgIT0gbGVuKHMuZWRnZXMpKzEgewoJCXJldHVybiBuaWwsIEVyckJhZFJlcG9ydAoJfQoJb3V0IDo9IG1ha2UoW11pbnQ2NCwgbGVuKHIuQnVja2V0cykpCgl2YXIgc3VtIGludDY0Cglmb3IgaSwgYiA6PSByYW5nZSByLkJ1Y2tldHMgewoJCWlmIGIgPCAwIHsKCQkJcmV0dXJuIG5pbCwgRXJyQmFkQW1vdW50CgkJfQoJCWlmIGIgPiBtYXhJbnQ2NC1zdW0gewoJCQlyZXR1cm4gbmlsLCBFcnJPdmVyZmxvdwoJCX0KCQlzdW0gKz0gYgoJCS8vIGIqcmF0ZSBpcyB0aGUgb25seSBwcm9kdWN0LiBUaGUgZ3VhcmQgaXMgcGVyIGJ1Y2tldCByYXRoZXIgdGhhbgoJCS8vIG9uIHRoZSB0b3RhbCBiZWNhdXNlIGEgY2FsbGVyLWJ1aWx0IHJlcG9ydCdzIFRvdGFsIGlzIG5vdCB5ZXQKCQkvLyB0cnVzdGVkIGF0IHRoaXMgcG9pbnQg4oCUIHRoZSBjcm9zcy1mb290IGJlbG93IGlzIHdoYXQgZXN0YWJsaXNoZXMKCQkvLyBpdCwgYW5kIG9yZGVyaW5nIHRoZSBjaGVjayB0aGUgb3RoZXIgd2F5IHdvdWxkIGxldCBhIHJlcG9ydCB3aXRoCgkJLy8gYSB3cm9uZyBUb3RhbCBjaG9vc2UgaXRzIG93biBvdmVyZmxvdyBwcmVjb25kaXRpb24uCgkJaWYgYiA+IG1heEludDY0L1JhdGVTY2FsZSB7CgkJCXJldHVybiBuaWwsIEVyck92ZXJmbG93CgkJfQoJCW91dFtpXSA9IChiICogcy5yYXRlc1tpXSkgLyBSYXRlU2NhbGUKCX0KCWlmIHN1bSAhPSByLlRvdGFsIHsKCQlyZXR1cm4gbmlsLCBFcnJDcm9zc0Zvb3QKCX0KCXJldHVybiBvdXQsIG5pbAp9CgovLyBQcm92aXNpb24gcmV0dXJucyB0aGUgZXhwZWN0ZWQgY3JlZGl0IGxvc3MgZm9yIGEgcmVwb3J0OiBvbmUgbnVtYmVyIGZvciBhCi8vIGxlZGdlci4KLy8KLy8gSXQgaXMgZGVmaW5lZCBhcyB0aGUgc3VtIG9mIFtTY2hlZHVsZS5Qcm92aXNpb25CeUJ1Y2tldF0sIHNvIHRoZSBzaW5nbGUKLy8gZmlndXJlIGFuZCB0aGUgbGluZSBpdGVtcyBjYW4gbmV2ZXIgZGlzYWdyZWUg4oCUIHRoZSBzYW1lIHJlYXNvbgovLyBbcC9kZXByZWNpYXRpb25dIGRlZmluZXMgYENoYXJnZWAgYXMgYSBkaWZmZXJlbmNlIG9mIGBDYXJyeWluZ0F0YC4gVGhlIHN1bQovLyBjYW5ub3Qgb3ZlcmZsb3c6IGVhY2ggdGVybSBpcyBhdCBtb3N0IGl0cyBidWNrZXQsIGJlY2F1c2UgZXZlcnkgcmF0ZSBpcyBhdAovLyBtb3N0IFJhdGVTY2FsZSwgYW5kIHRoZSBidWNrZXRzIHdlcmUgZXN0YWJsaXNoZWQgdG8gc3VtIHdpdGhvdXQgb3ZlcmZsb3cuCmZ1bmMgKHMgU2NoZWR1bGUpIFByb3Zpc2lvbihyIFJlcG9ydCkgKGludDY0LCBlcnJvcikgewoJcGFydHMsIGVyciA6PSBzLlByb3Zpc2lvbkJ5QnVja2V0KHIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9Cgl2YXIgc3VtIGludDY0Cglmb3IgXywgcCA6PSByYW5nZSBwYXJ0cyB7CgkJc3VtICs9IHAKCX0KCXJldHVybiBzdW0sIG5pbAp9CgovLyBQcm92aXNpb25Gb3IgaXMgW1NjaGVkdWxlLlJlcG9ydEF0XSBmb2xsb3dlZCBieSBbU2NoZWR1bGUuUHJvdmlzaW9uXSwgZm9yIGEKLy8gY2FsbGVyIHRoYXQgd2FudHMgdGhlIG51bWJlciBhbmQgbm90IHRoZSBsaW5lIGl0ZW1zLgovLwovLyBQcmVmZXIgaXQgb3ZlciBob2xkaW5nIGEgW1JlcG9ydF06IGEgUmVwb3J0IGNhcnJpZXMgbm8gcmVmZXJlbmNlIHRvIHRoZQovLyBzY2hlZHVsZSB0aGF0IHByb2R1Y2VkIGl0LCBzbyBhIHN0b3JlZCBvbmUgY2FuIGJlIHByaWNlZCBhZ2FpbnN0IGEKLy8gZGlmZmVyZW50IHNjaGVkdWxlIG9mIHRoZSBzYW1lIGJ1Y2tldCBjb3VudCB3aXRoIG5vIGVycm9yLiBEb2luZyBib3RoIHN0ZXBzCi8vIGluIG9uZSBjYWxsIHJlbW92ZXMgdGhlIG9wcG9ydHVuaXR5LgpmdW5jIChzIFNjaGVkdWxlKSBQcm92aXNpb25Gb3Iob2JzIFtdT2JsaWdhdGlvbiwgbm93IGludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXAsIGVyciA6PSBzLlJlcG9ydEF0KG9icywgbm93KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIGVycgoJfQoJcmV0dXJuIHMuUHJvdmlzaW9uKHJlcCkKfQoaYAoLZ25vbW9kLnRvbWwSUW1vZHVsZSA9ICJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYWdpbmciCmdubyA9ICIwLjkiCiINMTAwMDAwMDB1Z25vdBISCJys7T8SCzEzMzkxNHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkCG9mRgHHVQAIpQOdEWVjstwFouFBxEIZJxc9k650wPxES5uRtURIo8qbqO/ZiwkFmJ62svCXmySksS3ot4HwXnGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}