{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "5AWlc1erJKptVgAZlvFn7bcHXAEOLcwldMKeo0N0f3Y=",
    "height": "327179",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "71390671",
      "GasUsed": "47593781"
    },
    "tx": "CuOVAgoML3ZtLm1fYWRkcGtnEtGVAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKUlQIKB2pvdXJuYWwSO2duby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9qb3VybmFsGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2pvdXJuYWwiCmdubyA9ICIwLjkiChrmkwIKC2pvdXJuYWwuZ25vEtWTAi8vIFBhY2thZ2Ugam91cm5hbCBpcyBhIHB1cmUgZG91YmxlLWVudHJ5IGFjY291bnRpbmcgcHJpbWl0aXZlIGZvciByZWFsbXMKLy8gdGhhdCBuZWVkIGJvb2tzIHdoaWNoIHByb3ZhYmx5IGJhbGFuY2UuIEl0IGlzIHRvICpib29ra2VlcGluZyogd2hhdAovLyBmZWVsZWRnZXIgaXMgdG8gKm1vbmV5KiBhbmQgZHVlYm9vayBpcyB0byAqdGltZSo6IGl0IGhvbGRzIG5vIGNvaW5zLAovLyBwZXJmb3JtcyBubyBlZmZlY3RzLCBpbXBvcnRzIG5vIGNoYWluIEFQSXMsIGFuZCBvd25zIG5vIHBhY2thZ2UtbGV2ZWwKLy8gc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gb3ducyBhICpCb29rLCBzdXBwbGllcyB0aGUgY2xvY2ssIGFuZCBwZXJmb3JtcwovLyBpdHMgb3duIGVmZmVjdHMuCi8vCi8vICMgVGhlIG9uZSBpZGVhCi8vCi8vIEV2ZXJ5IGZpbmFuY2lhbCBwcmltaXRpdmUgaW4gdGhlIHNlYXJjaGVkIEdubyBlY29zeXN0ZW0gaXMgT05FLVNJREVELiBBCi8vIHRyZWFzdXJ5IHJlY29yZHMgd2hhdCBtb3ZlZC4gQSBwdWxsLXBheW1lbnQgbGVkZ2VyIHJlY29yZHMgd2hvIGlzIG93ZWQKLy8gd2hhdC4gQSBHUkMyMCBsZWRnZXIgcmVjb3JkcyB3aG8gaG9sZHMgd2hhdC4gRWFjaCBzdG9yZXMgYSBiYWxhbmNlIGFuZAovLyBtdXRhdGVzIGl0LgovLwovLyBUaGlzIHBhY2thZ2Ugc3RvcmVzIG5vIGJhbGFuY2UuIEl0IHN0b3JlcyBFTlRSSUVTLCBhbmQgZGVyaXZlcyBiYWxhbmNlcwovLyBmcm9tIHRoZW06Ci8vCi8vCWJvb2suTXVzdE9wZW4oIjEwMDAiLCAiQ2FzaCIsIEFzc2V0KQovLwlib29rLk11c3RPcGVuKCI0MDAwIiwgIlJldmVudWUiLCBSZXZlbnVlKQovLwlib29rLk11c3RQb3N0KG5vdywgImludm9pY2UgMTcgcGFpZCIsIFtdUG9zdGluZ3sKLy8JCXtBY2NvdW50OiAiMTAwMCIsIFNpZGU6IERlYml0LCBBbW91bnQ6IDUwMDB9LAovLwkJe0FjY291bnQ6ICI0MDAwIiwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDUwMDB9LAovLwl9KQovLwovLyBBbiBlbnRyeSB0aGF0IGRvZXMgbm90IGJhbGFuY2UgaXMgcmVmdXNlZCwgYW5kIHRoZSByZWZ1c2FsIHNheXMgd2hpY2ggc2lkZQovLyBpcyBzaG9ydC4gU28gYHN1bShkZWJpdHMpID09IHN1bShjcmVkaXRzKWAgaXMgbm90IGEgcHJvcGVydHkgdGhlIGNvbnN1bWVyCi8vIG11c3QgcmVtZW1iZXIgdG8gbWFpbnRhaW4g4oCUIGl0IGlzIHRoZSBwcmVjb25kaXRpb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2luZwovLyBhdCBhbGwuIEEgQm9vayBjYW5ub3QgYmUgcHV0IGludG8gYW4gdW5iYWxhbmNlZCBzdGF0ZSBieSBhbnkgc2VxdWVuY2Ugb2YKLy8gY2FsbHMgdG8gdGhpcyBwYWNrYWdlLgovLwovLyAjIE5vIGFtZW5kLCBubyB2b2lkCi8vCi8vIFBvc3QgaXMgdGhlIG9ubHkgd2F5IGluLCBhbmQgdGhlcmUgaXMgbm8gRWRpdCBhbmQgbm8gRGVsZXRlLiBBIG1pc3Rha2UgaXMKLy8gY29ycmVjdGVkIHRoZSB3YXkgcmVhbCBib29rcyBjb3JyZWN0IG9uZTogd2l0aCBhIFJFVkVSU0lORyBFTlRSWSB0aGF0Ci8vIG1pcnJvcnMgZXZlcnkgcG9zdGluZyBvZiB0aGUgb3JpZ2luYWwsIGxlYXZpbmcgYm90aCB2aXNpYmxlLgovLwovLwlib29rLk11c3RSZXZlcnNlKGVudHJ5SUQsIG5vdywgIndyb25nIGFjY291bnQiKQovLwovLyBUaGlzIGlzIHdoeSBoaXN0b3J5IGlzIHRydXN0d29ydGh5IGhlcmUgYW5kIHdvdWxkIG5vdCBiZSBpZiBlbnRyaWVzIHdlcmUKLy8gbXV0YWJsZS4gQW4gYXVkaXRvciByZWFkaW5nIHRoZSBqb3VybmFsIHNlZXMgdGhlIGVycm9yIEFORCB0aGUgY29ycmVjdGlvbiwKLy8gd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBrZWVwaW5nIGEgam91cm5hbCByYXRoZXIgdGhhbiBhIGJhbGFuY2UuCi8vIFJldmVyc2UgcmVmdXNlcyBhIHNlY29uZCByZXZlcnNhbCBvZiB0aGUgc2FtZSBlbnRyeSwgc28gYSBjb3JyZWN0aW9uCi8vIGNhbm5vdCBiZSBsb29wZWQuCi8vCi8vICMgUGVyaW9kcwovLwovLyBDbG9zZSh0aHJvdWdoKSBzZWFscyBldmVyeXRoaW5nIGRhdGVkIGF0IG9yIGJlZm9yZSBgdGhyb3VnaGAuIEl0IG9ubHkgZXZlcgovLyBtb3ZlcyBmb3J3YXJkLCBhbmQgYWZ0ZXIgaXQgUG9zdCByZWZ1c2VzIGFueSBlbnRyeSBkYXRlZCBpbnRvIHRoZSBzZWFsZWQKLy8gcmFuZ2Ug4oCUIHRoZSBiYWNrZGF0aW5nIHRoYXQgbWFrZXMgYSBjbG9zZWQgcGVyaW9kIG1lYW5pbmdsZXNzLiBSZXZlcnNlIGlzCi8vIHJlZnVzZWQgdGhlcmUgdG9vOiBjb3JyZWN0aW5nIGEgc2VhbGVkIHBlcmlvZCBtZWFucyBvcGVuaW5nIGEgbmV3IGVudHJ5IGluCi8vIHRoZSBjdXJyZW50IG9uZSwgd2hpY2ggaXMgdGhlIGNvbnN1bWVyJ3MgY2FsbCB0byBtYWtlIGV4cGxpY2l0bHkuCi8vCi8vICMgV2hhdCAiYmFsYW5jZWQiIGlzIGFjdHVhbGx5IHdvcnRoCi8vCi8vIFJlYWQgdGhpcyBiZWZvcmUgcXVvdGluZyBJc0JhbGFuY2VkIGFzIGEgZ3VhcmFudGVlLgovLwovLyBJc0JhbGFuY2VkIGNvbXBhcmVzIFRXTyBJTkRFUEVOREVOVExZIE1BSU5UQUlORUQgQUNDVU1VTEFUT1JTOiB0aGUKLy8gcGVyLWFjY291bnQgZGViaXQvY3JlZGl0IHRvdGFscywgc3VtbWVkIGFjcm9zcyB0aGUgY2hhcnQsIGFnYWluc3QgdGhlCi8vIEJvb2sncyBvd24gcnVubmluZyB0b3RhbHMuIFRoZXkgYXJlIHdyaXR0ZW4gYnkgZGlmZmVyZW50IGNvZGUgcGF0aHMsIHNvCi8vIGEgZHJpZnQgYmV0d2VlbiB0aGVtIGlzIGEgcmVhbCBkZWZlY3QgYW5kIElzQmFsYW5jZWQgZmluZHMgaXQuIFdoYXQgaXQKLy8gZG9lcyBOT1QgZG8gaXMgcmUtcmVhZCB0aGUgam91cm5hbCwgc28gYSBkZWZlY3QgdGhhdCBjb3JydXB0ZWQgYm90aAovLyBhY2N1bXVsYXRvcnMgaWRlbnRpY2FsbHkgd291bGQgc3Vydml2ZSBpdC4KLy8KLy8gUmVkZXJpdmVGcm9tSm91cm5hbCBpcyB0aGUgc3Ryb25nIGNoZWNrOiBpdCByZXBsYXlzIGV2ZXJ5IHBvc3Rpbmcgb2YgZXZlcnkKLy8gZW50cnkgYW5kIGNvbXBhcmVzIHRoZSByZXN1bHQgYWdhaW5zdCBib3RoIGFjY3VtdWxhdG9ycy4gSXQgY29zdHMgTyhhbGwKLy8gcG9zdGluZ3MgZXZlcikgYW5kIGV4aXN0cyB0byBiZSBydW4gZGVsaWJlcmF0ZWx5LCBub3Qgb24gZXZlcnkgcmVhZC4KLy8KLy8gQWNjb3VudGluZ0VxdWF0aW9uIGlzIFdFQUtFUiBUSEFOIElUIExPT0tTIGFuZCBpcyBkb2N1bWVudGVkIGFzIHN1Y2gKLy8gcmF0aGVyIHRoYW4gbGVmdCBmb3IgYSByZWFkZXIgdG8gYXNzdW1lIG90aGVyd2lzZTogdW5kZXIgdGhpcyBwYWNrYWdlJ3MKLy8gc2lnbiBjb252ZW50aW9ucyBpdCBpcyBpbXBsaWVkIGJ5IElzQmFsYW5jZWQsIGFuZCBpdHMgYm9vbGVhbiBwcm92ZXMKLy8gRVhBQ1RMWSBPTkUgb2YgSXNCYWxhbmNlZCdzIHRocmVlIGNvbmp1bmN0cy4gSXQgaXMgTk9UIGFuIGluZGVwZW5kZW50Ci8vIGFjY291bnRpbmcgZmFjdC4gVGhyZWUgY2hlY2tzIHRoYXQgYXJlIHJlYWxseSB0d28sIHByZXNlbnRlZCBhcyB0aHJlZSwKLy8gd291bGQgYmUgdGhlIGRlZmVjdCB0aGlzIHBhY2thZ2UgZXhpc3RzIHRvIGF2b2lkLgovLwovLyBUaGlzIGRvYyBzYWlkICJpdCBpcyBhIGNyb3NzLWNoZWNrIG9mIHRoaXMgcGFja2FnZSdzIG93biBub3JtYWwtYmFsYW5jZQovLyBoYW5kbGluZyIgdW50aWwgMjAyNi0xMC0wNywgYW5kIHRoYXQgc2VudGVuY2Ugd2FzIEZBTFNFIOKAlCB0aGUgb25lIHBsYWNlCi8vIHRoZSBjYXJlZnVsIGRpc2NsYWltZXIgYXJvdW5kIGl0IHN0aWxsIG92ZXJjbGFpbWVkLiBUaGUgYm9vbGVhbiBpcyB0aGUKLy8gc3VtIG9mIGV2ZXJ5IGFjY291bnQncyBSYXdEZWx0YSwgYnVja2V0ZWQgYnkgS2luZCBhbmQgdGhlbiBhZGRlZCBiYWNrCi8vIHRvZ2V0aGVyLCBzbyB0aGUgYnVja2V0aW5nIGNhbm5vdCBjaGFuZ2UgaXQ6IG9mZnNldHMgaXMgSU5WQVJJQU5UIHVuZGVyCi8vIGV2ZXJ5IHBvc3NpYmxlIEtpbmQgbWlzY2xhc3NpZmljYXRpb24sIHdoaWNoIGlzIHRoZSBvbmUgdGhpbmcKLy8gIm5vcm1hbC1iYWxhbmNlIGhhbmRsaW5nIiBtZWFucy4gU2VlIG9ibGlnYXRpb24gNyBiZWxvdywgYW5kCi8vIEFjY291bnRpbmdFcXVhdGlvbidzIG93biBkb2MgZm9yIHdoYXQgaXQgZG9lcyBwcm92ZS4KLy8KLy8gQW5kIHRoZSBjZWlsaW5nIG9uIGFsbCB0aHJlZTogYSBCb29rIGNhbiBiZSBpbnRlcm5hbGx5IHBlcmZlY3QgYW5kCi8vIGRlc2NyaWJlIG5vdGhpbmcuIFNlZSBvYmxpZ2F0aW9uIDEgYmVsb3cuCi8vCi8vICMgU3RhdGUgZ3Jvd3RoCi8vCi8vIEVudHJpZXMgYXJlIG5ldmVyIHJlbW92ZWQsIGJlY2F1c2UgYW4gYXBwZW5kLW9ubHkgam91cm5hbCB3aG9zZSBlbnRyaWVzCi8vIGNvdWxkIHZhbmlzaCBpcyBub3QgYSBqb3VybmFsLiBTdG9yYWdlIHRoZXJlZm9yZSBncm93cyB3aXRoIGV2ZXJ5IFBvc3QgYW5kCi8vIGlzIGJvdW5kZWQgb25seSBieSBtYXhFbnRyaWVzLCBzZXQgYXQgY29uc3RydWN0aW9uLiBBIEJvb2sgdGhhdCByZWFjaGVzCi8vIHRoYXQgY2FwIHJlZnVzZXMgZnVydGhlciBlbnRyaWVzIHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIGhpc3Rvcnkg4oCUCi8vIGEgbG9uZy1saXZlZCBjb25zdW1lciBtdXN0IHBsYW4gZm9yIHRoaXMsIGFuZCB0aGUgcGxhbiBpcyBhIG5ldyBCb29rIHdpdGgKLy8gb3BlbmluZyBiYWxhbmNlcyBjYXJyaWVkIGZvcndhcmQsIG5vdCBhIHBydW5lZCBvbmUuCi8vCi8vICMgQ29uc3VtZXIgY29udHJhY3QgKHRoZSBwYXJ0cyB0aGUgcGFja2FnZSBjYW5ub3QgZW5mb3JjZSkKLy8KLy8gIDEuIFRIRSBCT09LUyBBUkUgQ0xBSU1TIEJZIFdIT0VWRVIgUE9TVEVEIFRIRU0uIFRoaXMgcGFja2FnZSBwcm92ZXMKLy8gICAgIGFyaXRobWV0aWMsIG5ldmVyIHRydXRoLiBXaXRoIG5vIGN1c3RvZHkgdGhlcmUgaXMgbm8gc29sdmVuY3kKLy8gICAgIGludmFyaWFudCB0eWluZyAiQ2FzaCA1MDAwIiB0byA1MDAwIHJlYWwgdWdub3QgYW55d2hlcmUuIEEgcmVhbG0gdGhhdAovLyAgICAgcHJlc2VudHMgYSBqb3VybmFsIGJhbGFuY2UgYXMgYSBob2xkaW5nIGlzIGFzc2VydGluZyBzb21ldGhpbmcgdGhpcwovLyAgICAgcGFja2FnZSBkaWQgbm90IGNoZWNrLiBUaGlzIGlzIHRoZSBzaW5nbGUgbW9zdCBpbXBvcnRhbnQgb2JsaWdhdGlvbgovLyAgICAgYW5kIHRoZSBvbmUgbW9zdCBjb21tb25seSBnb3Qgd3JvbmcuCi8vICAyLiBTVVBQTFkgQSBSRUFMIENMT0NLLiBqb3VybmFsIGNhbm5vdCB2ZXJpZnkgdGhhdCBgYXRgIGNhbWUgZnJvbQovLyAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpIG9yIHRpbWUuTm93KCkuVW5peCgpLiBBIHJlYWxtIHRoYXQgbGV0cyBhIGNhbGxlcgovLyAgICAgY2hvb3NlIGBhdGAgaGFzIG5vIHBlcmlvZCBkaXNjaXBsaW5lIGF0IGFsbDogdGhlIGNhbGxlciBkYXRlcyBlbnRyaWVzCi8vICAgICB3aGVyZXZlciB0aGV5IGFyZSBjb252ZW5pZW50LiBQYXNzIHRoZSBjaGFpbidzIGNsb2NrLCBuZXZlciBhCi8vICAgICB0cmFuc2FjdGlvbiBwYXJhbWV0ZXIuCi8vICAzLiBVU0UgT05FIENMT0NLIENPTlNJU1RFTlRMWS4gSGVpZ2h0cyBhbmQgc2Vjb25kcyBtdXN0IG5vdCBiZSBtaXhlZAovLyAgICAgd2l0aGluIGEgQm9vazsgYGF0YCBhbmQgYHRocm91Z2hgIGFyZSBib3RoIGluIHRoZSBjYWxsZXIncyB1bml0LgovLyAgNC4gRE8gTk9UIEVYUE9SVCBUSEUgQk9PSy4gQSAqQm9vayBpcyBhIG11dGFibGUgaGFuZGxlLiBSZXR1cm5pbmcgb25lCi8vICAgICBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSBoYW5kcyBvdXQgdGhlIHJpZ2h0IHRvIG9wZW4gYWNjb3VudHMsIHBvc3QgYW5kCi8vICAgICByZXZlcnNlLiBFeHBvc2UgeW91ciBvd24gY3Jvc3NpbmcgZnVuY3Rpb25zIGluc3RlYWQ7IHRoaXMgcGFja2FnZQovLyAgICAgcmV0dXJucyBBY2NvdW50IGFuZCBFbnRyeSBWQUxVRVMsIG5ldmVyIHBvaW50ZXJzIGludG8gaXRzIHN0YXRlLgovLyAgNS4gQVVUSE9SSVpFIFRIRSBQT1NURVIuIGpvdXJuYWwgYXV0aGVudGljYXRlcyBub2JvZHkuIFdobyBtYXkgb3BlbiBhbgovLyAgICAgYWNjb3VudCwgd2hvIG1heSBwb3N0LCBhbmQgd2hvIG1heSBjbG9zZSBhIHBlcmlvZCBhcmUgdGhlIHJlYWxtJ3MKLy8gICAgIHBvbGljeSDigJQgZGVyaXZlIHRoZSBjYWxsZXIgZnJvbSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIG5vdCBmcm9tIGFuCi8vICAgICBhcmd1bWVudC4KLy8gIDYuIENIT09TRSBUSEUgVU5JVCBPTkNFLiBBbW91bnRzIGFyZSBpbnQ2NCBpbiB3aGF0ZXZlciBtaW5vciB1bml0IHRoZQovLyAgICAgY29uc3VtZXIgcGlja3MuIGpvdXJuYWwgZG9lcyBub3Qga25vdyBhYm91dCBkZW5vbWluYXRpb25zIGFuZCB3aWxsCi8vICAgICBoYXBwaWx5IGJhbGFuY2UgYW4gZW50cnkgdGhhdCBtaXhlcyB0d28gb2YgdGhlbS4KLy8gIDcuIEdFVCBUSEUgS0lORCBSSUdIVCBBVCBPUEVOIFRJTUUuIE5PIENIRUNLIElOIFRISVMgUEFDS0FHRSBWQUxJREFURVMKLy8gICAgIEFOIEFDQ09VTlQnUyBLSU5ELiBBIEtpbmQgaXMgYWNjZXB0ZWQgaWYgaXQgaXMgb25lIG9mIHRoZSBmaXZlIGFuZCBpcwovLyAgICAgbmV2ZXIgcmV2aXNpdGVkLCBzbyBhbiBhY2NvdW50IG9wZW5lZCBBc3NldCB0aGF0IHNob3VsZCBoYXZlIGJlZW4KLy8gICAgIExpYWJpbGl0eSByZXBvcnRzIGEgc2lnbi1mbGlwcGVkIEJhbGFuY2UoKSBmb3JldmVyIOKAlCBhbmQgSXNCYWxhbmNlZCwKLy8gICAgIFJlZGVyaXZlRnJvbUpvdXJuYWwgYW5kIEFjY291bnRpbmdFcXVhdGlvbiBhbGwgdGhyZWUgc3RheSBoZWFsdGh5LAovLyAgICAgYmVjYXVzZSBldmVyeSBvbmUgb2YgdGhlbSBpcyBidWlsdCBvbiBEZWJpdHMgYW5kIENyZWRpdHMsIHdoaWNoIHRoZQovLyAgICAgS2luZCBkb2VzIG5vdCB0b3VjaC4gVGhpcyBpcyB0aGUgaW52YXJpYW50IHRpZXJzJyBibGluZCBzcG90LCBpdCBpcwovLyAgICAgc3RydWN0dXJhbCByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbiB0byBiZSBmaXhlZCBsYXRlciwgYW5kIGEgcmVhbG0KLy8gICAgIHRoYXQgbGV0cyBhIGNhbGxlciBjaG9vc2UgdGhlIEtpbmQgaGFzIGRlbGVnYXRlZCBhIGRlY2lzaW9uIG5vCi8vICAgICBsYXRlciBjaGVjayBjYW4gYXVkaXQuCi8vCi8vIEFsbCBmYWlsdXJlcyBhcmUgcmV0dXJuZWQgYXMgZXJyb3JzIGFuZCBsZWF2ZSB0aGUgQm9vayBDT01QTEVURUxZCi8vIFVOQ0hBTkdFRC4gTXVzdCogd3JhcHBlcnMgYXJlIHRoZSBvbmx5IGZ1bmN0aW9ucyBoZXJlIHRoYXQgcGFuaWMuCi8vCi8vIFRoZSBCb29rIGlzIGFkZHJlc3MtYWdub3N0aWM6IGFjY291bnQgY29kZXMgYXJlIG5vbi1lbXB0eSBzdHJpbmdzLiBSZWFsbXMKLy8gbm9ybWFsbHkgdXNlIGEgY2hhcnQtb2YtYWNjb3VudHMgY29kZSwgbm90IGFuIGFkZHJlc3MuCnBhY2thZ2Ugam91cm5hbAoKaW1wb3J0ICgKCSJlcnJvcnMiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIE1heEFjY291bnRzTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4QWNjb3VudHMgYSBCb29rIG1heSBiZSBjb25zdHJ1Y3RlZAovLyB3aXRoLiBJdCBib3VuZHMgdGhlIGNvc3Qgb2YgSXNCYWxhbmNlZCBhbmQgQWNjb3VudGluZ0VxdWF0aW9uLCB3aGljaCBzY2FuCi8vIHRoZSBjaGFydCBvZiBhY2NvdW50cy4KY29uc3QgTWF4QWNjb3VudHNMaW1pdCA9IDEwMDAwCgovLyBNYXhFbnRyaWVzTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4RW50cmllcyBhIEJvb2sgbWF5IGJlIGNvbnN0cnVjdGVkIHdpdGguCmNvbnN0IE1heEVudHJpZXNMaW1pdCA9IDEwMDAwMDAKCi8vIE1heFBvc3RpbmdzUGVyRW50cnkgYm91bmRzIGEgc2luZ2xlIGVudHJ5J3MgcG9zdGluZyBjb3VudC4gVHdvIGlzIHRoZQovLyBtaW5pbXVtIGEgYmFsYW5jZWQgZW50cnkgY2FuIGhhdmU7IHRoZSBjZWlsaW5nIGtlZXBzIG9uZSBQb3N0IGJvdW5kZWQuCmNvbnN0IE1heFBvc3RpbmdzUGVyRW50cnkgPSA2NAoKLy8gTWF4Q29kZUxlbiBib3VuZHMgYW4gYWNjb3VudCBjb2RlLgpjb25zdCBNYXhDb2RlTGVuID0gNjQKCi8vIE1heE5hbWVMZW4gYm91bmRzIGFuIGFjY291bnQncyBodW1hbi1yZWFkYWJsZSBuYW1lLgpjb25zdCBNYXhOYW1lTGVuID0gMjU2CgovLyBNYXhNZW1vTGVuIGJvdW5kcyBhbiBlbnRyeSBtZW1vLiBUaGUgbWVtbyBpcyBvcGFxdWUgdG8gam91cm5hbCDigJQgaXQgZXhpc3RzCi8vIHNvIGEgcmVhbG0gY2FuIHJlY29yZCB3aHkgYW4gZW50cnkgd2FzIG1hZGUgd2l0aG91dCBrZWVwaW5nIGEgcGFyYWxsZWwKLy8gdGFibGUuCmNvbnN0IE1heE1lbW9MZW4gPSAxMDI0CgovLyBFcnJvcnMgcmV0dXJuZWQgYnkgQm9vayBvcGVyYXRpb25zLgp2YXIgKAoJRXJyRW1wdHlDb2RlICAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVtcHR5IGFjY291bnQgY29kZSIpCglFcnJDb2RlVG9vTG9uZyAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYWNjb3VudCBjb2RlIGV4Y2VlZHMgTWF4Q29kZUxlbiIpCglFcnJOYW1lVG9vTG9uZyAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYWNjb3VudCBuYW1lIGV4Y2VlZHMgTWF4TmFtZUxlbiIpCglFcnJNZW1vVG9vTG9uZyAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogbWVtbyBleGNlZWRzIE1heE1lbW9MZW4iKQoJRXJySW52YWxpZEtpbmQgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IHVua25vd24gYWNjb3VudCBraW5kIikKCUVyckludmFsaWRTaWRlICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBwb3N0aW5nIHNpZGUgbXVzdCBiZSBEZWJpdCBvciBDcmVkaXQiKQoJRXJySW52YWxpZEFtb3VudCAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IHBvc3RpbmcgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJRXJySW52YWxpZEF0ICAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGF0IG11c3QgYmUgbm9uLW5lZ2F0aXZlIikKCUVyckludmFsaWRDb25maWcgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBpbnZhbGlkIGJvb2sgY29uZmlndXJhdGlvbiIpCglFcnJBY2NvdW50RXhpc3RzICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYWNjb3VudCBjb2RlIGFscmVhZHkgb3BlbiIpCglFcnJVbmtub3duQWNjb3VudCAgID0gZXJyb3JzLk5ldygiam91cm5hbDogbm8gc3VjaCBhY2NvdW50IikKCUVyckNoYXJ0RnVsbCAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBhY2NvdW50IGNhcCByZWFjaGVkIikKCUVyckJvb2tGdWxsICAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBjYXAgcmVhY2hlZCIpCglFcnJUb29GZXdQb3N0aW5ncyAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYW4gZW50cnkgbmVlZHMgYXQgbGVhc3QgdHdvIHBvc3RpbmdzIikKCUVyclRvb01hbnlQb3N0aW5ncyAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBleGNlZWRzIE1heFBvc3RpbmdzUGVyRW50cnkiKQoJRXJyTm9EZWJpdCAgICAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVudHJ5IGhhcyBubyBkZWJpdCBwb3N0aW5nIikKCUVyck5vQ3JlZGl0ICAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBoYXMgbm8gY3JlZGl0IHBvc3RpbmciKQoJRXJyRGViaXRTaG9ydCAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVudHJ5IGRvZXMgbm90IGJhbGFuY2UsIGRlYml0cyBhcmUgc2hvcnQiKQoJRXJyQ3JlZGl0U2hvcnQgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVudHJ5IGRvZXMgbm90IGJhbGFuY2UsIGNyZWRpdHMgYXJlIHNob3J0IikKCUVyckVudHJ5Tm90Rm91bmQgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBubyBzdWNoIGVudHJ5IikKCUVyckFscmVhZHlSZXZlcnNlZCAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2VkIikKCUVyclBlcmlvZENsb3NlZCAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBhdCBmYWxscyBpbiBhIGNsb3NlZCBwZXJpb2QiKQoJRXJyQ2xvc2VOb3RGb3J3YXJkICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGNsb3NlIG11c3QgbW92ZSBmb3J3YXJkIikKCUVyck92ZXJmbG93ICAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBpbnQ2NCBvdmVyZmxvdyIpCglFcnJJREV4aGF1c3RlZCAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogaWRlbnRpZmllciBzcGFjZSBleGhhdXN0ZWQiKQopCgovLyBLaW5kIGlzIGFuIGFjY291bnQncyBjbGFzc2lmaWNhdGlvbiwgd2hpY2ggZml4ZXMgaXRzIG5vcm1hbCBiYWxhbmNlLgovLyBUaGUgemVybyB2YWx1ZSBpcyBkZWxpYmVyYXRlbHkgaW52YWxpZCBzbyBhIGZvcmdvdHRlbiBmaWVsZCBpcyBhbiBlcnJvcgovLyByYXRoZXIgdGhhbiBhbiBBc3NldC4KdHlwZSBLaW5kIHVpbnQ4CgovLyBUaGUgZml2ZSBhY2NvdW50IGtpbmRzLiBBc3NldCBhbmQgRXhwZW5zZSBhcmUgZGViaXQtbm9ybWFsOyBMaWFiaWxpdHksCi8vIEVxdWl0eSBhbmQgUmV2ZW51ZSBhcmUgY3JlZGl0LW5vcm1hbC4KY29uc3QgKAoJQXNzZXQgICAgIEtpbmQgPSAxCglMaWFiaWxpdHkgS2luZCA9IDIKCUVxdWl0eSAgICBLaW5kID0gMwoJUmV2ZW51ZSAgIEtpbmQgPSA0CglFeHBlbnNlICAgS2luZCA9IDUKKQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIGsgaXMgb25lIG9mIHRoZSBmaXZlIGtpbmRzLgpmdW5jIChrIEtpbmQpIFZhbGlkKCkgYm9vbCB7IHJldHVybiBrID49IEFzc2V0ICYmIGsgPD0gRXhwZW5zZSB9CgovLyBJc0RlYml0Tm9ybWFsIHJlcG9ydHMgd2hldGhlciBhbiBpbmNyZWFzZSBpbiBrIGlzIHJlY29yZGVkIGFzIGEgZGViaXQuCi8vIEFzc2V0IGFuZCBFeHBlbnNlIGFyZSBkZWJpdC1ub3JtYWw7IHRoZSBvdGhlciB0aHJlZSBhcmUgY3JlZGl0LW5vcm1hbC4KLy8gQW4gaW52YWxpZCBLaW5kIHJlcG9ydHMgZmFsc2UsIHdoaWNoIGlzIHdoeSBjYWxsZXJzIHZhbGlkYXRlIGZpcnN0LgpmdW5jIChrIEtpbmQpIElzRGViaXROb3JtYWwoKSBib29sIHsgcmV0dXJuIGsgPT0gQXNzZXQgfHwgayA9PSBFeHBlbnNlIH0KCi8vIFN0cmluZyByZXR1cm5zIHRoZSBraW5kJ3MgbmFtZSwgb3IgImludmFsaWQiIGZvciB0aGUgemVybyB2YWx1ZSBhbmQgYW55Ci8vIHVucmVjb2duaXNlZCBjb2RlLgpmdW5jIChrIEtpbmQpIFN0cmluZygpIHN0cmluZyB7Cglzd2l0Y2ggayB7CgljYXNlIEFzc2V0OgoJCXJldHVybiAiYXNzZXQiCgljYXNlIExpYWJpbGl0eToKCQlyZXR1cm4gImxpYWJpbGl0eSIKCWNhc2UgRXF1aXR5OgoJCXJldHVybiAiZXF1aXR5IgoJY2FzZSBSZXZlbnVlOgoJCXJldHVybiAicmV2ZW51ZSIKCWNhc2UgRXhwZW5zZToKCQlyZXR1cm4gImV4cGVuc2UiCgl9CglyZXR1cm4gImludmFsaWQiCn0KCi8vIFNpZGUgaXMgd2hpY2ggY29sdW1uIGEgcG9zdGluZyBsYW5kcyBpbi4gVGhlIHplcm8gdmFsdWUgaXMgZGVsaWJlcmF0ZWx5Ci8vIGludmFsaWQ6IGEgcG9zdGluZyB3aXRoIGEgZm9yZ290dGVuIFNpZGUgbXVzdCBiZSByZWZ1c2VkLCBub3Qgc2lsZW50bHkKLy8gdHJlYXRlZCBhcyBhIGRlYml0Lgp0eXBlIFNpZGUgdWludDgKCi8vIFRoZSB0d28gcG9zdGluZyBzaWRlcy4KY29uc3QgKAoJRGViaXQgIFNpZGUgPSAxCglDcmVkaXQgU2lkZSA9IDIKKQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIHMgaXMgRGViaXQgb3IgQ3JlZGl0LgpmdW5jIChzIFNpZGUpIFZhbGlkKCkgYm9vbCB7IHJldHVybiBzID09IERlYml0IHx8IHMgPT0gQ3JlZGl0IH0KCi8vIFN0cmluZyByZXR1cm5zICJkZWJpdCIsICJjcmVkaXQiLCBvciAiaW52YWxpZCIuCmZ1bmMgKHMgU2lkZSkgU3RyaW5nKCkgc3RyaW5nIHsKCXN3aXRjaCBzIHsKCWNhc2UgRGViaXQ6CgkJcmV0dXJuICJkZWJpdCIKCWNhc2UgQ3JlZGl0OgoJCXJldHVybiAiY3JlZGl0IgoJfQoJcmV0dXJuICJpbnZhbGlkIgp9CgovLyBPcHBvc2l0ZSByZXR1cm5zIHRoZSBvdGhlciBzaWRlLiBBbiBpbnZhbGlkIFNpZGUgcmV0dXJucyBpdHNlbGYsIHNvIGEKLy8gY2FsbGVyIHRoYXQgc2tpcHBlZCB2YWxpZGF0aW9uIGdldHMgYW4gaW52YWxpZCBwb3N0aW5nIHJhdGhlciB0aGFuIGEKLy8gcGxhdXNpYmxlIG9uZS4KZnVuYyAocyBTaWRlKSBPcHBvc2l0ZSgpIFNpZGUgewoJc3dpdGNoIHMgewoJY2FzZSBEZWJpdDoKCQlyZXR1cm4gQ3JlZGl0CgljYXNlIENyZWRpdDoKCQlyZXR1cm4gRGViaXQKCX0KCXJldHVybiBzCn0KCi8vIFBvc3RpbmcgaXMgb25lIGxlZyBvZiBhbiBlbnRyeTogYW4gYW1vdW50IGluIG9uZSBjb2x1bW4gb2Ygb25lIGFjY291bnQuCi8vIEFtb3VudCBpcyBhbHdheXMgUE9TSVRJVkUg4oCUIGRpcmVjdGlvbiBpcyBjYXJyaWVkIGJ5IFNpZGUsIG5vdCBieSBhIHNpZ24uCi8vCi8vIFRoYXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBvdmVyIHNpZ25lZCBhbW91bnRzLiBXaXRoIGEgc2lnbiwgIndoaWNoIHNpZGUKLy8gaXMgc2hvcnQiIGlzIHVuYW5zd2VyYWJsZSB3aXRob3V0IGtub3dpbmcgZWFjaCBhY2NvdW50J3Mgbm9ybWFsIGJhbGFuY2UsCi8vIHNvIGFuIHVuYmFsYW5jZWQgZW50cnkgY2FuIG9ubHkgYmUgcmVwb3J0ZWQgYXMgYSBudW1iZXIgdGhhdCBkb2VzIG5vdCBhZGQKLy8gdXAuIFdpdGggYW4gZXhwbGljaXQgU2lkZSB0aGUgcmVmdXNhbCBuYW1lcyB0aGUgc2hvcnQgY29sdW1uLCB3aGljaCBpcwovLyB3aGF0IGEgYm9va2tlZXBlciBuZWVkcyBpbiBvcmRlciB0byBmaXggaXQuCnR5cGUgUG9zdGluZyBzdHJ1Y3QgewoJQWNjb3VudCBzdHJpbmcKCVNpZGUgICAgU2lkZQoJQW1vdW50ICBpbnQ2NAp9CgovLyBBY2NvdW50IGlzIG9uZSBsaW5lIG9mIHRoZSBjaGFydCBvZiBhY2NvdW50cywgY2FycnlpbmcgaXRzIGN1bXVsYXRpdmUKLy8gZGViaXQgYW5kIGNyZWRpdCB0b3RhbHMuIEl0IGlzIHJldHVybmVkIEJZIFZBTFVFOiBob2xkZXJzIGNhbm5vdCByZWFjaAovLyBpbnRvIGEgQm9vayB0aHJvdWdoIGl0Lgp0eXBlIEFjY291bnQgc3RydWN0IHsKCUNvZGUgICAgc3RyaW5nCglOYW1lICAgIHN0cmluZwoJS2luZCAgICBLaW5kCglEZWJpdHMgIGludDY0CglDcmVkaXRzIGludDY0Cn0KCi8vIEJhbGFuY2UgcmV0dXJucyB0aGUgYWNjb3VudCdzIGJhbGFuY2UgaW4gaXRzIE5PUk1BTCBkaXJlY3Rpb246IGZvciBhCi8vIGRlYml0LW5vcm1hbCBhY2NvdW50IERlYml0cy1DcmVkaXRzLCBmb3IgYSBjcmVkaXQtbm9ybWFsIGFjY291bnQKLy8gQ3JlZGl0cy1EZWJpdHMuIEEgbm9ybWFsIGFjY291bnQgdGhlcmVmb3JlIGhhcyBhIG5vbi1uZWdhdGl2ZSBiYWxhbmNlLAovLyBhbmQgYSBuZWdhdGl2ZSByZXN1bHQgaXMgYSByZWFsIHNpZ25hbCAoYSBjb250cmEgcG9zaXRpb24pIHJhdGhlciB0aGFuIGEKLy8gc2lnbiBjb252ZW50aW9uLgpmdW5jIChhIEFjY291bnQpIEJhbGFuY2UoKSBpbnQ2NCB7CglpZiBhLktpbmQuSXNEZWJpdE5vcm1hbCgpIHsKCQlyZXR1cm4gYS5EZWJpdHMgLSBhLkNyZWRpdHMKCX0KCXJldHVybiBhLkNyZWRpdHMgLSBhLkRlYml0cwp9CgovLyBSYXdEZWx0YSByZXR1cm5zIERlYml0cy1DcmVkaXRzIHJlZ2FyZGxlc3Mgb2Yga2luZC4gU3VtbWVkIG92ZXIgZXZlcnkKLy8gYWNjb3VudCBpbiBhIGJhbGFuY2VkIGJvb2sgaXQgaXMgZXhhY3RseSB6ZXJvLCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHRoZQovLyB1c2VmdWwgcXVhbnRpdHkgZm9yIGEgY29uc2lzdGVuY3kgY2hlY2sgYW5kIHRoZSB3cm9uZyBvbmUgZm9yIGEgcmVwb3J0LgpmdW5jIChhIEFjY291bnQpIFJhd0RlbHRhKCkgaW50NjQgeyByZXR1cm4gYS5EZWJpdHMgLSBhLkNyZWRpdHMgfQoKLy8gRW50cnkgaXMgb25lIGpvdXJuYWwgZW50cnk6IGEgZGF0ZWQsIG1lbW8nZCwgYmFsYW5jZWQgc2V0IG9mIHBvc3RpbmdzLgovLyBJdCBpcyByZXR1cm5lZCBCWSBWQUxVRSwgYW5kIGl0cyBQb3N0aW5ncyBzbGljZSBpcyBhIERFRkVOU0lWRSBDT1BZIOKAlCBhCi8vIGhvbGRlciBjYW4gbXV0YXRlIHRoZSByZXR1cm5lZCBzbGljZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBCb29rLiBFbnRyeSBpcwovLyB0aGUgb25lIHR5cGUgaGVyZSB0aGF0IGNvbnRhaW5zIGEgc2xpY2UsIHNvIGl0IGlzIHRoZSBvbmUgdHlwZSB3aGVyZQovLyByZXR1cm5pbmcgdGhlIHN0b3JlZCB2YWx1ZSBkaXJlY3RseSB3b3VsZCBoYXZlIGhhbmRlZCBvdXQgYSB3cml0YWJsZQovLyB3aW5kb3cgaW50byBCb29rIHN0YXRlLgovLwovLyBSZXZlcnNhbE9mIGlzIDAgdW5sZXNzIHRoaXMgZW50cnkgd2FzIHByb2R1Y2VkIGJ5IFJldmVyc2UsIGluIHdoaWNoIGNhc2UKLy8gaXQgaXMgdGhlIElEIG9mIHRoZSBlbnRyeSBpdCBtaXJyb3JzLgp0eXBlIEVudHJ5IHN0cnVjdCB7CglJRCAgICAgICAgIHVpbnQ2NAoJQXQgICAgICAgICBpbnQ2NAoJTWVtbyAgICAgICBzdHJpbmcKCVBvc3RpbmdzICAgW11Qb3N0aW5nCglSZXZlcnNhbE9mIHVpbnQ2NAp9CgovLyBJc1JldmVyc2FsIHJlcG9ydHMgd2hldGhlciB0aGlzIGVudHJ5IHdhcyBwcm9kdWNlZCBieSBSZXZlcnNlLgpmdW5jIChlIEVudHJ5KSBJc1JldmVyc2FsKCkgYm9vbCB7IHJldHVybiBlLlJldmVyc2FsT2YgIT0gMCB9CgovLyBUb3RhbCByZXR1cm5zIHRoZSBlbnRyeSdzIGRlYml0IHRvdGFsLCB3aGljaCBmb3IgYW55IGVudHJ5IGEgQm9vayBhY2NlcHRlZAovLyBlcXVhbHMgaXRzIGNyZWRpdCB0b3RhbC4KZnVuYyAoZSBFbnRyeSkgVG90YWwoKSBpbnQ2NCB7Cgl2YXIgdCBpbnQ2NAoJZm9yIF8sIHAgOj0gcmFuZ2UgZS5Qb3N0aW5ncyB7CgkJaWYgcC5TaWRlID09IERlYml0IHsKCQkJdCArPSBwLkFtb3VudAoJCX0KCX0KCXJldHVybiB0Cn0KCi8vIEJvb2sgaXMgdGhlIGNoYXJ0IG9mIGFjY291bnRzIGFuZCB0aGUgam91cm5hbCBvZiBvbmUgY29uc3VtaW5nIHJlYWxtLiBUaGUKLy8gemVybyB2YWx1ZSBpcyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcuCnR5cGUgQm9vayBzdHJ1Y3QgewoJbWF4QWNjb3VudHMgaW50CgltYXhFbnRyaWVzICBpbnQKCglhY2NvdW50cyAqYXZsLlRyZWUgLy8gY29kZSAtPiBBY2NvdW50CgllbnRyaWVzICAqYXZsLlRyZWUgLy8gcGFkZGVkIGlkIC0+IEVudHJ5CgkvLyByZXZlcnNlZCBzdG9yZXMgYHRydWVgLCBub3QgYSBzdHJ1Y3R7fSBzZW50aW5lbCwgYW5kIGRlbGliZXJhdGVseToKCS8vIGF2bC5UcmVlLkdldCBjYW5ub3QgdGVsbCBhIG5pbC12YWx1ZWQga2V5IGZyb20gYW4gYWJzZW50IG9uZSwgc28gYQoJLy8gbmlsIHNlbnRpbmVsIGludml0ZXMgYSBmdXR1cmUgcmVhZGVyIHRvIHN3aXRjaCBmcm9tIEhhcyB0byBHZXQgYW5kCgkvLyBnZXQgYSBzaWxlbnRseSB3cm9uZyBhbnN3ZXIuIE1lbWJlcnNoaXAgaXMgdGhlIHdob2xlIHZhbHVlIGhlcmUg4oCUCgkvLyBib3RoIHJlYWRlcnMgdXNlIEhhcyBhbmQgdGhlIHN0b3JlZCB2YWx1ZSBpcyBuZXZlciByZWFkLgoJcmV2ZXJzZWQgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiB0cnVlLCBmb3IgZW50cmllcyBhbHJlYWR5IHJldmVyc2VkCgoJbmV4dElEICAgICAgICB1aW50NjQgLy8gbmV2ZXIgZGVjcmVhc2VzOyBlbnRyeSBJRHMgYXJlIG5ldmVyIHJldXNlZAoJY2xvc2VkVGhyb3VnaCBpbnQ2NCAgLy8gZW50cmllcyBkYXRlZCBhdCBvciBiZWZvcmUgdGhpcyBhcmUgcmVmdXNlZAoJaGFzQ2xvc2VkICAgICBib29sICAgLy8gZGlzdGluZ3Vpc2hlcyAiY2xvc2VkIHRocm91Z2ggMCIgZnJvbSAibmV2ZXIgY2xvc2VkIgoKCXRvdGFsRGViaXRzICBpbnQ2NCAvLyBydW5uaW5nIHRvdGFsLCBtYWludGFpbmVkIGluZGVwZW5kZW50bHkgb2YgYWNjb3VudHMKCXRvdGFsQ3JlZGl0cyBpbnQ2NAp9CgovLyBOZXcgcmV0dXJucyBhbiBlbXB0eSBCb29rLgovLwovLyBtYXhBY2NvdW50cyBjYXBzIHRoZSBjaGFydCBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4QWNjb3VudHNMaW1pdF0uCi8vIG1heEVudHJpZXMgY2FwcyB0aGUgam91cm5hbCBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4RW50cmllc0xpbWl0XTsgYmVjYXVzZQovLyBlbnRyaWVzIGFyZSBuZXZlciByZW1vdmVkLCBpdCBpcyBhIGxpZmV0aW1lIGNhcCByYXRoZXIgdGhhbiBhIGNvbmN1cnJlbnQKLy8gb25lLCBhbmQgYSBCb29rIHRoYXQgcmVhY2hlcyBpdCBpcyBmaW5pc2hlZC4KZnVuYyBOZXcobWF4QWNjb3VudHMsIG1heEVudHJpZXMgaW50KSAoKkJvb2ssIGVycm9yKSB7CglpZiBtYXhBY2NvdW50cyA8IDEgfHwgbWF4QWNjb3VudHMgPiBNYXhBY2NvdW50c0xpbWl0IHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkQ29uZmlnCgl9CglpZiBtYXhFbnRyaWVzIDwgMSB8fCBtYXhFbnRyaWVzID4gTWF4RW50cmllc0xpbWl0IHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkQ29uZmlnCgl9CglyZXR1cm4gJkJvb2t7CgkJbWF4QWNjb3VudHM6IG1heEFjY291bnRzLAoJCW1heEVudHJpZXM6ICBtYXhFbnRyaWVzLAoJCWFjY291bnRzOiAgICBhdmwuTmV3VHJlZSgpLAoJCWVudHJpZXM6ICAgICBhdmwuTmV3VHJlZSgpLAoJCXJldmVyc2VkOiAgICBhdmwuTmV3VHJlZSgpLAoJCW5leHRJRDogICAgICAxLAoJfSwgbmlsCn0KCi8vIE11c3ROZXcgaXMgTmV3IGJ1dCBwYW5pY3Mgb24gZXJyb3IuCmZ1bmMgTXVzdE5ldyhtYXhBY2NvdW50cywgbWF4RW50cmllcyBpbnQpICpCb29rIHsKCWIsIGVyciA6PSBOZXcobWF4QWNjb3VudHMsIG1heEVudHJpZXMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYgp9CgovLyBNYXhBY2NvdW50cyByZXR1cm5zIHRoZSBCb29rJ3MgY2FwIG9uIGNoYXJ0IHNpemUuCmZ1bmMgKGIgKkJvb2spIE1heEFjY291bnRzKCkgaW50IHsgcmV0dXJuIGIubWF4QWNjb3VudHMgfQoKLy8gTWF4RW50cmllcyByZXR1cm5zIHRoZSBCb29rJ3MgbGlmZXRpbWUgY2FwIG9uIGVudHJpZXMuCmZ1bmMgKGIgKkJvb2spIE1heEVudHJpZXMoKSBpbnQgeyByZXR1cm4gYi5tYXhFbnRyaWVzIH0KCi8vIEFjY291bnRDb3VudCByZXR1cm5zIGhvdyBtYW55IGFjY291bnRzIGFyZSBvcGVuLgpmdW5jIChiICpCb29rKSBBY2NvdW50Q291bnQoKSBpbnQgeyByZXR1cm4gYi5hY2NvdW50cy5TaXplKCkgfQoKLy8gRW50cnlDb3VudCByZXR1cm5zIGhvdyBtYW55IGVudHJpZXMgdGhlIGpvdXJuYWwgaG9sZHMuIEl0IG5ldmVyIGRlY3JlYXNlcy4KZnVuYyAoYiAqQm9vaykgRW50cnlDb3VudCgpIGludCB7IHJldHVybiBiLmVudHJpZXMuU2l6ZSgpIH0KCi8vIE5leHRJRCByZXR1cm5zIHRoZSBpZGVudGlmaWVyIHRoZSBuZXh0IGVudHJ5IHdpbGwgdGFrZS4gSXQgb25seSBldmVyCi8vIGluY3JlYXNlcywgc28gYW4gZW50cnkgSUQgaWRlbnRpZmllcyBvbmUgZW50cnkgZm9yIHRoZSBsaWZlIG9mIHRoZSBCb29rLgpmdW5jIChiICpCb29rKSBOZXh0SUQoKSB1aW50NjQgeyByZXR1cm4gYi5uZXh0SUQgfQoKLy8gVG90YWxEZWJpdHMgcmV0dXJucyB0aGUgQm9vaydzIHJ1bm5pbmcgZGViaXQgdG90YWwgYWNyb3NzIGV2ZXJ5IGVudHJ5LgpmdW5jIChiICpCb29rKSBUb3RhbERlYml0cygpIGludDY0IHsgcmV0dXJuIGIudG90YWxEZWJpdHMgfQoKLy8gVG90YWxDcmVkaXRzIHJldHVybnMgdGhlIEJvb2sncyBydW5uaW5nIGNyZWRpdCB0b3RhbCBhY3Jvc3MgZXZlcnkgZW50cnkuCmZ1bmMgKGIgKkJvb2spIFRvdGFsQ3JlZGl0cygpIGludDY0IHsgcmV0dXJuIGIudG90YWxDcmVkaXRzIH0KCi8vIENsb3NlZFRocm91Z2ggcmV0dXJucyB0aGUgcGVyaW9kIHNlYWw6IGVudHJpZXMgZGF0ZWQgYXQgb3IgYmVmb3JlIGl0IGFyZQovLyByZWZ1c2VkLiBUaGUgc2Vjb25kIHJlc3VsdCBpcyBmYWxzZSBpZiB0aGUgQm9vayBoYXMgbmV2ZXIgYmVlbiBjbG9zZWQsIGluCi8vIHdoaWNoIGNhc2UgdGhlIGZpcnN0IGlzIG1lYW5pbmdsZXNzIOKAlCBhIEJvb2sgY2xvc2VkIHRocm91Z2ggMCBhbmQgYSBCb29rCi8vIG5ldmVyIGNsb3NlZCBkaWZmZXIsIGFuZCBjb2xsYXBzaW5nIHRoZW0gd291bGQgc2lsZW50bHkgcmVqZWN0IGVudHJpZXMKLy8gZGF0ZWQgYXQgMC4KZnVuYyAoYiAqQm9vaykgQ2xvc2VkVGhyb3VnaCgpIChpbnQ2NCwgYm9vbCkgeyByZXR1cm4gYi5jbG9zZWRUaHJvdWdoLCBiLmhhc0Nsb3NlZCB9CgovLyBPcGVuIGFkZHMgYW4gYWNjb3VudCB0byB0aGUgY2hhcnQuIENvZGVzIGFyZSB1bmlxdWUgYW5kIGltbXV0YWJsZTogdGhlcmUKLy8gaXMgbm8gUmVuYW1lIGFuZCBubyBDbG9zZSwgYmVjYXVzZSBhbiBhY2NvdW50J3MgY3VtdWxhdGl2ZSB0b3RhbHMgYXJlIHBhcnQKLy8gb2YgdGhlIGRlcml2YXRpb24gb2YgZXZlcnkgYmFsYW5jZSB0aGF0IGNpdGVzIGl0LCBhbmQgcmVtb3Zpbmcgb25lIHdvdWxkCi8vIG1ha2UgdGhlIGpvdXJuYWwgdW5yZXBsYXlhYmxlLgovLwovLyBGYWlscyB3aXRoIEVyckVtcHR5Q29kZSwgRXJyQ29kZVRvb0xvbmcsIEVyck5hbWVUb29Mb25nLCBFcnJJbnZhbGlkS2luZCwKLy8gRXJyQWNjb3VudEV4aXN0cywgb3IgRXJyQ2hhcnRGdWxsLiBPbiBlcnJvciBub3RoaW5nIGlzIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBPcGVuKGNvZGUsIG5hbWUgc3RyaW5nLCBraW5kIEtpbmQpIGVycm9yIHsKCWlmIGNvZGUgPT0gIiIgewoJCXJldHVybiBFcnJFbXB0eUNvZGUKCX0KCWlmIGxlbihjb2RlKSA+IE1heENvZGVMZW4gewoJCXJldHVybiBFcnJDb2RlVG9vTG9uZwoJfQoJaWYgbGVuKG5hbWUpID4gTWF4TmFtZUxlbiB7CgkJcmV0dXJuIEVyck5hbWVUb29Mb25nCgl9CglpZiAha2luZC5WYWxpZCgpIHsKCQlyZXR1cm4gRXJySW52YWxpZEtpbmQKCX0KCWlmIGIuYWNjb3VudHMuSGFzKGNvZGUpIHsKCQlyZXR1cm4gRXJyQWNjb3VudEV4aXN0cwoJfQoJaWYgYi5hY2NvdW50cy5TaXplKCkgPj0gYi5tYXhBY2NvdW50cyB7CgkJcmV0dXJuIEVyckNoYXJ0RnVsbAoJfQoJYi5hY2NvdW50cy5TZXQoY29kZSwgQWNjb3VudHtDb2RlOiBjb2RlLCBOYW1lOiBuYW1lLCBLaW5kOiBraW5kfSkKCXJldHVybiBuaWwKfQoKLy8gTXVzdE9wZW4gaXMgT3BlbiBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0T3Blbihjb2RlLCBuYW1lIHN0cmluZywga2luZCBLaW5kKSB7CglpZiBlcnIgOj0gYi5PcGVuKGNvZGUsIG5hbWUsIGtpbmQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIEFjY291bnQgcmV0dXJucyBhbiBhY2NvdW50IGJ5IGNvZGUuIFRoZSBzZWNvbmQgcmVzdWx0IGlzIGZhbHNlIGlmIG5vIHN1Y2gKLy8gYWNjb3VudCBpcyBvcGVuLgpmdW5jIChiICpCb29rKSBBY2NvdW50KGNvZGUgc3RyaW5nKSAoQWNjb3VudCwgYm9vbCkgeyByZXR1cm4gYi5hY2NvdW50KGNvZGUpIH0KCi8vIEJhbGFuY2UgcmV0dXJucyBhbiBhY2NvdW50J3MgYmFsYW5jZSBpbiBpdHMgbm9ybWFsIGRpcmVjdGlvbiwgYW5kIHdoZXRoZXIKLy8gdGhlIGFjY291bnQgZXhpc3RzLiBBIG1pc3NpbmcgYWNjb3VudCByZXR1cm5zICgwLCBmYWxzZSkgcmF0aGVyIHRoYW4gYQovLyB6ZXJvIGJhbGFuY2UsIGJlY2F1c2UgIm5vIHN1Y2ggYWNjb3VudCIgYW5kICJiYWxhbmNlIHplcm8iIGFyZSBkaWZmZXJlbnQKLy8gYW5zd2VycyBhbmQgYSBjb25zdW1lciBicmFuY2hpbmcgb24gdGhlIG51bWJlciBhbG9uZSB3b3VsZCBjb25mbGF0ZSB0aGVtLgpmdW5jIChiICpCb29rKSBCYWxhbmNlKGNvZGUgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCWEsIG9rIDo9IGIuYWNjb3VudChjb2RlKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBhLkJhbGFuY2UoKSwgdHJ1ZQp9CgovLyBQb3N0IGFwcGVuZHMgYSBiYWxhbmNlZCBlbnRyeSBhbmQgcmV0dXJucyBpdHMgSUQuCi8vCi8vIFRoZSBwb3N0aW5ncyBtdXN0IG51bWJlciBhdCBsZWFzdCB0d28gYW5kIGF0IG1vc3QgTWF4UG9zdGluZ3NQZXJFbnRyeSwKLy8gZWFjaCBuYW1pbmcgYW4gb3BlbiBhY2NvdW50LCBhIHZhbGlkIFNpZGUsIGFuZCBhIHBvc2l0aXZlIEFtb3VudC4gVGhlCi8vIGVudHJ5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZGViaXQgYW5kIGF0IGxlYXN0IG9uZSBjcmVkaXQsIGFuZCB0aGUgdHdvCi8vIGNvbHVtbiB0b3RhbHMgbXVzdCBiZSBlcXVhbCDigJQgYW4gaW5lcXVhbGl0eSBpcyByZXBvcnRlZCBhcyBFcnJEZWJpdFNob3J0Ci8vIG9yIEVyckNyZWRpdFNob3J0LCBuYW1pbmcgdGhlIGNvbHVtbiB0aGF0IG5lZWRzIG1vcmUuCi8vCi8vIEZhaWxzIHdpdGggRXJySW52YWxpZEF0LCBFcnJNZW1vVG9vTG9uZywgRXJyUGVyaW9kQ2xvc2VkLCBFcnJCb29rRnVsbCwKLy8gRXJySURFeGhhdXN0ZWQsIEVyclRvb0Zld1Bvc3RpbmdzLCBFcnJUb29NYW55UG9zdGluZ3MsIEVyckludmFsaWRTaWRlLAovLyBFcnJJbnZhbGlkQW1vdW50LCBFcnJVbmtub3duQWNjb3VudCwgRXJyTm9EZWJpdCwgRXJyTm9DcmVkaXQsCi8vIEVyckRlYml0U2hvcnQsIEVyckNyZWRpdFNob3J0LCBvciBFcnJPdmVyZmxvdy4gT24gZXJyb3Igbm90aGluZyBpcwovLyBtb2RpZmllZCDigJQgZXZlcnkgcG9zdGluZyBpcyB2YWxpZGF0ZWQgYW5kIGV2ZXJ5IHRvdGFsIGNvbXB1dGVkIGJlZm9yZSB0aGUKLy8gZmlyc3Qgd3JpdGUuCmZ1bmMgKGIgKkJvb2spIFBvc3QoYXQgaW50NjQsIG1lbW8gc3RyaW5nLCBwb3N0aW5ncyBbXVBvc3RpbmcpICh1aW50NjQsIGVycm9yKSB7CglpZiBhdCA8IDAgewoJCXJldHVybiAwLCBFcnJJbnZhbGlkQXQKCX0KCWlmIGxlbihtZW1vKSA+IE1heE1lbW9MZW4gewoJCXJldHVybiAwLCBFcnJNZW1vVG9vTG9uZwoJfQoJaWYgYi5oYXNDbG9zZWQgJiYgYXQgPD0gYi5jbG9zZWRUaHJvdWdoIHsKCQlyZXR1cm4gMCwgRXJyUGVyaW9kQ2xvc2VkCgl9CglyZXR1cm4gYi5wb3N0KGF0LCBtZW1vLCAwLCBwb3N0aW5ncykKfQoKLy8gTXVzdFBvc3QgaXMgUG9zdCBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0UG9zdChhdCBpbnQ2NCwgbWVtbyBzdHJpbmcsIHBvc3RpbmdzIFtdUG9zdGluZykgdWludDY0IHsKCWlkLCBlcnIgOj0gYi5Qb3N0KGF0LCBtZW1vLCBwb3N0aW5ncykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBpZAp9CgovLyBSZXZlcnNlIGFwcGVuZHMgdGhlIG1pcnJvciBvZiBhbiBleGlzdGluZyBlbnRyeSDigJQgZXZlcnkgcG9zdGluZyByZXBlYXRlZAovLyBvbiB0aGUgb3Bwb3NpdGUgc2lkZSwgZm9yIHRoZSBzYW1lIGFtb3VudCDigJQgYW5kIHJldHVybnMgdGhlIG5ldyBlbnRyeSdzCi8vIElELiBUaGUgb3JpZ2luYWwgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhcy4KLy8KLy8gQW4gZW50cnkgbWF5IGJlIHJldmVyc2VkIGF0IG1vc3Qgb25jZS4gUmV2ZXJzaW5nIGEgcmV2ZXJzYWwgSVMgcGVybWl0dGVkCi8vIChpdCByZS1hcHBsaWVzIHRoZSBvcmlnaW5hbCdzIGVmZmVjdCkgYW5kIGlzIGl0c2VsZiBzdWJqZWN0IHRvIHRoZSBzYW1lCi8vIG9uY2Utb25seSBydWxlLCBzbyBhIGNvcnJlY3Rpb24gY2Fubm90IGJlIGxvb3BlZC4KLy8KLy8gYGF0YCBkYXRlcyB0aGUgY29ycmVjdGlvbiBhbmQgbXVzdCBiZSBpbiB0aGUgb3BlbiBwZXJpb2Q6IGEgc2VhbGVkIHBlcmlvZAovLyBjYW5ub3QgYmUgY29ycmVjdGVkIGluIHBsYWNlLCBieSBjb25zdHJ1Y3Rpb24uIENvcnJlY3Rpbmcgb25lIG1lYW5zCi8vIHBvc3RpbmcgaW50byB0aGUgY3VycmVudCBwZXJpb2QsIHdoaWNoIGlzIHRoZSBjb25zdW1lcidzIGRlY2lzaW9uIHRvIG1ha2UKLy8gZXhwbGljaXRseSByYXRoZXIgdGhhbiB0aGlzIHBhY2thZ2UncyB0byBtYWtlIHNpbGVudGx5LgovLwovLyBGYWlscyB3aXRoIEVyckludmFsaWRBdCwgRXJyTWVtb1Rvb0xvbmcsIEVyclBlcmlvZENsb3NlZCwKLy8gRXJyRW50cnlOb3RGb3VuZCwgRXJyQWxyZWFkeVJldmVyc2VkLCBFcnJCb29rRnVsbCwgRXJySURFeGhhdXN0ZWQsIG9yCi8vIEVyck92ZXJmbG93LiBPbiBlcnJvciBub3RoaW5nIGlzIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBSZXZlcnNlKGlkIHVpbnQ2NCwgYXQgaW50NjQsIG1lbW8gc3RyaW5nKSAodWludDY0LCBlcnJvcikgewoJaWYgYXQgPCAwIHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZEF0Cgl9CglpZiBsZW4obWVtbykgPiBNYXhNZW1vTGVuIHsKCQlyZXR1cm4gMCwgRXJyTWVtb1Rvb0xvbmcKCX0KCWlmIGIuaGFzQ2xvc2VkICYmIGF0IDw9IGIuY2xvc2VkVGhyb3VnaCB7CgkJcmV0dXJuIDAsIEVyclBlcmlvZENsb3NlZAoJfQoJb3JpZywgb2sgOj0gYi5lbnRyeShpZCkKCWlmICFvayB7CgkJcmV0dXJuIDAsIEVyckVudHJ5Tm90Rm91bmQKCX0KCWlmIGIucmV2ZXJzZWQuSGFzKGlkS2V5KGlkKSkgewoJCXJldHVybiAwLCBFcnJBbHJlYWR5UmV2ZXJzZWQKCX0KCgltaXJyb3IgOj0gbWFrZShbXVBvc3RpbmcsIGxlbihvcmlnLlBvc3RpbmdzKSkKCWZvciBpLCBwIDo9IHJhbmdlIG9yaWcuUG9zdGluZ3MgewoJCW1pcnJvcltpXSA9IFBvc3Rpbmd7QWNjb3VudDogcC5BY2NvdW50LCBTaWRlOiBwLlNpZGUuT3Bwb3NpdGUoKSwgQW1vdW50OiBwLkFtb3VudH0KCX0KCgluZXdJRCwgZXJyIDo9IGIucG9zdChhdCwgbWVtbywgaWQsIG1pcnJvcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCS8vIE1hcmtlZCBvbmx5IGFmdGVyIHBvc3Qgc3VjY2VlZGVkLCBzbyBhIHJlZnVzZWQgcmV2ZXJzYWwgZG9lcyBub3QKCS8vIGNvbnN1bWUgdGhlIG9yaWdpbmFsJ3Mgc2luZ2xlIHJldmVyc2FsLgoJYi5yZXZlcnNlZC5TZXQoaWRLZXkoaWQpLCB0cnVlKQoJcmV0dXJuIG5ld0lELCBuaWwKfQoKLy8gTXVzdFJldmVyc2UgaXMgUmV2ZXJzZSBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0UmV2ZXJzZShpZCB1aW50NjQsIGF0IGludDY0LCBtZW1vIHN0cmluZykgdWludDY0IHsKCW5ld0lELCBlcnIgOj0gYi5SZXZlcnNlKGlkLCBhdCwgbWVtbykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBuZXdJRAp9CgovLyBJc1JldmVyc2VkIHJlcG9ydHMgd2hldGhlciBhbiBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2VkLiBJdCByZXR1cm5zCi8vIGZhbHNlIGZvciBhbiBlbnRyeSB0aGF0IGRvZXMgbm90IGV4aXN0LCBzbyBwYWlyIGl0IHdpdGggRW50cnkgd2hlbiB0aGUKLy8gZGlzdGluY3Rpb24gbWF0dGVycy4KZnVuYyAoYiAqQm9vaykgSXNSZXZlcnNlZChpZCB1aW50NjQpIGJvb2wgeyByZXR1cm4gYi5yZXZlcnNlZC5IYXMoaWRLZXkoaWQpKSB9CgovLyBDbG9zZSBzZWFscyB0aGUgcGVyaW9kIGVuZGluZyBhdCBgdGhyb3VnaGAsIGFmdGVyIHdoaWNoIFBvc3QgYW5kIFJldmVyc2UKLy8gcmVmdXNlIGFueSBlbnRyeSBkYXRlZCBhdCBvciBiZWZvcmUgaXQuCi8vCi8vIEl0IG9ubHkgbW92ZXMgZm9yd2FyZC4gQSBmaXJzdCBjbG9zZSBtYXkgbmFtZSBhbnkgbm9uLW5lZ2F0aXZlIGluc3RhbnQ7IGEKLy8gbGF0ZXIgb25lIG11c3QgbmFtZSBhIHN0cmljdGx5IGdyZWF0ZXIgaW5zdGFudCwgc28gYSBzZWFsIGNhbiBuZXZlciBiZQovLyBsb29zZW5lZCBhbmQgYmFja2RhdGluZyBjYW4gbmV2ZXIgYmUgcmUtZW5hYmxlZC4KLy8KLy8gRmFpbHMgd2l0aCBFcnJJbnZhbGlkQXQgKHRocm91Z2ggPCAwKSBvciBFcnJDbG9zZU5vdEZvcndhcmQuIE9uIGVycm9yCi8vIG5vdGhpbmcgaXMgbW9kaWZpZWQuCmZ1bmMgKGIgKkJvb2spIENsb3NlKHRocm91Z2ggaW50NjQpIGVycm9yIHsKCWlmIHRocm91Z2ggPCAwIHsKCQlyZXR1cm4gRXJySW52YWxpZEF0Cgl9CglpZiBiLmhhc0Nsb3NlZCAmJiB0aHJvdWdoIDw9IGIuY2xvc2VkVGhyb3VnaCB7CgkJcmV0dXJuIEVyckNsb3NlTm90Rm9yd2FyZAoJfQoJYi5jbG9zZWRUaHJvdWdoID0gdGhyb3VnaAoJYi5oYXNDbG9zZWQgPSB0cnVlCglyZXR1cm4gbmlsCn0KCi8vIE11c3RDbG9zZSBpcyBDbG9zZSBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0Q2xvc2UodGhyb3VnaCBpbnQ2NCkgewoJaWYgZXJyIDo9IGIuQ2xvc2UodGhyb3VnaCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gRW50cnkgcmV0dXJucyBhbiBlbnRyeSBieSBJRCwgd2l0aCBhIGRlZmVuc2l2ZSBjb3B5IG9mIGl0cyBwb3N0aW5ncy4gVGhlCi8vIHNlY29uZCByZXN1bHQgaXMgZmFsc2UgaWYgbm8gc3VjaCBlbnRyeSBleGlzdHMg4oCUIHdoaWNoLCBiZWNhdXNlIGVudHJpZXMKLy8gYXJlIG5ldmVyIHJlbW92ZWQsIG1lYW5zIGl0IHdhcyBuZXZlciBjcmVhdGVkLgpmdW5jIChiICpCb29rKSBFbnRyeShpZCB1aW50NjQpIChFbnRyeSwgYm9vbCkgewoJZSwgb2sgOj0gYi5lbnRyeShpZCkKCWlmICFvayB7CgkJcmV0dXJuIEVudHJ5e30sIGZhbHNlCgl9CglyZXR1cm4gZS53aXRoQ29waWVkUG9zdGluZ3MoKSwgdHJ1ZQp9CgovLyBJc0JhbGFuY2VkIHJlcG9ydHMgd2hldGhlciB0aGUgQm9vaydzIHR3byBpbmRlcGVuZGVudGx5LW1haW50YWluZWQKLy8gYWNjdW11bGF0b3JzIGFncmVlIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCB0aGVtc2VsdmVzLgovLwovLyBJdCBzY2FucyB0aGUgY2hhcnQsIHN1bXMgZXZlcnkgYWNjb3VudCdzIGRlYml0IGFuZCBjcmVkaXQgdG90YWxzLCBhbmQKLy8gcmVxdWlyZXMgdGhhdCB0aGUgdHdvIHN1bXMgYXJlIGVxdWFsIEFORCB0aGF0IGVhY2ggbWF0Y2hlcyB0aGUgQm9vaydzIG93bgovLyBydW5uaW5nIHRvdGFsLiBUaG9zZSB0b3RhbHMgYXJlIHdyaXR0ZW4gYnkgZGlmZmVyZW50IGNvZGUgaW4gUG9zdCwgc28gYQovLyBkaXNhZ3JlZW1lbnQgaXMgYSBkZWZlY3QgaW4gdGhpcyBwYWNrYWdlIGFuZCBJc0JhbGFuY2VkIGlzIGhvdyBhIGNvbnN1bWVyCi8vIGRldGVjdHMgb25lLgovLwovLyBXaGF0IGl0IGRvZXMgbm90IGRvIGlzIHJlLXJlYWQgdGhlIGpvdXJuYWwuIFJlYWQgdGhlIHBhY2thZ2UgZG9jJ3MKLy8gIldoYXQgYmFsYW5jZWQgaXMgYWN0dWFsbHkgd29ydGgiIGJlZm9yZSBxdW90aW5nIGl0LCBhbmQgdXNlCi8vIFJlZGVyaXZlRnJvbUpvdXJuYWwgZm9yIHRoZSBzdHJvbmcgY2xhaW0uCi8vCi8vIEFuIGVtcHR5IEJvb2sgaXMgYmFsYW5jZWQuCmZ1bmMgKGIgKkJvb2spIElzQmFsYW5jZWQoKSBib29sIHsKCWQsIGMsIG9rIDo9IGIuc3VtQWNjb3VudHMoKQoJaWYgIW9rIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiBkID09IGMgJiYgZCA9PSBiLnRvdGFsRGViaXRzICYmIGMgPT0gYi50b3RhbENyZWRpdHMKfQoKLy8gUmVkZXJpdmVGcm9tSm91cm5hbCByZXBsYXlzIGV2ZXJ5IHBvc3Rpbmcgb2YgZXZlcnkgZW50cnkgYW5kIHJlcG9ydHMgdGhlCi8vIGRlYml0IGFuZCBjcmVkaXQgdG90YWxzIGl0IGZpbmRzLCB0b2dldGhlciB3aXRoIHdoZXRoZXIgdGhleSBhZ3JlZSB3aXRoCi8vIGJvdGggdGhlIHBlci1hY2NvdW50IGFjY3VtdWxhdG9ycyBhbmQgdGhlIEJvb2sncyBydW5uaW5nIHRvdGFscy4KLy8KLy8gVGhpcyBpcyB0aGUgc3Ryb25nIGNoZWNrIGFuZCB0aGUgZXhwZW5zaXZlIG9uZTogaXRzIGNvc3QgaXMgcHJvcG9ydGlvbmFsCi8vIHRvIGV2ZXJ5IHBvc3RpbmcgZXZlciBtYWRlLCBzbyBpdCBpcyBtZWFudCB0byBiZSBjYWxsZWQgZGVsaWJlcmF0ZWx5IOKAlCBieQovLyBhbiBhdWRpdG9yLCBvciBieSBhIGNvbnN1bWVyJ3Mgb3duIGludmFyaWFudCB2aWV3IOKAlCBhbmQgbm90IGZyb20gYSBob3QKLy8gcGF0aC4gYGFncmVlc2AgZmFsc2Ugb24gYSBCb29rIHRoaXMgcGFja2FnZSBidWlsdCBpcyBhIGRlZmVjdCBpbiB0aGlzCi8vIHBhY2thZ2UuCmZ1bmMgKGIgKkJvb2spIFJlZGVyaXZlRnJvbUpvdXJuYWwoKSAoZGViaXRzLCBjcmVkaXRzIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJdmFyIGQsIGMgaW50NjQKCW9rTWF0aCA6PSB0cnVlCgliLmVudHJpZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJZSA6PSB2YWx1ZS4oRW50cnkpCgkJZm9yIF8sIHAgOj0gcmFuZ2UgZS5Qb3N0aW5ncyB7CgkJCXZhciBvayBib29sCgkJCWlmIHAuU2lkZSA9PSBEZWJpdCB7CgkJCQlkLCBvayA9IGNoZWNrZWRBZGQoZCwgcC5BbW91bnQpCgkJCX0gZWxzZSB7CgkJCQljLCBvayA9IGNoZWNrZWRBZGQoYywgcC5BbW91bnQpCgkJCX0KCQkJaWYgIW9rIHsKCQkJCW9rTWF0aCA9IGZhbHNlCgkJCQlyZXR1cm4gdHJ1ZQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCWlmICFva01hdGggewoJCXJldHVybiAwLCAwLCBmYWxzZQoJfQoJc2QsIHNjLCBva1N1bSA6PSBiLnN1bUFjY291bnRzKCkKCWFncmVlcyA9IG9rU3VtICYmCgkJZCA9PSBjICYmCgkJZCA9PSBiLnRvdGFsRGViaXRzICYmIGMgPT0gYi50b3RhbENyZWRpdHMgJiYKCQlkID09IHNkICYmIGMgPT0gc2MKCXJldHVybiBkLCBjLCBhZ3JlZXMKfQoKLy8gQWNjb3VudGluZ0VxdWF0aW9uIHJldHVybnMgdGhlIHR3byBoYWx2ZXMgb2YgYXNzZXRzK2V4cGVuc2VzIHZlcnN1cwovLyBsaWFiaWxpdGllcytlcXVpdHkrcmV2ZW51ZSwgaW4gUkFXIGRlYml0LW1pbnVzLWNyZWRpdCB0ZXJtcywgYW5kIHdoZXRoZXIKLy8gdGhleSBvZmZzZXQuCi8vCi8vIElUIElTIFdFQUtFUiBUSEFOIElUIExPT0tTLCBhbmQgd2Vha2VyIHRoYW4gdGhpcyBkb2MgdXNlZCB0byBjbGFpbS4KLy8KLy8gV2hhdCBvZmZzZXRzIEFDVFVBTExZIHByb3Zlczogc3VtKFJhd0RlbHRhKSA9PSAwIG92ZXIgdGhlIHdob2xlIGNoYXJ0LAovLyB3aGljaCBpcyB0aGUgc2FtZSBmYWN0IGFzIElzQmFsYW5jZWQncyBmaXJzdCBjb25qdW5jdCAoZCA9PSBjKSBhbmQKLy8gbm90aGluZyBtb3JlLiBJc0JhbGFuY2VkIHJlcXVpcmVzIHRocmVlLiBTbyB0aGlzIGlzIGltcGxpZWQgYnkKLy8gSXNCYWxhbmNlZCwgaXMgTk9UIGFuIGluZGVwZW5kZW50IGFjY291bnRpbmcgZmFjdCwgYW5kIGNpdGluZyBpdCBhcyBhCi8vIHNlY29uZCBndWFyYW50ZWUgYWxvbmdzaWRlIElzQmFsYW5jZWQgaXMgY291bnRpbmcgb25lIGNoZWNrIHR3aWNlLgovLwovLyBXaGF0IG9mZnNldHMgRE9FUyBOT1QgcHJvdmUsIGRlc3BpdGUgdGhlIEtpbmQgcGFydGl0aW9uIHNpdHRpbmcgcmlnaHQKLy8gdGhlcmUgaW4gdGhlIGNvZGU6IGFueXRoaW5nIHdoYXRzb2V2ZXIgYWJvdXQgbm9ybWFsLWJhbGFuY2UgaGFuZGxpbmcuCi8vIGRuIGFuZCBjbiBhcmUgYSBwYXJ0aXRpb24gb2YgdGhlIHNhbWUgYWRkZW5kcywgc28gZG4rY24gaXMgdGhlIHRvdGFsCi8vIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYnVja2V0IGVhY2ggYWNjb3VudCBsYW5kZWQgaW4uIFJlY2xhc3NpZnkgZXZlcnkKLy8gYWNjb3VudCBpbiB0aGUgY2hhcnQgYW5kIEJPVEggc3VidG90YWxzIGNoYW5nZSB3aGlsZSBvZmZzZXRzIHN0YXlzCi8vIHRydWUuIEEgS2luZCBzZXQgd3JvbmdseSBhdCBPcGVuIHRpbWUgaXMgdW5kZXRlY3RhYmxlIGhlcmUgYW5kCi8vIHVuZGV0ZWN0YWJsZSBhbnl3aGVyZSBlbHNlIGluIHRoaXMgcGFja2FnZSDigJQgb2JsaWdhdGlvbiA3LgovLwovLyBJdCBpcyBleHBvcnRlZCBiZWNhdXNlIHRoZSB0d28gU1VCVE9UQUxTIGFyZSBjb3JyZWN0IGFuZCBhIGNvbnN1bWVyCi8vIHByZXNlbnRpbmcgYSBiYWxhbmNlIHNoZWV0IHdhbnRzIHRoZW0gYW55d2F5LiBUaGV5IGFyZSB0aGUgcHJvZHVjdDsKLy8gb2Zmc2V0cyBpcyBhIGR1cGxpY2F0ZSBvZiBhIGNoZWNrIHlvdSBhbHJlYWR5IGhhdmUuCmZ1bmMgKGIgKkJvb2spIEFjY291bnRpbmdFcXVhdGlvbigpIChkZWJpdE5vcm1hbCwgY3JlZGl0Tm9ybWFsIGludDY0LCBvZmZzZXRzIGJvb2wpIHsKCXZhciBkbiwgY24gaW50NjQKCW9rTWF0aCA6PSB0cnVlCgliLmFjY291bnRzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWEgOj0gdmFsdWUuKEFjY291bnQpCgkJdmFyIG9rIGJvb2wKCQlpZiBhLktpbmQuSXNEZWJpdE5vcm1hbCgpIHsKCQkJZG4sIG9rID0gY2hlY2tlZEFkZChkbiwgYS5SYXdEZWx0YSgpKQoJCX0gZWxzZSB7CgkJCWNuLCBvayA9IGNoZWNrZWRBZGQoY24sIGEuUmF3RGVsdGEoKSkKCQl9CgkJaWYgIW9rIHsKCQkJb2tNYXRoID0gZmFsc2UKCQkJcmV0dXJuIHRydWUKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgIW9rTWF0aCB7CgkJcmV0dXJuIDAsIDAsIGZhbHNlCgl9CglzdW0sIG9rIDo9IGNoZWNrZWRBZGQoZG4sIGNuKQoJcmV0dXJuIGRuLCBjbiwgb2sgJiYgc3VtID09IDAKfQoKLy8gSXRlcmF0ZUFjY291bnRzIGNhbGxzIGZuIGZvciBldmVyeSBhY2NvdW50IGluIGFzY2VuZGluZyBjb2RlIG9yZGVyLgovLyBJdGVyYXRpb24gc3RvcHMgZWFybHkgd2hlbiBmbiByZXR1cm5zIHRydWUuCi8vCi8vIGZuIHJlY2VpdmVzIGEgQ09QWTogQWNjb3VudCBpcyBwYXNzZWQgYnkgdmFsdWUgYW5kIGhvbGRzIG9ubHkgc2NhbGFycyBhbmQKLy8gc3RyaW5ncywgc28gZm4gZ2V0cyBubyBwb2ludGVyIGludG8gdGhlIEJvb2suCi8vCi8vIFR3byBydWxlcyBmb3IgZm4sIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3MuCi8vCi8vICAgLSBEbyBub3QgT3BlbiwgUG9zdCwgUmV2ZXJzZSBvciBDbG9zZSBmcm9tIGluc2lkZSBmbjogbXV0YXRpbmcgYSB0cmVlCi8vICAgICB3aGlsZSBpdGVyYXRpbmcgaXQgaXMgdW5kZWZpbmVkLiBDb2xsZWN0IHdoYXQgeW91IG5lZWQgZmlyc3QsIHRoZW4gYWN0Ci8vICAgICBhZnRlciBJdGVyYXRlQWNjb3VudHMgcmV0dXJucy4KLy8KLy8gICAtIGZuIHJ1bnMgdW5kZXIgdGhlIENBTExJTkcgUkVBTE0nUyBTVE9SQUdFIEFVVEhPUklUWS4gVGhpcyBtZXRob2QncwovLyAgICAgcmVjZWl2ZXIgaXMgc3RhbXBlZCB3aXRoIHRoZSBpbXBvcnRpbmcgcmVhbG0ncyBQa2dJRCwgc28gdGhlIGJvcnJvdwovLyAgICAgcnVsZXMgbGVhdmUgdGhlIHJlYWxtIGNvbnRleHQgc2V0IHRvIHRoYXQgcmVhbG0gZm9yIHRoZSB3aG9sZQovLyAgICAgY2FsbGJhY2ssIGFuZCBhIHRvcC1sZXZlbCBmbiBoYXMgbm8gcmVjZWl2ZXIgYW5kIG5vIGRlY2xhcmluZyByZWFsbSB0bwovLyAgICAgYW5jaG9yIGl0IGVsc2V3aGVyZS4gQSBjYWxsYmFjayB0aGF0IHJlLWVudGVycyB0aGUgY2FsbGluZyByZWFsbSdzIG93bgovLyAgICAgbXV0YXRvcnMgdGhlcmVmb3JlIGRvZXMgc28gd2l0aCB0aGF0IHJlYWxtJ3MgYXV0aG9yaXR5LiBOZXZlciBwYXNzIGEKLy8gICAgIGNhbGxlci1zdXBwbGllZCBmdW5jdGlvbiBoZXJlIGZyb20gaW5zaWRlIGEgcGVybWlzc2lvbi1nYXRlZCBwYXRoOwovLyAgICAgcGFzcyBvbmx5IGEgY2xvc3VyZSB0aGlzIHBhY2thZ2UncyBjb25zdW1lciB3cm90ZSBpdHNlbGYuCmZ1bmMgKGIgKkJvb2spIEl0ZXJhdGVBY2NvdW50cyhmbiBmdW5jKEFjY291bnQpIGJvb2wpIHsKCWIuYWNjb3VudHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGZuKHZhbHVlLihBY2NvdW50KSkKCX0pCn0KCi8vIEl0ZXJhdGVFbnRyaWVzIGNhbGxzIGZuIGZvciBldmVyeSBlbnRyeSBpbiBhc2NlbmRpbmcgSUQgb3JkZXIsIHdoaWNoIGZvcgovLyBhbiBhcHBlbmQtb25seSBqb3VybmFsIGlzIGFsc28gY2hyb25vbG9naWNhbCBieSBpbnNlcnRpb24uIEl0ZXJhdGlvbiBzdG9wcwovLyBlYXJseSB3aGVuIGZuIHJldHVybnMgdHJ1ZS4KLy8KLy8gZm4gcmVjZWl2ZXMgYW4gRW50cnkgd2hvc2UgUG9zdGluZ3Mgc2xpY2UgaXMgYSBERUZFTlNJVkUgQ09QWSwgc28gYQovLyBjYWxsYmFjayBjYW5ub3Qgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIEJvb2sgc3RhdGUuIFRoZSB0d28gcnVsZXMgb24KLy8gSXRlcmF0ZUFjY291bnRzJ3MgZm4gYXBwbHkgaGVyZSB1bmNoYW5nZWQsIGluY2x1ZGluZyB0aGUgc3RvcmFnZS1hdXRob3JpdHkKLy8gb25lLgpmdW5jIChiICpCb29rKSBJdGVyYXRlRW50cmllcyhmbiBmdW5jKEVudHJ5KSBib29sKSB7CgliLmVudHJpZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGZuKHZhbHVlLihFbnRyeSkud2l0aENvcGllZFBvc3RpbmdzKCkpCgl9KQp9CgovLyBFbnRyaWVzIHJldHVybnMgdXAgdG8gbGltaXQgZW50cmllcyB3aXRoIElEID49IGZyb20sIGluIGFzY2VuZGluZyBJRAovLyBvcmRlciwgZWFjaCB3aXRoIGEgZGVmZW5zaXZlIGNvcHkgb2YgaXRzIHBvc3RpbmdzLiBBIGxpbWl0IDw9IDAgcmV0dXJucwovLyBub3RoaW5nLiBJdCBpcyB0aGUgcGFnaW5nIHJlYWQgZm9yIGEgY29uc3VtZXIgdGhhdCBjYW5ub3QgaG9sZCB0aGUgd2hvbGUKLy8gam91cm5hbCBpbiBvbmUgY2FsbC4KZnVuYyAoYiAqQm9vaykgRW50cmllcyhmcm9tIHVpbnQ2NCwgbGltaXQgaW50KSBbXUVudHJ5IHsKCW91dCA6PSBbXUVudHJ5e30KCWlmIGxpbWl0IDw9IDAgewoJCXJldHVybiBvdXQKCX0KCWIuZW50cmllcy5JdGVyYXRlKGlkS2V5KGZyb20pLCAiIiwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlvdXQgPSBhcHBlbmQob3V0LCB2YWx1ZS4oRW50cnkpLndpdGhDb3BpZWRQb3N0aW5ncygpKQoJCXJldHVybiBsZW4ob3V0KSA+PSBsaW1pdAoJfSkKCXJldHVybiBvdXQKfQoKLy8gcG9zdCBpcyB0aGUgc2hhcmVkIGJvZHkgb2YgUG9zdCBhbmQgUmV2ZXJzZS4gQ2FsbGVycyBoYXZlIGFscmVhZHkKLy8gdmFsaWRhdGVkIGBhdGAsIHRoZSBtZW1vLCBhbmQgdGhlIHBlcmlvZCBzZWFsOyByZXZlcnNhbE9mIGlzIDAgZm9yIGFuCi8vIG9yaWdpbmFsIGVudHJ5LiBJdCB2YWxpZGF0ZXMgZXZlcnkgcG9zdGluZyBhbmQgY29tcHV0ZXMgYm90aCB0b3RhbHMgYmVmb3JlCi8vIHdyaXRpbmcgYW55dGhpbmcuCmZ1bmMgKGIgKkJvb2spIHBvc3QoYXQgaW50NjQsIG1lbW8gc3RyaW5nLCByZXZlcnNhbE9mIHVpbnQ2NCwgcG9zdGluZ3MgW11Qb3N0aW5nKSAodWludDY0LCBlcnJvcikgewoJaWYgbGVuKHBvc3RpbmdzKSA8IDIgewoJCXJldHVybiAwLCBFcnJUb29GZXdQb3N0aW5ncwoJfQoJaWYgbGVuKHBvc3RpbmdzKSA+IE1heFBvc3RpbmdzUGVyRW50cnkgewoJCXJldHVybiAwLCBFcnJUb29NYW55UG9zdGluZ3MKCX0KCWlmIGIuZW50cmllcy5TaXplKCkgPj0gYi5tYXhFbnRyaWVzIHsKCQlyZXR1cm4gMCwgRXJyQm9va0Z1bGwKCX0KCWlmIGIubmV4dElEID09IDAgewoJCXJldHVybiAwLCBFcnJJREV4aGF1c3RlZAoJfQoKCXZhciBkZWJpdHMsIGNyZWRpdHMgaW50NjQKCXNhd0RlYml0LCBzYXdDcmVkaXQgOj0gZmFsc2UsIGZhbHNlCglmb3IgXywgcCA6PSByYW5nZSBwb3N0aW5ncyB7CgkJaWYgIXAuU2lkZS5WYWxpZCgpIHsKCQkJcmV0dXJuIDAsIEVyckludmFsaWRTaWRlCgkJfQoJCWlmIHAuQW1vdW50IDw9IDAgewoJCQlyZXR1cm4gMCwgRXJySW52YWxpZEFtb3VudAoJCX0KCQlpZiAhYi5hY2NvdW50cy5IYXMocC5BY2NvdW50KSB7CgkJCXJldHVybiAwLCBFcnJVbmtub3duQWNjb3VudAoJCX0KCQl2YXIgb2sgYm9vbAoJCWlmIHAuU2lkZSA9PSBEZWJpdCB7CgkJCXNhd0RlYml0ID0gdHJ1ZQoJCQlkZWJpdHMsIG9rID0gY2hlY2tlZEFkZChkZWJpdHMsIHAuQW1vdW50KQoJCX0gZWxzZSB7CgkJCXNhd0NyZWRpdCA9IHRydWUKCQkJY3JlZGl0cywgb2sgPSBjaGVja2VkQWRkKGNyZWRpdHMsIHAuQW1vdW50KQoJCX0KCQlpZiAhb2sgewoJCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCQl9Cgl9CglpZiAhc2F3RGViaXQgewoJCXJldHVybiAwLCBFcnJOb0RlYml0Cgl9CglpZiAhc2F3Q3JlZGl0IHsKCQlyZXR1cm4gMCwgRXJyTm9DcmVkaXQKCX0KCWlmIGRlYml0cyA8IGNyZWRpdHMgewoJCXJldHVybiAwLCBFcnJEZWJpdFNob3J0Cgl9CglpZiBjcmVkaXRzIDwgZGViaXRzIHsKCQlyZXR1cm4gMCwgRXJyQ3JlZGl0U2hvcnQKCX0KCgkvLyBCb29rLWxldmVsIHJ1bm5pbmcgdG90YWxzLCBjaGVja2VkIGJlZm9yZSBhbnkgYWNjb3VudCBpcyB0b3VjaGVkLgoJbmV3VG90YWxEZWJpdHMsIG9rIDo9IGNoZWNrZWRBZGQoYi50b3RhbERlYml0cywgZGViaXRzKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCX0KCW5ld1RvdGFsQ3JlZGl0cywgb2sgOj0gY2hlY2tlZEFkZChiLnRvdGFsQ3JlZGl0cywgY3JlZGl0cykKCWlmICFvayB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CgoJLy8gUGVyLWFjY291bnQgYWNjdW11bGF0b3JzLCBhbGwgY29tcHV0ZWQgaW50byBhIHN0YWdpbmcgbGlzdCBiZWZvcmUgdGhlCgkvLyBmaXJzdCBTZXQsIHNvIGFuIG92ZXJmbG93IG9uIHRoZSBsYXN0IHBvc3RpbmcgbGVhdmVzIG5vdGhpbmcgd3JpdHRlbi4KCXN0YWdlZCA6PSBtYWtlKFtdQWNjb3VudCwgbGVuKHBvc3RpbmdzKSkKCWZvciBpLCBwIDo9IHJhbmdlIHBvc3RpbmdzIHsKCQlhLCBmb3VuZCA6PSBiLmFjY291bnQocC5BY2NvdW50KQoJCWlmICFmb3VuZCB7CgkJCS8vIFVucmVhY2hhYmxlOiBIYXMoKSBzdWNjZWVkZWQgYWJvdmUgYW5kIG5vdGhpbmcgaGFzIGJlZW4KCQkJLy8gd3JpdHRlbiBzaW5jZS4gUmVmdXNlZCByYXRoZXIgdGhhbiBpZ25vcmVkLCBiZWNhdXNlIGEgc2lsZW50CgkJCS8vIHplcm8gQWNjb3VudCBoZXJlIHdvdWxkIGNvcnJ1cHQgdGhlIGNoYXJ0LgoJCQlyZXR1cm4gMCwgRXJyVW5rbm93bkFjY291bnQKCQl9CgkJLy8gRm9sZCBlYXJsaWVyIHN0YWdpbmdzIG9mIHRoZSBzYW1lIGFjY291bnQsIHNvIGFuIGVudHJ5IHRoYXQgcG9zdHMKCQkvLyB0byBvbmUgYWNjb3VudCB0d2ljZSBhY2N1bXVsYXRlcyBib3RoIGxlZ3MgaW5zdGVhZCBvZiB0aGUgc2Vjb25kCgkJLy8gc3RhZ2luZyBvdmVyd3JpdGluZyB0aGUgZmlyc3QuCgkJZm9yIGogOj0gMDsgaiA8IGk7IGorKyB7CgkJCWlmIHN0YWdlZFtqXS5Db2RlID09IHAuQWNjb3VudCB7CgkJCQlhID0gc3RhZ2VkW2pdCgkJCX0KCQl9CgkJdmFyIG9rQWNjIGJvb2wKCQlpZiBwLlNpZGUgPT0gRGViaXQgewoJCQlhLkRlYml0cywgb2tBY2MgPSBjaGVja2VkQWRkKGEuRGViaXRzLCBwLkFtb3VudCkKCQl9IGVsc2UgewoJCQlhLkNyZWRpdHMsIG9rQWNjID0gY2hlY2tlZEFkZChhLkNyZWRpdHMsIHAuQW1vdW50KQoJCX0KCQlpZiAhb2tBY2MgewoJCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCQl9CgkJc3RhZ2VkW2ldID0gYQoJfQoKCS8vIFBhc3QgaGVyZSBub3RoaW5nIGNhbiBmYWlsLgoJaWQgOj0gYi5uZXh0SUQKCWIubmV4dElEKysKCXN0b3JlZCA6PSBtYWtlKFtdUG9zdGluZywgbGVuKHBvc3RpbmdzKSkKCWNvcHkoc3RvcmVkLCBwb3N0aW5ncykKCWIuZW50cmllcy5TZXQoaWRLZXkoaWQpLCBFbnRyeXsKCQlJRDogICAgICAgICBpZCwKCQlBdDogICAgICAgICBhdCwKCQlNZW1vOiAgICAgICBtZW1vLAoJCVBvc3RpbmdzOiAgIHN0b3JlZCwKCQlSZXZlcnNhbE9mOiByZXZlcnNhbE9mLAoJfSkKCWZvciBfLCBhIDo9IHJhbmdlIHN0YWdlZCB7CgkJYi5hY2NvdW50cy5TZXQoYS5Db2RlLCBhKQoJfQoJYi50b3RhbERlYml0cyA9IG5ld1RvdGFsRGViaXRzCgliLnRvdGFsQ3JlZGl0cyA9IG5ld1RvdGFsQ3JlZGl0cwoJcmV0dXJuIGlkLCBuaWwKfQoKLy8gc3VtQWNjb3VudHMgdG90YWxzIGV2ZXJ5IGFjY291bnQncyBkZWJpdCBhbmQgY3JlZGl0IGNvbHVtbnMuIFRoZSBib29sIGlzCi8vIGZhbHNlIG9uIG92ZXJmbG93LCB3aGljaCBpcyB3aHkgY2FsbGVycyBtdXN0IG5vdCB0cmVhdCAoMCwgMCkgYXMgYW4gZW1wdHkKLy8gY2hhcnQuCmZ1bmMgKGIgKkJvb2spIHN1bUFjY291bnRzKCkgKGRlYml0cywgY3JlZGl0cyBpbnQ2NCwgb2sgYm9vbCkgewoJdmFyIGQsIGMgaW50NjQKCW9rTWF0aCA6PSB0cnVlCgliLmFjY291bnRzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWEgOj0gdmFsdWUuKEFjY291bnQpCgkJdmFyIG9rQWRkIGJvb2wKCQlpZiBkLCBva0FkZCA9IGNoZWNrZWRBZGQoZCwgYS5EZWJpdHMpOyAhb2tBZGQgewoJCQlva01hdGggPSBmYWxzZQoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQlpZiBjLCBva0FkZCA9IGNoZWNrZWRBZGQoYywgYS5DcmVkaXRzKTsgIW9rQWRkIHsKCQkJb2tNYXRoID0gZmFsc2UKCQkJcmV0dXJuIHRydWUKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgIW9rTWF0aCB7CgkJcmV0dXJuIDAsIDAsIGZhbHNlCgl9CglyZXR1cm4gZCwgYywgdHJ1ZQp9CgovLyBhY2NvdW50IGxvb2tzIHVwIG9uZSBjaGFydCBsaW5lLgpmdW5jIChiICpCb29rKSBhY2NvdW50KGNvZGUgc3RyaW5nKSAoQWNjb3VudCwgYm9vbCkgewoJdiA6PSBiLmFjY291bnRzLkdldChjb2RlKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBBY2NvdW50e30sIGZhbHNlCgl9CglyZXR1cm4gdi4oQWNjb3VudCksIHRydWUKfQoKLy8gZW50cnkgbG9va3MgdXAgb25lIGpvdXJuYWwgZW50cnksIFdJVEhPVVQgY29weWluZyBpdHMgcG9zdGluZ3MuIEludGVybmFsCi8vIGNhbGxlcnMgbXVzdCBub3QgcmV0YWluIG9yIG11dGF0ZSB0aGUgcmV0dXJuZWQgc2xpY2U7IGV2ZXJ5IGV4cG9ydGVkIHBhdGgKLy8gZ29lcyB0aHJvdWdoIHdpdGhDb3BpZWRQb3N0aW5ncy4KZnVuYyAoYiAqQm9vaykgZW50cnkoaWQgdWludDY0KSAoRW50cnksIGJvb2wpIHsKCXYgOj0gYi5lbnRyaWVzLkdldChpZEtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIEVudHJ5e30sIGZhbHNlCgl9CglyZXR1cm4gdi4oRW50cnkpLCB0cnVlCn0KCi8vIHdpdGhDb3BpZWRQb3N0aW5ncyByZXR1cm5zIGUgd2l0aCBhIGZyZXNoIFBvc3RpbmdzIHNsaWNlLCBzbyBhIHZhbHVlCi8vIGhhbmRlZCB0byBhIGNhbGxlciBzaGFyZXMgbm8gYmFja2luZyBhcnJheSB3aXRoIHRoZSBCb29rLgpmdW5jIChlIEVudHJ5KSB3aXRoQ29waWVkUG9zdGluZ3MoKSBFbnRyeSB7CglvdXQgOj0gbWFrZShbXVBvc3RpbmcsIGxlbihlLlBvc3RpbmdzKSkKCWNvcHkob3V0LCBlLlBvc3RpbmdzKQoJZS5Qb3N0aW5ncyA9IG91dAoJcmV0dXJuIGUKfQoKLy8gaWRLZXkgZW5jb2RlcyBhbiBJRCBzbyB0aGF0IGF2bCdzIGxleGljYWwga2V5IG9yZGVyIG1hdGNoZXMgbnVtZXJpYyBJRAovLyBvcmRlci4gbWF0aC5NYXhVaW50NjQgaXMgMjAgZGlnaXRzLCBzbyBhIGZpeGVkIDIwLXdpZGUgemVyby1wYWRkZWQKLy8gZGVjaW1hbCBpcyBib3RoIHN1ZmZpY2llbnQgYW5kIHVuYW1iaWd1b3VzLgpmdW5jIGlkS2V5KGlkIHVpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkKCWNvbnN0IHdpZHRoID0gMjAKCWlmIGxlbihzKSA+PSB3aWR0aCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiB6ZXJvc1s6d2lkdGgtbGVuKHMpXSArIHMKfQoKY29uc3QgemVyb3MgPSAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiCgovLyBjaGVja2VkQWRkIHJldHVybnMgYStiIGFuZCByZXBvcnRzIHdoZXRoZXIgdGhlIGFkZGl0aW9uIGRpZCBub3Qgb3ZlcmZsb3cKLy8gaW50NjQuCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXN1bSA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHN1bSA8IGEpIHx8IChiIDwgMCAmJiBzdW0gPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gc3VtLCB0cnVlCn0KIg0xMDAwMDAwMHVnbm90EhIInteKRBILMTQyNzgydWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQCWE3aRygX+pZLdIkgJ1EJ1j39h0ePRdIr72DgwODwuQf3shI/742xx2UzsTC1BW18zTiIGmR9MLYSHECk33Jo0aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}