{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "9D7QVGmFvNdEryQK08Txlt77t7wROLnsam9VOACD/aE=",
    "height": "1316628",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "250000000",
      "GasUsed": "104756192"
    },
    "tx": "CvvzBAoML3ZtLm1fYWRkcGtnEunzBAooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKs8wQKB2pvdXJuYWwSO2duby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9qb3VybmFsGmIKC2dub21vZC50b21sElNtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2pvdXJuYWwiCmdubyA9ICIwLjkiChrmkwIKC2pvdXJuYWwuZ25vEtWTAi8vIFBhY2thZ2Ugam91cm5hbCBpcyBhIHB1cmUgZG91YmxlLWVudHJ5IGFjY291bnRpbmcgcHJpbWl0aXZlIGZvciByZWFsbXMKLy8gdGhhdCBuZWVkIGJvb2tzIHdoaWNoIHByb3ZhYmx5IGJhbGFuY2UuIEl0IGlzIHRvICpib29ra2VlcGluZyogd2hhdAovLyBmZWVsZWRnZXIgaXMgdG8gKm1vbmV5KiBhbmQgZHVlYm9vayBpcyB0byAqdGltZSo6IGl0IGhvbGRzIG5vIGNvaW5zLAovLyBwZXJmb3JtcyBubyBlZmZlY3RzLCBpbXBvcnRzIG5vIGNoYWluIEFQSXMsIGFuZCBvd25zIG5vIHBhY2thZ2UtbGV2ZWwKLy8gc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gb3ducyBhICpCb29rLCBzdXBwbGllcyB0aGUgY2xvY2ssIGFuZCBwZXJmb3JtcwovLyBpdHMgb3duIGVmZmVjdHMuCi8vCi8vICMgVGhlIG9uZSBpZGVhCi8vCi8vIEV2ZXJ5IGZpbmFuY2lhbCBwcmltaXRpdmUgaW4gdGhlIHNlYXJjaGVkIEdubyBlY29zeXN0ZW0gaXMgT05FLVNJREVELiBBCi8vIHRyZWFzdXJ5IHJlY29yZHMgd2hhdCBtb3ZlZC4gQSBwdWxsLXBheW1lbnQgbGVkZ2VyIHJlY29yZHMgd2hvIGlzIG93ZWQKLy8gd2hhdC4gQSBHUkMyMCBsZWRnZXIgcmVjb3JkcyB3aG8gaG9sZHMgd2hhdC4gRWFjaCBzdG9yZXMgYSBiYWxhbmNlIGFuZAovLyBtdXRhdGVzIGl0LgovLwovLyBUaGlzIHBhY2thZ2Ugc3RvcmVzIG5vIGJhbGFuY2UuIEl0IHN0b3JlcyBFTlRSSUVTLCBhbmQgZGVyaXZlcyBiYWxhbmNlcwovLyBmcm9tIHRoZW06Ci8vCi8vCWJvb2suTXVzdE9wZW4oIjEwMDAiLCAiQ2FzaCIsIEFzc2V0KQovLwlib29rLk11c3RPcGVuKCI0MDAwIiwgIlJldmVudWUiLCBSZXZlbnVlKQovLwlib29rLk11c3RQb3N0KG5vdywgImludm9pY2UgMTcgcGFpZCIsIFtdUG9zdGluZ3sKLy8JCXtBY2NvdW50OiAiMTAwMCIsIFNpZGU6IERlYml0LCBBbW91bnQ6IDUwMDB9LAovLwkJe0FjY291bnQ6ICI0MDAwIiwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDUwMDB9LAovLwl9KQovLwovLyBBbiBlbnRyeSB0aGF0IGRvZXMgbm90IGJhbGFuY2UgaXMgcmVmdXNlZCwgYW5kIHRoZSByZWZ1c2FsIHNheXMgd2hpY2ggc2lkZQovLyBpcyBzaG9ydC4gU28gYHN1bShkZWJpdHMpID09IHN1bShjcmVkaXRzKWAgaXMgbm90IGEgcHJvcGVydHkgdGhlIGNvbnN1bWVyCi8vIG11c3QgcmVtZW1iZXIgdG8gbWFpbnRhaW4g4oCUIGl0IGlzIHRoZSBwcmVjb25kaXRpb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2luZwovLyBhdCBhbGwuIEEgQm9vayBjYW5ub3QgYmUgcHV0IGludG8gYW4gdW5iYWxhbmNlZCBzdGF0ZSBieSBhbnkgc2VxdWVuY2Ugb2YKLy8gY2FsbHMgdG8gdGhpcyBwYWNrYWdlLgovLwovLyAjIE5vIGFtZW5kLCBubyB2b2lkCi8vCi8vIFBvc3QgaXMgdGhlIG9ubHkgd2F5IGluLCBhbmQgdGhlcmUgaXMgbm8gRWRpdCBhbmQgbm8gRGVsZXRlLiBBIG1pc3Rha2UgaXMKLy8gY29ycmVjdGVkIHRoZSB3YXkgcmVhbCBib29rcyBjb3JyZWN0IG9uZTogd2l0aCBhIFJFVkVSU0lORyBFTlRSWSB0aGF0Ci8vIG1pcnJvcnMgZXZlcnkgcG9zdGluZyBvZiB0aGUgb3JpZ2luYWwsIGxlYXZpbmcgYm90aCB2aXNpYmxlLgovLwovLwlib29rLk11c3RSZXZlcnNlKGVudHJ5SUQsIG5vdywgIndyb25nIGFjY291bnQiKQovLwovLyBUaGlzIGlzIHdoeSBoaXN0b3J5IGlzIHRydXN0d29ydGh5IGhlcmUgYW5kIHdvdWxkIG5vdCBiZSBpZiBlbnRyaWVzIHdlcmUKLy8gbXV0YWJsZS4gQW4gYXVkaXRvciByZWFkaW5nIHRoZSBqb3VybmFsIHNlZXMgdGhlIGVycm9yIEFORCB0aGUgY29ycmVjdGlvbiwKLy8gd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBrZWVwaW5nIGEgam91cm5hbCByYXRoZXIgdGhhbiBhIGJhbGFuY2UuCi8vIFJldmVyc2UgcmVmdXNlcyBhIHNlY29uZCByZXZlcnNhbCBvZiB0aGUgc2FtZSBlbnRyeSwgc28gYSBjb3JyZWN0aW9uCi8vIGNhbm5vdCBiZSBsb29wZWQuCi8vCi8vICMgUGVyaW9kcwovLwovLyBDbG9zZSh0aHJvdWdoKSBzZWFscyBldmVyeXRoaW5nIGRhdGVkIGF0IG9yIGJlZm9yZSBgdGhyb3VnaGAuIEl0IG9ubHkgZXZlcgovLyBtb3ZlcyBmb3J3YXJkLCBhbmQgYWZ0ZXIgaXQgUG9zdCByZWZ1c2VzIGFueSBlbnRyeSBkYXRlZCBpbnRvIHRoZSBzZWFsZWQKLy8gcmFuZ2Ug4oCUIHRoZSBiYWNrZGF0aW5nIHRoYXQgbWFrZXMgYSBjbG9zZWQgcGVyaW9kIG1lYW5pbmdsZXNzLiBSZXZlcnNlIGlzCi8vIHJlZnVzZWQgdGhlcmUgdG9vOiBjb3JyZWN0aW5nIGEgc2VhbGVkIHBlcmlvZCBtZWFucyBvcGVuaW5nIGEgbmV3IGVudHJ5IGluCi8vIHRoZSBjdXJyZW50IG9uZSwgd2hpY2ggaXMgdGhlIGNvbnN1bWVyJ3MgY2FsbCB0byBtYWtlIGV4cGxpY2l0bHkuCi8vCi8vICMgV2hhdCAiYmFsYW5jZWQiIGlzIGFjdHVhbGx5IHdvcnRoCi8vCi8vIFJlYWQgdGhpcyBiZWZvcmUgcXVvdGluZyBJc0JhbGFuY2VkIGFzIGEgZ3VhcmFudGVlLgovLwovLyBJc0JhbGFuY2VkIGNvbXBhcmVzIFRXTyBJTkRFUEVOREVOVExZIE1BSU5UQUlORUQgQUNDVU1VTEFUT1JTOiB0aGUKLy8gcGVyLWFjY291bnQgZGViaXQvY3JlZGl0IHRvdGFscywgc3VtbWVkIGFjcm9zcyB0aGUgY2hhcnQsIGFnYWluc3QgdGhlCi8vIEJvb2sncyBvd24gcnVubmluZyB0b3RhbHMuIFRoZXkgYXJlIHdyaXR0ZW4gYnkgZGlmZmVyZW50IGNvZGUgcGF0aHMsIHNvCi8vIGEgZHJpZnQgYmV0d2VlbiB0aGVtIGlzIGEgcmVhbCBkZWZlY3QgYW5kIElzQmFsYW5jZWQgZmluZHMgaXQuIFdoYXQgaXQKLy8gZG9lcyBOT1QgZG8gaXMgcmUtcmVhZCB0aGUgam91cm5hbCwgc28gYSBkZWZlY3QgdGhhdCBjb3JydXB0ZWQgYm90aAovLyBhY2N1bXVsYXRvcnMgaWRlbnRpY2FsbHkgd291bGQgc3Vydml2ZSBpdC4KLy8KLy8gUmVkZXJpdmVGcm9tSm91cm5hbCBpcyB0aGUgc3Ryb25nIGNoZWNrOiBpdCByZXBsYXlzIGV2ZXJ5IHBvc3Rpbmcgb2YgZXZlcnkKLy8gZW50cnkgYW5kIGNvbXBhcmVzIHRoZSByZXN1bHQgYWdhaW5zdCBib3RoIGFjY3VtdWxhdG9ycy4gSXQgY29zdHMgTyhhbGwKLy8gcG9zdGluZ3MgZXZlcikgYW5kIGV4aXN0cyB0byBiZSBydW4gZGVsaWJlcmF0ZWx5LCBub3Qgb24gZXZlcnkgcmVhZC4KLy8KLy8gQWNjb3VudGluZ0VxdWF0aW9uIGlzIFdFQUtFUiBUSEFOIElUIExPT0tTIGFuZCBpcyBkb2N1bWVudGVkIGFzIHN1Y2gKLy8gcmF0aGVyIHRoYW4gbGVmdCBmb3IgYSByZWFkZXIgdG8gYXNzdW1lIG90aGVyd2lzZTogdW5kZXIgdGhpcyBwYWNrYWdlJ3MKLy8gc2lnbiBjb252ZW50aW9ucyBpdCBpcyBpbXBsaWVkIGJ5IElzQmFsYW5jZWQsIGFuZCBpdHMgYm9vbGVhbiBwcm92ZXMKLy8gRVhBQ1RMWSBPTkUgb2YgSXNCYWxhbmNlZCdzIHRocmVlIGNvbmp1bmN0cy4gSXQgaXMgTk9UIGFuIGluZGVwZW5kZW50Ci8vIGFjY291bnRpbmcgZmFjdC4gVGhyZWUgY2hlY2tzIHRoYXQgYXJlIHJlYWxseSB0d28sIHByZXNlbnRlZCBhcyB0aHJlZSwKLy8gd291bGQgYmUgdGhlIGRlZmVjdCB0aGlzIHBhY2thZ2UgZXhpc3RzIHRvIGF2b2lkLgovLwovLyBUaGlzIGRvYyBzYWlkICJpdCBpcyBhIGNyb3NzLWNoZWNrIG9mIHRoaXMgcGFja2FnZSdzIG93biBub3JtYWwtYmFsYW5jZQovLyBoYW5kbGluZyIgdW50aWwgMjAyNi0xMC0wNywgYW5kIHRoYXQgc2VudGVuY2Ugd2FzIEZBTFNFIOKAlCB0aGUgb25lIHBsYWNlCi8vIHRoZSBjYXJlZnVsIGRpc2NsYWltZXIgYXJvdW5kIGl0IHN0aWxsIG92ZXJjbGFpbWVkLiBUaGUgYm9vbGVhbiBpcyB0aGUKLy8gc3VtIG9mIGV2ZXJ5IGFjY291bnQncyBSYXdEZWx0YSwgYnVja2V0ZWQgYnkgS2luZCBhbmQgdGhlbiBhZGRlZCBiYWNrCi8vIHRvZ2V0aGVyLCBzbyB0aGUgYnVja2V0aW5nIGNhbm5vdCBjaGFuZ2UgaXQ6IG9mZnNldHMgaXMgSU5WQVJJQU5UIHVuZGVyCi8vIGV2ZXJ5IHBvc3NpYmxlIEtpbmQgbWlzY2xhc3NpZmljYXRpb24sIHdoaWNoIGlzIHRoZSBvbmUgdGhpbmcKLy8gIm5vcm1hbC1iYWxhbmNlIGhhbmRsaW5nIiBtZWFucy4gU2VlIG9ibGlnYXRpb24gNyBiZWxvdywgYW5kCi8vIEFjY291bnRpbmdFcXVhdGlvbidzIG93biBkb2MgZm9yIHdoYXQgaXQgZG9lcyBwcm92ZS4KLy8KLy8gQW5kIHRoZSBjZWlsaW5nIG9uIGFsbCB0aHJlZTogYSBCb29rIGNhbiBiZSBpbnRlcm5hbGx5IHBlcmZlY3QgYW5kCi8vIGRlc2NyaWJlIG5vdGhpbmcuIFNlZSBvYmxpZ2F0aW9uIDEgYmVsb3cuCi8vCi8vICMgU3RhdGUgZ3Jvd3RoCi8vCi8vIEVudHJpZXMgYXJlIG5ldmVyIHJlbW92ZWQsIGJlY2F1c2UgYW4gYXBwZW5kLW9ubHkgam91cm5hbCB3aG9zZSBlbnRyaWVzCi8vIGNvdWxkIHZhbmlzaCBpcyBub3QgYSBqb3VybmFsLiBTdG9yYWdlIHRoZXJlZm9yZSBncm93cyB3aXRoIGV2ZXJ5IFBvc3QgYW5kCi8vIGlzIGJvdW5kZWQgb25seSBieSBtYXhFbnRyaWVzLCBzZXQgYXQgY29uc3RydWN0aW9uLiBBIEJvb2sgdGhhdCByZWFjaGVzCi8vIHRoYXQgY2FwIHJlZnVzZXMgZnVydGhlciBlbnRyaWVzIHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIGhpc3Rvcnkg4oCUCi8vIGEgbG9uZy1saXZlZCBjb25zdW1lciBtdXN0IHBsYW4gZm9yIHRoaXMsIGFuZCB0aGUgcGxhbiBpcyBhIG5ldyBCb29rIHdpdGgKLy8gb3BlbmluZyBiYWxhbmNlcyBjYXJyaWVkIGZvcndhcmQsIG5vdCBhIHBydW5lZCBvbmUuCi8vCi8vICMgQ29uc3VtZXIgY29udHJhY3QgKHRoZSBwYXJ0cyB0aGUgcGFja2FnZSBjYW5ub3QgZW5mb3JjZSkKLy8KLy8gIDEuIFRIRSBCT09LUyBBUkUgQ0xBSU1TIEJZIFdIT0VWRVIgUE9TVEVEIFRIRU0uIFRoaXMgcGFja2FnZSBwcm92ZXMKLy8gICAgIGFyaXRobWV0aWMsIG5ldmVyIHRydXRoLiBXaXRoIG5vIGN1c3RvZHkgdGhlcmUgaXMgbm8gc29sdmVuY3kKLy8gICAgIGludmFyaWFudCB0eWluZyAiQ2FzaCA1MDAwIiB0byA1MDAwIHJlYWwgdWdub3QgYW55d2hlcmUuIEEgcmVhbG0gdGhhdAovLyAgICAgcHJlc2VudHMgYSBqb3VybmFsIGJhbGFuY2UgYXMgYSBob2xkaW5nIGlzIGFzc2VydGluZyBzb21ldGhpbmcgdGhpcwovLyAgICAgcGFja2FnZSBkaWQgbm90IGNoZWNrLiBUaGlzIGlzIHRoZSBzaW5nbGUgbW9zdCBpbXBvcnRhbnQgb2JsaWdhdGlvbgovLyAgICAgYW5kIHRoZSBvbmUgbW9zdCBjb21tb25seSBnb3Qgd3JvbmcuCi8vICAyLiBTVVBQTFkgQSBSRUFMIENMT0NLLiBqb3VybmFsIGNhbm5vdCB2ZXJpZnkgdGhhdCBgYXRgIGNhbWUgZnJvbQovLyAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpIG9yIHRpbWUuTm93KCkuVW5peCgpLiBBIHJlYWxtIHRoYXQgbGV0cyBhIGNhbGxlcgovLyAgICAgY2hvb3NlIGBhdGAgaGFzIG5vIHBlcmlvZCBkaXNjaXBsaW5lIGF0IGFsbDogdGhlIGNhbGxlciBkYXRlcyBlbnRyaWVzCi8vICAgICB3aGVyZXZlciB0aGV5IGFyZSBjb252ZW5pZW50LiBQYXNzIHRoZSBjaGFpbidzIGNsb2NrLCBuZXZlciBhCi8vICAgICB0cmFuc2FjdGlvbiBwYXJhbWV0ZXIuCi8vICAzLiBVU0UgT05FIENMT0NLIENPTlNJU1RFTlRMWS4gSGVpZ2h0cyBhbmQgc2Vjb25kcyBtdXN0IG5vdCBiZSBtaXhlZAovLyAgICAgd2l0aGluIGEgQm9vazsgYGF0YCBhbmQgYHRocm91Z2hgIGFyZSBib3RoIGluIHRoZSBjYWxsZXIncyB1bml0LgovLyAgNC4gRE8gTk9UIEVYUE9SVCBUSEUgQk9PSy4gQSAqQm9vayBpcyBhIG11dGFibGUgaGFuZGxlLiBSZXR1cm5pbmcgb25lCi8vICAgICBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSBoYW5kcyBvdXQgdGhlIHJpZ2h0IHRvIG9wZW4gYWNjb3VudHMsIHBvc3QgYW5kCi8vICAgICByZXZlcnNlLiBFeHBvc2UgeW91ciBvd24gY3Jvc3NpbmcgZnVuY3Rpb25zIGluc3RlYWQ7IHRoaXMgcGFja2FnZQovLyAgICAgcmV0dXJucyBBY2NvdW50IGFuZCBFbnRyeSBWQUxVRVMsIG5ldmVyIHBvaW50ZXJzIGludG8gaXRzIHN0YXRlLgovLyAgNS4gQVVUSE9SSVpFIFRIRSBQT1NURVIuIGpvdXJuYWwgYXV0aGVudGljYXRlcyBub2JvZHkuIFdobyBtYXkgb3BlbiBhbgovLyAgICAgYWNjb3VudCwgd2hvIG1heSBwb3N0LCBhbmQgd2hvIG1heSBjbG9zZSBhIHBlcmlvZCBhcmUgdGhlIHJlYWxtJ3MKLy8gICAgIHBvbGljeSDigJQgZGVyaXZlIHRoZSBjYWxsZXIgZnJvbSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIG5vdCBmcm9tIGFuCi8vICAgICBhcmd1bWVudC4KLy8gIDYuIENIT09TRSBUSEUgVU5JVCBPTkNFLiBBbW91bnRzIGFyZSBpbnQ2NCBpbiB3aGF0ZXZlciBtaW5vciB1bml0IHRoZQovLyAgICAgY29uc3VtZXIgcGlja3MuIGpvdXJuYWwgZG9lcyBub3Qga25vdyBhYm91dCBkZW5vbWluYXRpb25zIGFuZCB3aWxsCi8vICAgICBoYXBwaWx5IGJhbGFuY2UgYW4gZW50cnkgdGhhdCBtaXhlcyB0d28gb2YgdGhlbS4KLy8gIDcuIEdFVCBUSEUgS0lORCBSSUdIVCBBVCBPUEVOIFRJTUUuIE5PIENIRUNLIElOIFRISVMgUEFDS0FHRSBWQUxJREFURVMKLy8gICAgIEFOIEFDQ09VTlQnUyBLSU5ELiBBIEtpbmQgaXMgYWNjZXB0ZWQgaWYgaXQgaXMgb25lIG9mIHRoZSBmaXZlIGFuZCBpcwovLyAgICAgbmV2ZXIgcmV2aXNpdGVkLCBzbyBhbiBhY2NvdW50IG9wZW5lZCBBc3NldCB0aGF0IHNob3VsZCBoYXZlIGJlZW4KLy8gICAgIExpYWJpbGl0eSByZXBvcnRzIGEgc2lnbi1mbGlwcGVkIEJhbGFuY2UoKSBmb3JldmVyIOKAlCBhbmQgSXNCYWxhbmNlZCwKLy8gICAgIFJlZGVyaXZlRnJvbUpvdXJuYWwgYW5kIEFjY291bnRpbmdFcXVhdGlvbiBhbGwgdGhyZWUgc3RheSBoZWFsdGh5LAovLyAgICAgYmVjYXVzZSBldmVyeSBvbmUgb2YgdGhlbSBpcyBidWlsdCBvbiBEZWJpdHMgYW5kIENyZWRpdHMsIHdoaWNoIHRoZQovLyAgICAgS2luZCBkb2VzIG5vdCB0b3VjaC4gVGhpcyBpcyB0aGUgaW52YXJpYW50IHRpZXJzJyBibGluZCBzcG90LCBpdCBpcwovLyAgICAgc3RydWN0dXJhbCByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbiB0byBiZSBmaXhlZCBsYXRlciwgYW5kIGEgcmVhbG0KLy8gICAgIHRoYXQgbGV0cyBhIGNhbGxlciBjaG9vc2UgdGhlIEtpbmQgaGFzIGRlbGVnYXRlZCBhIGRlY2lzaW9uIG5vCi8vICAgICBsYXRlciBjaGVjayBjYW4gYXVkaXQuCi8vCi8vIEFsbCBmYWlsdXJlcyBhcmUgcmV0dXJuZWQgYXMgZXJyb3JzIGFuZCBsZWF2ZSB0aGUgQm9vayBDT01QTEVURUxZCi8vIFVOQ0hBTkdFRC4gTXVzdCogd3JhcHBlcnMgYXJlIHRoZSBvbmx5IGZ1bmN0aW9ucyBoZXJlIHRoYXQgcGFuaWMuCi8vCi8vIFRoZSBCb29rIGlzIGFkZHJlc3MtYWdub3N0aWM6IGFjY291bnQgY29kZXMgYXJlIG5vbi1lbXB0eSBzdHJpbmdzLiBSZWFsbXMKLy8gbm9ybWFsbHkgdXNlIGEgY2hhcnQtb2YtYWNjb3VudHMgY29kZSwgbm90IGFuIGFkZHJlc3MuCnBhY2thZ2Ugam91cm5hbAoKaW1wb3J0ICgKCSJlcnJvcnMiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIE1heEFjY291bnRzTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4QWNjb3VudHMgYSBCb29rIG1heSBiZSBjb25zdHJ1Y3RlZAovLyB3aXRoLiBJdCBib3VuZHMgdGhlIGNvc3Qgb2YgSXNCYWxhbmNlZCBhbmQgQWNjb3VudGluZ0VxdWF0aW9uLCB3aGljaCBzY2FuCi8vIHRoZSBjaGFydCBvZiBhY2NvdW50cy4KY29uc3QgTWF4QWNjb3VudHNMaW1pdCA9IDEwMDAwCgovLyBNYXhFbnRyaWVzTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4RW50cmllcyBhIEJvb2sgbWF5IGJlIGNvbnN0cnVjdGVkIHdpdGguCmNvbnN0IE1heEVudHJpZXNMaW1pdCA9IDEwMDAwMDAKCi8vIE1heFBvc3RpbmdzUGVyRW50cnkgYm91bmRzIGEgc2luZ2xlIGVudHJ5J3MgcG9zdGluZyBjb3VudC4gVHdvIGlzIHRoZQovLyBtaW5pbXVtIGEgYmFsYW5jZWQgZW50cnkgY2FuIGhhdmU7IHRoZSBjZWlsaW5nIGtlZXBzIG9uZSBQb3N0IGJvdW5kZWQuCmNvbnN0IE1heFBvc3RpbmdzUGVyRW50cnkgPSA2NAoKLy8gTWF4Q29kZUxlbiBib3VuZHMgYW4gYWNjb3VudCBjb2RlLgpjb25zdCBNYXhDb2RlTGVuID0gNjQKCi8vIE1heE5hbWVMZW4gYm91bmRzIGFuIGFjY291bnQncyBodW1hbi1yZWFkYWJsZSBuYW1lLgpjb25zdCBNYXhOYW1lTGVuID0gMjU2CgovLyBNYXhNZW1vTGVuIGJvdW5kcyBhbiBlbnRyeSBtZW1vLiBUaGUgbWVtbyBpcyBvcGFxdWUgdG8gam91cm5hbCDigJQgaXQgZXhpc3RzCi8vIHNvIGEgcmVhbG0gY2FuIHJlY29yZCB3aHkgYW4gZW50cnkgd2FzIG1hZGUgd2l0aG91dCBrZWVwaW5nIGEgcGFyYWxsZWwKLy8gdGFibGUuCmNvbnN0IE1heE1lbW9MZW4gPSAxMDI0CgovLyBFcnJvcnMgcmV0dXJuZWQgYnkgQm9vayBvcGVyYXRpb25zLgp2YXIgKAoJRXJyRW1wdHlDb2RlICAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVtcHR5IGFjY291bnQgY29kZSIpCglFcnJDb2RlVG9vTG9uZyAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYWNjb3VudCBjb2RlIGV4Y2VlZHMgTWF4Q29kZUxlbiIpCglFcnJOYW1lVG9vTG9uZyAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYWNjb3VudCBuYW1lIGV4Y2VlZHMgTWF4TmFtZUxlbiIpCglFcnJNZW1vVG9vTG9uZyAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogbWVtbyBleGNlZWRzIE1heE1lbW9MZW4iKQoJRXJySW52YWxpZEtpbmQgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IHVua25vd24gYWNjb3VudCBraW5kIikKCUVyckludmFsaWRTaWRlICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBwb3N0aW5nIHNpZGUgbXVzdCBiZSBEZWJpdCBvciBDcmVkaXQiKQoJRXJySW52YWxpZEFtb3VudCAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IHBvc3RpbmcgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJRXJySW52YWxpZEF0ICAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGF0IG11c3QgYmUgbm9uLW5lZ2F0aXZlIikKCUVyckludmFsaWRDb25maWcgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBpbnZhbGlkIGJvb2sgY29uZmlndXJhdGlvbiIpCglFcnJBY2NvdW50RXhpc3RzICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYWNjb3VudCBjb2RlIGFscmVhZHkgb3BlbiIpCglFcnJVbmtub3duQWNjb3VudCAgID0gZXJyb3JzLk5ldygiam91cm5hbDogbm8gc3VjaCBhY2NvdW50IikKCUVyckNoYXJ0RnVsbCAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBhY2NvdW50IGNhcCByZWFjaGVkIikKCUVyckJvb2tGdWxsICAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBjYXAgcmVhY2hlZCIpCglFcnJUb29GZXdQb3N0aW5ncyAgID0gZXJyb3JzLk5ldygiam91cm5hbDogYW4gZW50cnkgbmVlZHMgYXQgbGVhc3QgdHdvIHBvc3RpbmdzIikKCUVyclRvb01hbnlQb3N0aW5ncyAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBleGNlZWRzIE1heFBvc3RpbmdzUGVyRW50cnkiKQoJRXJyTm9EZWJpdCAgICAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVudHJ5IGhhcyBubyBkZWJpdCBwb3N0aW5nIikKCUVyck5vQ3JlZGl0ICAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBoYXMgbm8gY3JlZGl0IHBvc3RpbmciKQoJRXJyRGViaXRTaG9ydCAgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVudHJ5IGRvZXMgbm90IGJhbGFuY2UsIGRlYml0cyBhcmUgc2hvcnQiKQoJRXJyQ3JlZGl0U2hvcnQgICAgICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGVudHJ5IGRvZXMgbm90IGJhbGFuY2UsIGNyZWRpdHMgYXJlIHNob3J0IikKCUVyckVudHJ5Tm90Rm91bmQgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBubyBzdWNoIGVudHJ5IikKCUVyckFscmVhZHlSZXZlcnNlZCAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2VkIikKCUVyclBlcmlvZENsb3NlZCAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBhdCBmYWxscyBpbiBhIGNsb3NlZCBwZXJpb2QiKQoJRXJyQ2xvc2VOb3RGb3J3YXJkICA9IGVycm9ycy5OZXcoImpvdXJuYWw6IGNsb3NlIG11c3QgbW92ZSBmb3J3YXJkIikKCUVyck92ZXJmbG93ICAgICAgICAgPSBlcnJvcnMuTmV3KCJqb3VybmFsOiBpbnQ2NCBvdmVyZmxvdyIpCglFcnJJREV4aGF1c3RlZCAgICAgID0gZXJyb3JzLk5ldygiam91cm5hbDogaWRlbnRpZmllciBzcGFjZSBleGhhdXN0ZWQiKQopCgovLyBLaW5kIGlzIGFuIGFjY291bnQncyBjbGFzc2lmaWNhdGlvbiwgd2hpY2ggZml4ZXMgaXRzIG5vcm1hbCBiYWxhbmNlLgovLyBUaGUgemVybyB2YWx1ZSBpcyBkZWxpYmVyYXRlbHkgaW52YWxpZCBzbyBhIGZvcmdvdHRlbiBmaWVsZCBpcyBhbiBlcnJvcgovLyByYXRoZXIgdGhhbiBhbiBBc3NldC4KdHlwZSBLaW5kIHVpbnQ4CgovLyBUaGUgZml2ZSBhY2NvdW50IGtpbmRzLiBBc3NldCBhbmQgRXhwZW5zZSBhcmUgZGViaXQtbm9ybWFsOyBMaWFiaWxpdHksCi8vIEVxdWl0eSBhbmQgUmV2ZW51ZSBhcmUgY3JlZGl0LW5vcm1hbC4KY29uc3QgKAoJQXNzZXQgICAgIEtpbmQgPSAxCglMaWFiaWxpdHkgS2luZCA9IDIKCUVxdWl0eSAgICBLaW5kID0gMwoJUmV2ZW51ZSAgIEtpbmQgPSA0CglFeHBlbnNlICAgS2luZCA9IDUKKQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIGsgaXMgb25lIG9mIHRoZSBmaXZlIGtpbmRzLgpmdW5jIChrIEtpbmQpIFZhbGlkKCkgYm9vbCB7IHJldHVybiBrID49IEFzc2V0ICYmIGsgPD0gRXhwZW5zZSB9CgovLyBJc0RlYml0Tm9ybWFsIHJlcG9ydHMgd2hldGhlciBhbiBpbmNyZWFzZSBpbiBrIGlzIHJlY29yZGVkIGFzIGEgZGViaXQuCi8vIEFzc2V0IGFuZCBFeHBlbnNlIGFyZSBkZWJpdC1ub3JtYWw7IHRoZSBvdGhlciB0aHJlZSBhcmUgY3JlZGl0LW5vcm1hbC4KLy8gQW4gaW52YWxpZCBLaW5kIHJlcG9ydHMgZmFsc2UsIHdoaWNoIGlzIHdoeSBjYWxsZXJzIHZhbGlkYXRlIGZpcnN0LgpmdW5jIChrIEtpbmQpIElzRGViaXROb3JtYWwoKSBib29sIHsgcmV0dXJuIGsgPT0gQXNzZXQgfHwgayA9PSBFeHBlbnNlIH0KCi8vIFN0cmluZyByZXR1cm5zIHRoZSBraW5kJ3MgbmFtZSwgb3IgImludmFsaWQiIGZvciB0aGUgemVybyB2YWx1ZSBhbmQgYW55Ci8vIHVucmVjb2duaXNlZCBjb2RlLgpmdW5jIChrIEtpbmQpIFN0cmluZygpIHN0cmluZyB7Cglzd2l0Y2ggayB7CgljYXNlIEFzc2V0OgoJCXJldHVybiAiYXNzZXQiCgljYXNlIExpYWJpbGl0eToKCQlyZXR1cm4gImxpYWJpbGl0eSIKCWNhc2UgRXF1aXR5OgoJCXJldHVybiAiZXF1aXR5IgoJY2FzZSBSZXZlbnVlOgoJCXJldHVybiAicmV2ZW51ZSIKCWNhc2UgRXhwZW5zZToKCQlyZXR1cm4gImV4cGVuc2UiCgl9CglyZXR1cm4gImludmFsaWQiCn0KCi8vIFNpZGUgaXMgd2hpY2ggY29sdW1uIGEgcG9zdGluZyBsYW5kcyBpbi4gVGhlIHplcm8gdmFsdWUgaXMgZGVsaWJlcmF0ZWx5Ci8vIGludmFsaWQ6IGEgcG9zdGluZyB3aXRoIGEgZm9yZ290dGVuIFNpZGUgbXVzdCBiZSByZWZ1c2VkLCBub3Qgc2lsZW50bHkKLy8gdHJlYXRlZCBhcyBhIGRlYml0Lgp0eXBlIFNpZGUgdWludDgKCi8vIFRoZSB0d28gcG9zdGluZyBzaWRlcy4KY29uc3QgKAoJRGViaXQgIFNpZGUgPSAxCglDcmVkaXQgU2lkZSA9IDIKKQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIHMgaXMgRGViaXQgb3IgQ3JlZGl0LgpmdW5jIChzIFNpZGUpIFZhbGlkKCkgYm9vbCB7IHJldHVybiBzID09IERlYml0IHx8IHMgPT0gQ3JlZGl0IH0KCi8vIFN0cmluZyByZXR1cm5zICJkZWJpdCIsICJjcmVkaXQiLCBvciAiaW52YWxpZCIuCmZ1bmMgKHMgU2lkZSkgU3RyaW5nKCkgc3RyaW5nIHsKCXN3aXRjaCBzIHsKCWNhc2UgRGViaXQ6CgkJcmV0dXJuICJkZWJpdCIKCWNhc2UgQ3JlZGl0OgoJCXJldHVybiAiY3JlZGl0IgoJfQoJcmV0dXJuICJpbnZhbGlkIgp9CgovLyBPcHBvc2l0ZSByZXR1cm5zIHRoZSBvdGhlciBzaWRlLiBBbiBpbnZhbGlkIFNpZGUgcmV0dXJucyBpdHNlbGYsIHNvIGEKLy8gY2FsbGVyIHRoYXQgc2tpcHBlZCB2YWxpZGF0aW9uIGdldHMgYW4gaW52YWxpZCBwb3N0aW5nIHJhdGhlciB0aGFuIGEKLy8gcGxhdXNpYmxlIG9uZS4KZnVuYyAocyBTaWRlKSBPcHBvc2l0ZSgpIFNpZGUgewoJc3dpdGNoIHMgewoJY2FzZSBEZWJpdDoKCQlyZXR1cm4gQ3JlZGl0CgljYXNlIENyZWRpdDoKCQlyZXR1cm4gRGViaXQKCX0KCXJldHVybiBzCn0KCi8vIFBvc3RpbmcgaXMgb25lIGxlZyBvZiBhbiBlbnRyeTogYW4gYW1vdW50IGluIG9uZSBjb2x1bW4gb2Ygb25lIGFjY291bnQuCi8vIEFtb3VudCBpcyBhbHdheXMgUE9TSVRJVkUg4oCUIGRpcmVjdGlvbiBpcyBjYXJyaWVkIGJ5IFNpZGUsIG5vdCBieSBhIHNpZ24uCi8vCi8vIFRoYXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBvdmVyIHNpZ25lZCBhbW91bnRzLiBXaXRoIGEgc2lnbiwgIndoaWNoIHNpZGUKLy8gaXMgc2hvcnQiIGlzIHVuYW5zd2VyYWJsZSB3aXRob3V0IGtub3dpbmcgZWFjaCBhY2NvdW50J3Mgbm9ybWFsIGJhbGFuY2UsCi8vIHNvIGFuIHVuYmFsYW5jZWQgZW50cnkgY2FuIG9ubHkgYmUgcmVwb3J0ZWQgYXMgYSBudW1iZXIgdGhhdCBkb2VzIG5vdCBhZGQKLy8gdXAuIFdpdGggYW4gZXhwbGljaXQgU2lkZSB0aGUgcmVmdXNhbCBuYW1lcyB0aGUgc2hvcnQgY29sdW1uLCB3aGljaCBpcwovLyB3aGF0IGEgYm9va2tlZXBlciBuZWVkcyBpbiBvcmRlciB0byBmaXggaXQuCnR5cGUgUG9zdGluZyBzdHJ1Y3QgewoJQWNjb3VudCBzdHJpbmcKCVNpZGUgICAgU2lkZQoJQW1vdW50ICBpbnQ2NAp9CgovLyBBY2NvdW50IGlzIG9uZSBsaW5lIG9mIHRoZSBjaGFydCBvZiBhY2NvdW50cywgY2FycnlpbmcgaXRzIGN1bXVsYXRpdmUKLy8gZGViaXQgYW5kIGNyZWRpdCB0b3RhbHMuIEl0IGlzIHJldHVybmVkIEJZIFZBTFVFOiBob2xkZXJzIGNhbm5vdCByZWFjaAovLyBpbnRvIGEgQm9vayB0aHJvdWdoIGl0Lgp0eXBlIEFjY291bnQgc3RydWN0IHsKCUNvZGUgICAgc3RyaW5nCglOYW1lICAgIHN0cmluZwoJS2luZCAgICBLaW5kCglEZWJpdHMgIGludDY0CglDcmVkaXRzIGludDY0Cn0KCi8vIEJhbGFuY2UgcmV0dXJucyB0aGUgYWNjb3VudCdzIGJhbGFuY2UgaW4gaXRzIE5PUk1BTCBkaXJlY3Rpb246IGZvciBhCi8vIGRlYml0LW5vcm1hbCBhY2NvdW50IERlYml0cy1DcmVkaXRzLCBmb3IgYSBjcmVkaXQtbm9ybWFsIGFjY291bnQKLy8gQ3JlZGl0cy1EZWJpdHMuIEEgbm9ybWFsIGFjY291bnQgdGhlcmVmb3JlIGhhcyBhIG5vbi1uZWdhdGl2ZSBiYWxhbmNlLAovLyBhbmQgYSBuZWdhdGl2ZSByZXN1bHQgaXMgYSByZWFsIHNpZ25hbCAoYSBjb250cmEgcG9zaXRpb24pIHJhdGhlciB0aGFuIGEKLy8gc2lnbiBjb252ZW50aW9uLgpmdW5jIChhIEFjY291bnQpIEJhbGFuY2UoKSBpbnQ2NCB7CglpZiBhLktpbmQuSXNEZWJpdE5vcm1hbCgpIHsKCQlyZXR1cm4gYS5EZWJpdHMgLSBhLkNyZWRpdHMKCX0KCXJldHVybiBhLkNyZWRpdHMgLSBhLkRlYml0cwp9CgovLyBSYXdEZWx0YSByZXR1cm5zIERlYml0cy1DcmVkaXRzIHJlZ2FyZGxlc3Mgb2Yga2luZC4gU3VtbWVkIG92ZXIgZXZlcnkKLy8gYWNjb3VudCBpbiBhIGJhbGFuY2VkIGJvb2sgaXQgaXMgZXhhY3RseSB6ZXJvLCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHRoZQovLyB1c2VmdWwgcXVhbnRpdHkgZm9yIGEgY29uc2lzdGVuY3kgY2hlY2sgYW5kIHRoZSB3cm9uZyBvbmUgZm9yIGEgcmVwb3J0LgpmdW5jIChhIEFjY291bnQpIFJhd0RlbHRhKCkgaW50NjQgeyByZXR1cm4gYS5EZWJpdHMgLSBhLkNyZWRpdHMgfQoKLy8gRW50cnkgaXMgb25lIGpvdXJuYWwgZW50cnk6IGEgZGF0ZWQsIG1lbW8nZCwgYmFsYW5jZWQgc2V0IG9mIHBvc3RpbmdzLgovLyBJdCBpcyByZXR1cm5lZCBCWSBWQUxVRSwgYW5kIGl0cyBQb3N0aW5ncyBzbGljZSBpcyBhIERFRkVOU0lWRSBDT1BZIOKAlCBhCi8vIGhvbGRlciBjYW4gbXV0YXRlIHRoZSByZXR1cm5lZCBzbGljZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBCb29rLiBFbnRyeSBpcwovLyB0aGUgb25lIHR5cGUgaGVyZSB0aGF0IGNvbnRhaW5zIGEgc2xpY2UsIHNvIGl0IGlzIHRoZSBvbmUgdHlwZSB3aGVyZQovLyByZXR1cm5pbmcgdGhlIHN0b3JlZCB2YWx1ZSBkaXJlY3RseSB3b3VsZCBoYXZlIGhhbmRlZCBvdXQgYSB3cml0YWJsZQovLyB3aW5kb3cgaW50byBCb29rIHN0YXRlLgovLwovLyBSZXZlcnNhbE9mIGlzIDAgdW5sZXNzIHRoaXMgZW50cnkgd2FzIHByb2R1Y2VkIGJ5IFJldmVyc2UsIGluIHdoaWNoIGNhc2UKLy8gaXQgaXMgdGhlIElEIG9mIHRoZSBlbnRyeSBpdCBtaXJyb3JzLgp0eXBlIEVudHJ5IHN0cnVjdCB7CglJRCAgICAgICAgIHVpbnQ2NAoJQXQgICAgICAgICBpbnQ2NAoJTWVtbyAgICAgICBzdHJpbmcKCVBvc3RpbmdzICAgW11Qb3N0aW5nCglSZXZlcnNhbE9mIHVpbnQ2NAp9CgovLyBJc1JldmVyc2FsIHJlcG9ydHMgd2hldGhlciB0aGlzIGVudHJ5IHdhcyBwcm9kdWNlZCBieSBSZXZlcnNlLgpmdW5jIChlIEVudHJ5KSBJc1JldmVyc2FsKCkgYm9vbCB7IHJldHVybiBlLlJldmVyc2FsT2YgIT0gMCB9CgovLyBUb3RhbCByZXR1cm5zIHRoZSBlbnRyeSdzIGRlYml0IHRvdGFsLCB3aGljaCBmb3IgYW55IGVudHJ5IGEgQm9vayBhY2NlcHRlZAovLyBlcXVhbHMgaXRzIGNyZWRpdCB0b3RhbC4KZnVuYyAoZSBFbnRyeSkgVG90YWwoKSBpbnQ2NCB7Cgl2YXIgdCBpbnQ2NAoJZm9yIF8sIHAgOj0gcmFuZ2UgZS5Qb3N0aW5ncyB7CgkJaWYgcC5TaWRlID09IERlYml0IHsKCQkJdCArPSBwLkFtb3VudAoJCX0KCX0KCXJldHVybiB0Cn0KCi8vIEJvb2sgaXMgdGhlIGNoYXJ0IG9mIGFjY291bnRzIGFuZCB0aGUgam91cm5hbCBvZiBvbmUgY29uc3VtaW5nIHJlYWxtLiBUaGUKLy8gemVybyB2YWx1ZSBpcyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcuCnR5cGUgQm9vayBzdHJ1Y3QgewoJbWF4QWNjb3VudHMgaW50CgltYXhFbnRyaWVzICBpbnQKCglhY2NvdW50cyAqYXZsLlRyZWUgLy8gY29kZSAtPiBBY2NvdW50CgllbnRyaWVzICAqYXZsLlRyZWUgLy8gcGFkZGVkIGlkIC0+IEVudHJ5CgkvLyByZXZlcnNlZCBzdG9yZXMgYHRydWVgLCBub3QgYSBzdHJ1Y3R7fSBzZW50aW5lbCwgYW5kIGRlbGliZXJhdGVseToKCS8vIGF2bC5UcmVlLkdldCBjYW5ub3QgdGVsbCBhIG5pbC12YWx1ZWQga2V5IGZyb20gYW4gYWJzZW50IG9uZSwgc28gYQoJLy8gbmlsIHNlbnRpbmVsIGludml0ZXMgYSBmdXR1cmUgcmVhZGVyIHRvIHN3aXRjaCBmcm9tIEhhcyB0byBHZXQgYW5kCgkvLyBnZXQgYSBzaWxlbnRseSB3cm9uZyBhbnN3ZXIuIE1lbWJlcnNoaXAgaXMgdGhlIHdob2xlIHZhbHVlIGhlcmUg4oCUCgkvLyBib3RoIHJlYWRlcnMgdXNlIEhhcyBhbmQgdGhlIHN0b3JlZCB2YWx1ZSBpcyBuZXZlciByZWFkLgoJcmV2ZXJzZWQgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiB0cnVlLCBmb3IgZW50cmllcyBhbHJlYWR5IHJldmVyc2VkCgoJbmV4dElEICAgICAgICB1aW50NjQgLy8gbmV2ZXIgZGVjcmVhc2VzOyBlbnRyeSBJRHMgYXJlIG5ldmVyIHJldXNlZAoJY2xvc2VkVGhyb3VnaCBpbnQ2NCAgLy8gZW50cmllcyBkYXRlZCBhdCBvciBiZWZvcmUgdGhpcyBhcmUgcmVmdXNlZAoJaGFzQ2xvc2VkICAgICBib29sICAgLy8gZGlzdGluZ3Vpc2hlcyAiY2xvc2VkIHRocm91Z2ggMCIgZnJvbSAibmV2ZXIgY2xvc2VkIgoKCXRvdGFsRGViaXRzICBpbnQ2NCAvLyBydW5uaW5nIHRvdGFsLCBtYWludGFpbmVkIGluZGVwZW5kZW50bHkgb2YgYWNjb3VudHMKCXRvdGFsQ3JlZGl0cyBpbnQ2NAp9CgovLyBOZXcgcmV0dXJucyBhbiBlbXB0eSBCb29rLgovLwovLyBtYXhBY2NvdW50cyBjYXBzIHRoZSBjaGFydCBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4QWNjb3VudHNMaW1pdF0uCi8vIG1heEVudHJpZXMgY2FwcyB0aGUgam91cm5hbCBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4RW50cmllc0xpbWl0XTsgYmVjYXVzZQovLyBlbnRyaWVzIGFyZSBuZXZlciByZW1vdmVkLCBpdCBpcyBhIGxpZmV0aW1lIGNhcCByYXRoZXIgdGhhbiBhIGNvbmN1cnJlbnQKLy8gb25lLCBhbmQgYSBCb29rIHRoYXQgcmVhY2hlcyBpdCBpcyBmaW5pc2hlZC4KZnVuYyBOZXcobWF4QWNjb3VudHMsIG1heEVudHJpZXMgaW50KSAoKkJvb2ssIGVycm9yKSB7CglpZiBtYXhBY2NvdW50cyA8IDEgfHwgbWF4QWNjb3VudHMgPiBNYXhBY2NvdW50c0xpbWl0IHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkQ29uZmlnCgl9CglpZiBtYXhFbnRyaWVzIDwgMSB8fCBtYXhFbnRyaWVzID4gTWF4RW50cmllc0xpbWl0IHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkQ29uZmlnCgl9CglyZXR1cm4gJkJvb2t7CgkJbWF4QWNjb3VudHM6IG1heEFjY291bnRzLAoJCW1heEVudHJpZXM6ICBtYXhFbnRyaWVzLAoJCWFjY291bnRzOiAgICBhdmwuTmV3VHJlZSgpLAoJCWVudHJpZXM6ICAgICBhdmwuTmV3VHJlZSgpLAoJCXJldmVyc2VkOiAgICBhdmwuTmV3VHJlZSgpLAoJCW5leHRJRDogICAgICAxLAoJfSwgbmlsCn0KCi8vIE11c3ROZXcgaXMgTmV3IGJ1dCBwYW5pY3Mgb24gZXJyb3IuCmZ1bmMgTXVzdE5ldyhtYXhBY2NvdW50cywgbWF4RW50cmllcyBpbnQpICpCb29rIHsKCWIsIGVyciA6PSBOZXcobWF4QWNjb3VudHMsIG1heEVudHJpZXMpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYgp9CgovLyBNYXhBY2NvdW50cyByZXR1cm5zIHRoZSBCb29rJ3MgY2FwIG9uIGNoYXJ0IHNpemUuCmZ1bmMgKGIgKkJvb2spIE1heEFjY291bnRzKCkgaW50IHsgcmV0dXJuIGIubWF4QWNjb3VudHMgfQoKLy8gTWF4RW50cmllcyByZXR1cm5zIHRoZSBCb29rJ3MgbGlmZXRpbWUgY2FwIG9uIGVudHJpZXMuCmZ1bmMgKGIgKkJvb2spIE1heEVudHJpZXMoKSBpbnQgeyByZXR1cm4gYi5tYXhFbnRyaWVzIH0KCi8vIEFjY291bnRDb3VudCByZXR1cm5zIGhvdyBtYW55IGFjY291bnRzIGFyZSBvcGVuLgpmdW5jIChiICpCb29rKSBBY2NvdW50Q291bnQoKSBpbnQgeyByZXR1cm4gYi5hY2NvdW50cy5TaXplKCkgfQoKLy8gRW50cnlDb3VudCByZXR1cm5zIGhvdyBtYW55IGVudHJpZXMgdGhlIGpvdXJuYWwgaG9sZHMuIEl0IG5ldmVyIGRlY3JlYXNlcy4KZnVuYyAoYiAqQm9vaykgRW50cnlDb3VudCgpIGludCB7IHJldHVybiBiLmVudHJpZXMuU2l6ZSgpIH0KCi8vIE5leHRJRCByZXR1cm5zIHRoZSBpZGVudGlmaWVyIHRoZSBuZXh0IGVudHJ5IHdpbGwgdGFrZS4gSXQgb25seSBldmVyCi8vIGluY3JlYXNlcywgc28gYW4gZW50cnkgSUQgaWRlbnRpZmllcyBvbmUgZW50cnkgZm9yIHRoZSBsaWZlIG9mIHRoZSBCb29rLgpmdW5jIChiICpCb29rKSBOZXh0SUQoKSB1aW50NjQgeyByZXR1cm4gYi5uZXh0SUQgfQoKLy8gVG90YWxEZWJpdHMgcmV0dXJucyB0aGUgQm9vaydzIHJ1bm5pbmcgZGViaXQgdG90YWwgYWNyb3NzIGV2ZXJ5IGVudHJ5LgpmdW5jIChiICpCb29rKSBUb3RhbERlYml0cygpIGludDY0IHsgcmV0dXJuIGIudG90YWxEZWJpdHMgfQoKLy8gVG90YWxDcmVkaXRzIHJldHVybnMgdGhlIEJvb2sncyBydW5uaW5nIGNyZWRpdCB0b3RhbCBhY3Jvc3MgZXZlcnkgZW50cnkuCmZ1bmMgKGIgKkJvb2spIFRvdGFsQ3JlZGl0cygpIGludDY0IHsgcmV0dXJuIGIudG90YWxDcmVkaXRzIH0KCi8vIENsb3NlZFRocm91Z2ggcmV0dXJucyB0aGUgcGVyaW9kIHNlYWw6IGVudHJpZXMgZGF0ZWQgYXQgb3IgYmVmb3JlIGl0IGFyZQovLyByZWZ1c2VkLiBUaGUgc2Vjb25kIHJlc3VsdCBpcyBmYWxzZSBpZiB0aGUgQm9vayBoYXMgbmV2ZXIgYmVlbiBjbG9zZWQsIGluCi8vIHdoaWNoIGNhc2UgdGhlIGZpcnN0IGlzIG1lYW5pbmdsZXNzIOKAlCBhIEJvb2sgY2xvc2VkIHRocm91Z2ggMCBhbmQgYSBCb29rCi8vIG5ldmVyIGNsb3NlZCBkaWZmZXIsIGFuZCBjb2xsYXBzaW5nIHRoZW0gd291bGQgc2lsZW50bHkgcmVqZWN0IGVudHJpZXMKLy8gZGF0ZWQgYXQgMC4KZnVuYyAoYiAqQm9vaykgQ2xvc2VkVGhyb3VnaCgpIChpbnQ2NCwgYm9vbCkgeyByZXR1cm4gYi5jbG9zZWRUaHJvdWdoLCBiLmhhc0Nsb3NlZCB9CgovLyBPcGVuIGFkZHMgYW4gYWNjb3VudCB0byB0aGUgY2hhcnQuIENvZGVzIGFyZSB1bmlxdWUgYW5kIGltbXV0YWJsZTogdGhlcmUKLy8gaXMgbm8gUmVuYW1lIGFuZCBubyBDbG9zZSwgYmVjYXVzZSBhbiBhY2NvdW50J3MgY3VtdWxhdGl2ZSB0b3RhbHMgYXJlIHBhcnQKLy8gb2YgdGhlIGRlcml2YXRpb24gb2YgZXZlcnkgYmFsYW5jZSB0aGF0IGNpdGVzIGl0LCBhbmQgcmVtb3Zpbmcgb25lIHdvdWxkCi8vIG1ha2UgdGhlIGpvdXJuYWwgdW5yZXBsYXlhYmxlLgovLwovLyBGYWlscyB3aXRoIEVyckVtcHR5Q29kZSwgRXJyQ29kZVRvb0xvbmcsIEVyck5hbWVUb29Mb25nLCBFcnJJbnZhbGlkS2luZCwKLy8gRXJyQWNjb3VudEV4aXN0cywgb3IgRXJyQ2hhcnRGdWxsLiBPbiBlcnJvciBub3RoaW5nIGlzIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBPcGVuKGNvZGUsIG5hbWUgc3RyaW5nLCBraW5kIEtpbmQpIGVycm9yIHsKCWlmIGNvZGUgPT0gIiIgewoJCXJldHVybiBFcnJFbXB0eUNvZGUKCX0KCWlmIGxlbihjb2RlKSA+IE1heENvZGVMZW4gewoJCXJldHVybiBFcnJDb2RlVG9vTG9uZwoJfQoJaWYgbGVuKG5hbWUpID4gTWF4TmFtZUxlbiB7CgkJcmV0dXJuIEVyck5hbWVUb29Mb25nCgl9CglpZiAha2luZC5WYWxpZCgpIHsKCQlyZXR1cm4gRXJySW52YWxpZEtpbmQKCX0KCWlmIGIuYWNjb3VudHMuSGFzKGNvZGUpIHsKCQlyZXR1cm4gRXJyQWNjb3VudEV4aXN0cwoJfQoJaWYgYi5hY2NvdW50cy5TaXplKCkgPj0gYi5tYXhBY2NvdW50cyB7CgkJcmV0dXJuIEVyckNoYXJ0RnVsbAoJfQoJYi5hY2NvdW50cy5TZXQoY29kZSwgQWNjb3VudHtDb2RlOiBjb2RlLCBOYW1lOiBuYW1lLCBLaW5kOiBraW5kfSkKCXJldHVybiBuaWwKfQoKLy8gTXVzdE9wZW4gaXMgT3BlbiBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0T3Blbihjb2RlLCBuYW1lIHN0cmluZywga2luZCBLaW5kKSB7CglpZiBlcnIgOj0gYi5PcGVuKGNvZGUsIG5hbWUsIGtpbmQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIEFjY291bnQgcmV0dXJucyBhbiBhY2NvdW50IGJ5IGNvZGUuIFRoZSBzZWNvbmQgcmVzdWx0IGlzIGZhbHNlIGlmIG5vIHN1Y2gKLy8gYWNjb3VudCBpcyBvcGVuLgpmdW5jIChiICpCb29rKSBBY2NvdW50KGNvZGUgc3RyaW5nKSAoQWNjb3VudCwgYm9vbCkgeyByZXR1cm4gYi5hY2NvdW50KGNvZGUpIH0KCi8vIEJhbGFuY2UgcmV0dXJucyBhbiBhY2NvdW50J3MgYmFsYW5jZSBpbiBpdHMgbm9ybWFsIGRpcmVjdGlvbiwgYW5kIHdoZXRoZXIKLy8gdGhlIGFjY291bnQgZXhpc3RzLiBBIG1pc3NpbmcgYWNjb3VudCByZXR1cm5zICgwLCBmYWxzZSkgcmF0aGVyIHRoYW4gYQovLyB6ZXJvIGJhbGFuY2UsIGJlY2F1c2UgIm5vIHN1Y2ggYWNjb3VudCIgYW5kICJiYWxhbmNlIHplcm8iIGFyZSBkaWZmZXJlbnQKLy8gYW5zd2VycyBhbmQgYSBjb25zdW1lciBicmFuY2hpbmcgb24gdGhlIG51bWJlciBhbG9uZSB3b3VsZCBjb25mbGF0ZSB0aGVtLgpmdW5jIChiICpCb29rKSBCYWxhbmNlKGNvZGUgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCWEsIG9rIDo9IGIuYWNjb3VudChjb2RlKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBhLkJhbGFuY2UoKSwgdHJ1ZQp9CgovLyBQb3N0IGFwcGVuZHMgYSBiYWxhbmNlZCBlbnRyeSBhbmQgcmV0dXJucyBpdHMgSUQuCi8vCi8vIFRoZSBwb3N0aW5ncyBtdXN0IG51bWJlciBhdCBsZWFzdCB0d28gYW5kIGF0IG1vc3QgTWF4UG9zdGluZ3NQZXJFbnRyeSwKLy8gZWFjaCBuYW1pbmcgYW4gb3BlbiBhY2NvdW50LCBhIHZhbGlkIFNpZGUsIGFuZCBhIHBvc2l0aXZlIEFtb3VudC4gVGhlCi8vIGVudHJ5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZGViaXQgYW5kIGF0IGxlYXN0IG9uZSBjcmVkaXQsIGFuZCB0aGUgdHdvCi8vIGNvbHVtbiB0b3RhbHMgbXVzdCBiZSBlcXVhbCDigJQgYW4gaW5lcXVhbGl0eSBpcyByZXBvcnRlZCBhcyBFcnJEZWJpdFNob3J0Ci8vIG9yIEVyckNyZWRpdFNob3J0LCBuYW1pbmcgdGhlIGNvbHVtbiB0aGF0IG5lZWRzIG1vcmUuCi8vCi8vIEZhaWxzIHdpdGggRXJySW52YWxpZEF0LCBFcnJNZW1vVG9vTG9uZywgRXJyUGVyaW9kQ2xvc2VkLCBFcnJCb29rRnVsbCwKLy8gRXJySURFeGhhdXN0ZWQsIEVyclRvb0Zld1Bvc3RpbmdzLCBFcnJUb29NYW55UG9zdGluZ3MsIEVyckludmFsaWRTaWRlLAovLyBFcnJJbnZhbGlkQW1vdW50LCBFcnJVbmtub3duQWNjb3VudCwgRXJyTm9EZWJpdCwgRXJyTm9DcmVkaXQsCi8vIEVyckRlYml0U2hvcnQsIEVyckNyZWRpdFNob3J0LCBvciBFcnJPdmVyZmxvdy4gT24gZXJyb3Igbm90aGluZyBpcwovLyBtb2RpZmllZCDigJQgZXZlcnkgcG9zdGluZyBpcyB2YWxpZGF0ZWQgYW5kIGV2ZXJ5IHRvdGFsIGNvbXB1dGVkIGJlZm9yZSB0aGUKLy8gZmlyc3Qgd3JpdGUuCmZ1bmMgKGIgKkJvb2spIFBvc3QoYXQgaW50NjQsIG1lbW8gc3RyaW5nLCBwb3N0aW5ncyBbXVBvc3RpbmcpICh1aW50NjQsIGVycm9yKSB7CglpZiBhdCA8IDAgewoJCXJldHVybiAwLCBFcnJJbnZhbGlkQXQKCX0KCWlmIGxlbihtZW1vKSA+IE1heE1lbW9MZW4gewoJCXJldHVybiAwLCBFcnJNZW1vVG9vTG9uZwoJfQoJaWYgYi5oYXNDbG9zZWQgJiYgYXQgPD0gYi5jbG9zZWRUaHJvdWdoIHsKCQlyZXR1cm4gMCwgRXJyUGVyaW9kQ2xvc2VkCgl9CglyZXR1cm4gYi5wb3N0KGF0LCBtZW1vLCAwLCBwb3N0aW5ncykKfQoKLy8gTXVzdFBvc3QgaXMgUG9zdCBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0UG9zdChhdCBpbnQ2NCwgbWVtbyBzdHJpbmcsIHBvc3RpbmdzIFtdUG9zdGluZykgdWludDY0IHsKCWlkLCBlcnIgOj0gYi5Qb3N0KGF0LCBtZW1vLCBwb3N0aW5ncykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBpZAp9CgovLyBSZXZlcnNlIGFwcGVuZHMgdGhlIG1pcnJvciBvZiBhbiBleGlzdGluZyBlbnRyeSDigJQgZXZlcnkgcG9zdGluZyByZXBlYXRlZAovLyBvbiB0aGUgb3Bwb3NpdGUgc2lkZSwgZm9yIHRoZSBzYW1lIGFtb3VudCDigJQgYW5kIHJldHVybnMgdGhlIG5ldyBlbnRyeSdzCi8vIElELiBUaGUgb3JpZ2luYWwgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhcy4KLy8KLy8gQW4gZW50cnkgbWF5IGJlIHJldmVyc2VkIGF0IG1vc3Qgb25jZS4gUmV2ZXJzaW5nIGEgcmV2ZXJzYWwgSVMgcGVybWl0dGVkCi8vIChpdCByZS1hcHBsaWVzIHRoZSBvcmlnaW5hbCdzIGVmZmVjdCkgYW5kIGlzIGl0c2VsZiBzdWJqZWN0IHRvIHRoZSBzYW1lCi8vIG9uY2Utb25seSBydWxlLCBzbyBhIGNvcnJlY3Rpb24gY2Fubm90IGJlIGxvb3BlZC4KLy8KLy8gYGF0YCBkYXRlcyB0aGUgY29ycmVjdGlvbiBhbmQgbXVzdCBiZSBpbiB0aGUgb3BlbiBwZXJpb2Q6IGEgc2VhbGVkIHBlcmlvZAovLyBjYW5ub3QgYmUgY29ycmVjdGVkIGluIHBsYWNlLCBieSBjb25zdHJ1Y3Rpb24uIENvcnJlY3Rpbmcgb25lIG1lYW5zCi8vIHBvc3RpbmcgaW50byB0aGUgY3VycmVudCBwZXJpb2QsIHdoaWNoIGlzIHRoZSBjb25zdW1lcidzIGRlY2lzaW9uIHRvIG1ha2UKLy8gZXhwbGljaXRseSByYXRoZXIgdGhhbiB0aGlzIHBhY2thZ2UncyB0byBtYWtlIHNpbGVudGx5LgovLwovLyBGYWlscyB3aXRoIEVyckludmFsaWRBdCwgRXJyTWVtb1Rvb0xvbmcsIEVyclBlcmlvZENsb3NlZCwKLy8gRXJyRW50cnlOb3RGb3VuZCwgRXJyQWxyZWFkeVJldmVyc2VkLCBFcnJCb29rRnVsbCwgRXJySURFeGhhdXN0ZWQsIG9yCi8vIEVyck92ZXJmbG93LiBPbiBlcnJvciBub3RoaW5nIGlzIG1vZGlmaWVkLgpmdW5jIChiICpCb29rKSBSZXZlcnNlKGlkIHVpbnQ2NCwgYXQgaW50NjQsIG1lbW8gc3RyaW5nKSAodWludDY0LCBlcnJvcikgewoJaWYgYXQgPCAwIHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZEF0Cgl9CglpZiBsZW4obWVtbykgPiBNYXhNZW1vTGVuIHsKCQlyZXR1cm4gMCwgRXJyTWVtb1Rvb0xvbmcKCX0KCWlmIGIuaGFzQ2xvc2VkICYmIGF0IDw9IGIuY2xvc2VkVGhyb3VnaCB7CgkJcmV0dXJuIDAsIEVyclBlcmlvZENsb3NlZAoJfQoJb3JpZywgb2sgOj0gYi5lbnRyeShpZCkKCWlmICFvayB7CgkJcmV0dXJuIDAsIEVyckVudHJ5Tm90Rm91bmQKCX0KCWlmIGIucmV2ZXJzZWQuSGFzKGlkS2V5KGlkKSkgewoJCXJldHVybiAwLCBFcnJBbHJlYWR5UmV2ZXJzZWQKCX0KCgltaXJyb3IgOj0gbWFrZShbXVBvc3RpbmcsIGxlbihvcmlnLlBvc3RpbmdzKSkKCWZvciBpLCBwIDo9IHJhbmdlIG9yaWcuUG9zdGluZ3MgewoJCW1pcnJvcltpXSA9IFBvc3Rpbmd7QWNjb3VudDogcC5BY2NvdW50LCBTaWRlOiBwLlNpZGUuT3Bwb3NpdGUoKSwgQW1vdW50OiBwLkFtb3VudH0KCX0KCgluZXdJRCwgZXJyIDo9IGIucG9zdChhdCwgbWVtbywgaWQsIG1pcnJvcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCS8vIE1hcmtlZCBvbmx5IGFmdGVyIHBvc3Qgc3VjY2VlZGVkLCBzbyBhIHJlZnVzZWQgcmV2ZXJzYWwgZG9lcyBub3QKCS8vIGNvbnN1bWUgdGhlIG9yaWdpbmFsJ3Mgc2luZ2xlIHJldmVyc2FsLgoJYi5yZXZlcnNlZC5TZXQoaWRLZXkoaWQpLCB0cnVlKQoJcmV0dXJuIG5ld0lELCBuaWwKfQoKLy8gTXVzdFJldmVyc2UgaXMgUmV2ZXJzZSBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0UmV2ZXJzZShpZCB1aW50NjQsIGF0IGludDY0LCBtZW1vIHN0cmluZykgdWludDY0IHsKCW5ld0lELCBlcnIgOj0gYi5SZXZlcnNlKGlkLCBhdCwgbWVtbykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXJldHVybiBuZXdJRAp9CgovLyBJc1JldmVyc2VkIHJlcG9ydHMgd2hldGhlciBhbiBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2VkLiBJdCByZXR1cm5zCi8vIGZhbHNlIGZvciBhbiBlbnRyeSB0aGF0IGRvZXMgbm90IGV4aXN0LCBzbyBwYWlyIGl0IHdpdGggRW50cnkgd2hlbiB0aGUKLy8gZGlzdGluY3Rpb24gbWF0dGVycy4KZnVuYyAoYiAqQm9vaykgSXNSZXZlcnNlZChpZCB1aW50NjQpIGJvb2wgeyByZXR1cm4gYi5yZXZlcnNlZC5IYXMoaWRLZXkoaWQpKSB9CgovLyBDbG9zZSBzZWFscyB0aGUgcGVyaW9kIGVuZGluZyBhdCBgdGhyb3VnaGAsIGFmdGVyIHdoaWNoIFBvc3QgYW5kIFJldmVyc2UKLy8gcmVmdXNlIGFueSBlbnRyeSBkYXRlZCBhdCBvciBiZWZvcmUgaXQuCi8vCi8vIEl0IG9ubHkgbW92ZXMgZm9yd2FyZC4gQSBmaXJzdCBjbG9zZSBtYXkgbmFtZSBhbnkgbm9uLW5lZ2F0aXZlIGluc3RhbnQ7IGEKLy8gbGF0ZXIgb25lIG11c3QgbmFtZSBhIHN0cmljdGx5IGdyZWF0ZXIgaW5zdGFudCwgc28gYSBzZWFsIGNhbiBuZXZlciBiZQovLyBsb29zZW5lZCBhbmQgYmFja2RhdGluZyBjYW4gbmV2ZXIgYmUgcmUtZW5hYmxlZC4KLy8KLy8gRmFpbHMgd2l0aCBFcnJJbnZhbGlkQXQgKHRocm91Z2ggPCAwKSBvciBFcnJDbG9zZU5vdEZvcndhcmQuIE9uIGVycm9yCi8vIG5vdGhpbmcgaXMgbW9kaWZpZWQuCmZ1bmMgKGIgKkJvb2spIENsb3NlKHRocm91Z2ggaW50NjQpIGVycm9yIHsKCWlmIHRocm91Z2ggPCAwIHsKCQlyZXR1cm4gRXJySW52YWxpZEF0Cgl9CglpZiBiLmhhc0Nsb3NlZCAmJiB0aHJvdWdoIDw9IGIuY2xvc2VkVGhyb3VnaCB7CgkJcmV0dXJuIEVyckNsb3NlTm90Rm9yd2FyZAoJfQoJYi5jbG9zZWRUaHJvdWdoID0gdGhyb3VnaAoJYi5oYXNDbG9zZWQgPSB0cnVlCglyZXR1cm4gbmlsCn0KCi8vIE11c3RDbG9zZSBpcyBDbG9zZSBidXQgcGFuaWNzIG9uIGVycm9yLgpmdW5jIChiICpCb29rKSBNdXN0Q2xvc2UodGhyb3VnaCBpbnQ2NCkgewoJaWYgZXJyIDo9IGIuQ2xvc2UodGhyb3VnaCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gRW50cnkgcmV0dXJucyBhbiBlbnRyeSBieSBJRCwgd2l0aCBhIGRlZmVuc2l2ZSBjb3B5IG9mIGl0cyBwb3N0aW5ncy4gVGhlCi8vIHNlY29uZCByZXN1bHQgaXMgZmFsc2UgaWYgbm8gc3VjaCBlbnRyeSBleGlzdHMg4oCUIHdoaWNoLCBiZWNhdXNlIGVudHJpZXMKLy8gYXJlIG5ldmVyIHJlbW92ZWQsIG1lYW5zIGl0IHdhcyBuZXZlciBjcmVhdGVkLgpmdW5jIChiICpCb29rKSBFbnRyeShpZCB1aW50NjQpIChFbnRyeSwgYm9vbCkgewoJZSwgb2sgOj0gYi5lbnRyeShpZCkKCWlmICFvayB7CgkJcmV0dXJuIEVudHJ5e30sIGZhbHNlCgl9CglyZXR1cm4gZS53aXRoQ29waWVkUG9zdGluZ3MoKSwgdHJ1ZQp9CgovLyBJc0JhbGFuY2VkIHJlcG9ydHMgd2hldGhlciB0aGUgQm9vaydzIHR3byBpbmRlcGVuZGVudGx5LW1haW50YWluZWQKLy8gYWNjdW11bGF0b3JzIGFncmVlIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCB0aGVtc2VsdmVzLgovLwovLyBJdCBzY2FucyB0aGUgY2hhcnQsIHN1bXMgZXZlcnkgYWNjb3VudCdzIGRlYml0IGFuZCBjcmVkaXQgdG90YWxzLCBhbmQKLy8gcmVxdWlyZXMgdGhhdCB0aGUgdHdvIHN1bXMgYXJlIGVxdWFsIEFORCB0aGF0IGVhY2ggbWF0Y2hlcyB0aGUgQm9vaydzIG93bgovLyBydW5uaW5nIHRvdGFsLiBUaG9zZSB0b3RhbHMgYXJlIHdyaXR0ZW4gYnkgZGlmZmVyZW50IGNvZGUgaW4gUG9zdCwgc28gYQovLyBkaXNhZ3JlZW1lbnQgaXMgYSBkZWZlY3QgaW4gdGhpcyBwYWNrYWdlIGFuZCBJc0JhbGFuY2VkIGlzIGhvdyBhIGNvbnN1bWVyCi8vIGRldGVjdHMgb25lLgovLwovLyBXaGF0IGl0IGRvZXMgbm90IGRvIGlzIHJlLXJlYWQgdGhlIGpvdXJuYWwuIFJlYWQgdGhlIHBhY2thZ2UgZG9jJ3MKLy8gIldoYXQgYmFsYW5jZWQgaXMgYWN0dWFsbHkgd29ydGgiIGJlZm9yZSBxdW90aW5nIGl0LCBhbmQgdXNlCi8vIFJlZGVyaXZlRnJvbUpvdXJuYWwgZm9yIHRoZSBzdHJvbmcgY2xhaW0uCi8vCi8vIEFuIGVtcHR5IEJvb2sgaXMgYmFsYW5jZWQuCmZ1bmMgKGIgKkJvb2spIElzQmFsYW5jZWQoKSBib29sIHsKCWQsIGMsIG9rIDo9IGIuc3VtQWNjb3VudHMoKQoJaWYgIW9rIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiBkID09IGMgJiYgZCA9PSBiLnRvdGFsRGViaXRzICYmIGMgPT0gYi50b3RhbENyZWRpdHMKfQoKLy8gUmVkZXJpdmVGcm9tSm91cm5hbCByZXBsYXlzIGV2ZXJ5IHBvc3Rpbmcgb2YgZXZlcnkgZW50cnkgYW5kIHJlcG9ydHMgdGhlCi8vIGRlYml0IGFuZCBjcmVkaXQgdG90YWxzIGl0IGZpbmRzLCB0b2dldGhlciB3aXRoIHdoZXRoZXIgdGhleSBhZ3JlZSB3aXRoCi8vIGJvdGggdGhlIHBlci1hY2NvdW50IGFjY3VtdWxhdG9ycyBhbmQgdGhlIEJvb2sncyBydW5uaW5nIHRvdGFscy4KLy8KLy8gVGhpcyBpcyB0aGUgc3Ryb25nIGNoZWNrIGFuZCB0aGUgZXhwZW5zaXZlIG9uZTogaXRzIGNvc3QgaXMgcHJvcG9ydGlvbmFsCi8vIHRvIGV2ZXJ5IHBvc3RpbmcgZXZlciBtYWRlLCBzbyBpdCBpcyBtZWFudCB0byBiZSBjYWxsZWQgZGVsaWJlcmF0ZWx5IOKAlCBieQovLyBhbiBhdWRpdG9yLCBvciBieSBhIGNvbnN1bWVyJ3Mgb3duIGludmFyaWFudCB2aWV3IOKAlCBhbmQgbm90IGZyb20gYSBob3QKLy8gcGF0aC4gYGFncmVlc2AgZmFsc2Ugb24gYSBCb29rIHRoaXMgcGFja2FnZSBidWlsdCBpcyBhIGRlZmVjdCBpbiB0aGlzCi8vIHBhY2thZ2UuCmZ1bmMgKGIgKkJvb2spIFJlZGVyaXZlRnJvbUpvdXJuYWwoKSAoZGViaXRzLCBjcmVkaXRzIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJdmFyIGQsIGMgaW50NjQKCW9rTWF0aCA6PSB0cnVlCgliLmVudHJpZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJZSA6PSB2YWx1ZS4oRW50cnkpCgkJZm9yIF8sIHAgOj0gcmFuZ2UgZS5Qb3N0aW5ncyB7CgkJCXZhciBvayBib29sCgkJCWlmIHAuU2lkZSA9PSBEZWJpdCB7CgkJCQlkLCBvayA9IGNoZWNrZWRBZGQoZCwgcC5BbW91bnQpCgkJCX0gZWxzZSB7CgkJCQljLCBvayA9IGNoZWNrZWRBZGQoYywgcC5BbW91bnQpCgkJCX0KCQkJaWYgIW9rIHsKCQkJCW9rTWF0aCA9IGZhbHNlCgkJCQlyZXR1cm4gdHJ1ZQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCWlmICFva01hdGggewoJCXJldHVybiAwLCAwLCBmYWxzZQoJfQoJc2QsIHNjLCBva1N1bSA6PSBiLnN1bUFjY291bnRzKCkKCWFncmVlcyA9IG9rU3VtICYmCgkJZCA9PSBjICYmCgkJZCA9PSBiLnRvdGFsRGViaXRzICYmIGMgPT0gYi50b3RhbENyZWRpdHMgJiYKCQlkID09IHNkICYmIGMgPT0gc2MKCXJldHVybiBkLCBjLCBhZ3JlZXMKfQoKLy8gQWNjb3VudGluZ0VxdWF0aW9uIHJldHVybnMgdGhlIHR3byBoYWx2ZXMgb2YgYXNzZXRzK2V4cGVuc2VzIHZlcnN1cwovLyBsaWFiaWxpdGllcytlcXVpdHkrcmV2ZW51ZSwgaW4gUkFXIGRlYml0LW1pbnVzLWNyZWRpdCB0ZXJtcywgYW5kIHdoZXRoZXIKLy8gdGhleSBvZmZzZXQuCi8vCi8vIElUIElTIFdFQUtFUiBUSEFOIElUIExPT0tTLCBhbmQgd2Vha2VyIHRoYW4gdGhpcyBkb2MgdXNlZCB0byBjbGFpbS4KLy8KLy8gV2hhdCBvZmZzZXRzIEFDVFVBTExZIHByb3Zlczogc3VtKFJhd0RlbHRhKSA9PSAwIG92ZXIgdGhlIHdob2xlIGNoYXJ0LAovLyB3aGljaCBpcyB0aGUgc2FtZSBmYWN0IGFzIElzQmFsYW5jZWQncyBmaXJzdCBjb25qdW5jdCAoZCA9PSBjKSBhbmQKLy8gbm90aGluZyBtb3JlLiBJc0JhbGFuY2VkIHJlcXVpcmVzIHRocmVlLiBTbyB0aGlzIGlzIGltcGxpZWQgYnkKLy8gSXNCYWxhbmNlZCwgaXMgTk9UIGFuIGluZGVwZW5kZW50IGFjY291bnRpbmcgZmFjdCwgYW5kIGNpdGluZyBpdCBhcyBhCi8vIHNlY29uZCBndWFyYW50ZWUgYWxvbmdzaWRlIElzQmFsYW5jZWQgaXMgY291bnRpbmcgb25lIGNoZWNrIHR3aWNlLgovLwovLyBXaGF0IG9mZnNldHMgRE9FUyBOT1QgcHJvdmUsIGRlc3BpdGUgdGhlIEtpbmQgcGFydGl0aW9uIHNpdHRpbmcgcmlnaHQKLy8gdGhlcmUgaW4gdGhlIGNvZGU6IGFueXRoaW5nIHdoYXRzb2V2ZXIgYWJvdXQgbm9ybWFsLWJhbGFuY2UgaGFuZGxpbmcuCi8vIGRuIGFuZCBjbiBhcmUgYSBwYXJ0aXRpb24gb2YgdGhlIHNhbWUgYWRkZW5kcywgc28gZG4rY24gaXMgdGhlIHRvdGFsCi8vIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYnVja2V0IGVhY2ggYWNjb3VudCBsYW5kZWQgaW4uIFJlY2xhc3NpZnkgZXZlcnkKLy8gYWNjb3VudCBpbiB0aGUgY2hhcnQgYW5kIEJPVEggc3VidG90YWxzIGNoYW5nZSB3aGlsZSBvZmZzZXRzIHN0YXlzCi8vIHRydWUuIEEgS2luZCBzZXQgd3JvbmdseSBhdCBPcGVuIHRpbWUgaXMgdW5kZXRlY3RhYmxlIGhlcmUgYW5kCi8vIHVuZGV0ZWN0YWJsZSBhbnl3aGVyZSBlbHNlIGluIHRoaXMgcGFja2FnZSDigJQgb2JsaWdhdGlvbiA3LgovLwovLyBJdCBpcyBleHBvcnRlZCBiZWNhdXNlIHRoZSB0d28gU1VCVE9UQUxTIGFyZSBjb3JyZWN0IGFuZCBhIGNvbnN1bWVyCi8vIHByZXNlbnRpbmcgYSBiYWxhbmNlIHNoZWV0IHdhbnRzIHRoZW0gYW55d2F5LiBUaGV5IGFyZSB0aGUgcHJvZHVjdDsKLy8gb2Zmc2V0cyBpcyBhIGR1cGxpY2F0ZSBvZiBhIGNoZWNrIHlvdSBhbHJlYWR5IGhhdmUuCmZ1bmMgKGIgKkJvb2spIEFjY291bnRpbmdFcXVhdGlvbigpIChkZWJpdE5vcm1hbCwgY3JlZGl0Tm9ybWFsIGludDY0LCBvZmZzZXRzIGJvb2wpIHsKCXZhciBkbiwgY24gaW50NjQKCW9rTWF0aCA6PSB0cnVlCgliLmFjY291bnRzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWEgOj0gdmFsdWUuKEFjY291bnQpCgkJdmFyIG9rIGJvb2wKCQlpZiBhLktpbmQuSXNEZWJpdE5vcm1hbCgpIHsKCQkJZG4sIG9rID0gY2hlY2tlZEFkZChkbiwgYS5SYXdEZWx0YSgpKQoJCX0gZWxzZSB7CgkJCWNuLCBvayA9IGNoZWNrZWRBZGQoY24sIGEuUmF3RGVsdGEoKSkKCQl9CgkJaWYgIW9rIHsKCQkJb2tNYXRoID0gZmFsc2UKCQkJcmV0dXJuIHRydWUKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgIW9rTWF0aCB7CgkJcmV0dXJuIDAsIDAsIGZhbHNlCgl9CglzdW0sIG9rIDo9IGNoZWNrZWRBZGQoZG4sIGNuKQoJcmV0dXJuIGRuLCBjbiwgb2sgJiYgc3VtID09IDAKfQoKLy8gSXRlcmF0ZUFjY291bnRzIGNhbGxzIGZuIGZvciBldmVyeSBhY2NvdW50IGluIGFzY2VuZGluZyBjb2RlIG9yZGVyLgovLyBJdGVyYXRpb24gc3RvcHMgZWFybHkgd2hlbiBmbiByZXR1cm5zIHRydWUuCi8vCi8vIGZuIHJlY2VpdmVzIGEgQ09QWTogQWNjb3VudCBpcyBwYXNzZWQgYnkgdmFsdWUgYW5kIGhvbGRzIG9ubHkgc2NhbGFycyBhbmQKLy8gc3RyaW5ncywgc28gZm4gZ2V0cyBubyBwb2ludGVyIGludG8gdGhlIEJvb2suCi8vCi8vIFR3byBydWxlcyBmb3IgZm4sIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3MuCi8vCi8vICAgLSBEbyBub3QgT3BlbiwgUG9zdCwgUmV2ZXJzZSBvciBDbG9zZSBmcm9tIGluc2lkZSBmbjogbXV0YXRpbmcgYSB0cmVlCi8vICAgICB3aGlsZSBpdGVyYXRpbmcgaXQgaXMgdW5kZWZpbmVkLiBDb2xsZWN0IHdoYXQgeW91IG5lZWQgZmlyc3QsIHRoZW4gYWN0Ci8vICAgICBhZnRlciBJdGVyYXRlQWNjb3VudHMgcmV0dXJucy4KLy8KLy8gICAtIGZuIHJ1bnMgdW5kZXIgdGhlIENBTExJTkcgUkVBTE0nUyBTVE9SQUdFIEFVVEhPUklUWS4gVGhpcyBtZXRob2QncwovLyAgICAgcmVjZWl2ZXIgaXMgc3RhbXBlZCB3aXRoIHRoZSBpbXBvcnRpbmcgcmVhbG0ncyBQa2dJRCwgc28gdGhlIGJvcnJvdwovLyAgICAgcnVsZXMgbGVhdmUgdGhlIHJlYWxtIGNvbnRleHQgc2V0IHRvIHRoYXQgcmVhbG0gZm9yIHRoZSB3aG9sZQovLyAgICAgY2FsbGJhY2ssIGFuZCBhIHRvcC1sZXZlbCBmbiBoYXMgbm8gcmVjZWl2ZXIgYW5kIG5vIGRlY2xhcmluZyByZWFsbSB0bwovLyAgICAgYW5jaG9yIGl0IGVsc2V3aGVyZS4gQSBjYWxsYmFjayB0aGF0IHJlLWVudGVycyB0aGUgY2FsbGluZyByZWFsbSdzIG93bgovLyAgICAgbXV0YXRvcnMgdGhlcmVmb3JlIGRvZXMgc28gd2l0aCB0aGF0IHJlYWxtJ3MgYXV0aG9yaXR5LiBOZXZlciBwYXNzIGEKLy8gICAgIGNhbGxlci1zdXBwbGllZCBmdW5jdGlvbiBoZXJlIGZyb20gaW5zaWRlIGEgcGVybWlzc2lvbi1nYXRlZCBwYXRoOwovLyAgICAgcGFzcyBvbmx5IGEgY2xvc3VyZSB0aGlzIHBhY2thZ2UncyBjb25zdW1lciB3cm90ZSBpdHNlbGYuCmZ1bmMgKGIgKkJvb2spIEl0ZXJhdGVBY2NvdW50cyhmbiBmdW5jKEFjY291bnQpIGJvb2wpIHsKCWIuYWNjb3VudHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGZuKHZhbHVlLihBY2NvdW50KSkKCX0pCn0KCi8vIEl0ZXJhdGVFbnRyaWVzIGNhbGxzIGZuIGZvciBldmVyeSBlbnRyeSBpbiBhc2NlbmRpbmcgSUQgb3JkZXIsIHdoaWNoIGZvcgovLyBhbiBhcHBlbmQtb25seSBqb3VybmFsIGlzIGFsc28gY2hyb25vbG9naWNhbCBieSBpbnNlcnRpb24uIEl0ZXJhdGlvbiBzdG9wcwovLyBlYXJseSB3aGVuIGZuIHJldHVybnMgdHJ1ZS4KLy8KLy8gZm4gcmVjZWl2ZXMgYW4gRW50cnkgd2hvc2UgUG9zdGluZ3Mgc2xpY2UgaXMgYSBERUZFTlNJVkUgQ09QWSwgc28gYQovLyBjYWxsYmFjayBjYW5ub3Qgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIEJvb2sgc3RhdGUuIFRoZSB0d28gcnVsZXMgb24KLy8gSXRlcmF0ZUFjY291bnRzJ3MgZm4gYXBwbHkgaGVyZSB1bmNoYW5nZWQsIGluY2x1ZGluZyB0aGUgc3RvcmFnZS1hdXRob3JpdHkKLy8gb25lLgpmdW5jIChiICpCb29rKSBJdGVyYXRlRW50cmllcyhmbiBmdW5jKEVudHJ5KSBib29sKSB7CgliLmVudHJpZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGZuKHZhbHVlLihFbnRyeSkud2l0aENvcGllZFBvc3RpbmdzKCkpCgl9KQp9CgovLyBFbnRyaWVzIHJldHVybnMgdXAgdG8gbGltaXQgZW50cmllcyB3aXRoIElEID49IGZyb20sIGluIGFzY2VuZGluZyBJRAovLyBvcmRlciwgZWFjaCB3aXRoIGEgZGVmZW5zaXZlIGNvcHkgb2YgaXRzIHBvc3RpbmdzLiBBIGxpbWl0IDw9IDAgcmV0dXJucwovLyBub3RoaW5nLiBJdCBpcyB0aGUgcGFnaW5nIHJlYWQgZm9yIGEgY29uc3VtZXIgdGhhdCBjYW5ub3QgaG9sZCB0aGUgd2hvbGUKLy8gam91cm5hbCBpbiBvbmUgY2FsbC4KZnVuYyAoYiAqQm9vaykgRW50cmllcyhmcm9tIHVpbnQ2NCwgbGltaXQgaW50KSBbXUVudHJ5IHsKCW91dCA6PSBbXUVudHJ5e30KCWlmIGxpbWl0IDw9IDAgewoJCXJldHVybiBvdXQKCX0KCWIuZW50cmllcy5JdGVyYXRlKGlkS2V5KGZyb20pLCAiIiwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlvdXQgPSBhcHBlbmQob3V0LCB2YWx1ZS4oRW50cnkpLndpdGhDb3BpZWRQb3N0aW5ncygpKQoJCXJldHVybiBsZW4ob3V0KSA+PSBsaW1pdAoJfSkKCXJldHVybiBvdXQKfQoKLy8gcG9zdCBpcyB0aGUgc2hhcmVkIGJvZHkgb2YgUG9zdCBhbmQgUmV2ZXJzZS4gQ2FsbGVycyBoYXZlIGFscmVhZHkKLy8gdmFsaWRhdGVkIGBhdGAsIHRoZSBtZW1vLCBhbmQgdGhlIHBlcmlvZCBzZWFsOyByZXZlcnNhbE9mIGlzIDAgZm9yIGFuCi8vIG9yaWdpbmFsIGVudHJ5LiBJdCB2YWxpZGF0ZXMgZXZlcnkgcG9zdGluZyBhbmQgY29tcHV0ZXMgYm90aCB0b3RhbHMgYmVmb3JlCi8vIHdyaXRpbmcgYW55dGhpbmcuCmZ1bmMgKGIgKkJvb2spIHBvc3QoYXQgaW50NjQsIG1lbW8gc3RyaW5nLCByZXZlcnNhbE9mIHVpbnQ2NCwgcG9zdGluZ3MgW11Qb3N0aW5nKSAodWludDY0LCBlcnJvcikgewoJaWYgbGVuKHBvc3RpbmdzKSA8IDIgewoJCXJldHVybiAwLCBFcnJUb29GZXdQb3N0aW5ncwoJfQoJaWYgbGVuKHBvc3RpbmdzKSA+IE1heFBvc3RpbmdzUGVyRW50cnkgewoJCXJldHVybiAwLCBFcnJUb29NYW55UG9zdGluZ3MKCX0KCWlmIGIuZW50cmllcy5TaXplKCkgPj0gYi5tYXhFbnRyaWVzIHsKCQlyZXR1cm4gMCwgRXJyQm9va0Z1bGwKCX0KCWlmIGIubmV4dElEID09IDAgewoJCXJldHVybiAwLCBFcnJJREV4aGF1c3RlZAoJfQoKCXZhciBkZWJpdHMsIGNyZWRpdHMgaW50NjQKCXNhd0RlYml0LCBzYXdDcmVkaXQgOj0gZmFsc2UsIGZhbHNlCglmb3IgXywgcCA6PSByYW5nZSBwb3N0aW5ncyB7CgkJaWYgIXAuU2lkZS5WYWxpZCgpIHsKCQkJcmV0dXJuIDAsIEVyckludmFsaWRTaWRlCgkJfQoJCWlmIHAuQW1vdW50IDw9IDAgewoJCQlyZXR1cm4gMCwgRXJySW52YWxpZEFtb3VudAoJCX0KCQlpZiAhYi5hY2NvdW50cy5IYXMocC5BY2NvdW50KSB7CgkJCXJldHVybiAwLCBFcnJVbmtub3duQWNjb3VudAoJCX0KCQl2YXIgb2sgYm9vbAoJCWlmIHAuU2lkZSA9PSBEZWJpdCB7CgkJCXNhd0RlYml0ID0gdHJ1ZQoJCQlkZWJpdHMsIG9rID0gY2hlY2tlZEFkZChkZWJpdHMsIHAuQW1vdW50KQoJCX0gZWxzZSB7CgkJCXNhd0NyZWRpdCA9IHRydWUKCQkJY3JlZGl0cywgb2sgPSBjaGVja2VkQWRkKGNyZWRpdHMsIHAuQW1vdW50KQoJCX0KCQlpZiAhb2sgewoJCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCQl9Cgl9CglpZiAhc2F3RGViaXQgewoJCXJldHVybiAwLCBFcnJOb0RlYml0Cgl9CglpZiAhc2F3Q3JlZGl0IHsKCQlyZXR1cm4gMCwgRXJyTm9DcmVkaXQKCX0KCWlmIGRlYml0cyA8IGNyZWRpdHMgewoJCXJldHVybiAwLCBFcnJEZWJpdFNob3J0Cgl9CglpZiBjcmVkaXRzIDwgZGViaXRzIHsKCQlyZXR1cm4gMCwgRXJyQ3JlZGl0U2hvcnQKCX0KCgkvLyBCb29rLWxldmVsIHJ1bm5pbmcgdG90YWxzLCBjaGVja2VkIGJlZm9yZSBhbnkgYWNjb3VudCBpcyB0b3VjaGVkLgoJbmV3VG90YWxEZWJpdHMsIG9rIDo9IGNoZWNrZWRBZGQoYi50b3RhbERlYml0cywgZGViaXRzKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCX0KCW5ld1RvdGFsQ3JlZGl0cywgb2sgOj0gY2hlY2tlZEFkZChiLnRvdGFsQ3JlZGl0cywgY3JlZGl0cykKCWlmICFvayB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CgoJLy8gUGVyLWFjY291bnQgYWNjdW11bGF0b3JzLCBhbGwgY29tcHV0ZWQgaW50byBhIHN0YWdpbmcgbGlzdCBiZWZvcmUgdGhlCgkvLyBmaXJzdCBTZXQsIHNvIGFuIG92ZXJmbG93IG9uIHRoZSBsYXN0IHBvc3RpbmcgbGVhdmVzIG5vdGhpbmcgd3JpdHRlbi4KCXN0YWdlZCA6PSBtYWtlKFtdQWNjb3VudCwgbGVuKHBvc3RpbmdzKSkKCWZvciBpLCBwIDo9IHJhbmdlIHBvc3RpbmdzIHsKCQlhLCBmb3VuZCA6PSBiLmFjY291bnQocC5BY2NvdW50KQoJCWlmICFmb3VuZCB7CgkJCS8vIFVucmVhY2hhYmxlOiBIYXMoKSBzdWNjZWVkZWQgYWJvdmUgYW5kIG5vdGhpbmcgaGFzIGJlZW4KCQkJLy8gd3JpdHRlbiBzaW5jZS4gUmVmdXNlZCByYXRoZXIgdGhhbiBpZ25vcmVkLCBiZWNhdXNlIGEgc2lsZW50CgkJCS8vIHplcm8gQWNjb3VudCBoZXJlIHdvdWxkIGNvcnJ1cHQgdGhlIGNoYXJ0LgoJCQlyZXR1cm4gMCwgRXJyVW5rbm93bkFjY291bnQKCQl9CgkJLy8gRm9sZCBlYXJsaWVyIHN0YWdpbmdzIG9mIHRoZSBzYW1lIGFjY291bnQsIHNvIGFuIGVudHJ5IHRoYXQgcG9zdHMKCQkvLyB0byBvbmUgYWNjb3VudCB0d2ljZSBhY2N1bXVsYXRlcyBib3RoIGxlZ3MgaW5zdGVhZCBvZiB0aGUgc2Vjb25kCgkJLy8gc3RhZ2luZyBvdmVyd3JpdGluZyB0aGUgZmlyc3QuCgkJZm9yIGogOj0gMDsgaiA8IGk7IGorKyB7CgkJCWlmIHN0YWdlZFtqXS5Db2RlID09IHAuQWNjb3VudCB7CgkJCQlhID0gc3RhZ2VkW2pdCgkJCX0KCQl9CgkJdmFyIG9rQWNjIGJvb2wKCQlpZiBwLlNpZGUgPT0gRGViaXQgewoJCQlhLkRlYml0cywgb2tBY2MgPSBjaGVja2VkQWRkKGEuRGViaXRzLCBwLkFtb3VudCkKCQl9IGVsc2UgewoJCQlhLkNyZWRpdHMsIG9rQWNjID0gY2hlY2tlZEFkZChhLkNyZWRpdHMsIHAuQW1vdW50KQoJCX0KCQlpZiAhb2tBY2MgewoJCQlyZXR1cm4gMCwgRXJyT3ZlcmZsb3cKCQl9CgkJc3RhZ2VkW2ldID0gYQoJfQoKCS8vIFBhc3QgaGVyZSBub3RoaW5nIGNhbiBmYWlsLgoJaWQgOj0gYi5uZXh0SUQKCWIubmV4dElEKysKCXN0b3JlZCA6PSBtYWtlKFtdUG9zdGluZywgbGVuKHBvc3RpbmdzKSkKCWNvcHkoc3RvcmVkLCBwb3N0aW5ncykKCWIuZW50cmllcy5TZXQoaWRLZXkoaWQpLCBFbnRyeXsKCQlJRDogICAgICAgICBpZCwKCQlBdDogICAgICAgICBhdCwKCQlNZW1vOiAgICAgICBtZW1vLAoJCVBvc3RpbmdzOiAgIHN0b3JlZCwKCQlSZXZlcnNhbE9mOiByZXZlcnNhbE9mLAoJfSkKCWZvciBfLCBhIDo9IHJhbmdlIHN0YWdlZCB7CgkJYi5hY2NvdW50cy5TZXQoYS5Db2RlLCBhKQoJfQoJYi50b3RhbERlYml0cyA9IG5ld1RvdGFsRGViaXRzCgliLnRvdGFsQ3JlZGl0cyA9IG5ld1RvdGFsQ3JlZGl0cwoJcmV0dXJuIGlkLCBuaWwKfQoKLy8gc3VtQWNjb3VudHMgdG90YWxzIGV2ZXJ5IGFjY291bnQncyBkZWJpdCBhbmQgY3JlZGl0IGNvbHVtbnMuIFRoZSBib29sIGlzCi8vIGZhbHNlIG9uIG92ZXJmbG93LCB3aGljaCBpcyB3aHkgY2FsbGVycyBtdXN0IG5vdCB0cmVhdCAoMCwgMCkgYXMgYW4gZW1wdHkKLy8gY2hhcnQuCmZ1bmMgKGIgKkJvb2spIHN1bUFjY291bnRzKCkgKGRlYml0cywgY3JlZGl0cyBpbnQ2NCwgb2sgYm9vbCkgewoJdmFyIGQsIGMgaW50NjQKCW9rTWF0aCA6PSB0cnVlCgliLmFjY291bnRzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWEgOj0gdmFsdWUuKEFjY291bnQpCgkJdmFyIG9rQWRkIGJvb2wKCQlpZiBkLCBva0FkZCA9IGNoZWNrZWRBZGQoZCwgYS5EZWJpdHMpOyAhb2tBZGQgewoJCQlva01hdGggPSBmYWxzZQoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQlpZiBjLCBva0FkZCA9IGNoZWNrZWRBZGQoYywgYS5DcmVkaXRzKTsgIW9rQWRkIHsKCQkJb2tNYXRoID0gZmFsc2UKCQkJcmV0dXJuIHRydWUKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgIW9rTWF0aCB7CgkJcmV0dXJuIDAsIDAsIGZhbHNlCgl9CglyZXR1cm4gZCwgYywgdHJ1ZQp9CgovLyBhY2NvdW50IGxvb2tzIHVwIG9uZSBjaGFydCBsaW5lLgpmdW5jIChiICpCb29rKSBhY2NvdW50KGNvZGUgc3RyaW5nKSAoQWNjb3VudCwgYm9vbCkgewoJdiA6PSBiLmFjY291bnRzLkdldChjb2RlKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBBY2NvdW50e30sIGZhbHNlCgl9CglyZXR1cm4gdi4oQWNjb3VudCksIHRydWUKfQoKLy8gZW50cnkgbG9va3MgdXAgb25lIGpvdXJuYWwgZW50cnksIFdJVEhPVVQgY29weWluZyBpdHMgcG9zdGluZ3MuIEludGVybmFsCi8vIGNhbGxlcnMgbXVzdCBub3QgcmV0YWluIG9yIG11dGF0ZSB0aGUgcmV0dXJuZWQgc2xpY2U7IGV2ZXJ5IGV4cG9ydGVkIHBhdGgKLy8gZ29lcyB0aHJvdWdoIHdpdGhDb3BpZWRQb3N0aW5ncy4KZnVuYyAoYiAqQm9vaykgZW50cnkoaWQgdWludDY0KSAoRW50cnksIGJvb2wpIHsKCXYgOj0gYi5lbnRyaWVzLkdldChpZEtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIEVudHJ5e30sIGZhbHNlCgl9CglyZXR1cm4gdi4oRW50cnkpLCB0cnVlCn0KCi8vIHdpdGhDb3BpZWRQb3N0aW5ncyByZXR1cm5zIGUgd2l0aCBhIGZyZXNoIFBvc3RpbmdzIHNsaWNlLCBzbyBhIHZhbHVlCi8vIGhhbmRlZCB0byBhIGNhbGxlciBzaGFyZXMgbm8gYmFja2luZyBhcnJheSB3aXRoIHRoZSBCb29rLgpmdW5jIChlIEVudHJ5KSB3aXRoQ29waWVkUG9zdGluZ3MoKSBFbnRyeSB7CglvdXQgOj0gbWFrZShbXVBvc3RpbmcsIGxlbihlLlBvc3RpbmdzKSkKCWNvcHkob3V0LCBlLlBvc3RpbmdzKQoJZS5Qb3N0aW5ncyA9IG91dAoJcmV0dXJuIGUKfQoKLy8gaWRLZXkgZW5jb2RlcyBhbiBJRCBzbyB0aGF0IGF2bCdzIGxleGljYWwga2V5IG9yZGVyIG1hdGNoZXMgbnVtZXJpYyBJRAovLyBvcmRlci4gbWF0aC5NYXhVaW50NjQgaXMgMjAgZGlnaXRzLCBzbyBhIGZpeGVkIDIwLXdpZGUgemVyby1wYWRkZWQKLy8gZGVjaW1hbCBpcyBib3RoIHN1ZmZpY2llbnQgYW5kIHVuYW1iaWd1b3VzLgpmdW5jIGlkS2V5KGlkIHVpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkKCWNvbnN0IHdpZHRoID0gMjAKCWlmIGxlbihzKSA+PSB3aWR0aCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiB6ZXJvc1s6d2lkdGgtbGVuKHMpXSArIHMKfQoKY29uc3QgemVyb3MgPSAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiCgovLyBjaGVja2VkQWRkIHJldHVybnMgYStiIGFuZCByZXBvcnRzIHdoZXRoZXIgdGhlIGFkZGl0aW9uIGRpZCBub3Qgb3ZlcmZsb3cKLy8gaW50NjQuCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXN1bSA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHN1bSA8IGEpIHx8IChiIDwgMCAmJiBzdW0gPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gc3VtLCB0cnVlCn0KGvDdAgoQam91cm5hbF90ZXN0LmdubxLa3QJwYWNrYWdlIGpvdXJuYWwKCmltcG9ydCAoCgkidGVzdGluZyIKKQoKY29uc3QgKAoJY2FzaCAgICA9ICIxMDAwIgoJYXIgICAgICA9ICIxMTAwIgoJcGF5YWJsZSA9ICIyMDAwIgoJY2FwaXRhbCA9ICIzMDAwIgoJcmV2ZW51ZSA9ICI0MDAwIgoJcmVudCAgICA9ICI1MDAwIgopCgovLyBuZXdCb29rIGlzIHRoZSBkZWZhdWx0IGZpeHR1cmU6IGEgc2l4LWxpbmUgY2hhcnQgY292ZXJpbmcgYWxsIGZpdmUga2luZHMsCi8vIGEgZ2VuZXJvdXMgZW50cnkgY2FwLgpmdW5jIG5ld0Jvb2sodCAqdGVzdGluZy5UKSAqQm9vayB7Cgl0LkhlbHBlcigpCgliLCBlcnIgOj0gTmV3KDMyLCAxMDAwKQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIk5ldzogJXYiLCBlcnIpCgl9CgliLk11c3RPcGVuKGNhc2gsICJDYXNoIiwgQXNzZXQpCgliLk11c3RPcGVuKGFyLCAiQWNjb3VudHMgcmVjZWl2YWJsZSIsIEFzc2V0KQoJYi5NdXN0T3BlbihwYXlhYmxlLCAiQWNjb3VudHMgcGF5YWJsZSIsIExpYWJpbGl0eSkKCWIuTXVzdE9wZW4oY2FwaXRhbCwgIk93bmVyIGNhcGl0YWwiLCBFcXVpdHkpCgliLk11c3RPcGVuKHJldmVudWUsICJTYWxlcyIsIFJldmVudWUpCgliLk11c3RPcGVuKHJlbnQsICJSZW50IGV4cGVuc2UiLCBFeHBlbnNlKQoJcmV0dXJuIGIKfQoKLy8gbXVzdFBhbmljV2l0aCBhc3NlcnRzIGZuIHBhbmljcyB3aXRoIGV4YWN0bHkgd2FudC4gQSAvcC8gZnVuY3Rpb24gY2FsbGVkCi8vIGZyb20gYSAvcC8gdGVzdCBjcm9zc2VzIG5vIHJlYWxtIGJvdW5kYXJ5LCBzbyB0aGUgcGFuaWMgaXMgTE9DQUwgYW5kCi8vIHJlY292ZXIoKSBpcyB0aGUgcmlnaHQgZmFtaWx5IC0tIEFib3J0cyogd291bGQgbm90IHNlZSBpdCBhdCBhbGwuCmZ1bmMgbXVzdFBhbmljV2l0aCh0ICp0ZXN0aW5nLlQsIHdhbnQgc3RyaW5nLCBmbiBmdW5jKCkpIHsKCXQuSGVscGVyKCkKCWRlZmVyIGZ1bmMoKSB7CgkJciA6PSByZWNvdmVyKCkKCQlpZiByID09IG5pbCB7CgkJCXQuRmF0YWxmKCJleHBlY3RlZCBwYW5pYyAlcSwgZ290IG5vbmUiLCB3YW50KQoJCX0KCQllcnIsIG9rIDo9IHIuKGVycm9yKQoJCWlmICFvayB8fCBlcnIuRXJyb3IoKSAhPSB3YW50IHsKCQkJdC5GYXRhbGYoInBhbmljID0gJXYsIHdhbnQgJXEiLCByLCB3YW50KQoJCX0KCX0oKQoJZm4oKQp9CgovLyBwYWlyIGlzIHRoZSBzaW1wbGVzdCBiYWxhbmNlZCBlbnRyeTogZGViaXQgb25lIGFjY291bnQsIGNyZWRpdCBhbm90aGVyLgpmdW5jIHBhaXIoZHIsIGNyIHN0cmluZywgYW1vdW50IGludDY0KSBbXVBvc3RpbmcgewoJcmV0dXJuIFtdUG9zdGluZ3sKCQl7QWNjb3VudDogZHIsIFNpZGU6IERlYml0LCBBbW91bnQ6IGFtb3VudH0sCgkJe0FjY291bnQ6IGNyLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogYW1vdW50fSwKCX0KfQoKLy8gLS0tIGNvbnN0cnVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdE5ld1JlamVjdHNCYWRDb25maWcodCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSAgICAgICAgICAgICAgICAgICBzdHJpbmcKCQltYXhBY2NvdW50cywgbWF4RW50cmllcyBpbnQKCX17CgkJeyJ6ZXJvIGFjY291bnRzIiwgMCwgMTB9LAoJCXsibmVnYXRpdmUgYWNjb3VudHMiLCAtMSwgMTB9LAoJCXsiYWNjb3VudHMgb3ZlciBsaW1pdCIsIE1heEFjY291bnRzTGltaXQgKyAxLCAxMH0sCgkJeyJ6ZXJvIGVudHJpZXMiLCAxMCwgMH0sCgkJeyJuZWdhdGl2ZSBlbnRyaWVzIiwgMTAsIC0xfSwKCQl7ImVudHJpZXMgb3ZlciBsaW1pdCIsIDEwLCBNYXhFbnRyaWVzTGltaXQgKyAxfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJdC5SdW4odGMubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKCQkJaWYgXywgZXJyIDo9IE5ldyh0Yy5tYXhBY2NvdW50cywgdGMubWF4RW50cmllcyk7IGVyciAhPSBFcnJJbnZhbGlkQ29uZmlnIHsKCQkJCXQuRmF0YWxmKCJOZXcgPSAldiwgd2FudCBFcnJJbnZhbGlkQ29uZmlnIiwgZXJyKQoJCQl9CgkJfSkKCX0KfQoKZnVuYyBUZXN0TmV3QXRMaW1pdHNJc0FjY2VwdGVkKHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIHBvc2l0aXZlIGNvbnRyb2wgZm9yIHRoZSBib3VuZHMgYWJvdmU6IGEgc2Fib3RhZ2UgdGhhdCByZWplY3RlZAoJLy8gZXZlcnl0aGluZyB3b3VsZCBwYXNzIHRob3NlIGNhc2VzIGFuZCBmYWlsIHRoaXMgb25lLgoJaWYgXywgZXJyIDo9IE5ldygxLCAxKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIk5ldygxLDEpID0gJXYsIHdhbnQgbmlsIiwgZXJyKQoJfQoJaWYgXywgZXJyIDo9IE5ldyhNYXhBY2NvdW50c0xpbWl0LCBNYXhFbnRyaWVzTGltaXQpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiTmV3IGF0IGxpbWl0cyA9ICV2LCB3YW50IG5pbCIsIGVycikKCX0KfQoKZnVuYyBUZXN0TmV3Qm9va0lzRW1wdHlBbmRCYWxhbmNlZCh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0LCA0KQoJaWYgYi5BY2NvdW50Q291bnQoKSAhPSAwIHx8IGIuRW50cnlDb3VudCgpICE9IDAgewoJCXQuRmF0YWxmKCJjb3VudHMgPSAlZC8lZCwgd2FudCAwLzAiLCBiLkFjY291bnRDb3VudCgpLCBiLkVudHJ5Q291bnQoKSkKCX0KCWlmIGIuTmV4dElEKCkgIT0gMSB7CgkJdC5GYXRhbGYoIk5leHRJRCA9ICVkLCB3YW50IDEiLCBiLk5leHRJRCgpKQoJfQoJaWYgIWIuSXNCYWxhbmNlZCgpIHsKCQl0LkZhdGFsKCJhbiBlbXB0eSBib29rIG11c3QgYmUgYmFsYW5jZWQiKQoJfQoJaWYgXywgXywgYWdyZWVzIDo9IGIuUmVkZXJpdmVGcm9tSm91cm5hbCgpOyAhYWdyZWVzIHsKCQl0LkZhdGFsKCJhbiBlbXB0eSBib29rIG11c3QgcmVkZXJpdmUiKQoJfQoJaWYgXywgY2xvc2VkIDo9IGIuQ2xvc2VkVGhyb3VnaCgpOyBjbG9zZWQgewoJCXQuRmF0YWwoImEgbmV3IGJvb2sgbXVzdCBub3QgcmVwb3J0IGEgY2xvc2VkIHBlcmlvZCIpCgl9Cn0KCmZ1bmMgVGVzdE11c3ROZXdQYW5pY3ModCAqdGVzdGluZy5UKSB7CgltdXN0UGFuaWNXaXRoKHQsICJqb3VybmFsOiBpbnZhbGlkIGJvb2sgY29uZmlndXJhdGlvbiIsIGZ1bmMoKSB7IE11c3ROZXcoMCwgMSkgfSkKfQoKLy8gLS0tIGtpbmRzIGFuZCBzaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdEtpbmROb3JtYWxCYWxhbmNlKHQgKnRlc3RpbmcuVCkgewoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCWsgICAgICAgICAgIEtpbmQKCQl2YWxpZCAgICAgICBib29sCgkJZGViaXROb3JtYWwgYm9vbAoJCW5hbWUgICAgICAgIHN0cmluZwoJfXsKCQl7QXNzZXQsIHRydWUsIHRydWUsICJhc3NldCJ9LAoJCXtFeHBlbnNlLCB0cnVlLCB0cnVlLCAiZXhwZW5zZSJ9LAoJCXtMaWFiaWxpdHksIHRydWUsIGZhbHNlLCAibGlhYmlsaXR5In0sCgkJe0VxdWl0eSwgdHJ1ZSwgZmFsc2UsICJlcXVpdHkifSwKCQl7UmV2ZW51ZSwgdHJ1ZSwgZmFsc2UsICJyZXZlbnVlIn0sCgkJe0tpbmQoMCksIGZhbHNlLCBmYWxzZSwgImludmFsaWQifSwKCQl7S2luZCg2KSwgZmFsc2UsIGZhbHNlLCAiaW52YWxpZCJ9LAoJCXtLaW5kKDI1NSksIGZhbHNlLCBmYWxzZSwgImludmFsaWQifSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJaWYgZ290IDo9IHRjLmsuVmFsaWQoKTsgZ290ICE9IHRjLnZhbGlkIHsKCQkJdC5GYXRhbGYoIktpbmQoJWQpLlZhbGlkID0gJXYsIHdhbnQgJXYiLCB1aW50OCh0Yy5rKSwgZ290LCB0Yy52YWxpZCkKCQl9CgkJaWYgZ290IDo9IHRjLmsuSXNEZWJpdE5vcm1hbCgpOyBnb3QgIT0gdGMuZGViaXROb3JtYWwgewoJCQl0LkZhdGFsZigiS2luZCglZCkuSXNEZWJpdE5vcm1hbCA9ICV2LCB3YW50ICV2IiwgdWludDgodGMuayksIGdvdCwgdGMuZGViaXROb3JtYWwpCgkJfQoJCWlmIGdvdCA6PSB0Yy5rLlN0cmluZygpOyBnb3QgIT0gdGMubmFtZSB7CgkJCXQuRmF0YWxmKCJLaW5kKCVkKS5TdHJpbmcgPSAlcSwgd2FudCAlcSIsIHVpbnQ4KHRjLmspLCBnb3QsIHRjLm5hbWUpCgkJfQoJfQp9CgpmdW5jIFRlc3RTaWRlVmFsaWRpdHlBbmRPcHBvc2l0ZSh0ICp0ZXN0aW5nLlQpIHsKCWlmICFEZWJpdC5WYWxpZCgpIHx8ICFDcmVkaXQuVmFsaWQoKSB7CgkJdC5GYXRhbCgiRGViaXQgYW5kIENyZWRpdCBtdXN0IGJlIHZhbGlkIikKCX0KCWlmIFNpZGUoMCkuVmFsaWQoKSB8fCBTaWRlKDMpLlZhbGlkKCkgewoJCXQuRmF0YWwoIm9ubHkgRGViaXQgYW5kIENyZWRpdCBhcmUgdmFsaWQgc2lkZXMiKQoJfQoJaWYgRGViaXQuT3Bwb3NpdGUoKSAhPSBDcmVkaXQgfHwgQ3JlZGl0Lk9wcG9zaXRlKCkgIT0gRGViaXQgewoJCXQuRmF0YWwoIk9wcG9zaXRlIG11c3Qgc3dhcCB0aGUgdHdvIHNpZGVzIikKCX0KCS8vIEFuIGludmFsaWQgc2lkZSByZXR1cm5zIGl0c2VsZiByYXRoZXIgdGhhbiBhIHBsYXVzaWJsZSBkZWZhdWx0LCBzbyBhCgkvLyBjYWxsZXIgdGhhdCBza2lwcGVkIHZhbGlkYXRpb24gZ2V0cyBhbiBpbnZhbGlkIHBvc3RpbmcuCglpZiBTaWRlKDApLk9wcG9zaXRlKCkgIT0gU2lkZSgwKSB7CgkJdC5GYXRhbCgiT3Bwb3NpdGUgb2YgYW4gaW52YWxpZCBzaWRlIG11c3Qgc3RheSBpbnZhbGlkIikKCX0KCWlmIERlYml0LlN0cmluZygpICE9ICJkZWJpdCIgfHwgQ3JlZGl0LlN0cmluZygpICE9ICJjcmVkaXQiIHx8IFNpZGUoOSkuU3RyaW5nKCkgIT0gImludmFsaWQiIHsKCQl0LkZhdGFsKCJTaWRlLlN0cmluZyIpCgl9Cn0KCi8vIC0tLSBvcGVuaW5nIGFjY291bnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RPcGVuVmFsaWRhdGlvbih0ICp0ZXN0aW5nLlQpIHsKCWxvbmcgOj0gIiIKCWZvciBpIDo9IDA7IGkgPCBNYXhDb2RlTGVuKzE7IGkrKyB7CgkJbG9uZyArPSAieCIKCX0KCWxvbmdOYW1lIDo9ICIiCglmb3IgaSA6PSAwOyBpIDwgTWF4TmFtZUxlbisxOyBpKysgewoJCWxvbmdOYW1lICs9ICJ5IgoJfQoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgc3RyaW5nCgkJY29kZSBzdHJpbmcKCQlhY2N0IHN0cmluZwoJCWtpbmQgS2luZAoJCXdhbnQgZXJyb3IKCX17CgkJeyJlbXB0eSBjb2RlIiwgIiIsICJDYXNoIiwgQXNzZXQsIEVyckVtcHR5Q29kZX0sCgkJeyJjb2RlIHRvbyBsb25nIiwgbG9uZywgIkNhc2giLCBBc3NldCwgRXJyQ29kZVRvb0xvbmd9LAoJCXsibmFtZSB0b28gbG9uZyIsICIxIiwgbG9uZ05hbWUsIEFzc2V0LCBFcnJOYW1lVG9vTG9uZ30sCgkJeyJ6ZXJvIGtpbmQiLCAiMSIsICJDYXNoIiwgS2luZCgwKSwgRXJySW52YWxpZEtpbmR9LAoJCXsidW5rbm93biBraW5kIiwgIjEiLCAiQ2FzaCIsIEtpbmQoNiksIEVyckludmFsaWRLaW5kfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJdC5SdW4odGMubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKCQkJYiA6PSBNdXN0TmV3KDQsIDQpCgkJCWlmIGVyciA6PSBiLk9wZW4odGMuY29kZSwgdGMuYWNjdCwgdGMua2luZCk7IGVyciAhPSB0Yy53YW50IHsKCQkJCXQuRmF0YWxmKCJPcGVuID0gJXYsIHdhbnQgJXYiLCBlcnIsIHRjLndhbnQpCgkJCX0KCQkJaWYgYi5BY2NvdW50Q291bnQoKSAhPSAwIHsKCQkJCXQuRmF0YWwoImEgcmVmdXNlZCBPcGVuIG11c3QgbGVhdmUgdGhlIGNoYXJ0IHVuY2hhbmdlZCIpCgkJCX0KCQl9KQoJfQp9CgpmdW5jIFRlc3RPcGVuQXRFeGFjdExlbmd0aExpbWl0c0lzQWNjZXB0ZWQodCAqdGVzdGluZy5UKSB7CgkvLyBQb3NpdGl2ZSBjb250cm9sIGZvciB0aGUgdHdvIGxlbmd0aCBndWFyZHM6IG9mZi1ieS1vbmUgaW4gdGhlIHdyb25nCgkvLyBkaXJlY3Rpb24gd291bGQgcmVqZWN0IHRoZXNlLgoJY29kZSA6PSAiIgoJZm9yIGkgOj0gMDsgaSA8IE1heENvZGVMZW47IGkrKyB7CgkJY29kZSArPSAieCIKCX0KCW5hbWUgOj0gIiIKCWZvciBpIDo9IDA7IGkgPCBNYXhOYW1lTGVuOyBpKysgewoJCW5hbWUgKz0gInkiCgl9CgliIDo9IE11c3ROZXcoNCwgNCkKCWlmIGVyciA6PSBiLk9wZW4oY29kZSwgbmFtZSwgQXNzZXQpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbiBhdCBleGFjdCBsaW1pdHMgPSAldiwgd2FudCBuaWwiLCBlcnIpCgl9Cn0KCmZ1bmMgVGVzdE9wZW5SZWplY3RzRHVwbGljYXRlQW5kUmVzcGVjdHNDYXAodCAqdGVzdGluZy5UKSB7CgliIDo9IE11c3ROZXcoMiwgNCkKCWIuTXVzdE9wZW4oIjEiLCAiT25lIiwgQXNzZXQpCglpZiBlcnIgOj0gYi5PcGVuKCIxIiwgIkRpZmZlcmVudCBuYW1lIiwgUmV2ZW51ZSk7IGVyciAhPSBFcnJBY2NvdW50RXhpc3RzIHsKCQl0LkZhdGFsZigiZHVwbGljYXRlIE9wZW4gPSAldiwgd2FudCBFcnJBY2NvdW50RXhpc3RzIiwgZXJyKQoJfQoJLy8gVGhlIGR1cGxpY2F0ZSBtdXN0IG5vdCBoYXZlIG92ZXJ3cml0dGVuIHRoZSBvcmlnaW5hbC4KCWEsIF8gOj0gYi5BY2NvdW50KCIxIikKCWlmIGEuTmFtZSAhPSAiT25lIiB8fCBhLktpbmQgIT0gQXNzZXQgewoJCXQuRmF0YWxmKCJhY2NvdW50IG11dGF0ZWQgYnkgcmVmdXNlZCBPcGVuOiAlK3YiLCBhKQoJfQoJYi5NdXN0T3BlbigiMiIsICJUd28iLCBMaWFiaWxpdHkpCglpZiBlcnIgOj0gYi5PcGVuKCIzIiwgIlRocmVlIiwgQXNzZXQpOyBlcnIgIT0gRXJyQ2hhcnRGdWxsIHsKCQl0LkZhdGFsZigiT3BlbiBwYXN0IGNhcCA9ICV2LCB3YW50IEVyckNoYXJ0RnVsbCIsIGVycikKCX0KCWlmIGIuQWNjb3VudENvdW50KCkgIT0gMiB7CgkJdC5GYXRhbGYoIkFjY291bnRDb3VudCA9ICVkLCB3YW50IDIiLCBiLkFjY291bnRDb3VudCgpKQoJfQp9CgpmdW5jIFRlc3RNdXN0T3BlblBhbmljcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0LCA0KQoJbXVzdFBhbmljV2l0aCh0LCAiam91cm5hbDogZW1wdHkgYWNjb3VudCBjb2RlIiwgZnVuYygpIHsgYi5NdXN0T3BlbigiIiwgIngiLCBBc3NldCkgfSkKfQoKZnVuYyBUZXN0QWNjb3VudEFuZEJhbGFuY2VEaXN0aW5ndWlzaE1pc3NpbmdGcm9tWmVybyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWYgXywgb2sgOj0gYi5BY2NvdW50KCJub3BlIik7IG9rIHsKCQl0LkZhdGFsKCJBY2NvdW50IG11c3QgcmVwb3J0IGEgbWlzc2luZyBjb2RlIikKCX0KCS8vIFRoZSBkaXN0aW5jdGlvbiB0aGF0IG1hdHRlcnM6IGEgbWlzc2luZyBhY2NvdW50IGlzIG5vdCBhIHplcm8gYmFsYW5jZS4KCWlmIHYsIG9rIDo9IGIuQmFsYW5jZSgibm9wZSIpOyBvayB8fCB2ICE9IDAgewoJCXQuRmF0YWxmKCJCYWxhbmNlKG1pc3NpbmcpID0gJWQsJXYgd2FudCAwLGZhbHNlIiwgdiwgb2spCgl9CglpZiB2LCBvayA6PSBiLkJhbGFuY2UoY2FzaCk7ICFvayB8fCB2ICE9IDAgewoJCXQuRmF0YWxmKCJCYWxhbmNlKG9wZW4sIHVucG9zdGVkKSA9ICVkLCV2IHdhbnQgMCx0cnVlIiwgdiwgb2spCgl9Cn0KCi8vIC0tLSBwb3N0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RQb3N0QmFsYW5jZWRFbnRyeVVwZGF0ZXNCb3RoU2lkZXModCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWlkLCBlcnIgOj0gYi5Qb3N0KDEwMCwgIm93bmVyIGZ1bmRzIHRoZSBidXNpbmVzcyIsIHBhaXIoY2FzaCwgY2FwaXRhbCwgNTAwMCkpCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUG9zdDogJXYiLCBlcnIpCgl9CglpZiBpZCAhPSAxIHx8IGIuTmV4dElEKCkgIT0gMiB7CgkJdC5GYXRhbGYoImlkPSVkIG5leHRJRD0lZCwgd2FudCAxIGFuZCAyIiwgaWQsIGIuTmV4dElEKCkpCgl9CglpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKGNhc2gpOyBnb3QgIT0gNTAwMCB7CgkJdC5GYXRhbGYoImNhc2ggYmFsYW5jZSA9ICVkLCB3YW50IDUwMDAiLCBnb3QpCgl9CgkvLyBFcXVpdHkgaXMgY3JlZGl0LW5vcm1hbCwgc28gYSBjcmVkaXQgaXMgYSBQT1NJVElWRSBiYWxhbmNlLiBBCgkvLyBkZWJpdC1ub3JtYWwgcmVhZGluZyB3b3VsZCByZXBvcnQgLTUwMDAgaGVyZS4KCWlmIGdvdCwgXyA6PSBiLkJhbGFuY2UoY2FwaXRhbCk7IGdvdCAhPSA1MDAwIHsKCQl0LkZhdGFsZigiY2FwaXRhbCBiYWxhbmNlID0gJWQsIHdhbnQgKzUwMDAgKGNyZWRpdC1ub3JtYWwpIiwgZ290KQoJfQoJYSwgXyA6PSBiLkFjY291bnQoY2FzaCkKCWlmIGEuRGViaXRzICE9IDUwMDAgfHwgYS5DcmVkaXRzICE9IDAgfHwgYS5SYXdEZWx0YSgpICE9IDUwMDAgewoJCXQuRmF0YWxmKCJjYXNoIGFjY291bnQgPSAlK3YiLCBhKQoJfQoJZSwgXyA6PSBiLkFjY291bnQoY2FwaXRhbCkKCWlmIGUuRGViaXRzICE9IDAgfHwgZS5DcmVkaXRzICE9IDUwMDAgfHwgZS5SYXdEZWx0YSgpICE9IC01MDAwIHsKCQl0LkZhdGFsZigiY2FwaXRhbCBhY2NvdW50ID0gJSt2IiwgZSkKCX0KCWlmIGIuVG90YWxEZWJpdHMoKSAhPSA1MDAwIHx8IGIuVG90YWxDcmVkaXRzKCkgIT0gNTAwMCB7CgkJdC5GYXRhbGYoInRvdGFscyA9ICVkLyVkLCB3YW50IDUwMDAvNTAwMCIsIGIuVG90YWxEZWJpdHMoKSwgYi5Ub3RhbENyZWRpdHMoKSkKCX0KCWlmICFiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgiYm9vayBtdXN0IGJlIGJhbGFuY2VkIGFmdGVyIGEgYmFsYW5jZWQgZW50cnkiKQoJfQp9CgpmdW5jIFRlc3RQb3N0UmVmdXNlc1VuYmFsYW5jZWRBbmROYW1lc1RoZVNob3J0U2lkZSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJLy8gRGViaXRzIHNob3J0OiAxMDAgZGViaXQgYWdhaW5zdCAxNTAgY3JlZGl0LgoJc2hvcnQgOj0gW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiAxMDB9LAoJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMTUwfSwKCX0KCWlmIF8sIGVyciA6PSBiLlBvc3QoMSwgIiIsIHNob3J0KTsgZXJyICE9IEVyckRlYml0U2hvcnQgewoJCXQuRmF0YWxmKCJQb3N0ID0gJXYsIHdhbnQgRXJyRGViaXRTaG9ydCIsIGVycikKCX0KCS8vIENyZWRpdHMgc2hvcnQ6IHRoZSBtaXJyb3IgY2FzZSBtdXN0IHJlcG9ydCB0aGUgT1RIRVIgZXJyb3IsIG9yIHRoZQoJLy8gcmVmdXNhbCBpcyBub3QgYWN0dWFsbHkgbmFtaW5nIHRoZSBzaG9ydCBzaWRlLgoJb3RoZXIgOj0gW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiAxNTB9LAoJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMTAwfSwKCX0KCWlmIF8sIGVyciA6PSBiLlBvc3QoMSwgIiIsIG90aGVyKTsgZXJyICE9IEVyckNyZWRpdFNob3J0IHsKCQl0LkZhdGFsZigiUG9zdCA9ICV2LCB3YW50IEVyckNyZWRpdFNob3J0IiwgZXJyKQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMCB8fCBiLlRvdGFsRGViaXRzKCkgIT0gMCB7CgkJdC5GYXRhbCgiYSByZWZ1c2VkIFBvc3QgbXVzdCBsZWF2ZSB0aGUgYm9vayBjb21wbGV0ZWx5IHVuY2hhbmdlZCIpCgl9CglpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKGNhc2gpOyBnb3QgIT0gMCB7CgkJdC5GYXRhbGYoImNhc2ggbW92ZWQgb24gYSByZWZ1c2VkIFBvc3Q6ICVkIiwgZ290KQoJfQp9CgpmdW5jIFRlc3RQb3N0VmFsaWRhdGlvbih0ICp0ZXN0aW5nLlQpIHsKCWxvbmcgOj0gIiIKCWZvciBpIDo9IDA7IGkgPCBNYXhNZW1vTGVuKzE7IGkrKyB7CgkJbG9uZyArPSAibSIKCX0KCW1hbnkgOj0gW11Qb3N0aW5ne30KCWZvciBpIDo9IDA7IGkgPCBNYXhQb3N0aW5nc1BlckVudHJ5KzE7IGkrKyB7CgkJc2lkZSA6PSBEZWJpdAoJCWlmIGklMiA9PSAxIHsKCQkJc2lkZSA9IENyZWRpdAoJCX0KCQltYW55ID0gYXBwZW5kKG1hbnksIFBvc3Rpbmd7QWNjb3VudDogY2FzaCwgU2lkZTogc2lkZSwgQW1vdW50OiAxfSkKCX0KCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICBzdHJpbmcKCQlhdCAgICAgICBpbnQ2NAoJCW1lbW8gICAgIHN0cmluZwoJCXBvc3RpbmdzIFtdUG9zdGluZwoJCXdhbnQgICAgIGVycm9yCgl9ewoJCXsibmVnYXRpdmUgYXQiLCAtMSwgIiIsIHBhaXIoY2FzaCwgcmV2ZW51ZSwgMSksIEVyckludmFsaWRBdH0sCgkJeyJtZW1vIHRvbyBsb25nIiwgMSwgbG9uZywgcGFpcihjYXNoLCByZXZlbnVlLCAxKSwgRXJyTWVtb1Rvb0xvbmd9LAoJCXsibm8gcG9zdGluZ3MiLCAxLCAiIiwgW11Qb3N0aW5ne30sIEVyclRvb0Zld1Bvc3RpbmdzfSwKCQl7Im9uZSBwb3N0aW5nIiwgMSwgIiIsIFtdUG9zdGluZ3t7QWNjb3VudDogY2FzaCwgU2lkZTogRGViaXQsIEFtb3VudDogMX19LCBFcnJUb29GZXdQb3N0aW5nc30sCgkJeyJ0b28gbWFueSBwb3N0aW5ncyIsIDEsICIiLCBtYW55LCBFcnJUb29NYW55UG9zdGluZ3N9LAoJCXsiemVybyBzaWRlIiwgMSwgIiIsIFtdUG9zdGluZ3sKCQkJe0FjY291bnQ6IGNhc2gsIFNpZGU6IFNpZGUoMCksIEFtb3VudDogMX0sCgkJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMX0sCgkJfSwgRXJySW52YWxpZFNpZGV9LAoJCXsiemVybyBhbW91bnQiLCAxLCAiIiwgW11Qb3N0aW5newoJCQl7QWNjb3VudDogY2FzaCwgU2lkZTogRGViaXQsIEFtb3VudDogMH0sCgkJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMH0sCgkJfSwgRXJySW52YWxpZEFtb3VudH0sCgkJeyJuZWdhdGl2ZSBhbW91bnQiLCAxLCAiIiwgW11Qb3N0aW5newoJCQl7QWNjb3VudDogY2FzaCwgU2lkZTogRGViaXQsIEFtb3VudDogLTV9LAoJCQl7QWNjb3VudDogcmV2ZW51ZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IC01fSwKCQl9LCBFcnJJbnZhbGlkQW1vdW50fSwKCQl7InVua25vd24gYWNjb3VudCIsIDEsICIiLCBwYWlyKGNhc2gsICI5OTk5IiwgMSksIEVyclVua25vd25BY2NvdW50fSwKCQl7ImFsbCBkZWJpdHMiLCAxLCAiIiwgW11Qb3N0aW5newoJCQl7QWNjb3VudDogY2FzaCwgU2lkZTogRGViaXQsIEFtb3VudDogMX0sCgkJCXtBY2NvdW50OiBhciwgU2lkZTogRGViaXQsIEFtb3VudDogMX0sCgkJfSwgRXJyTm9DcmVkaXR9LAoJCXsiYWxsIGNyZWRpdHMiLCAxLCAiIiwgW11Qb3N0aW5newoJCQl7QWNjb3VudDogcmV2ZW51ZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDF9LAoJCQl7QWNjb3VudDogcGF5YWJsZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDF9LAoJCX0sIEVyck5vRGViaXR9LAoJfQoJZm9yIF8sIHRjIDo9IHJhbmdlIGNhc2VzIHsKCQl0LlJ1bih0Yy5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewoJCQliIDo9IG5ld0Jvb2sodCkKCQkJaWYgXywgZXJyIDo9IGIuUG9zdCh0Yy5hdCwgdGMubWVtbywgdGMucG9zdGluZ3MpOyBlcnIgIT0gdGMud2FudCB7CgkJCQl0LkZhdGFsZigiUG9zdCA9ICV2LCB3YW50ICV2IiwgZXJyLCB0Yy53YW50KQoJCQl9CgkJCWlmIGIuRW50cnlDb3VudCgpICE9IDAgewoJCQkJdC5GYXRhbCgiYSByZWZ1c2VkIFBvc3QgbXVzdCB3cml0ZSBub3RoaW5nIikKCQkJfQoJCQlpZiAhYi5Jc0JhbGFuY2VkKCkgewoJCQkJdC5GYXRhbCgiYSByZWZ1c2VkIFBvc3QgbXVzdCBsZWF2ZSB0aGUgYm9vayBiYWxhbmNlZCIpCgkJCX0KCQl9KQoJfQp9CgpmdW5jIFRlc3RQb3N0QXRFeGFjdFBvc3RpbmdMaW1pdElzQWNjZXB0ZWQodCAqdGVzdGluZy5UKSB7CgkvLyBQb3NpdGl2ZSBjb250cm9sIGZvciBFcnJUb29NYW55UG9zdGluZ3MuCgliIDo9IG5ld0Jvb2sodCkKCXBzIDo9IFtdUG9zdGluZ3t9Cglmb3IgaSA6PSAwOyBpIDwgTWF4UG9zdGluZ3NQZXJFbnRyeTsgaSsrIHsKCQlzaWRlIDo9IERlYml0CgkJaWYgaSUyID09IDEgewoJCQlzaWRlID0gQ3JlZGl0CgkJfQoJCXBzID0gYXBwZW5kKHBzLCBQb3N0aW5ne0FjY291bnQ6IGNhc2gsIFNpZGU6IHNpZGUsIEFtb3VudDogMX0pCgl9CglpZiBfLCBlcnIgOj0gYi5Qb3N0KDEsICIiLCBwcyk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJQb3N0IGF0IGV4YWN0bHkgTWF4UG9zdGluZ3NQZXJFbnRyeSA9ICV2LCB3YW50IG5pbCIsIGVycikKCX0KfQoKZnVuYyBUZXN0UG9zdEF0WmVyb0lzQWNjZXB0ZWRPbkFuVW5jbG9zZWRCb29rKHQgKnRlc3RpbmcuVCkgewoJLy8gYXQgPT0gMCBpcyBhIGxlZ2l0aW1hdGUgaW5zdGFudC4gSXQgaXMgb25seSByZWZ1c2VkIG9uY2UgYSBwZXJpb2QgaGFzCgkvLyBhY3R1YWxseSBiZWVuIGNsb3NlZCB0aHJvdWdoIGl0IC0tIHdoaWNoIGlzIHdoeSBoYXNDbG9zZWQgZXhpc3RzLgoJYiA6PSBuZXdCb29rKHQpCglpZiBfLCBlcnIgOj0gYi5Qb3N0KDAsICJnZW5lc2lzIiwgcGFpcihjYXNoLCBjYXBpdGFsLCAxKSk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJQb3N0KGF0PTApID0gJXYsIHdhbnQgbmlsIiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RQb3N0TXVsdGlMZWdFbnRyeSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJLy8gT25lIGRlYml0IHNwbGl0IGFjcm9zcyB0d28gY3JlZGl0cy4KCWlkIDo9IGIuTXVzdFBvc3QoMTAsICJwYXJ0IGNhc2gsIHBhcnQgY3JlZGl0IiwgW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiAzMDB9LAoJCXtBY2NvdW50OiBhciwgU2lkZTogRGViaXQsIEFtb3VudDogNzAwfSwKCQl7QWNjb3VudDogcmV2ZW51ZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDEwMDB9LAoJfSkKCWUsIG9rIDo9IGIuRW50cnkoaWQpCglpZiAhb2sgewoJCXQuRmF0YWwoImVudHJ5IG1pc3NpbmciKQoJfQoJaWYgbGVuKGUuUG9zdGluZ3MpICE9IDMgewoJCXQuRmF0YWxmKCJwb3N0aW5ncyA9ICVkLCB3YW50IDMiLCBsZW4oZS5Qb3N0aW5ncykpCgl9CglpZiBlLlRvdGFsKCkgIT0gMTAwMCB7CgkJdC5GYXRhbGYoIlRvdGFsID0gJWQsIHdhbnQgMTAwMCIsIGUuVG90YWwoKSkKCX0KCWlmIGdvdCwgXyA6PSBiLkJhbGFuY2UocmV2ZW51ZSk7IGdvdCAhPSAxMDAwIHsKCQl0LkZhdGFsZigicmV2ZW51ZSA9ICVkLCB3YW50IDEwMDAiLCBnb3QpCgl9CglpZiAhYi5Jc0JhbGFuY2VkKCkgewoJCXQuRmF0YWwoIm11bHRpLWxlZyBlbnRyeSBtdXN0IGJhbGFuY2UiKQoJfQp9CgpmdW5jIFRlc3RQb3N0U2FtZUFjY291bnRUd2ljZUluT25lRW50cnlBY2N1bXVsYXRlc0JvdGhMZWdzKHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIHN0YWdpbmcgbG9vcCBmb2xkcyBlYXJsaWVyIHN0YWdpbmdzIG9mIHRoZSBzYW1lIGFjY291bnQuIFdpdGhvdXQKCS8vIHRoYXQgZm9sZCB0aGUgc2Vjb25kIGxlZyB3b3VsZCBvdmVyd3JpdGUgdGhlIGZpcnN0IGFuZCB0aGUgYWNjb3VudAoJLy8gd291bGQgc2lsZW50bHkgbG9zZSBhIHBvc3Rpbmcgd2hpbGUgdGhlIGJvb2stbGV2ZWwgdG90YWxzIGtlcHQgYm90aCAtLQoJLy8gd2hpY2ggSXNCYWxhbmNlZCBpcyBidWlsdCB0byBjYXRjaCwgc28gYXNzZXJ0IGJvdGguCgliIDo9IG5ld0Jvb2sodCkKCWIuTXVzdFBvc3QoMSwgIm5ldCBzZXR0bGVtZW50IHRocm91Z2ggb25lIGFjY291bnQiLCBbXVBvc3Rpbmd7CgkJe0FjY291bnQ6IGNhc2gsIFNpZGU6IERlYml0LCBBbW91bnQ6IDUwMH0sCgkJe0FjY291bnQ6IGNhc2gsIFNpZGU6IENyZWRpdCwgQW1vdW50OiAyMDB9LAoJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogNDAwfSwKCQl7QWNjb3VudDogcmVudCwgU2lkZTogRGViaXQsIEFtb3VudDogMTAwfSwKCX0pCglhLCBfIDo9IGIuQWNjb3VudChjYXNoKQoJaWYgYS5EZWJpdHMgIT0gNTAwIHx8IGEuQ3JlZGl0cyAhPSAyMDAgewoJCXQuRmF0YWxmKCJjYXNoID0gJSt2LCB3YW50IGRlYml0cyA1MDAgY3JlZGl0cyAyMDAiLCBhKQoJfQoJaWYgYS5CYWxhbmNlKCkgIT0gMzAwIHsKCQl0LkZhdGFsZigiY2FzaCBiYWxhbmNlID0gJWQsIHdhbnQgMzAwIiwgYS5CYWxhbmNlKCkpCgl9CglpZiAhYi5Jc0JhbGFuY2VkKCkgewoJCXQuRmF0YWwoInBlci1hY2NvdW50IHRvdGFscyBkcmlmdGVkIGZyb20gdGhlIHJ1bm5pbmcgdG90YWxzIikKCX0KCWlmIF8sIF8sIGFncmVlcyA6PSBiLlJlZGVyaXZlRnJvbUpvdXJuYWwoKTsgIWFncmVlcyB7CgkJdC5GYXRhbCgiam91cm5hbCByZXBsYXkgZGlzYWdyZWVzIHdpdGggdGhlIGFjY3VtdWxhdG9ycyIpCgl9Cn0KCmZ1bmMgVGVzdFBvc3RUaHJlZUxlZ3NUb09uZUFjY291bnRGb2xkc0FsbE9mVGhlbSh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRIUkVFIGxlZ3MsIG5vdCB0d28sIGFuZCB0aGF0IGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgdGhlIGNhc2UuCgkvLwoJLy8gVGhlIHN0YWdpbmcgZm9sZCBzY2FucyBldmVyeSBlYXJsaWVyIHN0YWdpbmcgYW5kIHJlYXNzaWducyB3aXRob3V0CgkvLyBicmVha2luZywgc28gdGhlIExBU1QgbWF0Y2ggd2lucyAtLSB3aGljaCBpcyBjb3JyZWN0LCBiZWNhdXNlIGVhY2gKCS8vIHN0YWdpbmcgYWxyZWFkeSBjYXJyaWVzIHRoZSBmb2xkcyB1cCB0byBpdC4gQSBgYnJlYWtgIGFmdGVyIHRoZQoJLy8gZmlyc3QgbWF0Y2ggd291bGQgYmUgdGhlIGJ1ZywgYW5kIHdpdGggb25seSBUV08gbGVncyB0aGUgZmlyc3QKCS8vIG1hdGNoIElTIHRoZSBsYXN0LCBzbyB0aGUgdHdvLWxlZyBjYXNlIGFib3ZlIHBhc3NlcyBlaXRoZXIgd2F5LgoJLy8gSXQgdGFrZXMgYSB0aGlyZCBsZWcgdG8gdGVsbCB0aGUgaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgc2Fib3RhZ2UsCgkvLyBhbmQgbmVpdGhlciBJc0JhbGFuY2VkIG5vciBSZWRlcml2ZUZyb21Kb3VybmFsIHdvdWxkIG5vdGljZTogdGhlCgkvLyBkcm9wcGVkIG1pZGRsZSBsZWcgd291bGQgYmUgYWJzZW50IGZyb20gdGhlIGFjY291bnQgQU5EIGZyb20gdGhlCgkvLyBzdG9yZWQgZW50cnkgdGhlIHJlcGxheSByZWFkcy4KCWIgOj0gbmV3Qm9vayh0KQoJYi5NdXN0UG9zdCgxLCAidGhyZWUgbGVncyB0aHJvdWdoIG9uZSBhY2NvdW50IiwgW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiA1MDB9LAoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMjAwfSwKCQl7QWNjb3VudDogY2FzaCwgU2lkZTogRGViaXQsIEFtb3VudDogMTAwfSwKCQl7QWNjb3VudDogcmV2ZW51ZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDQwMH0sCgl9KQoJYSwgXyA6PSBiLkFjY291bnQoY2FzaCkKCWlmIGEuRGViaXRzICE9IDYwMCB8fCBhLkNyZWRpdHMgIT0gMjAwIHsKCQl0LkZhdGFsZigiY2FzaCA9ICUrdiwgd2FudCBkZWJpdHMgNjAwIGNyZWRpdHMgMjAwIChhbGwgdGhyZWUgbGVncykiLCBhKQoJfQoJaWYgYS5CYWxhbmNlKCkgIT0gNDAwIHsKCQl0LkZhdGFsZigiY2FzaCBiYWxhbmNlID0gJWQsIHdhbnQgNDAwIiwgYS5CYWxhbmNlKCkpCgl9CglpZiBiLlRvdGFsRGViaXRzKCkgIT0gNjAwIHx8IGIuVG90YWxDcmVkaXRzKCkgIT0gNjAwIHsKCQl0LkZhdGFsZigiYm9vayB0b3RhbHMgPSAlZC8lZCwgd2FudCA2MDAvNjAwIiwKCQkJYi5Ub3RhbERlYml0cygpLCBiLlRvdGFsQ3JlZGl0cygpKQoJfQoJaWYgIWIuSXNCYWxhbmNlZCgpIHsKCQl0LkZhdGFsKCJwZXItYWNjb3VudCB0b3RhbHMgZHJpZnRlZCBmcm9tIHRoZSBydW5uaW5nIHRvdGFscyIpCgl9CglpZiBfLCBfLCBhZ3JlZXMgOj0gYi5SZWRlcml2ZUZyb21Kb3VybmFsKCk7ICFhZ3JlZXMgewoJCXQuRmF0YWwoImpvdXJuYWwgcmVwbGF5IGRpc2FncmVlcyB3aXRoIHRoZSBhY2N1bXVsYXRvcnMiKQoJfQoJLy8gQW5kIHRoZSBzdG9yZWQgZW50cnkga2VwdCBhbGwgZm91ciBwb3N0aW5ncywgbm90IGEgZGVkdXBsaWNhdGVkIHRocmVlLgoJZSwgb2sgOj0gYi5FbnRyeSgxKQoJaWYgIW9rIHsKCQl0LkZhdGFsKCJlbnRyeSAxIG1pc3NpbmciKQoJfQoJaWYgbGVuKGUuUG9zdGluZ3MpICE9IDQgewoJCXQuRmF0YWxmKCJzdG9yZWQgcG9zdGluZ3MgPSAlZCwgd2FudCA0IiwgbGVuKGUuUG9zdGluZ3MpKQoJfQp9CgpmdW5jIFRlc3RBY2NvdW50aW5nRXF1YXRpb25Jc0JsaW5kVG9BS2luZE1pc2NsYXNzaWZpY2F0aW9uKHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIHNhYm90YWdlIHRoYXQgcHJvdmVzIHRoZSBORUdBVElWRSBjbGFpbSBpbiB0aGUgZG9jcywgYmVjYXVzZSBhbgoJLy8gdW5lbmZvcmNlZCBkb2MgY2xhaW0gaXMgdGhlIGRlZmVjdCB0aGlzIHBhY2thZ2Uga2VlcHMgYmVpbmcgYXVkaXRlZAoJLy8gZm9yLiBPYmxpZ2F0aW9uIDcgYW5kIEFjY291bnRpbmdFcXVhdGlvbidzIG93biBkb2MgYm90aCBzYXkgYSB3cm9uZwoJLy8gS2luZCBpcyB1bmRldGVjdGFibGUgYnkgZXZlcnkgY2hlY2sgaGVyZS4gQXNzZXJ0IGl0IHJhdGhlciB0aGFuCgkvLyBhc2tpbmcgYSByZWFkZXIgdG8gYmVsaWV2ZSBpdC4KCS8vCgkvLyBJZiB0aGlzIHRlc3QgZXZlciBmYWlscywgc29tZSBjaGVjayBsZWFybmVkIHRvIHZhbGlkYXRlIGEgS2luZCAtLQoJLy8gdXBkYXRlIHRoZSBkb2NzLCBkbyBub3QgcmVsYXggdGhlIHRlc3QuCgliIDo9IG5ld0Jvb2sodCkKCWIuTXVzdFBvc3QoMSwgIiIsIHBhaXIoY2FzaCwgcmV2ZW51ZSwgMTAwKSkKCglkbiwgY24sIG9mZnNldHMgOj0gYi5BY2NvdW50aW5nRXF1YXRpb24oKQoJaWYgIW9mZnNldHMgewoJCXQuRmF0YWwoInByZWNvbmRpdGlvbjogYSBjbGVhbiBib29rIG11c3Qgb2Zmc2V0IikKCX0KCWlmIGRuICE9IDEwMCB8fCBjbiAhPSAtMTAwIHsKCQl0LkZhdGFsZigic3VidG90YWxzID0gJWQvJWQsIHdhbnQgMTAwLy0xMDAiLCBkbiwgY24pCgl9CgoJLy8gUmVjbGFzc2lmeSBDYXNoIGZyb20gQXNzZXQgdG8gTGlhYmlsaXR5OiBhIGNyZWRpdC1ub3JtYWwgYnVja2V0IGZvcgoJLy8gYW4gYWNjb3VudCBob2xkaW5nIGEgZGViaXQgYmFsYW5jZS4gTm90aGluZyBhYm91dCBEZWJpdHMgb3IgQ3JlZGl0cwoJLy8gY2hhbmdlcywgc28gbm90aGluZyBidWlsdCBvbiB0aGVtIGNhbiBzZWUgaXQuCglhLCBfIDo9IGIuQWNjb3VudChjYXNoKQoJYS5LaW5kID0gTGlhYmlsaXR5CgliLmFjY291bnRzLlNldChhLkNvZGUsIGEpCgoJZG4yLCBjbjIsIG9mZnNldHMyIDo9IGIuQWNjb3VudGluZ0VxdWF0aW9uKCkKCWlmICFvZmZzZXRzMiB7CgkJdC5GYXRhbCgib2Zmc2V0cyBtdXN0IFNUQVkgdHJ1ZSAtLSBpdCBpcyBpbnZhcmlhbnQgdW5kZXIgdGhlIHBhcnRpdGlvbiIpCgl9CgkvLyBCb3RoIHN1YnRvdGFscyBtb3ZlZCwgd2hpY2ggaXMgaG93IHdlIGtub3cgdGhlIG1pc2NsYXNzaWZpY2F0aW9uCgkvLyByZWFsbHkgdG9vayBlZmZlY3QgYW5kIHRoZSBpbnZhcmlhbmNlIGlzIG5vdCBhIHZhY3VvdXMgcGFzcy4KCWlmIGRuMiAhPSAwIHx8IGNuMiAhPSAwIHsKCQl0LkZhdGFsZigic3VidG90YWxzID0gJWQvJWQsIHdhbnQgMC8wIGFmdGVyIHJlY2xhc3NpZmljYXRpb24iLCBkbjIsIGNuMikKCX0KCWlmIGRuMiA9PSBkbiAmJiBjbjIgPT0gY24gewoJCXQuRmF0YWwoInN1YnRvdGFscyBkaWQgbm90IG1vdmU7IHRoZSBzYWJvdGFnZSBkaWQgbm90IHRha2UiKQoJfQoJLy8gVGhlIG90aGVyIHR3byB0aWVycyBhcmUgZXF1YWxseSBibGluZC4KCWlmICFiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgiSXNCYWxhbmNlZCBtdXN0IHN0YXkgdHJ1ZTogS2luZCBpcyBub3Qgb25lIG9mIGl0cyBpbnB1dHMiKQoJfQoJaWYgXywgXywgYWdyZWVzIDo9IGIuUmVkZXJpdmVGcm9tSm91cm5hbCgpOyAhYWdyZWVzIHsKCQl0LkZhdGFsKCJSZWRlcml2ZUZyb21Kb3VybmFsIG11c3Qgc3RheSB0cnVlIGZvciB0aGUgc2FtZSByZWFzb24iKQoJfQoJLy8gQW5kIHRoZSB2aXNpYmxlIGNvbnNlcXVlbmNlOiBhIHNpZ24tZmxpcHBlZCBiYWxhbmNlLCByZXBvcnRlZAoJLy8gY29uZmlkZW50bHkgYnkgdGhlIG9ubHkgYWNjZXNzb3IgYSBjb25zdW1lciBpcyBsaWtlbHkgdG8gcXVvdGUuCglhMiwgXyA6PSBiLkFjY291bnQoY2FzaCkKCWlmIGEyLkJhbGFuY2UoKSAhPSAtMTAwIHsKCQl0LkZhdGFsZigiYmFsYW5jZSA9ICVkLCB3YW50IC0xMDAgKHRoZSBzaWduIGZsaXAsIHNpbGVudGx5KSIsCgkJCWEyLkJhbGFuY2UoKSkKCX0KCWlmIGEyLlJhd0RlbHRhKCkgIT0gMTAwIHsKCQl0LkZhdGFsZigiUmF3RGVsdGEgPSAlZCwgd2FudCAxMDAgLS0gdW5jaGFuZ2VkLCB3aGljaCBpcyB0aGUgcG9pbnQiLAoJCQlhMi5SYXdEZWx0YSgpKQoJfQp9CgpmdW5jIFRlc3RQb3N0UmVzcGVjdHNFbnRyeUNhcCh0ICp0ZXN0aW5nLlQpIHsKCWIsIGVyciA6PSBOZXcoOCwgMikKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJOZXc6ICV2IiwgZXJyKQoJfQoJYi5NdXN0T3BlbihjYXNoLCAiQ2FzaCIsIEFzc2V0KQoJYi5NdXN0T3BlbihyZXZlbnVlLCAiU2FsZXMiLCBSZXZlbnVlKQoJYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxKSkKCWIuTXVzdFBvc3QoMiwgIiIsIHBhaXIoY2FzaCwgcmV2ZW51ZSwgMSkpCglpZiBfLCBlcnIgOj0gYi5Qb3N0KDMsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEpKTsgZXJyICE9IEVyckJvb2tGdWxsIHsKCQl0LkZhdGFsZigiUG9zdCBwYXN0IGNhcCA9ICV2LCB3YW50IEVyckJvb2tGdWxsIiwgZXJyKQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMiB7CgkJdC5GYXRhbGYoIkVudHJ5Q291bnQgPSAlZCwgd2FudCAyIiwgYi5FbnRyeUNvdW50KCkpCgl9CgkvLyBBIHJlZnVzZWQgUG9zdCBtdXN0IG5vdCBjb25zdW1lIGFuIElEIGVpdGhlci4KCWlmIGIuTmV4dElEKCkgIT0gMyB7CgkJdC5GYXRhbGYoIk5leHRJRCA9ICVkLCB3YW50IDMiLCBiLk5leHRJRCgpKQoJfQp9CgpmdW5jIFRlc3RNdXN0UG9zdFBhbmljcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJbXVzdFBhbmljV2l0aCh0LCAiam91cm5hbDogZW50cnkgZG9lcyBub3QgYmFsYW5jZSwgZGViaXRzIGFyZSBzaG9ydCIsIGZ1bmMoKSB7CgkJYi5NdXN0UG9zdCgxLCAiIiwgW11Qb3N0aW5newoJCQl7QWNjb3VudDogY2FzaCwgU2lkZTogRGViaXQsIEFtb3VudDogMX0sCgkJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMn0sCgkJfSkKCX0pCn0KCi8vIC0tLSBvdmVyZmxvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RQb3N0T3ZlcmZsb3dMZWF2ZXNCb29rVW5jaGFuZ2VkKHQgKnRlc3RpbmcuVCkgewoJY29uc3QgbWF4SW50NjQgPSBpbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3KQoJYiA6PSBuZXdCb29rKHQpCgliLk11c3RQb3N0KDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIG1heEludDY0KSkKCS8vIEEgc2Vjb25kIGVudHJ5IG9mIGFueSBwb3NpdGl2ZSBzaXplIG92ZXJmbG93cyB0aGUgcnVubmluZyB0b3RhbHMuCglpZiBfLCBlcnIgOj0gYi5Qb3N0KDIsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEpKTsgZXJyICE9IEVyck92ZXJmbG93IHsKCQl0LkZhdGFsZigiUG9zdCA9ICV2LCB3YW50IEVyck92ZXJmbG93IiwgZXJyKQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMSB8fCBiLlRvdGFsRGViaXRzKCkgIT0gbWF4SW50NjQgewoJCXQuRmF0YWwoImFuIG92ZXJmbG93aW5nIFBvc3QgbXVzdCB3cml0ZSBub3RoaW5nIikKCX0KCWlmICFiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgiYm9vayBtdXN0IHJlbWFpbiBiYWxhbmNlZCBhZnRlciBhIHJlZnVzZWQgb3ZlcmZsb3ciKQoJfQp9CgpmdW5jIFRlc3RQb3N0T3ZlcmZsb3dXaXRoaW5PbmVFbnRyeSh0ICp0ZXN0aW5nLlQpIHsKCWNvbnN0IG1heEludDY0ID0gaW50NjQoOTIyMzM3MjAzNjg1NDc3NTgwNykKCWIgOj0gbmV3Qm9vayh0KQoJaWYgXywgZXJyIDo9IGIuUG9zdCgxLCAiIiwgW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiBtYXhJbnQ2NH0sCgkJe0FjY291bnQ6IGFyLCBTaWRlOiBEZWJpdCwgQW1vdW50OiAxfSwKCQl7QWNjb3VudDogcmV2ZW51ZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IG1heEludDY0fSwKCQl7QWNjb3VudDogcGF5YWJsZSwgU2lkZTogQ3JlZGl0LCBBbW91bnQ6IDF9LAoJfSk7IGVyciAhPSBFcnJPdmVyZmxvdyB7CgkJdC5GYXRhbGYoIlBvc3QgPSAldiwgd2FudCBFcnJPdmVyZmxvdyIsIGVycikKCX0KCWlmIGIuRW50cnlDb3VudCgpICE9IDAgewoJCXQuRmF0YWwoIm11c3Qgd3JpdGUgbm90aGluZyIpCgl9Cn0KCmZ1bmMgVGVzdFBvc3RSZWZ1c2VzV2hlbklEc0FyZUV4aGF1c3RlZCh0ICp0ZXN0aW5nLlQpIHsKCS8vIG5leHRJRCBzdGFydHMgYXQgMSBhbmQgb25seSBldmVyIGluY3JlYXNlcywgc28gdGhlIHdyYXAgaXMgMl42NAoJLy8gZW50cmllcyBhd2F5IGFuZCB1bnJlYWNoYWJsZSB0aHJvdWdoIHRoZSBBUEkuIFRoZSBndWFyZCBpcyBzdGlsbAoJLy8gbG9hZC1iZWFyaW5nIC0tIGEgcmV1c2VkIGlkIG1ha2VzIG9uZSBpZCBuYW1lIHR3byBlbnRyaWVzIC0tIHNvIGl0CgkvLyBpcyBwcm92ZW4gYnkgcmVhY2hpbmcgcGFzdCB0aGUgQVBJIHRvIHRoZSBzaW5nbGUgc3RhdGUgdGhhdCBmaXJlcwoJLy8gaXQsIHdoaWNoIGlzIHRoZSBtb3ZlIFRlc3RJc0JhbGFuY2VkQ2F0Y2hlc0FEcmlmdGVkQWNjdW11bGF0b3IgbWFrZXMKCS8vIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uLgoJYiA6PSBuZXdCb29rKHQpCgliLm5leHRJRCA9IDAKCWlmIF8sIGVyciA6PSBiLlBvc3QoMSwgIiIsIHBhaXIoY2FzaCwgcmV2ZW51ZSwgMTAwKSk7IGVyciAhPSBFcnJJREV4aGF1c3RlZCB7CgkJdC5GYXRhbGYoIlBvc3QgPSAldiwgd2FudCBFcnJJREV4aGF1c3RlZCIsIGVycikKCX0KCWlmIGIuRW50cnlDb3VudCgpICE9IDAgewoJCXQuRmF0YWwoImEgcmVmdXNlZCBQb3N0IG11c3Qgd3JpdGUgbm90aGluZyIpCgl9Cn0KCmZ1bmMgVGVzdFBvc3RDb3BpZXNUaGVDYWxsZXJTbGljZSh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSB3cml0ZS1zaWRlIHR3aW4gb2YgVGVzdEVudHJ5UG9zdGluZ3NBcmVBRGVmZW5zaXZlQ29weSwgd2hpY2gKCS8vIG11dGF0ZXMgdGhlIHNsaWNlIEVudHJ5IFJFVFVSTlMuIFRoaXMgb25lIG11dGF0ZXMgdGhlIHNsaWNlIHRoZQoJLy8gQ0FMTEVSIHBhc3NlZCBpbjogaWYgcG9zdCBzdG9yZWQgdGhhdCBzbGljZSBieSByZWZlcmVuY2UsIHRoZSBjYWxsZXIKCS8vIGtlZXBzIGEgd3JpdGFibGUgd2luZG93IGludG8gYSBzZWFsZWQgam91cm5hbCBlbnRyeSwgYW5kIG5vCgkvLyByZWFkLXNpZGUgY29weSBjYW4gdGFrZSBpdCBiYWNrLgoJYiA6PSBuZXdCb29rKHQpCglsZWdzIDo9IHBhaXIoY2FzaCwgcmV2ZW51ZSwgMTAwKQoJaWQgOj0gYi5NdXN0UG9zdCgxLCAiIiwgbGVncykKCglsZWdzWzBdLkFtb3VudCA9IDk5OQoJbGVnc1swXS5BY2NvdW50ID0gImhhY2tlZCIKCWxlZ3NbMV0uU2lkZSA9IERlYml0CgoJZSwgZm91bmQgOj0gYi5FbnRyeShpZCkKCWlmICFmb3VuZCB7CgkJdC5GYXRhbCgidGhlIGVudHJ5IHZhbmlzaGVkIikKCX0KCWlmIGUuUG9zdGluZ3NbMF0uQW1vdW50ICE9IDEwMCB8fCBlLlBvc3RpbmdzWzBdLkFjY291bnQgIT0gY2FzaCB7CgkJdC5GYXRhbGYoInBvc3Qgc3RvcmVkIHRoZSBjYWxsZXIncyBzbGljZTogJSt2IiwgZS5Qb3N0aW5nc1swXSkKCX0KCWlmIGUuUG9zdGluZ3NbMV0uU2lkZSAhPSBDcmVkaXQgewoJCXQuRmF0YWwoInBvc3Qgc3RvcmVkIHRoZSBjYWxsZXIncyBzbGljZTogdGhlIHNpZGUgd2FzIG11dGF0ZWQgdGhyb3VnaCBpdCIpCgl9CglpZiBfLCBfLCBhZ3JlZXMgOj0gYi5SZWRlcml2ZUZyb21Kb3VybmFsKCk7ICFhZ3JlZXMgewoJCXQuRmF0YWwoInRoZSBqb3VybmFsIG11c3Qgc3RpbGwgYWdyZWUgd2l0aCBib3RoIGFjY3VtdWxhdG9ycyIpCgl9Cn0KCmZ1bmMgVGVzdFBvc3RDaGVja3NCb3RoUnVubmluZ1RvdGFsc1NlcGFyYXRlbHkodCAqdGVzdGluZy5UKSB7CgkvLyBBIHBvc3RlZCBlbnRyeSBhZHZhbmNlcyBib3RoIHJ1bm5pbmcgdG90YWxzIGJ5IHRoZSBzYW1lIGFtb3VudCwgc28KCS8vIHRocm91Z2ggdGhlIEFQSSBlaXRoZXIgY2hlY2sgYWxvbmUgd291bGQgY2F0Y2ggZXZlcnkgb3ZlcmZsb3cgdGhlCgkvLyBvdGhlciBvbmUgd291bGQgLS0gd2hpY2ggbWFrZXMgbmVpdGhlciBvZiB0aGVtIHByb3ZhYmxlLiBEcmlmdGluZwoJLy8gb25lIGFjY3VtdWxhdG9yIGZpcnN0IGlzIHdoYXQgbWFrZXMgdGhlIGRlYml0IGNoZWNrIGFuZCB0aGUgY3JlZGl0CgkvLyBjaGVjayBkaXN0aW5ndWlzaGFibGUgYXQgYWxsLgoJY29uc3QgbWF4SW50NjQgPSBpbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3KQoKCWIgOj0gbmV3Qm9vayh0KQoJYi50b3RhbERlYml0cyA9IG1heEludDY0CglpZiBfLCBlcnIgOj0gYi5Qb3N0KDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEpKTsgZXJyICE9IEVyck92ZXJmbG93IHsKCQl0LkZhdGFsZigiZGViaXQgc2lkZTogUG9zdCA9ICV2LCB3YW50IEVyck92ZXJmbG93IiwgZXJyKQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMCB7CgkJdC5GYXRhbCgiZGViaXQgc2lkZTogYSByZWZ1c2VkIFBvc3QgbXVzdCB3cml0ZSBub3RoaW5nIikKCX0KCgliID0gbmV3Qm9vayh0KQoJYi50b3RhbENyZWRpdHMgPSBtYXhJbnQ2NAoJaWYgXywgZXJyIDo9IGIuUG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxKSk7IGVyciAhPSBFcnJPdmVyZmxvdyB7CgkJdC5GYXRhbGYoImNyZWRpdCBzaWRlOiBQb3N0ID0gJXYsIHdhbnQgRXJyT3ZlcmZsb3ciLCBlcnIpCgl9CglpZiBiLkVudHJ5Q291bnQoKSAhPSAwIHsKCQl0LkZhdGFsKCJjcmVkaXQgc2lkZTogYSByZWZ1c2VkIFBvc3QgbXVzdCB3cml0ZSBub3RoaW5nIikKCX0KfQoKZnVuYyBUZXN0UG9zdFJlZnVzZXNBUGVyQWNjb3VudE92ZXJmbG93KHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIGJvb2stbGV2ZWwgdG90YWxzIGFyZSBjaGVja2VkIGJlZm9yZSB0aGUgY2hhcnQgaXMgdG91Y2hlZCwgYW5kCgkvLyBoZXJlIHRoZXkgYXJlIGF0IHplcm8gYW5kIHBhc3MgLS0gc28gdGhpcyByZWFjaGVzIHRoZSBwZXItYWNjb3VudAoJLy8gc3RhZ2luZyBjaGVjayBhbmQgbm90aGluZyBlbHNlIGRvZXMuIFdpdGhvdXQgaXQgYSBjaGFydCBsaW5lIHdyYXBzCgkvLyBuZWdhdGl2ZSB3aGlsZSB0aGUgYm9vayBzdGlsbCByZWFkcyBiYWxhbmNlZCBhdCB0aGUgdG9wIGxldmVsLgoJY29uc3QgbWF4SW50NjQgPSBpbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3KQoJYiA6PSBuZXdCb29rKHQpCglhLCBfIDo9IGIuQWNjb3VudChjYXNoKQoJYS5EZWJpdHMgPSBtYXhJbnQ2NAoJYi5hY2NvdW50cy5TZXQoYS5Db2RlLCBhKQoKCWlmIGIuVG90YWxEZWJpdHMoKSAhPSAwIHsKCQl0LkZhdGFsKCJwcmVjb25kaXRpb246IHRoZSBib29rLWxldmVsIGNoZWNrIG11c3Qgbm90IGJlIHRoZSBvbmUgdGhhdCBmaXJlcyIpCgl9CglpZiBfLCBlcnIgOj0gYi5Qb3N0KDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEpKTsgZXJyICE9IEVyck92ZXJmbG93IHsKCQl0LkZhdGFsZigiUG9zdCA9ICV2LCB3YW50IEVyck92ZXJmbG93IiwgZXJyKQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMCB7CgkJdC5GYXRhbCgiYSByZWZ1c2VkIFBvc3QgbXVzdCB3cml0ZSBub3RoaW5nIikKCX0KCWFnYWluLCBfIDo9IGIuQWNjb3VudChjYXNoKQoJaWYgYWdhaW4uRGViaXRzICE9IG1heEludDY0IHsKCQl0LkZhdGFsZigiY2FzaC5EZWJpdHMgPSAlZCwgd2FudCB0aGUgd2hvbGUgc3RhZ2luZyBsaXN0IGRpc2NhcmRlZCIsIGFnYWluLkRlYml0cykKCX0KfQoKZnVuYyBUZXN0Q2hlY2tlZEFkZEJyYW5jaGVzKHQgKnRlc3RpbmcuVCkgewoJY29uc3QgbWF4SW50NjQgPSBpbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3KQoJY29uc3QgbWluSW50NjQgPSAtbWF4SW50NjQgLSAxCglpZiB2LCBvayA6PSBjaGVja2VkQWRkKDIsIDMpOyAhb2sgfHwgdiAhPSA1IHsKCQl0LkZhdGFsZigiY2hlY2tlZEFkZCgyLDMpID0gJWQsJXYiLCB2LCBvaykKCX0KCWlmIF8sIG9rIDo9IGNoZWNrZWRBZGQobWF4SW50NjQsIDEpOyBvayB7CgkJdC5GYXRhbCgicG9zaXRpdmUgb3ZlcmZsb3cgbm90IGNhdWdodCIpCgl9CglpZiBfLCBvayA6PSBjaGVja2VkQWRkKG1pbkludDY0LCAtMSk7IG9rIHsKCQl0LkZhdGFsKCJuZWdhdGl2ZSBvdmVyZmxvdyBub3QgY2F1Z2h0IikKCX0KCWlmIHYsIG9rIDo9IGNoZWNrZWRBZGQobWF4SW50NjQsIC0xKTsgIW9rIHx8IHYgIT0gbWF4SW50NjQtMSB7CgkJdC5GYXRhbGYoImNoZWNrZWRBZGQobWF4LC0xKSA9ICVkLCV2Iiwgdiwgb2spCgl9CglpZiB2LCBvayA6PSBjaGVja2VkQWRkKDUsIDApOyAhb2sgfHwgdiAhPSA1IHsKCQl0LkZhdGFsZigiY2hlY2tlZEFkZCg1LDApID0gJWQsJXYiLCB2LCBvaykKCX0KfQoKLy8gLS0tIHJldmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdFJldmVyc2VNaXJyb3JzRXZlcnlQb3N0aW5nQW5kTmV0c1RvWmVybyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWQgOj0gYi5NdXN0UG9zdCgxMCwgIndyb25nIGFjY291bnQiLCBbXVBvc3Rpbmd7CgkJe0FjY291bnQ6IGNhc2gsIFNpZGU6IERlYml0LCBBbW91bnQ6IDMwMH0sCgkJe0FjY291bnQ6IGFyLCBTaWRlOiBEZWJpdCwgQW1vdW50OiA3MDB9LAoJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogMTAwMH0sCgl9KQoJcmV2SUQgOj0gYi5NdXN0UmV2ZXJzZShpZCwgMjAsICJmaXhpbmcgaXQiKQoJaWYgcmV2SUQgIT0gaWQrMSB7CgkJdC5GYXRhbGYoInJldmVyc2FsIGlkID0gJWQsIHdhbnQgJWQiLCByZXZJRCwgaWQrMSkKCX0KCglyZXYsIF8gOj0gYi5FbnRyeShyZXZJRCkKCWlmICFyZXYuSXNSZXZlcnNhbCgpIHx8IHJldi5SZXZlcnNhbE9mICE9IGlkIHsKCQl0LkZhdGFsZigicmV2ZXJzYWwgbWV0YWRhdGEgPSAlK3YiLCByZXYpCgl9CglpZiByZXYuQXQgIT0gMjAgfHwgcmV2Lk1lbW8gIT0gImZpeGluZyBpdCIgewoJCXQuRmF0YWxmKCJyZXZlcnNhbCBkYXRpbmcvbWVtbyA9ICUrdiIsIHJldikKCX0KCW9yaWcsIF8gOj0gYi5FbnRyeShpZCkKCWlmIG9yaWcuSXNSZXZlcnNhbCgpIHsKCQl0LkZhdGFsKCJ0aGUgb3JpZ2luYWwgbXVzdCBub3QgYmUgbWFya2VkIGEgcmV2ZXJzYWwiKQoJfQoJaWYgbGVuKHJldi5Qb3N0aW5ncykgIT0gbGVuKG9yaWcuUG9zdGluZ3MpIHsKCQl0LkZhdGFsZigicG9zdGluZ3MgPSAlZCwgd2FudCAlZCIsIGxlbihyZXYuUG9zdGluZ3MpLCBsZW4ob3JpZy5Qb3N0aW5ncykpCgl9Cglmb3IgaSwgcCA6PSByYW5nZSByZXYuUG9zdGluZ3MgewoJCW8gOj0gb3JpZy5Qb3N0aW5nc1tpXQoJCWlmIHAuQWNjb3VudCAhPSBvLkFjY291bnQgfHwgcC5BbW91bnQgIT0gby5BbW91bnQgfHwgcC5TaWRlICE9IG8uU2lkZS5PcHBvc2l0ZSgpIHsKCQkJdC5GYXRhbGYoInBvc3RpbmcgJWQgPSAlK3YsIHdhbnQgbWlycm9yIG9mICUrdiIsIGksIHAsIG8pCgkJfQoJfQoKCS8vIFRoZSB3aG9sZSBwb2ludDogZXZlcnkgYmFsYW5jZSBpcyBiYWNrIHRvIHplcm8sIGFuZCBCT1RIIGVudHJpZXMgYXJlCgkvLyBzdGlsbCB2aXNpYmxlLgoJZm9yIF8sIGNvZGUgOj0gcmFuZ2UgW11zdHJpbmd7Y2FzaCwgYXIsIHJldmVudWV9IHsKCQlpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKGNvZGUpOyBnb3QgIT0gMCB7CgkJCXQuRmF0YWxmKCIlcyA9ICVkLCB3YW50IDAgYWZ0ZXIgcmV2ZXJzYWwiLCBjb2RlLCBnb3QpCgkJfQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMiB7CgkJdC5GYXRhbGYoIkVudHJ5Q291bnQgPSAlZCwgd2FudCAyIC0tIGEgcmV2ZXJzYWwgbXVzdCBub3QgZGVsZXRlIiwgYi5FbnRyeUNvdW50KCkpCgl9CglpZiAhYi5Jc0JhbGFuY2VkKCkgewoJCXQuRmF0YWwoImJvb2sgbXVzdCBiZSBiYWxhbmNlZCBhZnRlciByZXZlcnNhbCIpCgl9CglpZiBfLCBfLCBhZ3JlZXMgOj0gYi5SZWRlcml2ZUZyb21Kb3VybmFsKCk7ICFhZ3JlZXMgewoJCXQuRmF0YWwoImpvdXJuYWwgcmVwbGF5IG11c3QgYWdyZWUgYWZ0ZXIgcmV2ZXJzYWwiKQoJfQp9CgpmdW5jIFRlc3RSZXZlcnNlSXNPbmNlT25seSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWQgOj0gYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxMDApKQoJaWYgYi5Jc1JldmVyc2VkKGlkKSB7CgkJdC5GYXRhbCgiYSBmcmVzaCBlbnRyeSBtdXN0IG5vdCByZWFkIGFzIHJldmVyc2VkIikKCX0KCWIuTXVzdFJldmVyc2UoaWQsIDIsICIiKQoJaWYgIWIuSXNSZXZlcnNlZChpZCkgewoJCXQuRmF0YWwoIklzUmV2ZXJzZWQgbXVzdCByZXBvcnQgdGhlIHJldmVyc2FsIikKCX0KCWlmIF8sIGVyciA6PSBiLlJldmVyc2UoaWQsIDMsICIiKTsgZXJyICE9IEVyckFscmVhZHlSZXZlcnNlZCB7CgkJdC5GYXRhbGYoInNlY29uZCBSZXZlcnNlID0gJXYsIHdhbnQgRXJyQWxyZWFkeVJldmVyc2VkIiwgZXJyKQoJfQoJaWYgYi5FbnRyeUNvdW50KCkgIT0gMiB7CgkJdC5GYXRhbGYoIkVudHJ5Q291bnQgPSAlZCwgd2FudCAyIiwgYi5FbnRyeUNvdW50KCkpCgl9Cn0KCmZ1bmMgVGVzdFJldmVyc2VBUmV2ZXJzYWxJc1Blcm1pdHRlZEFuZEFsc29PbmNlT25seSh0ICp0ZXN0aW5nLlQpIHsKCS8vIERvY3VtZW50ZWQgYmVoYXZpb3VyOiByZXZlcnNpbmcgYSByZXZlcnNhbCByZS1hcHBsaWVzIHRoZSBvcmlnaW5hbC4KCWIgOj0gbmV3Qm9vayh0KQoJaWQgOj0gYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxMDApKQoJcmV2SUQgOj0gYi5NdXN0UmV2ZXJzZShpZCwgMiwgIiIpCglpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKGNhc2gpOyBnb3QgIT0gMCB7CgkJdC5GYXRhbGYoImNhc2ggPSAlZCwgd2FudCAwIiwgZ290KQoJfQoJcmVSZXZJRCA6PSBiLk11c3RSZXZlcnNlKHJldklELCAzLCAidW5kbyB0aGUgdW5kbyIpCglpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKGNhc2gpOyBnb3QgIT0gMTAwIHsKCQl0LkZhdGFsZigiY2FzaCA9ICVkLCB3YW50IDEwMCAtLSByZS1yZXZlcnNhbCBtdXN0IHJlLWFwcGx5IiwgZ290KQoJfQoJaWYgXywgZXJyIDo9IGIuUmV2ZXJzZShyZXZJRCwgNCwgIiIpOyBlcnIgIT0gRXJyQWxyZWFkeVJldmVyc2VkIHsKCQl0LkZhdGFsZigic2Vjb25kIFJldmVyc2Ugb2YgdGhlIHJldmVyc2FsID0gJXYsIHdhbnQgRXJyQWxyZWFkeVJldmVyc2VkIiwgZXJyKQoJfQoJaWYgcmVSZXZJRCAhPSAzIHx8IGIuRW50cnlDb3VudCgpICE9IDMgewoJCXQuRmF0YWxmKCJpZHMvY291bnQgPSAlZC8lZCwgd2FudCAzLzMiLCByZVJldklELCBiLkVudHJ5Q291bnQoKSkKCX0KCWlmICFiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgibXVzdCBzdGF5IGJhbGFuY2VkIikKCX0KfQoKZnVuYyBUZXN0UmV2ZXJzZVZhbGlkYXRpb24odCAqdGVzdGluZy5UKSB7Cglsb25nIDo9ICIiCglmb3IgaSA6PSAwOyBpIDwgTWF4TWVtb0xlbisxOyBpKysgewoJCWxvbmcgKz0gIm0iCgl9CgliIDo9IG5ld0Jvb2sodCkKCWlkIDo9IGIuTXVzdFBvc3QoMTAsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEwMCkpCgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSBzdHJpbmcKCQlpZCAgIHVpbnQ2NAoJCWF0ICAgaW50NjQKCQltZW1vIHN0cmluZwoJCXdhbnQgZXJyb3IKCX17CgkJeyJubyBzdWNoIGVudHJ5IiwgOTk5LCAyMCwgIiIsIEVyckVudHJ5Tm90Rm91bmR9LAoJCXsiZW50cnkgaWQgemVybyIsIDAsIDIwLCAiIiwgRXJyRW50cnlOb3RGb3VuZH0sCgkJeyJuZWdhdGl2ZSBhdCIsIGlkLCAtMSwgIiIsIEVyckludmFsaWRBdH0sCgkJeyJtZW1vIHRvbyBsb25nIiwgaWQsIDIwLCBsb25nLCBFcnJNZW1vVG9vTG9uZ30sCgl9Cglmb3IgXywgdGMgOj0gcmFuZ2UgY2FzZXMgewoJCXQuUnVuKHRjLm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CgkJCWlmIF8sIGVyciA6PSBiLlJldmVyc2UodGMuaWQsIHRjLmF0LCB0Yy5tZW1vKTsgZXJyICE9IHRjLndhbnQgewoJCQkJdC5GYXRhbGYoIlJldmVyc2UgPSAldiwgd2FudCAldiIsIGVyciwgdGMud2FudCkKCQkJfQoJCQlpZiBiLkVudHJ5Q291bnQoKSAhPSAxIHsKCQkJCXQuRmF0YWwoImEgcmVmdXNlZCBSZXZlcnNlIG11c3Qgd3JpdGUgbm90aGluZyIpCgkJCX0KCQkJaWYgYi5Jc1JldmVyc2VkKGlkKSB7CgkJCQl0LkZhdGFsKCJhIHJlZnVzZWQgUmV2ZXJzZSBtdXN0IG5vdCBjb25zdW1lIHRoZSBzaW5nbGUgcmV2ZXJzYWwiKQoJCQl9CgkJfSkKCX0KfQoKZnVuYyBUZXN0UmVmdXNlZFJldmVyc2VEb2VzTm90Q29uc3VtZVRoZVJldmVyc2FsKHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIG9yZGVyaW5nIHRoYXQgbWF0dGVyczogYHJldmVyc2VkYCBpcyBtYXJrZWQgb25seSBBRlRFUiBwb3N0CgkvLyBzdWNjZWVkcy4gQSBib29rIGF0IGl0cyBlbnRyeSBjYXAgcmVmdXNlcyB0aGUgcmV2ZXJzYWw7IHRoZSBvcmlnaW5hbAoJLy8gbXVzdCBzdGlsbCBiZSByZXZlcnNpYmxlIG9uY2UgdGhlcmUgaXMgcm9vbS4KCWIsIGVyciA6PSBOZXcoOCwgMSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJOZXc6ICV2IiwgZXJyKQoJfQoJYi5NdXN0T3BlbihjYXNoLCAiQ2FzaCIsIEFzc2V0KQoJYi5NdXN0T3BlbihyZXZlbnVlLCAiU2FsZXMiLCBSZXZlbnVlKQoJaWQgOj0gYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxMDApKQoJaWYgXywgZXJyIDo9IGIuUmV2ZXJzZShpZCwgMiwgIiIpOyBlcnIgIT0gRXJyQm9va0Z1bGwgewoJCXQuRmF0YWxmKCJSZXZlcnNlID0gJXYsIHdhbnQgRXJyQm9va0Z1bGwiLCBlcnIpCgl9CglpZiBiLklzUmV2ZXJzZWQoaWQpIHsKCQl0LkZhdGFsKCJhIHJldmVyc2FsIHJlZnVzZWQgYXQgdGhlIGNhcCBtdXN0IG5vdCBtYXJrIHRoZSBlbnRyeSByZXZlcnNlZCIpCgl9CgoJLy8gU2FtZSBib29rLCB3aXRoIHJvb206IHRoZSByZXZlcnNhbCBub3cgc3VjY2VlZHMuCgliMiwgXyA6PSBOZXcoOCwgMikKCWIyLk11c3RPcGVuKGNhc2gsICJDYXNoIiwgQXNzZXQpCgliMi5NdXN0T3BlbihyZXZlbnVlLCAiU2FsZXMiLCBSZXZlbnVlKQoJaWQyIDo9IGIyLk11c3RQb3N0KDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEwMCkpCglpZiBfLCBlcnIgOj0gYjIuUmV2ZXJzZShpZDIsIDIsICIiKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIlJldmVyc2Ugd2l0aCByb29tID0gJXYsIHdhbnQgbmlsIiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RNdXN0UmV2ZXJzZVBhbmljcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJbXVzdFBhbmljV2l0aCh0LCAiam91cm5hbDogbm8gc3VjaCBlbnRyeSIsIGZ1bmMoKSB7IGIuTXVzdFJldmVyc2UoNDIsIDEsICIiKSB9KQp9CgovLyAtLS0gcGVyaW9kIGNsb3NlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0Q2xvc2VTZWFsc0JhY2tkYXRpbmdGb3JCb3RoUG9zdEFuZFJldmVyc2UodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWlkIDo9IGIuTXVzdFBvc3QoMTAsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEwMCkpCglpZiBlcnIgOj0gYi5DbG9zZSgxMDApOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQ2xvc2U6ICV2IiwgZXJyKQoJfQoJdGhyb3VnaCwgY2xvc2VkIDo9IGIuQ2xvc2VkVGhyb3VnaCgpCglpZiAhY2xvc2VkIHx8IHRocm91Z2ggIT0gMTAwIHsKCQl0LkZhdGFsZigiQ2xvc2VkVGhyb3VnaCA9ICVkLCV2IHdhbnQgMTAwLHRydWUiLCB0aHJvdWdoLCBjbG9zZWQpCgl9CgkvLyBBdCB0aGUgYm91bmRhcnkgYW5kIGJlbG93IGFyZSBzZWFsZWQ7IHRoZSBpbnN0YW50IGFmdGVyIGlzIG9wZW4uCglpZiBfLCBlcnIgOj0gYi5Qb3N0KDEwMCwgIiIsIHBhaXIoY2FzaCwgcmV2ZW51ZSwgMSkpOyBlcnIgIT0gRXJyUGVyaW9kQ2xvc2VkIHsKCQl0LkZhdGFsZigiUG9zdCBhdCB0aGUgc2VhbCA9ICV2LCB3YW50IEVyclBlcmlvZENsb3NlZCIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLlBvc3QoNTAsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEpKTsgZXJyICE9IEVyclBlcmlvZENsb3NlZCB7CgkJdC5GYXRhbGYoIlBvc3QgYmVmb3JlIHRoZSBzZWFsID0gJXYsIHdhbnQgRXJyUGVyaW9kQ2xvc2VkIiwgZXJyKQoJfQoJaWYgXywgZXJyIDo9IGIuUG9zdCgxMDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEpKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIlBvc3QgYWZ0ZXIgdGhlIHNlYWwgPSAldiwgd2FudCBuaWwiLCBlcnIpCgl9CgkvLyBSZXZlcnNlIGlzIHNlYWxlZCBieSB0aGUgc2FtZSBydWxlOiBhIGNsb3NlZCBwZXJpb2QgY2Fubm90IGJlCgkvLyBjb3JyZWN0ZWQgaW4gcGxhY2UuCglpZiBfLCBlcnIgOj0gYi5SZXZlcnNlKGlkLCAxMDAsICIiKTsgZXJyICE9IEVyclBlcmlvZENsb3NlZCB7CgkJdC5GYXRhbGYoIlJldmVyc2UgaW50byB0aGUgc2VhbCA9ICV2LCB3YW50IEVyclBlcmlvZENsb3NlZCIsIGVycikKCX0KCWlmIGIuSXNSZXZlcnNlZChpZCkgewoJCXQuRmF0YWwoImEgcGVyaW9kLXJlZnVzZWQgUmV2ZXJzZSBtdXN0IG5vdCBjb25zdW1lIHRoZSByZXZlcnNhbCIpCgl9CglpZiBfLCBlcnIgOj0gYi5SZXZlcnNlKGlkLCAyMDAsICJjb3JyZWN0ZWQgaW4gdGhlIG9wZW4gcGVyaW9kIik7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJSZXZlcnNlIGluIHRoZSBvcGVuIHBlcmlvZCA9ICV2LCB3YW50IG5pbCIsIGVycikKCX0KfQoKZnVuYyBUZXN0Q2xvc2VPbmx5TW92ZXNGb3J3YXJkKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBuZXdCb29rKHQpCglpZiBlcnIgOj0gYi5DbG9zZSgxMDApOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQ2xvc2U6ICV2IiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuQ2xvc2UoMTAwKTsgZXJyICE9IEVyckNsb3NlTm90Rm9yd2FyZCB7CgkJdC5GYXRhbGYoInJlLWNsb3NlIGF0IHRoZSBzYW1lIGluc3RhbnQgPSAldiwgd2FudCBFcnJDbG9zZU5vdEZvcndhcmQiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5DbG9zZSg5OSk7IGVyciAhPSBFcnJDbG9zZU5vdEZvcndhcmQgewoJCXQuRmF0YWxmKCJjbG9zZSBiYWNrd2FyZHMgPSAldiwgd2FudCBFcnJDbG9zZU5vdEZvcndhcmQiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5DbG9zZSgtMSk7IGVyciAhPSBFcnJJbnZhbGlkQXQgewoJCXQuRmF0YWxmKCJDbG9zZSgtMSkgPSAldiwgd2FudCBFcnJJbnZhbGlkQXQiLCBlcnIpCgl9CgkvLyBUaGUgc2VhbCBtdXN0IGJlIGV4YWN0bHkgd2hlcmUgaXQgd2FzIGFmdGVyIHRocmVlIHJlZnVzYWxzLgoJdGhyb3VnaCwgXyA6PSBiLkNsb3NlZFRocm91Z2goKQoJaWYgdGhyb3VnaCAhPSAxMDAgewoJCXQuRmF0YWxmKCJDbG9zZWRUaHJvdWdoID0gJWQsIHdhbnQgMTAwIiwgdGhyb3VnaCkKCX0KCWlmIGVyciA6PSBiLkNsb3NlKDEwMSk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJDbG9zZSBmb3J3YXJkID0gJXYsIHdhbnQgbmlsIiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RDbG9zZVRocm91Z2haZXJvSXNEaXN0aW5jdEZyb21OZXZlckNsb3NlZCh0ICp0ZXN0aW5nLlQpIHsKCS8vIGhhc0Nsb3NlZCBleGlzdHMgZm9yIGV4YWN0bHkgdGhpczogd2l0aG91dCBpdCwgImNsb3NlZCB0aHJvdWdoIDAiIGlzCgkvLyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgbmV3IGJvb2ssIGFuZCBhIG5ldyBib29rIHdvdWxkIHNpbGVudGx5CgkvLyByZWplY3QgZXZlcnkgZW50cnkgZGF0ZWQgYXQgMC4KCWIgOj0gbmV3Qm9vayh0KQoJaWYgXywgZXJyIDo9IGIuUG9zdCgwLCAiYWNjZXB0ZWQgYmVmb3JlIGFueSBjbG9zZSIsIHBhaXIoY2FzaCwgY2FwaXRhbCwgMSkpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUG9zdCgwKSBvbiBhIG5ldyBib29rID0gJXYsIHdhbnQgbmlsIiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuQ2xvc2UoMCk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJDbG9zZSgwKSA9ICV2LCB3YW50IG5pbCIsIGVycikKCX0KCXRocm91Z2gsIGNsb3NlZCA6PSBiLkNsb3NlZFRocm91Z2goKQoJaWYgIWNsb3NlZCB8fCB0aHJvdWdoICE9IDAgewoJCXQuRmF0YWxmKCJDbG9zZWRUaHJvdWdoID0gJWQsJXYgd2FudCAwLHRydWUiLCB0aHJvdWdoLCBjbG9zZWQpCgl9CglpZiBfLCBlcnIgOj0gYi5Qb3N0KDAsICIiLCBwYWlyKGNhc2gsIGNhcGl0YWwsIDEpKTsgZXJyICE9IEVyclBlcmlvZENsb3NlZCB7CgkJdC5GYXRhbGYoIlBvc3QoMCkgYWZ0ZXIgQ2xvc2UoMCkgPSAldiwgd2FudCBFcnJQZXJpb2RDbG9zZWQiLCBlcnIpCgl9Cn0KCmZ1bmMgVGVzdE11c3RDbG9zZVBhbmljcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJYi5NdXN0Q2xvc2UoNSkKCW11c3RQYW5pY1dpdGgodCwgImpvdXJuYWw6IGNsb3NlIG11c3QgbW92ZSBmb3J3YXJkIiwgZnVuYygpIHsgYi5NdXN0Q2xvc2UoNSkgfSkKfQoKLy8gLS0tIGludmFyaWFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdEludmFyaWFudHNIb2xkQWNyb3NzQUxvbmdTZXF1ZW5jZSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJYi5NdXN0UG9zdCgxLCAiY2FwaXRhbCIsIHBhaXIoY2FzaCwgY2FwaXRhbCwgMTAwMDApKQoJYi5NdXN0UG9zdCgyLCAic2FsZSBvbiBjcmVkaXQiLCBwYWlyKGFyLCByZXZlbnVlLCAyNTAwKSkKCWIuTXVzdFBvc3QoMywgImNvbGxlY3QiLCBwYWlyKGNhc2gsIGFyLCAyNTAwKSkKCWIuTXVzdFBvc3QoNCwgInJlbnQgYWNjcnVlZCIsIHBhaXIocmVudCwgcGF5YWJsZSwgODAwKSkKCWIuTXVzdFBvc3QoNSwgInJlbnQgcGFpZCIsIHBhaXIocGF5YWJsZSwgY2FzaCwgODAwKSkKCWJhZCA6PSBiLk11c3RQb3N0KDYsICJtaXN0YWtlIiwgcGFpcihyZW50LCBjYXNoLCA5OTkpKQoJYi5NdXN0UmV2ZXJzZShiYWQsIDcsICJtaXN0YWtlIHJldmVyc2VkIikKCglpZiAhYi5Jc0JhbGFuY2VkKCkgewoJCXQuRmF0YWwoIklzQmFsYW5jZWQiKQoJfQoJZCwgYywgYWdyZWVzIDo9IGIuUmVkZXJpdmVGcm9tSm91cm5hbCgpCglpZiAhYWdyZWVzIHsKCQl0LkZhdGFsKCJSZWRlcml2ZUZyb21Kb3VybmFsIG11c3QgYWdyZWUiKQoJfQoJaWYgZCAhPSBjIHx8IGQgIT0gYi5Ub3RhbERlYml0cygpIHsKCQl0LkZhdGFsZigicmVkZXJpdmVkICVkLyVkIHZzIHRvdGFscyAlZC8lZCIsIGQsIGMsIGIuVG90YWxEZWJpdHMoKSwgYi5Ub3RhbENyZWRpdHMoKSkKCX0KCWlmIF8sIF8sIG9mZnNldHMgOj0gYi5BY2NvdW50aW5nRXF1YXRpb24oKTsgIW9mZnNldHMgewoJCXQuRmF0YWwoIkFjY291bnRpbmdFcXVhdGlvbiBtdXN0IG9mZnNldCIpCgl9CgoJLy8gU3BvdC1jaGVjayB0aGUgZWNvbm9taWNzLCBzbyB0aGlzIGlzIGEgdGVzdCBvZiB0aGUgbGVkZ2VyIGFuZCBub3Qgb25seQoJLy8gb2YgaXRzIHNlbGYtY2hlY2tzOiAxMDAwMCBpbiwgMjUwMCBjb2xsZWN0ZWQsIDgwMCByZW50IHBhaWQsIGFuZCB0aGUKCS8vIDk5OSBtaXN0YWtlIHJldmVyc2VkIGJhY2sgb3V0LgoJaWYgZ290LCBfIDo9IGIuQmFsYW5jZShjYXNoKTsgZ290ICE9IDEwMDAwKzI1MDAtODAwIHsKCQl0LkZhdGFsZigiY2FzaCA9ICVkLCB3YW50IDExNzAwIiwgZ290KQoJfQoJaWYgZ290LCBfIDo9IGIuQmFsYW5jZShhcik7IGdvdCAhPSAwIHsKCQl0LkZhdGFsZigiQVIgPSAlZCwgd2FudCAwIGFmdGVyIGNvbGxlY3Rpb24iLCBnb3QpCgl9CglpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKHBheWFibGUpOyBnb3QgIT0gMCB7CgkJdC5GYXRhbGYoInBheWFibGUgPSAlZCwgd2FudCAwIGFmdGVyIHBheW1lbnQiLCBnb3QpCgl9CglpZiBnb3QsIF8gOj0gYi5CYWxhbmNlKHJldmVudWUpOyBnb3QgIT0gMjUwMCB7CgkJdC5GYXRhbGYoInJldmVudWUgPSAlZCwgd2FudCAyNTAwIiwgZ290KQoJfQoJaWYgZ290LCBfIDo9IGIuQmFsYW5jZShyZW50KTsgZ290ICE9IDgwMCB7CgkJdC5GYXRhbGYoInJlbnQgPSAlZCwgd2FudCA4MDAgLS0gdGhlIDk5OSBlcnJvciBtdXN0IGJlIHJldmVyc2VkIG91dCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0QWNjb3VudGluZ0VxdWF0aW9uSGFsdmVzQXJlUmVwb3J0ZWQodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWIuTXVzdFBvc3QoMSwgIiIsIHBhaXIoY2FzaCwgY2FwaXRhbCwgMTAwMDApKQoJYi5NdXN0UG9zdCgyLCAiIiwgcGFpcihyZW50LCBwYXlhYmxlLCA0MDApKQoJLy8gZGViaXQtbm9ybWFsIHJhdyBkZWx0YTogY2FzaCArMTAwMDAsIHJlbnQgKzQwMCA9IDEwNDAwCgkvLyBjcmVkaXQtbm9ybWFsIHJhdyBkZWx0YTogY2FwaXRhbCAtMTAwMDAsIHBheWFibGUgLTQwMCA9IC0xMDQwMAoJZG4sIGNuLCBvZmZzZXRzIDo9IGIuQWNjb3VudGluZ0VxdWF0aW9uKCkKCWlmIGRuICE9IDEwNDAwIHx8IGNuICE9IC0xMDQwMCB8fCAhb2Zmc2V0cyB7CgkJdC5GYXRhbGYoIkFjY291bnRpbmdFcXVhdGlvbiA9ICVkLCVkLCV2IHdhbnQgMTA0MDAsLTEwNDAwLHRydWUiLCBkbiwgY24sIG9mZnNldHMpCgl9Cn0KCmZ1bmMgVGVzdElzQmFsYW5jZWRDYXRjaGVzQURyaWZ0ZWRBY2N1bXVsYXRvcih0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSBzYWJvdGFnZSB0aGF0IHByb3ZlcyBJc0JhbGFuY2VkIGNhbiBmYWlsLiBSZWFjaGluZyBwYXN0IHRoZSBBUEkKCS8vIGludG8gdGhlIHJ1bm5pbmcgdG90YWwgaXMgZXhhY3RseSB0aGUgZHJpZnQgaXQgZXhpc3RzIHRvIGRldGVjdDsgaWYKCS8vIHRoaXMgYm9vayBzdGlsbCByZWFkIGJhbGFuY2VkLCB0aGUgY2hlY2sgd291bGQgYmUgZGVjb3JhdGl2ZS4KCWIgOj0gbmV3Qm9vayh0KQoJYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxMDApKQoJaWYgIWIuSXNCYWxhbmNlZCgpIHsKCQl0LkZhdGFsKCJwcmVjb25kaXRpb24iKQoJfQoJYi50b3RhbERlYml0cyArPSAxCglpZiBiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgiSXNCYWxhbmNlZCBtdXN0IGZhaWwgd2hlbiB0aGUgcnVubmluZyB0b3RhbCBkcmlmdHMiKQoJfQoJaWYgXywgXywgYWdyZWVzIDo9IGIuUmVkZXJpdmVGcm9tSm91cm5hbCgpOyBhZ3JlZXMgewoJCXQuRmF0YWwoIlJlZGVyaXZlRnJvbUpvdXJuYWwgbXVzdCBmYWlsIG9uIHRoZSBzYW1lIGRyaWZ0IikKCX0KCWIudG90YWxEZWJpdHMgLT0gMQoKCS8vIEFuZCB0aGUgb3RoZXIgcmVwcmVzZW50YXRpb246IGRyaWZ0IGEgcGVyLWFjY291bnQgYWNjdW11bGF0b3IuCglhLCBfIDo9IGIuQWNjb3VudChjYXNoKQoJYS5EZWJpdHMgKz0gNwoJYi5hY2NvdW50cy5TZXQoYS5Db2RlLCBhKQoJaWYgYi5Jc0JhbGFuY2VkKCkgewoJCXQuRmF0YWwoIklzQmFsYW5jZWQgbXVzdCBmYWlsIHdoZW4gYW4gYWNjb3VudCB0b3RhbCBkcmlmdHMiKQoJfQoJaWYgXywgXywgb2Zmc2V0cyA6PSBiLkFjY291bnRpbmdFcXVhdGlvbigpOyBvZmZzZXRzIHsKCQl0LkZhdGFsKCJBY2NvdW50aW5nRXF1YXRpb24gbXVzdCBmYWlsIG9uIGFuIGFjY291bnQgZHJpZnQiKQoJfQp9CgpmdW5jIFRlc3RSZWRlcml2ZUZyb21Kb3VybmFsQ2F0Y2hlc0FDb3JydXB0ZWRFbnRyeSh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSBkcmlmdCB0aGUgY2hlYXAgY2hlY2sgY2Fubm90IHNlZTogY29ycnVwdCB0aGUgSk9VUk5BTCB3aGlsZSBib3RoCgkvLyBhY2N1bXVsYXRvcnMgc3RheSBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4gSXNCYWxhbmNlZCBwYXNzZXMgLS0KCS8vIHdoaWNoIGlzIHRoZSBkb2N1bWVudGVkIGNlaWxpbmcgLS0gYW5kIG9ubHkgdGhlIHJlcGxheSBjYXRjaGVzIGl0LgoJYiA6PSBuZXdCb29rKHQpCglpZCA6PSBiLk11c3RQb3N0KDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEwMCkpCgllLCBfIDo9IGIuZW50cnkoaWQpCgllLlBvc3RpbmdzID0gW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiA5OTl9LAoJCXtBY2NvdW50OiByZXZlbnVlLCBTaWRlOiBDcmVkaXQsIEFtb3VudDogOTk5fSwKCX0KCWIuZW50cmllcy5TZXQoaWRLZXkoaWQpLCBlKQoKCWlmICFiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgiSXNCYWxhbmNlZCBpcyBkb2N1bWVudGVkIGFzIGJsaW5kIHRvIHRoaXM7IGlmIGl0IG5vdyBjYXRjaGVzIGl0LCB1cGRhdGUgdGhlIGRvYyIpCgl9CglkLCBjLCBhZ3JlZXMgOj0gYi5SZWRlcml2ZUZyb21Kb3VybmFsKCkKCWlmIGFncmVlcyB7CgkJdC5GYXRhbCgiUmVkZXJpdmVGcm9tSm91cm5hbCBtdXN0IGNhdGNoIGEgam91cm5hbCB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBhY2N1bXVsYXRvcnMiKQoJfQoJaWYgZCAhPSA5OTkgfHwgYyAhPSA5OTkgewoJCXQuRmF0YWxmKCJyZWRlcml2ZWQgPSAlZC8lZCwgd2FudCA5OTkvOTk5IGZyb20gdGhlIGpvdXJuYWwgaXRzZWxmIiwgZCwgYykKCX0KfQoKZnVuYyBUZXN0SXNCYWxhbmNlZENvbXBhcmVzVGhlVHdvQ29sdW1uc1RvRWFjaE90aGVyKHQgKnRlc3RpbmcuVCkgewoJLy8gZCA9PSBiLnRvdGFsRGViaXRzIGFuZCBjID09IGIudG90YWxDcmVkaXRzIHRvZ2V0aGVyIGRvIE5PVCBpbXBseQoJLy8gZCA9PSBjOiBhIGJvb2sgd2hvc2UgdHdvIHJlcHJlc2VudGF0aW9ucyBhZ3JlZSB3aXRoIGVhY2ggb3RoZXIgY2FuCgkvLyBzdGlsbCBoYXZlIGEgZGViaXQgY29sdW1uIHRoYXQgZG9lcyBub3QgZXF1YWwgaXRzIGNyZWRpdCBjb2x1bW4uCgkvLyBEcmlmdGluZyBhbiBhY2NvdW50IGFuZCBpdHMgbWF0Y2hpbmcgcnVubmluZyB0b3RhbCBieSB0aGUgU0FNRQoJLy8gYW1vdW50IGxlYXZlcyB0aGUgZCA9PSBjIGNvbmp1bmN0IGFzIHRoZSBvbmx5IG9uZSB0aGF0IGNhbiBub3RpY2UsCgkvLyB3aGljaCBpcyB3aGF0IG1ha2VzIHRoYXQgY29uanVuY3QgcHJvdmFibGUgcmF0aGVyIHRoYW4gcmVkdW5kYW50LgoJYiA6PSBuZXdCb29rKHQpCgliLk11c3RQb3N0KDEsICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIDEwMCkpCglpZiAhYi5Jc0JhbGFuY2VkKCkgewoJCXQuRmF0YWwoInByZWNvbmRpdGlvbiIpCgl9CglhLCBfIDo9IGIuQWNjb3VudChjYXNoKQoJYS5EZWJpdHMgKz0gNwoJYi5hY2NvdW50cy5TZXQoYS5Db2RlLCBhKQoJYi50b3RhbERlYml0cyArPSA3CgoJZCwgYywgb2sgOj0gYi5zdW1BY2NvdW50cygpCglpZiAhb2sgewoJCXQuRmF0YWwoInByZWNvbmRpdGlvbjogdGhlIGNoYXJ0IG11c3Qgc3RpbGwgc3VtIikKCX0KCWlmIGQgIT0gYi50b3RhbERlYml0cyB8fCBjICE9IGIudG90YWxDcmVkaXRzIHsKCQl0LkZhdGFsZigicHJlY29uZGl0aW9uOiBib3RoIHJlcHJlc2VudGF0aW9ucyBtdXN0IGFncmVlOiBjaGFydCAlZC8lZCwgdG90YWxzICVkLyVkIiwKCQkJZCwgYywgYi50b3RhbERlYml0cywgYi50b3RhbENyZWRpdHMpCgl9CglpZiBkID09IGMgewoJCXQuRmF0YWwoInByZWNvbmRpdGlvbjogdGhlIHR3byBjb2x1bW5zIG11c3QgZGlmZmVyIikKCX0KCWlmIGIuSXNCYWxhbmNlZCgpIHsKCQl0LkZhdGFsKCJJc0JhbGFuY2VkIG11c3QgZmFpbCB3aGVuIHRoZSBkZWJpdCBjb2x1bW4gZG9lcyBub3QgZXF1YWwgdGhlIGNyZWRpdCBjb2x1bW4iKQoJfQp9CgpmdW5jIFRlc3RJc0JhbGFuY2VkUmVmdXNlc0FuT3ZlcmZsb3dlZENoYXJ0U3VtKHQgKnRlc3RpbmcuVCkgewoJLy8gc3VtQWNjb3VudHMgZG9jdW1lbnRzIHRoYXQgY2FsbGVycyBtdXN0IG5vdCByZWFkIGl0cyAoMCwgMCkgb24KCS8vIG92ZXJmbG93IGFzIGFuIGVtcHR5IGNoYXJ0LCBhbmQgdGhpcyBpcyB0aGUgcmVhc29uOiBhIGZyZXNoIEJvb2sncwoJLy8gcnVubmluZyB0b3RhbHMgYXJlIGFsc28gMC8wLCBzbyBkaXNjYXJkaW5nIHRoZSBvayBtYWtlcyBhbgoJLy8gb3ZlcmZsb3dlZCBjaGFydCByZWFkIGV4YWN0bHkgbGlrZSBhIGJvb2sgd2l0aCBub3RoaW5nIHBvc3RlZC4KCWNvbnN0IG1heEludDY0ID0gaW50NjQoOTIyMzM3MjAzNjg1NDc3NTgwNykKCWIgOj0gbmV3Qm9vayh0KQoJZm9yIF8sIGNvZGUgOj0gcmFuZ2UgW11zdHJpbmd7Y2FzaCwgYXJ9IHsKCQlhLCBfIDo9IGIuQWNjb3VudChjb2RlKQoJCWEuRGViaXRzID0gbWF4SW50NjQKCQliLmFjY291bnRzLlNldChhLkNvZGUsIGEpCgl9CgoJaWYgXywgXywgb2sgOj0gYi5zdW1BY2NvdW50cygpOyBvayB7CgkJdC5GYXRhbCgicHJlY29uZGl0aW9uOiB0aGUgY2hhcnQgc3VtIG11c3Qgb3ZlcmZsb3ciKQoJfQoJaWYgYi5Ub3RhbERlYml0cygpICE9IDAgfHwgYi5Ub3RhbENyZWRpdHMoKSAhPSAwIHsKCQl0LkZhdGFsKCJwcmVjb25kaXRpb246IHRoZSBydW5uaW5nIHRvdGFscyBtdXN0IHN0aWxsIGJlIHplcm8sIG9yIHRoZSB0ZXN0IHByb3ZlcyBzb21ldGhpbmcgZWxzZSIpCgl9CglpZiBiLklzQmFsYW5jZWQoKSB7CgkJdC5GYXRhbCgiSXNCYWxhbmNlZCBtdXN0IHJlZnVzZSBhIGNoYXJ0IHN1bSBpdCBjb3VsZCBub3QgY29tcHV0ZSIpCgl9CglpZiBfLCBfLCBhZ3JlZXMgOj0gYi5SZWRlcml2ZUZyb21Kb3VybmFsKCk7IGFncmVlcyB7CgkJdC5GYXRhbCgiUmVkZXJpdmVGcm9tSm91cm5hbCBtdXN0IHJlZnVzZSB0aGUgc2FtZSBjaGFydCIpCgl9Cn0KCmZ1bmMgVGVzdFJlZGVyaXZlRnJvbUpvdXJuYWxDb21wYXJlc1RoZVJlcGxheVRvVGhlQ2hhcnQodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgY2hhcnQgaXMgdGhlIHRoaXJkIHJlcHJlc2VudGF0aW9uIGFuZCB0aGUgb25lIHRoZSBydW5uaW5nIHRvdGFscwoJLy8gY2Fubm90IHN0YW5kIGluIGZvci4gRHJpZnQgb25lIGFjY291bnQgb25seTogdGhlIHJlcGxheSBzdGlsbCBhZ3JlZXMKCS8vIHdpdGggYm90aCBydW5uaW5nIHRvdGFscywgc28gdGhlIGQgPT0gc2QgJiYgYyA9PSBzYyBjb25qdW5jdCBpcyB0aGUKCS8vIG9ubHkgdGhpbmcgbGVmdCB0aGF0IGNhbiBjYXRjaCBpdC4KCWIgOj0gbmV3Qm9vayh0KQoJYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxMDApKQoJYSwgXyA6PSBiLkFjY291bnQoY2FzaCkKCWEuRGViaXRzICs9IDcKCWIuYWNjb3VudHMuU2V0KGEuQ29kZSwgYSkKCglkLCBjLCBhZ3JlZXMgOj0gYi5SZWRlcml2ZUZyb21Kb3VybmFsKCkKCWlmIGQgIT0gMTAwIHx8IGMgIT0gMTAwIHsKCQl0LkZhdGFsZigicmVwbGF5ID0gJWQvJWQsIHdhbnQgMTAwLzEwMCByZWFkIGJhY2sgZnJvbSB0aGUgam91cm5hbCIsIGQsIGMpCgl9CglpZiBkICE9IGIudG90YWxEZWJpdHMgfHwgYyAhPSBiLnRvdGFsQ3JlZGl0cyB7CgkJdC5GYXRhbGYoInByZWNvbmRpdGlvbjogdGhlIHJlcGxheSBtdXN0IHN0aWxsIGFncmVlIHdpdGggYm90aCBydW5uaW5nIHRvdGFscyAoJWQvJWQpIiwKCQkJYi50b3RhbERlYml0cywgYi50b3RhbENyZWRpdHMpCgl9CglzZCwgc2MsIG9rU3VtIDo9IGIuc3VtQWNjb3VudHMoKQoJaWYgIW9rU3VtIHsKCQl0LkZhdGFsKCJwcmVjb25kaXRpb246IHRoZSBjaGFydCBtdXN0IHN0aWxsIHN1bSIpCgl9CglpZiBzZCA9PSBkIHsKCQl0LkZhdGFsZigicHJlY29uZGl0aW9uOiB0aGUgY2hhcnQgbXVzdCBkaXNhZ3JlZSB3aXRoIHRoZSByZXBsYXk6IGNoYXJ0ICVkLyVkIiwgc2QsIHNjKQoJfQoJaWYgYWdyZWVzIHsKCQl0LkZhdGFsKCJSZWRlcml2ZUZyb21Kb3VybmFsIG11c3QgZmFpbCB3aGVuIHRoZSBjaGFydCBkaXNhZ3JlZXMgd2l0aCB0aGUgam91cm5hbCIpCgl9Cn0KCi8vIC0tLSByZWFkcyBhbmQgZW5jYXBzdWxhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RFbnRyeVBvc3RpbmdzQXJlQURlZmVuc2l2ZUNvcHkodCAqdGVzdGluZy5UKSB7CgliIDo9IG5ld0Jvb2sodCkKCWlkIDo9IGIuTXVzdFBvc3QoMSwgIiIsIHBhaXIoY2FzaCwgcmV2ZW51ZSwgMTAwKSkKCgllLCBfIDo9IGIuRW50cnkoaWQpCgllLlBvc3RpbmdzWzBdLkFtb3VudCA9IDEKCWUuUG9zdGluZ3NbMF0uQWNjb3VudCA9ICJoYWNrZWQiCgllLlBvc3RpbmdzWzFdLlNpZGUgPSBEZWJpdAoKCWFnYWluLCBfIDo9IGIuRW50cnkoaWQpCglpZiBhZ2Fpbi5Qb3N0aW5nc1swXS5BbW91bnQgIT0gMTAwIHx8IGFnYWluLlBvc3RpbmdzWzBdLkFjY291bnQgIT0gY2FzaCB7CgkJdC5GYXRhbGYoIkVudHJ5IHJldHVybmVkIGEgd2luZG93IGludG8gQm9vayBzdGF0ZTogJSt2IiwgYWdhaW4uUG9zdGluZ3NbMF0pCgl9CglpZiBhZ2Fpbi5Qb3N0aW5nc1sxXS5TaWRlICE9IENyZWRpdCB7CgkJdC5GYXRhbCgiRW50cnkncyBwb3N0aW5ncyB3ZXJlIG11dGF0ZWQgdGhyb3VnaCB0aGUgcmV0dXJuZWQgc2xpY2UiKQoJfQoJaWYgIWIuSXNCYWxhbmNlZCgpIHsKCQl0LkZhdGFsKCJib29rIG11c3QgYmUgdW5hZmZlY3RlZCIpCgl9Cn0KCmZ1bmMgVGVzdEl0ZXJhdGVFbnRyaWVzQWxzb0NvcGllcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJYi5NdXN0UG9zdCgxLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxMDApKQoJYi5JdGVyYXRlRW50cmllcyhmdW5jKGUgRW50cnkpIGJvb2wgewoJCWUuUG9zdGluZ3NbMF0uQW1vdW50ID0gNDIKCQlyZXR1cm4gZmFsc2UKCX0pCglhZ2FpbiA6PSBiLkVudHJpZXMoMSwgMSkKCWlmIGxlbihhZ2FpbikgIT0gMSB8fCBhZ2FpblswXS5Qb3N0aW5nc1swXS5BbW91bnQgIT0gMTAwIHsKCQl0LkZhdGFsKCJJdGVyYXRlRW50cmllcyBoYW5kZWQgb3V0IGEgd3JpdGFibGUgd2luZG93IikKCX0KfQoKZnVuYyBUZXN0RW50cnlNaXNzaW5nSXNSZXBvcnRlZE5vdFplcm9lZCh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJaWYgXywgb2sgOj0gYi5FbnRyeSgxKTsgb2sgewoJCXQuRmF0YWwoIkVudHJ5IG9uIGFuIGVtcHR5IGpvdXJuYWwgbXVzdCByZXBvcnQgZmFsc2UiKQoJfQoJaWYgXywgb2sgOj0gYi5FbnRyeSgwKTsgb2sgewoJCXQuRmF0YWwoImlkIDAgaXMgbmV2ZXIgYWxsb2NhdGVkIikKCX0KCWlmIGIuSXNSZXZlcnNlZCgxKSB7CgkJdC5GYXRhbCgiSXNSZXZlcnNlZCBvbiBhIG1pc3NpbmcgZW50cnkgbXVzdCBiZSBmYWxzZSIpCgl9Cn0KCmZ1bmMgVGVzdEl0ZXJhdGlvbklzSW5Bc2NlbmRpbmdJRE9yZGVyUGFzdFRlbkVudHJpZXModCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgcGFkZGVkLWtleSB0ZXN0OiB3aXRoIHVucGFkZGVkIGRlY2ltYWwga2V5cywgIjEwIiBzb3J0cyBiZWZvcmUKCS8vICIyIiBhbmQgdGhpcyBmYWlscyBhdCB0aGUgdGVudGggZW50cnkuCgliIDo9IG5ld0Jvb2sodCkKCWZvciBpIDo9IDA7IGkgPCAxMjsgaSsrIHsKCQliLk11c3RQb3N0KGludDY0KGkrMSksICIiLCBwYWlyKGNhc2gsIHJldmVudWUsIGludDY0KGkrMSkpKQoJfQoJdmFyIHNlZW4gW111aW50NjQKCWIuSXRlcmF0ZUVudHJpZXMoZnVuYyhlIEVudHJ5KSBib29sIHsKCQlzZWVuID0gYXBwZW5kKHNlZW4sIGUuSUQpCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgbGVuKHNlZW4pICE9IDEyIHsKCQl0LkZhdGFsZigiaXRlcmF0ZWQgJWQsIHdhbnQgMTIiLCBsZW4oc2VlbikpCgl9Cglmb3IgaSwgaWQgOj0gcmFuZ2Ugc2VlbiB7CgkJaWYgaWQgIT0gdWludDY0KGkrMSkgewoJCQl0LkZhdGFsZigib3JkZXIgPSAldiwgd2FudCAxLi4xMiBhc2NlbmRpbmciLCBzZWVuKQoJCX0KCX0KfQoKZnVuYyBUZXN0SXRlcmF0aW9uU3RvcHNFYXJseSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJZm9yIGkgOj0gMDsgaSA8IDU7IGkrKyB7CgkJYi5NdXN0UG9zdChpbnQ2NChpKzEpLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxKSkKCX0KCW4gOj0gMAoJYi5JdGVyYXRlRW50cmllcyhmdW5jKEVudHJ5KSBib29sIHsKCQluKysKCQlyZXR1cm4gbiA+PSAyCgl9KQoJaWYgbiAhPSAyIHsKCQl0LkZhdGFsZigiSXRlcmF0ZUVudHJpZXMgdmlzaXRlZCAlZCwgd2FudCAyIiwgbikKCX0KCgltIDo9IDAKCWIuSXRlcmF0ZUFjY291bnRzKGZ1bmMoQWNjb3VudCkgYm9vbCB7CgkJbSsrCgkJcmV0dXJuIG0gPj0gMwoJfSkKCWlmIG0gIT0gMyB7CgkJdC5GYXRhbGYoIkl0ZXJhdGVBY2NvdW50cyB2aXNpdGVkICVkLCB3YW50IDMiLCBtKQoJfQp9CgpmdW5jIFRlc3RJdGVyYXRlQWNjb3VudHNDb3ZlcnNUaGVDaGFydEluQ29kZU9yZGVyKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBuZXdCb29rKHQpCgl2YXIgY29kZXMgW11zdHJpbmcKCWIuSXRlcmF0ZUFjY291bnRzKGZ1bmMoYSBBY2NvdW50KSBib29sIHsKCQljb2RlcyA9IGFwcGVuZChjb2RlcywgYS5Db2RlKQoJCXJldHVybiBmYWxzZQoJfSkKCXdhbnQgOj0gW11zdHJpbmd7Y2FzaCwgYXIsIHBheWFibGUsIGNhcGl0YWwsIHJldmVudWUsIHJlbnR9CglpZiBsZW4oY29kZXMpICE9IGxlbih3YW50KSB7CgkJdC5GYXRhbGYoIml0ZXJhdGVkICVkIGFjY291bnRzLCB3YW50ICVkIiwgbGVuKGNvZGVzKSwgbGVuKHdhbnQpKQoJfQoJZm9yIGkgOj0gcmFuZ2Ugd2FudCB7CgkJaWYgY29kZXNbaV0gIT0gd2FudFtpXSB7CgkJCXQuRmF0YWxmKCJvcmRlciA9ICV2LCB3YW50ICV2IiwgY29kZXMsIHdhbnQpCgkJfQoJfQp9CgpmdW5jIFRlc3RFbnRyaWVzUGFnZXNGcm9tQW5JRCh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gbmV3Qm9vayh0KQoJZm9yIGkgOj0gMDsgaSA8IDY7IGkrKyB7CgkJYi5NdXN0UG9zdChpbnQ2NChpKzEpLCAiIiwgcGFpcihjYXNoLCByZXZlbnVlLCAxKSkKCX0KCWlmIGdvdCA6PSBiLkVudHJpZXMoMCwgMCk7IGxlbihnb3QpICE9IDAgewoJCXQuRmF0YWxmKCJsaW1pdCAwIHJldHVybmVkICVkIiwgbGVuKGdvdCkpCgl9CglpZiBnb3QgOj0gYi5FbnRyaWVzKDAsIC0xKTsgbGVuKGdvdCkgIT0gMCB7CgkJdC5GYXRhbGYoIm5lZ2F0aXZlIGxpbWl0IHJldHVybmVkICVkIiwgbGVuKGdvdCkpCgl9CglwYWdlIDo9IGIuRW50cmllcygzLCAyKQoJaWYgbGVuKHBhZ2UpICE9IDIgfHwgcGFnZVswXS5JRCAhPSAzIHx8IHBhZ2VbMV0uSUQgIT0gNCB7CgkJdC5GYXRhbGYoIkVudHJpZXMoMywyKSA9ICV2IiwgcGFnZSkKCX0KCXRhaWwgOj0gYi5FbnRyaWVzKDUsIDEwKQoJaWYgbGVuKHRhaWwpICE9IDIgfHwgdGFpbFswXS5JRCAhPSA1IHsKCQl0LkZhdGFsZigiRW50cmllcyg1LDEwKSByZXR1cm5lZCAlZCBlbnRyaWVzIiwgbGVuKHRhaWwpKQoJfQoJaWYgZ290IDo9IGIuRW50cmllcyg5OSwgNSk7IGxlbihnb3QpICE9IDAgewoJCXQuRmF0YWxmKCJFbnRyaWVzIHBhc3QgdGhlIGVuZCByZXR1cm5lZCAlZCIsIGxlbihnb3QpKQoJfQp9CgpmdW5jIFRlc3RJREtleVBhZHNBbmRPcmRlcnModCAqdGVzdGluZy5UKSB7CglpZiBnb3QgOj0gaWRLZXkoMSk7IGdvdCAhPSAiMDAwMDAwMDAwMDAwMDAwMDAwMDEiIHsKCQl0LkZhdGFsZigiaWRLZXkoMSkgPSAlcSIsIGdvdCkKCX0KCWlmIGxlbihpZEtleSgxKSkgIT0gbGVuKGlkS2V5KDEyMzQ1NjcpKSB7CgkJdC5GYXRhbCgia2V5cyBtdXN0IGJlIGZpeGVkIHdpZHRoIikKCX0KCWlmICEoaWRLZXkoMikgPCBpZEtleSgxMCkpIHsKCQl0LkZhdGFsKCJsZXhpY2FsIG9yZGVyIG11c3QgbWF0Y2ggbnVtZXJpYyBvcmRlciIpCgl9CgkvLyBUaGUgMjAtZGlnaXQgY2xhaW06IG1hdGguTWF4VWludDY0IGlzIGV4YWN0bHkgMjAgZGlnaXRzLCBzbyBpdCBpcyB0aGUKCS8vIG9uZSBpbnB1dCB0aGF0IHVzZXMgdGhlIGZ1bGwgd2lkdGggd2l0aCBubyBwYWRkaW5nLgoJbWF4IDo9IGlkS2V5KDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQoJaWYgbGVuKG1heCkgIT0gMjAgfHwgbWF4ICE9ICIxODQ0Njc0NDA3MzcwOTU1MTYxNSIgewoJCXQuRmF0YWxmKCJpZEtleShtYXhVaW50NjQpID0gJXEiLCBtYXgpCgl9Cn0KCmZ1bmMgVGVzdEVudHJ5VG90YWxDb3VudHNEZWJpdHNPbmx5KHQgKnRlc3RpbmcuVCkgewoJZSA6PSBFbnRyeXtQb3N0aW5nczogW11Qb3N0aW5newoJCXtBY2NvdW50OiBjYXNoLCBTaWRlOiBEZWJpdCwgQW1vdW50OiAzMH0sCgkJe0FjY291bnQ6IGFyLCBTaWRlOiBEZWJpdCwgQW1vdW50OiA3MH0sCgkJe0FjY291bnQ6IHJldmVudWUsIFNpZGU6IENyZWRpdCwgQW1vdW50OiAxMDB9LAoJfX0KCWlmIGUuVG90YWwoKSAhPSAxMDAgewoJCXQuRmF0YWxmKCJUb3RhbCA9ICVkLCB3YW50IDEwMCIsIGUuVG90YWwoKSkKCX0KCWlmIChFbnRyeXt9KS5Ub3RhbCgpICE9IDAgewoJCXQuRmF0YWwoImVtcHR5IGVudHJ5IFRvdGFsIG11c3QgYmUgMCIpCgl9Cn0KCmZ1bmMgVGVzdEFjY291bnRCYWxhbmNlU2lnbkJ5S2luZCh0ICp0ZXN0aW5nLlQpIHsKCS8vIEEgY29udHJhIHBvc2l0aW9uIGlzIGEgcmVhbCBzaWduYWwsIG5vdCBhIHNpZ24gY29udmVudGlvbjogYW4gYXNzZXQKCS8vIHdpdGggbW9yZSBjcmVkaXRzIHRoYW4gZGViaXRzIHJlcG9ydHMgTkVHQVRJVkUuCglhIDo9IEFjY291bnR7S2luZDogQXNzZXQsIERlYml0czogMTAsIENyZWRpdHM6IDQwfQoJaWYgYS5CYWxhbmNlKCkgIT0gLTMwIHx8IGEuUmF3RGVsdGEoKSAhPSAtMzAgewoJCXQuRmF0YWxmKCJjb250cmEgYXNzZXQgPSAlZC8lZCwgd2FudCAtMzAvLTMwIiwgYS5CYWxhbmNlKCksIGEuUmF3RGVsdGEoKSkKCX0KCWwgOj0gQWNjb3VudHtLaW5kOiBMaWFiaWxpdHksIERlYml0czogMTAsIENyZWRpdHM6IDQwfQoJaWYgbC5CYWxhbmNlKCkgIT0gMzAgfHwgbC5SYXdEZWx0YSgpICE9IC0zMCB7CgkJdC5GYXRhbGYoImxpYWJpbGl0eSA9ICVkLyVkLCB3YW50IDMwLy0zMCIsIGwuQmFsYW5jZSgpLCBsLlJhd0RlbHRhKCkpCgl9CgkvLyBBbiBpbnZhbGlkIGtpbmQgcmVwb3J0cyBmYWxzZSBmcm9tIElzRGViaXROb3JtYWwsIHNvIEJhbGFuY2UgcmVhZHMgaXQKCS8vIGFzIGNyZWRpdC1ub3JtYWwuIEFzc2VydGVkIHJhdGhlciB0aGFuIGxlZnQgaW1wbGljaXQsIGJlY2F1c2UgYSBib29rCgkvLyBjYW4gbmV2ZXIgaG9sZCBvbmUgLS0gT3BlbiByZWZ1c2VzIGl0LgoJYmFkIDo9IEFjY291bnR7S2luZDogS2luZCgwKSwgRGViaXRzOiAxMCwgQ3JlZGl0czogNDB9CglpZiBiYWQuQmFsYW5jZSgpICE9IDMwIHsKCQl0LkZhdGFsZigiaW52YWxpZCBraW5kIEJhbGFuY2UgPSAlZCwgd2FudCAzMCAoY3JlZGl0LW5vcm1hbCBmYWxsYmFjaykiLCBiYWQuQmFsYW5jZSgpKQoJfQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMjAwMDAwMDB1Z25vdBITCIDKte4BEgsyNTAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQI+F/3SD44LzJd5QXHh1vF/QcCo6KniXCcPaMD4J5RVpxJAW7WezQp+uocgeImCUaFZ+bBQcaiX0cTNVPZfxccorN0Kg39PhDdXzHY243cmdO0IsCqk59y9buco8He7Goaf+BooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}