{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "+GG+z0yoy0Z2B/Yp8bySiZI9TgJxtMNCXT3wVKO57J0=",
    "height": "481166",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "68869752",
      "GasUsed": "45913168"
    },
    "tx": "CryLAgoML3ZtLm1fYWRkcGtnEqqLAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLtigIKBm1ldGVycxI6Z25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL21ldGVycxphCgtnbm9tb2QudG9tbBJSbW9kdWxlID0gImduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9tZXRlcnMiCmdubyA9ICIwLjkiChrCiQIKCm1ldGVycy5nbm8SsokCLy8gUmVhbG0gbWV0ZXJzIGlzIHVzYWdlLWJhc2VkIGJpbGxpbmcgd2l0aCBncmFkdWF0ZWQgbWFyZ2luYWwgcHJpY2luZzogYQovLyBwcm92aWRlciBwdWJsaXNoZXMgYSBNRVRFUiAoYSB1bml0IG9mIHNlcnZpY2UsIGEgbGlzdCBwcmljZSBwZXIgdW5pdCwgYQovLyBiaWxsaW5nIHBlcmlvZCwgYW5kIGEgdGllcnMuU2NoZWR1bGUgb2YgbWFyZ2luYWwgdm9sdW1lIGRpc2NvdW50cyksIGEKLy8gY29uc3VtZXIgRU5ST0xMUyBhbmQgcHJlcGF5cyBhIGRlcG9zaXQsIHRoZSBwcm92aWRlciBSRUNPUkRTIHVzYWdlIGFzIGl0IGlzCi8vIHNlcnZlZCwgYW5kIGVhY2ggcGVyaW9kJ3MgYWNjdW11bGF0ZWQgdXNhZ2Ugc2V0dGxlcyBmcm9tIHRoZSBjb25zdW1lcidzCi8vIGRlcG9zaXQgaW50byB0aGUgcHJvdmlkZXIncyBjbGFpbWFibGUgYmFsYW5jZS4KLy8KLy8gSXQgaXMgdGhlIHVzYWdlLWJhc2VkIGNvbXBsZW1lbnQgdG8gci9zdWJzY3JpcHRpb25zJyBmbGF0IHJlY3VycmluZyBwbGFucyDigJQKLy8gdGhlIG9uZSBiaWxsaW5nIHNoYXBlIHRoaXMgcG9ydGZvbGlvIGxhY2tlZCAoaXRzIGRpc2NvdmVyeSBnYXRlJ3Mgd2hvbGUKLy8gZmluZGluZykuIFRoZSBwcmljaW5nIGlkZW50aXR5IGlzIHAvdGllcnMnOgovLwovLwliYXNlID0gdW5pdHMgw5cgdW5pdFByaWNlICAgICAgICAoY2hlY2tlZCBpbnQ2NCBtdWx0aXBsaWNhdGlvbikKLy8JZHVlICA9IFNjaGVkdWxlLkNoYXJnZShiYXNlKSAgICAo4omkIGJhc2Ug4oCUIG1hcmdpbmFsIGRpc2NvdW50IG9mZiBsaXN0KQovLwovLyB0aWVycyB2YWxpZGF0ZXMgZXZlcnkgcmF0ZSBpbnRvIFswLCBSYXRlU2NhbGVdLCBzbyBDaGFyZ2UoYmFzZSkg4omkIGJhc2UgaXMgYW4KLy8gYXJpdGhtZXRpYyBmYWN0OiBhIHNjaGVkdWxlIGNhbiBESVNDT1VOVCBsaXN0IHByaWNlIGFuZCBjYW4gbmV2ZXIgc3VyY2hhcmdlCi8vIGl0LiBBIGZsYXQgcHJpY2UgaXMgdGhlIG9uZS1yYXRlIHNjaGVkdWxlIChubyBlZGdlcywgcmF0ZXMgIjEwMDAwIikg4oCUIHRoZQovLyBkZWdlbmVyYXRlIGNhc2UsIG5vdCBhIHNlY29uZCBjb2RlIHBhdGguCi8vCi8vICMgVGhlIHRocmVlIHRydXN0IHN0YXRlbWVudHMsIGluIG9yZGVyIG9mIHdobyBiZWFycyB3aGF0Ci8vCi8vICAgLSBVU0FHRSBJUyBQUk9WSURFUi1BU1NFUlRFRCwgYW5kIHRoYXQgZGVjbGFyYXRpb24gaXMgdGhlIHRydXN0IGJvdW5kYXJ5IOKAlAovLyAgICAgdGhlIHNhbWUgYm91bmRhcnkgci9ib29rcyBkcmF3cyBhdCBvd25lci1wb3N0ZWQgZW50cmllcyBhbmQgci9jYXNoZmxvdwovLyAgICAgYXQgUG9saWN5LkNhc2guIFRoZSByZWFsbSBjYW5ub3QgdmVyaWZ5IG9mZi1jaGFpbiBjb25zdW1wdGlvbjsgd2hhdCBpdAovLyAgICAgZG9lcyBpcyBtYWtlIHRoZSBhc3NlcnRpb24gYXR0cmlidXRhYmxlIChvbmx5IHRoZSBtZXRlcidzIHByb3ZpZGVyIG1heQovLyAgICAgUmVjb3JkLCBhbmQgb25seSBhZ2FpbnN0IGFuIGVucm9sbG1lbnQgdG8gdGhhdCBtZXRlciksIGJvdW5kZWQgKG5leHQKLy8gICAgIHN0YXRlbWVudCksIGFuZCBhdWRpdGFibGUgKGV2ZXJ5IHVuaXQgaXMgYW4gZXZlbnQgYW5kIGEgcmVhZGFibGUgcm93KS4KLy8gICAtIExJQUJJTElUWSBJUyBCT1VOREVEIEJZIERFUE9TSVQsIGZhaWwtY2xvc2VkLiBSZWNvcmQgcmVmdXNlcyBhbnkgcG9zdGluZwovLyAgICAgd2hvc2UgZW5kLW9mLXBlcmlvZCBjaGFyZ2Ugd291bGQgZXhjZWVkIHRoZSBlbnJvbGxtZW50J3MgZGVwb3NpdGVkCi8vICAgICBiYWxhbmNlLCBhbmQgYSB3aXRoZHJhd2FsIGxlYXZlcyB0aGUgcGVuZGluZyBjaGFyZ2UgY292ZXJlZC4gQ2hhcmdlIGlzCi8vICAgICBtb25vdG9uZSBpbiB1bml0cyAodGllcnMnIGRvY3VtZW50ZWQgbW9ub3RvbmljaXR5KSwgc28gdGhlIHJlZnVzYWwKLy8gICAgIHByZWRpY2F0ZSBpcyB3ZWxsLWRlZmluZWQuIE5vIGFycmVhcnMgZXhpc3QgYW55d2hlcmUgaW4gdGhpcyBkZXNpZ246IHRoZQovLyAgICAgcmVhbG0gbmV2ZXIgaG9sZHMgYSBjbGFpbSBhZ2FpbnN0IGZ1bmRzIGEgY29uc3VtZXIgaGFzIG5vdCBkZXBvc2l0ZWQuCi8vICAgLSBTRVRUTEVNRU5UIElTIExBWlkgQU5EIEVYQUNULiBVc2FnZSBhY2N1bXVsYXRlcyBhZ2FpbnN0IHRoZSBwZXJpb2QgaXQKLy8gICAgIHdhcyByZWNvcmRlZCBpbjsgdGhlIGZpcnN0IHRvdWNoIGFmdGVyIGEgcGVyaW9kIGJvdW5kYXJ5IHNldHRsZXMgdGhhdAovLyAgICAgcGVyaW9kJ3MgY2hhcmdlLiBBIHBlcmlvZCBub2JvZHkgcmVjb3JkZWQgdXNhZ2UgaW4gb3dlcyB6ZXJvLCBzbyBsYXp5Ci8vICAgICBzZXR0bGVtZW50IGxvc2VzIG5vdGhpbmcg4oCUIHRoZXJlIGlzIG5vIGtlZXBlciwgbm8gdXBrZWVwIGRlcGVuZGVuY3ksIGFuZAovLyAgICAgYSBTZXR0bGUgdmFsdmUgaXMgcGVybWlzc2lvbmxlc3Mgc28gbmVpdGhlciBwYXJ0eSdzIGFic2VuY2UgY2FuIHdlZGdlCi8vICAgICB0aGUgb3RoZXIncyBmdW5kcy4KLy8KLy8gRnVuZHMgbW92ZSBvbiBwdWxsIHBhdGhzIG9ubHk6IHByb3ZpZGVycyBDbGFpbSwgY29uc3VtZXJzIFdpdGhkcmF3RGVwb3NpdCBvcgovLyBFeGl0LCB0aGUgZmVlIHJlY2lwaWVudCBXaXRoZHJhd0ZlZXMuIFBlcmlvZHMgYXJlIGZpeGVkLWxlbmd0aCBibG9jayB3aW5kb3dzCi8vIGFuY2hvcmVkIGF0IEVucm9sbCBoZWlnaHQg4oCUIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB0aHJvdWdob3V0LCBuZXZlciBhCi8vIGNhbGxlci1zdXBwbGllZCB0aW1lIChyL2Jvb2tzJyBvYmxpZ2F0aW9uLCBpbmhlcml0ZWQgdmVyYmF0aW0pLgovLwovLyBSRUFMTS1DQUxMRVIgQ0FWRUFULCBpbmhlcml0ZWQgZnJvbSB0aGUgc2libGluZ3MgdmVyYmF0aW06IGNvaW5pbydzIHJlY2VpcHQKLy8gZ3VhcmQgYWRtaXRzIG9ubHkgRU9BIHBheWVycywgc28gZW5yb2xsaW5nIGNvbnN1bWVycyBhcmUgRU9BczsgYXNzZXJ0Tm9TZW5kCi8vIHJlYWRzIHRoZSBPUklHSU4gZW52ZWxvcGUsIHNvIGV2ZXJ5IG5vbi1wYXlhYmxlIGZ1bmN0aW9uIHJlZnVzZXMgYW55Ci8vIHRyYW5zYWN0aW9uIHRoYXQgYXR0YWNoZWQgY29pbnMgYW55d2hlcmUuIFByb3ZpZGVycyBtYXkgYmUgRU9BcyBvciByZWFsbXMsCi8vIGJ1dCBhIHJlYWxtIHByb3ZpZGVyIG11c3QgZXhwb3NlIGl0cyBvd24gY3Jvc3NpbmcgcGF0aCB0byBDbGFpbSwgb3Igd2hhdCBpdAovLyBlYXJucyBpcyBzdHJhbmRlZC4KcGFja2FnZSBtZXRlcnMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY29pbmlvIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3RpZXJzIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIERlbm9tIGlzIHRoZSBvbmx5IGFzc2V0IHRoaXMgcmVhbG0gYWNjZXB0cy4KY29uc3QgRGVub20gPSAidWdub3QiCgovLyBNYXhGZWVCcHMgaXMgdGhlIGhhcmQgcHJvdG9jb2wtZmVlIGNhcDogMTAwMCBicHMgPSAxMCUuCmNvbnN0IE1heEZlZUJwcyA9IGludDY0KDEwMDApCgovLyBNZXRlciBzdGF0dXMgdmFsdWVzLgpjb25zdCAoCglNZXRlckFjdGl2ZSAgPSAiYWN0aXZlIgoJTWV0ZXJSZXRpcmVkID0gInJldGlyZWQiCikKCi8vIEVucm9sbG1lbnQgc3RhdHVzIHZhbHVlcy4gRXhpdGVkIGlzIHRlcm1pbmFsLgpjb25zdCAoCglFbnJvbGxBY3RpdmUgPSAiYWN0aXZlIgoJRW5yb2xsRXhpdGVkID0gImV4aXRlZCIKKQoKLy8gSW5wdXQgYm91bmRzLgpjb25zdCAoCglNYXhUaXRsZUxlbiA9IDgwCglNYXhVbml0TGVuICA9IDI0CgoJLy8gTWluVW5pdFByaWNlIGtlZXBzIGEgbWV0ZXIgZnJvbSBiZWluZyBmcmVlLWJ5LXJvdW5kaW5nOyBhIHByb3ZpZGVyCgkvLyB3aG8gd2FudHMgYSBmcmVlIHRpZXIgZGVjbGFyZXMgYSAwLXJhdGUgZmlyc3QgdGllciBpbnN0ZWFkLCB3aGljaAoJLy8ga2VlcHMgdGhlIGFyaXRobWV0aWMgdmlzaWJsZSBpbiB0aGUgc2NoZWR1bGUgcmF0aGVyIHRoYW4gaW1wbGljaXQKCS8vIGluIGEgemVybyBwcmljZS4KCU1pblVuaXRQcmljZSA9IGludDY0KDEpCgkvLyBNYXhVbml0UHJpY2Uga2VlcHMgYmFzZSA9IHVuaXRzIMOXIHVuaXRQcmljZSBmYXIgZnJvbSBpbnQ2NAoJLy8gb3ZlcmZsb3cgZm9yIGFueSB1c2FnZSBhIGRlcG9zaXQgY291bGQgcGxhdXNpYmx5IGNvdmVyOyB0aGUKCS8vIGNoZWNrZWQgbXVsdGlwbGljYXRpb24gaXMgc3RpbGwgdGhlcmUgYW5kIHN0aWxsIHJlZnVzZXMuCglNYXhVbml0UHJpY2UgPSBpbnQ2NCgxXzAwMF8wMDBfMDAwKSAvLyAxMDAwIEdOT1QgcGVyIHVuaXQKCgkvLyBNaW5QZXJpb2RCbG9ja3MvTWF4UGVyaW9kQmxvY2tzIGJvdW5kIGEgbWV0ZXIncyBiaWxsaW5nIHBlcmlvZCDigJQKCS8vIHRoZSBzYW1lIGJvdW5kcyBhbmQgcmVhc29uaW5nIGFzIHIvc3Vic2NyaXB0aW9uczogdGhlIGZsb29yIGtlZXBzCgkvLyBzZXR0bGVtZW50IGZyb20gYmVjb21pbmcgYSBwZXItYmxvY2sgdHJlYWRtaWxsLCB0aGUgY2VpbGluZyBrZWVwcwoJLy8gcGVyaW9kIGFyaXRobWV0aWMgZmFyIGZyb20gb3ZlcmZsb3cuCglNaW5QZXJpb2RCbG9ja3MgPSBpbnQ2NCgxMCkKCU1heFBlcmlvZEJsb2NrcyA9IGludDY0KDc1MDAwMDApCgoJLy8gTWF4TWV0ZXJzUGVyUHJvdmlkZXIgYm91bmRzIGNhdGFsb2cgbW9ub3BvbGl6YXRpb24gYnkgYSBzaW5nbGUKCS8vIGFkZHJlc3Mg4oCUIHRoZSBmaW5kaW5nIHRoYXQgd2FzIFJFRCBpbiBwZXJtaXNzaW9uX3JlZ2lzdHJ5IGFuZAoJLy8gc2VydmljZV9yZWdpc3RyeSwgY2FycmllZCBmcm9tIHRoZSBzdGFydCBoZXJlLgoJTWF4TWV0ZXJzUGVyUHJvdmlkZXIgPSAyMAoKCS8vIE1heEVucm9sbG1lbnRzUGVyQ29uc3VtZXIgYm91bmRzIG9uZSBhY2NvdW50J3Mgb3Blbi1lbnJvbGxtZW50CgkvLyBzdGF0ZS4gRXhpdGVkIGVucm9sbG1lbnRzIGZyZWUgdGhlaXIgc2xvdC4KCU1heEVucm9sbG1lbnRzUGVyQ29uc3VtZXIgPSAxMDAKCgkvLyBSZW5kZXJMaW1pdCBib3VuZHMgZXZlcnkgcmVuZGVyZWQgbGlzdCDigJQgYW4gdW5ib3VuZGVkIFJlbmRlciB3YXMKCS8vIFlFTExPVyBpbiB0aHJlZSBwcmlvciBhdWRpdHMuCglSZW5kZXJMaW1pdCA9IDIwCikKCnR5cGUgbWV0ZXIgc3RydWN0IHsKCWlkICAgICAgICAgICBpbnQ2NAoJcHJvdmlkZXIgICAgIGFkZHJlc3MKCXRpdGxlICAgICAgICBzdHJpbmcKCXVuaXQgICAgICAgICBzdHJpbmcgLy8gd2hhdCBvbmUgdW5pdCBpcywgZm9yIGh1bWFuczogImNhbGwiLCAiR0IiLCAic2VhdC1kYXkiCgl1bml0UHJpY2UgICAgaW50NjQgIC8vIHVnbm90IGxpc3QgcHJpY2UgcGVyIHVuaXQKCXNjaGVkICAgICAgICB0aWVycy5TY2hlZHVsZQoJcGVyaW9kQmxvY2tzIGludDY0CglmZWVCcHMgICAgICAgaW50NjQgLy8gc25hcHNob3R0ZWQgYXQgY3JlYXRpb24sIGNoYXJnZWQgYXQgZXZlcnkgc2V0dGxlbWVudAoJc3RhdHVzICAgICAgIHN0cmluZwoJZW5yb2xsbWVudHMgIGludDY0IC8vIGxpZmV0aW1lIGNvdW50LCBuZXZlciBkZWNyZW1lbnRlZAp9Cgp0eXBlIGVucm9sbG1lbnQgc3RydWN0IHsKCWlkICAgICAgIGludDY0CgltZXRlcklEICBpbnQ2NAoJY29uc3VtZXIgYWRkcmVzcwoJcHJvdmlkZXIgYWRkcmVzcyAvLyBjb3BpZWQgYXQgRW5yb2xsOyBuZXZlciByZS1yZWFkIGZyb20gdGhlIG1ldGVyCgkvLyBwcmljaW5nIHRlcm1zLCBhbGwgY29waWVkIGF0IEVucm9sbCBzbyBub3RoaW5nIGEgY29uc3VtZXIgYWdyZWVkCgkvLyB0byBjYW4gbW92ZSB1bmRlcm5lYXRoIHRoZW0gKG1ldGVycyBhcmUgaW1tdXRhYmxlIGFueXdheTsgdGhlCgkvLyBjb3B5IG1ha2VzIHRoYXQgYSBzdHJ1Y3R1cmFsIGZhY3Qgb2YgdGhlIGVucm9sbG1lbnQgcmF0aGVyIHRoYW4KCS8vIGEgcHJvcGVydHkgb2YgdGhlIG1ldGVyJ3MgbGlmZWN5Y2xlKToKCXVuaXRQcmljZSAgICBpbnQ2NAoJc2NoZWQgICAgICAgIHRpZXJzLlNjaGVkdWxlCglwZXJpb2RCbG9ja3MgaW50NjQKCWZlZUJwcyAgICAgICBpbnQ2NAoKCXN0YXR1cyAgICAgIHN0cmluZwoJc3RhcnRIZWlnaHQgaW50NjQgLy8gcGVyaW9kIGFuY2hvcjogcGVyaW9kIGsgaXMgW3N0YXJ0K2vCt3AsIHN0YXJ0KyhrKzEpwrdwKQoJdXNhZ2UgICAgICAgaW50NjQgLy8gdW5pdHMgcmVjb3JkZWQgaW4gcGVyaW9kIHVzYWdlUGVyaW9kLCBub3QgeWV0IHNldHRsZWQKCXVzYWdlUGVyaW9kIGludDY0IC8vIHRoZSBwZXJpb2QgaW5kZXggdXNhZ2UgYmVsb25ncyB0bwoJcGVyaW9kcyAgICAgaW50NjQgLy8gbGlmZXRpbWUgc2V0dGxlZC1wZXJpb2QgY291bnQgKG5vbnplcm8gY2hhcmdlcyBvbmx5KQp9Cgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MgLy8gbWF5IHNldCBmZWUsIGZlZSByZWNpcGllbnQsIHN0YWdlIHN1Y2Nlc3NvcgoJcGVuZGluZ0FkbWluIGFkZHJlc3MgLy8gc3RhZ2VkIGJ5IFRyYW5zZmVyQWRtaW4sIGNvbXBsZXRlcyB2aWEgQWNjZXB0QWRtaW4KCWZlZVJlY2lwaWVudCBhZGRyZXNzIC8vIG1heSB3aXRoZHJhdyBmZWVzIGFuZCBzd2VlcCBzdXJwbHVzCglmZWVCcHMgICAgICAgaW50NjQgICAvLyBmZWUgc25hcHNob3R0ZWQgaW50byBORVcgbWV0ZXJzCgoJc2VsZiAgICAgIGFkZHJlc3MgLy8gdGhpcyByZWFsbSdzIGFkZHJlc3MsIGNhcHR1cmVkIGF0IGRlcGxveQoJbmV4dE1ldGVyIGludDY0CgluZXh0RW5yICAgaW50NjQKCgltZXRlcnNUICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpICAgICAgICAgICAgICAtPiAqbWV0ZXIKCWVucm9sbG1lbnRzID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgICAgICAgICAgICAgIC0+ICplbnJvbGxtZW50CglhY3RpdmVCeUtleSA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQobWV0ZXJJRCl8Y29uc3VtZXIgLT4gaW50NjQgZW5yb2xsIGlkLCB3aGlsZSBBY3RpdmUKCXByb3ZpZGVyTnVtID0gYXZsLk5ld1RyZWUoKSAvLyBhZGRyZXNzIC0+ICppbnQ2NCwgbGl2ZSBtZXRlcnMgcGVyIHByb3ZpZGVyCgljb25zdW1lck51bSA9IGF2bC5OZXdUcmVlKCkgLy8gYWRkcmVzcyAtPiAqaW50NjQsIEFjdGl2ZSBlbnJvbGxtZW50cyBwZXIgY29uc3VtZXIKCWxlZGdlciAgICAgID0gZmVlbGVkZ2VyLk11c3ROZXcoTWF4RmVlQnBzKQopCgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJZmVlUmVjaXBpZW50ID0gYWRtaW4KCXNlbGYgPSB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpCn0KCi8vIC0tLSBwcm92aWRlciBzaWRlIC0tLQoKLy8gQ3JlYXRlTWV0ZXIgcHVibGlzaGVzIGEgbWV0ZXIgYW5kIHJldHVybnMgaXRzIGlkLiBObyBjb2lucyBhcmUgYWNjZXB0ZWQ7IHRoZQovLyBzdG9yYWdlIGRlcG9zaXQgdGhlIGNhbGxlciBwYXlzIGlzIHRoZSBhbnRpLXNwYW0uIGVkZ2VzIGFuZCByYXRlcyBhcmUKLy8gY29tbWEtc2VwYXJhdGVkIGludDY0IGxpc3RzIGJ1aWxkaW5nIHRoZSB0aWVycy5TY2hlZHVsZSBvdmVyIHRoZSB1Z25vdCBCQVNFCi8vICh1bml0cyDDlyB1bml0UHJpY2UpOiBsZW4ocmF0ZXMpID09IGxlbihlZGdlcykrMSwgZWFjaCByYXRlIGluIFswLCAxMDAwMF0KLy8gdGVuLXRob3VzYW5kdGhzIG9mIGxpc3QgcHJpY2UuICIiIGVkZ2VzIHdpdGggcmF0ZXMgIjEwMDAwIiBpcyBhIGZsYXQgbWV0ZXIuCi8vIFRoZSBjdXJyZW50IHByb3RvY29sIGZlZSBpcyBzbmFwc2hvdHRlZCBpbiBhbmQgbXVzdCBub3QgZXhjZWVkIG1heEZlZUJwcywKLy8gdGhlIGNlaWxpbmcgdGhlIHByb3ZpZGVyIHNpZ25lZCBmb3Ig4oCUIHBhc3MgTWF4RmVlQnBzIHRvIGFjY2VwdCBhbnkgbGVnYWwKLy8gZmVlLiBNZXRlcnMgYXJlIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQ6IHByaWNlLCBwZXJpb2Qgb3Igc2NoZWR1bGUgY2hhbmdlcwovLyBhcmUgYSBuZXcgbWV0ZXIsIHNvIG5vdGhpbmcgYSBjb25zdW1lciBhZ3JlZWQgdG8gY2FuIG1vdmUgdW5kZXJuZWF0aCB0aGVtLgpmdW5jIENyZWF0ZU1ldGVyKGN1ciByZWFsbSwgdGl0bGUsIHVuaXQgc3RyaW5nLCB1bml0UHJpY2UsIHBlcmlvZEJsb2NrcyBpbnQ2NCwgZWRnZXMsIHJhdGVzIHN0cmluZywgbWF4RmVlQnBzIGludDY0KSBpbnQ2NCB7Cglhc3NlcnROb1NlbmQoKQoJcHJvdmlkZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJaWYgdGl0bGUgPT0gIiIgfHwgbGVuKHRpdGxlKSA+IE1heFRpdGxlTGVuIHsKCQlwYW5pYygidGl0bGUgbXVzdCBiZSAxLi4iICsgaXRvYShNYXhUaXRsZUxlbikgKyAiIGJ5dGVzIikKCX0KCWlmIHVuaXQgPT0gIiIgfHwgbGVuKHVuaXQpID4gTWF4VW5pdExlbiB7CgkJcGFuaWMoInVuaXQgbXVzdCBiZSAxLi4iICsgaXRvYShNYXhVbml0TGVuKSArICIgYnl0ZXMiKQoJfQoJaWYgdW5pdFByaWNlIDwgTWluVW5pdFByaWNlIHx8IHVuaXRQcmljZSA+IE1heFVuaXRQcmljZSB7CgkJcGFuaWMoInVuaXRQcmljZSBtdXN0IGJlICIgKyBpdG9hKE1pblVuaXRQcmljZSkgKyAiLi4iICsgaXRvYShNYXhVbml0UHJpY2UpICsgRGVub20pCgl9CglpZiBwZXJpb2RCbG9ja3MgPCBNaW5QZXJpb2RCbG9ja3MgfHwgcGVyaW9kQmxvY2tzID4gTWF4UGVyaW9kQmxvY2tzIHsKCQlwYW5pYygicGVyaW9kQmxvY2tzIG11c3QgYmUgIiArIGl0b2EoTWluUGVyaW9kQmxvY2tzKSArICIuLiIgKyBpdG9hKE1heFBlcmlvZEJsb2NrcykpCgl9CglpZiBtYXhGZWVCcHMgPCAwIHx8IG1heEZlZUJwcyA+IE1heEZlZUJwcyB7CgkJcGFuaWMoIm1heEZlZUJwcyBtdXN0IGJlIDAuLiIgKyBpdG9hKE1heEZlZUJwcykpCgl9CglpZiBmZWVCcHMgPiBtYXhGZWVCcHMgewoJCXBhbmljKCJjdXJyZW50IHByb3RvY29sIGZlZSAiICsgaXRvYShmZWVCcHMpICsgIiBicHMgZXhjZWVkcyB0aGUgY2VpbGluZyB5b3Ugc2lnbmVkIGZvciAoIiArIGl0b2EobWF4RmVlQnBzKSArICIpIikKCX0KCXMsIGVyciA6PSB0aWVycy5OZXcoCgkJcGFyc2VJbnQ2NExpc3QoZWRnZXMsIHRpZXJzLk1heFRpZXJzLTEsICJlZGdlIiksCgkJcGFyc2VJbnQ2NExpc3QocmF0ZXMsIHRpZXJzLk1heFRpZXJzLCAicmF0ZSIpLAoJKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoInNjaGVkdWxlOiAiICsgZXJyLkVycm9yKCkpCgl9CgoJbiA6PSBjb3VudGVyKHByb3ZpZGVyTnVtLCBwcm92aWRlcikKCWlmICpuID49IE1heE1ldGVyc1BlclByb3ZpZGVyIHsKCQlwYW5pYygicGVyLXByb3ZpZGVyIG1ldGVyIGxpbWl0IHJlYWNoZWQiKQoJfQoKCWlkIDo9IG5leHRNZXRlcgoJbmV4dE1ldGVyKysKCW1ldGVyc1QuU2V0KHBhZElEKGlkKSwgJm1ldGVyewoJCWlkOiAgICAgICAgICAgaWQsCgkJcHJvdmlkZXI6ICAgICBwcm92aWRlciwKCQl0aXRsZTogICAgICAgIHRpdGxlLAoJCXVuaXQ6ICAgICAgICAgdW5pdCwKCQl1bml0UHJpY2U6ICAgIHVuaXRQcmljZSwKCQlzY2hlZDogICAgICAgIHMsCgkJcGVyaW9kQmxvY2tzOiBwZXJpb2RCbG9ja3MsCgkJZmVlQnBzOiAgICAgICBmZWVCcHMsCgkJc3RhdHVzOiAgICAgICBNZXRlckFjdGl2ZSwKCX0pCgkqbisrCgoJY2hhaW4uRW1pdCgiTWV0ZXJDcmVhdGVkIiwKCQkibWV0ZXJJZCIsIGl0b2EoaWQpLAoJCSJwcm92aWRlciIsIHByb3ZpZGVyLlN0cmluZygpLAoJCSJ1bml0UHJpY2UiLCBpdG9hKHVuaXRQcmljZSksCgkJInBlcmlvZEJsb2NrcyIsIGl0b2EocGVyaW9kQmxvY2tzKSwKCQkiZmVlQnBzIiwgaXRvYShmZWVCcHMpLAoJKQoJcmV0dXJuIGlkCn0KCi8vIFJldGlyZU1ldGVyIHN0b3BzIE5FVyBlbnJvbGxtZW50cyBhbmQgTkVXIHVzYWdlIG9uIHRoZSBjYWxsZXIncyBvd24gbWV0ZXIuCi8vIEV4aXN0aW5nIGVucm9sbG1lbnRzIGtlZXAgdGhlaXIgZnVuZHMgcGF0aHMgd2hvbGU6IHBlbmRpbmcgdXNhZ2Ugc3RpbGwKLy8gc2V0dGxlcywgZGVwb3NpdHMgc3RheSB3aXRoZHJhd2FibGUsIEV4aXQgc3RpbGwgcmVmdW5kcy4gVGhlIHByb3ZpZGVyJ3MKLy8gbWV0ZXIgc2xvdCBmcmVlcy4gVGVybWluYWwuCmZ1bmMgUmV0aXJlTWV0ZXIoY3VyIHJlYWxtLCBtZXRlcklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJbSA6PSBtdXN0R2V0TWV0ZXIobWV0ZXJJRCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBtLnByb3ZpZGVyIHsKCQlwYW5pYygib25seSB0aGUgcHJvdmlkZXIgbWF5IHJldGlyZSBhIG1ldGVyIikKCX0KCWlmIG0uc3RhdHVzICE9IE1ldGVyQWN0aXZlIHsKCQlwYW5pYygibWV0ZXIgaXMgIiArIG0uc3RhdHVzKQoJfQoJbS5zdGF0dXMgPSBNZXRlclJldGlyZWQKCWRlY0NvdW50ZXIocHJvdmlkZXJOdW0sIG0ucHJvdmlkZXIpCgljaGFpbi5FbWl0KCJNZXRlclJldGlyZWQiLCAibWV0ZXJJZCIsIGl0b2EobWV0ZXJJRCksICJwcm92aWRlciIsIG0ucHJvdmlkZXIuU3RyaW5nKCkpCn0KCi8vIFJlY29yZCBhc3NlcnRzIHRoYXQgdGhlIGVucm9sbG1lbnQncyBjb25zdW1lciB1c2VkIHVuaXRzIG1vcmUgdW5pdHMgb2YgdGhlCi8vIG1ldGVyJ3Mgc2VydmljZSBpbiB0aGUgQ1VSUkVOVCBwZXJpb2QuIFByb3ZpZGVyIG9ubHkuIEZhaWwtY2xvc2VkIG9uIHRoZQovLyBkZXBvc2l0IGJvdW5kOiBpZiBjaGFyZ2luZyB0aGUgcGVyaW9kJ3MgbmV3IHRvdGFsIGF0IHRoZSBlbnJvbGxtZW50J3MKLy8gc2NoZWR1bGUgd291bGQgZXhjZWVkIHRoZSBkZXBvc2l0ZWQgYmFsYW5jZSwgdGhlIHdob2xlIHBvc3RpbmcgaXMgcmVmdXNlZCDigJQKLy8gbmV2ZXIgY2xpcHBlZCwgYmVjYXVzZSBhIGNsaXBwZWQgYXNzZXJ0aW9uIGlzIGEgd3JvbmcgYXNzZXJ0aW9uIHdpdGggdGhlCi8vIHNhbWUgc2lnbmF0dXJlIGFzIGEgcmlnaHQgb25lLiBBbnkgZWxhcHNlZCBwZXJpb2Qgc2V0dGxlcyBmaXJzdCwgc28gdGhlCi8vIGJvdW5kIGlzIGFsd2F5cyBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBiYWxhbmNlIHRoYXQgd2lsbCBhY3R1YWxseSBiYWNrIHRoaXMKLy8gcGVyaW9kLgpmdW5jIFJlY29yZChjdXIgcmVhbG0sIGVucm9sbElELCB1bml0cyBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWUgOj0gbXVzdEdldEVucm9sbG1lbnQoZW5yb2xsSUQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZS5wcm92aWRlciB7CgkJcGFuaWMoIm9ubHkgdGhlIHByb3ZpZGVyIG1heSByZWNvcmQgdXNhZ2UiKQoJfQoJaWYgZS5zdGF0dXMgIT0gRW5yb2xsQWN0aXZlIHsKCQlwYW5pYygiZW5yb2xsbWVudCBpcyAiICsgZS5zdGF0dXMpCgl9CgltIDo9IG11c3RHZXRNZXRlcihlLm1ldGVySUQpCglpZiBtLnN0YXR1cyAhPSBNZXRlckFjdGl2ZSB7CgkJcGFuaWMoIm1ldGVyIGlzICIgKyBtLnN0YXR1cyArICI7IG5vIG5ldyB1c2FnZSIpCgl9CglpZiB1bml0cyA8PSAwIHsKCQlwYW5pYygidW5pdHMgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CglzZXR0bGVFbGFwc2VkKGUpCgoJbmV3VXNhZ2UsIG9rIDo9IGFkZENoZWNrZWQoZS51c2FnZSwgdW5pdHMpCglpZiAhb2sgewoJCXBhbmljKCJ1c2FnZSBvdmVyZmxvdyIpCgl9CgljaGFyZ2UgOj0gY2hhcmdlRm9yKGUsIG5ld1VzYWdlKQoJYmFsIDo9IGxlZGdlci5CYWxhbmNlT2YoZW5yb2xsS2V5KGUuaWQpKQoJaWYgY2hhcmdlID4gYmFsIHsKCQlwYW5pYygiZGVwb3NpdCBib3VuZDogY2hhcmdpbmcgIiArIGl0b2EobmV3VXNhZ2UpICsgIiB1bml0cyBjb3N0cyAiICsgaXRvYShjaGFyZ2UpICsKCQkJRGVub20gKyAiIGFnYWluc3QgYSBiYWxhbmNlIG9mICIgKyBpdG9hKGJhbCkgKyBEZW5vbSArCgkJCSIg4oCUIHRoZSBjb25zdW1lciBtdXN0IGRlcG9zaXQgYmVmb3JlIHRoaXMgdXNhZ2UgY2FuIGJlIHJlY29yZGVkIikKCX0KCWUudXNhZ2UgPSBuZXdVc2FnZQoKCWNoYWluLkVtaXQoIlVzYWdlUmVjb3JkZWQiLAoJCSJlbnJvbGxJZCIsIGl0b2EoZW5yb2xsSUQpLAoJCSJtZXRlcklkIiwgaXRvYShlLm1ldGVySUQpLAoJCSJ1bml0cyIsIGl0b2EodW5pdHMpLAoJCSJwZXJpb2RVc2FnZSIsIGl0b2EobmV3VXNhZ2UpLAoJCSJwZXJpb2QiLCBpdG9hKGUudXNhZ2VQZXJpb2QpLAoJCSJwZW5kaW5nQ2hhcmdlIiwgaXRvYShjaGFyZ2UpLAoJKQp9CgovLyAtLS0gY29uc3VtZXIgc2lkZSAtLS0KCi8vIEVucm9sbCBvcGVucyBhbiBlbnJvbGxtZW50IG9uIGEgbWV0ZXIgZm9yIHRoZSBjYWxsZXIsIHdpdGggYW55IGF0dGFjaGVkCi8vIGNvaW5zIGNyZWRpdGVkIGFzIHRoZSBpbml0aWFsIGRlcG9zaXQuIE9uZSBhY3RpdmUgZW5yb2xsbWVudCBwZXIKLy8gKG1ldGVyLCBjb25zdW1lcik7IEV4aXQgZnJlZXMgdGhlIHNsb3QuIFRlcm1zIChwcmljZSwgc2NoZWR1bGUsIHBlcmlvZCwKLy8gZmVlKSBhcmUgY29waWVkIGluIGF0IHRoaXMgbW9tZW50IGFuZCBuZXZlciByZS1yZWFkLgpmdW5jIEVucm9sbChjdXIgcmVhbG0sIG1ldGVySUQgaW50NjQpIGludDY0IHsKCS8vIFRoZSBkZXBvc2l0IGlzIG9wdGlvbmFsIGF0IGVucm9sbG1lbnQ6IHdpdGggY29pbnMgYXR0YWNoZWQgdGhlIHBheWVyIGlzCgkvLyB0aGUgRU9BIG9yaWdpbiBjb2luaW8ncyByZWNlaXB0IGd1YXJkIGFkbWl0cywgd2l0aG91dCB0aGVtIHRoZSBjYWxsZXIgaXMKCS8vIHRha2VuIGFzLWlzLiBBIFJFQUxNIG1heSB0aGVyZWZvcmUgZW5yb2xsIGNvaW5sZXNzLCBidXQgaXQgY2FuIG5ldmVyCgkvLyBmdW5kIHRoZSBlbnJvbGxtZW50IGFmdGVyd2FyZHMgKERlcG9zaXQncyBwYXllciBjb21lcyB0aHJvdWdoIHRoZSBzYW1lCgkvLyBFT0Etb25seSBndWFyZCksIHNvIGEgcmVhbG0gZW5yb2xsbWVudCBpcyBpbmVydCByYXRoZXIgdGhhbiB1bnNhZmUuCgljb25zdW1lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCA6PSBpbnQ2NCgwKQoJaWYgIXVuc2FmZS5PcmlnaW5TZW5kKCkuSXNaZXJvKCkgewoJCWNvbnN1bWVyLCBhbW91bnQgPSBjb2luaW8uUmVjZWl2ZSgwLCBjdXIsIERlbm9tKQoJfQoJbSA6PSBtdXN0R2V0TWV0ZXIobWV0ZXJJRCkKCWlmIG0uc3RhdHVzICE9IE1ldGVyQWN0aXZlIHsKCQlwYW5pYygibWV0ZXIgaXMgIiArIG0uc3RhdHVzKQoJfQoJa2V5IDo9IHBhZElEKG1ldGVySUQpICsgInwiICsgY29uc3VtZXIuU3RyaW5nKCkKCWlmIGFjdGl2ZUJ5S2V5LkdldChrZXkpICE9IG5pbCB7CgkJcGFuaWMoImFuIGFjdGl2ZSBlbnJvbGxtZW50IG9uIHRoaXMgbWV0ZXIgYWxyZWFkeSBleGlzdHMiKQoJfQoJbiA6PSBjb3VudGVyKGNvbnN1bWVyTnVtLCBjb25zdW1lcikKCWlmICpuID49IE1heEVucm9sbG1lbnRzUGVyQ29uc3VtZXIgewoJCXBhbmljKCJwZXItY29uc3VtZXIgZW5yb2xsbWVudCBsaW1pdCByZWFjaGVkIikKCX0KCglpZiBhbW91bnQgPiAwIHsKCQlsZWRnZXIuTXVzdERlcG9zaXQoZW5yb2xsS2V5KG5leHRFbnIpLCBhbW91bnQsIDApCgl9CgoJaWQgOj0gbmV4dEVucgoJbmV4dEVucisrCgllbnJvbGxtZW50cy5TZXQocGFkSUQoaWQpLCAmZW5yb2xsbWVudHsKCQlpZDogICAgICAgICAgIGlkLAoJCW1ldGVySUQ6ICAgICAgbWV0ZXJJRCwKCQljb25zdW1lcjogICAgIGNvbnN1bWVyLAoJCXByb3ZpZGVyOiAgICAgbS5wcm92aWRlciwKCQl1bml0UHJpY2U6ICAgIG0udW5pdFByaWNlLAoJCXNjaGVkOiAgICAgICAgbS5zY2hlZCwKCQlwZXJpb2RCbG9ja3M6IG0ucGVyaW9kQmxvY2tzLAoJCWZlZUJwczogICAgICAgbS5mZWVCcHMsCgkJc3RhdHVzOiAgICAgICBFbnJvbGxBY3RpdmUsCgkJc3RhcnRIZWlnaHQ6ICBydW50aW1lLkNoYWluSGVpZ2h0KCksCgkJdXNhZ2VQZXJpb2Q6ICAwLAoJfSkKCWFjdGl2ZUJ5S2V5LlNldChrZXksIGlkKQoJKm4rKwoJbS5lbnJvbGxtZW50cysrCgoJY2hhaW4uRW1pdCgiRW5yb2xsZWQiLAoJCSJlbnJvbGxJZCIsIGl0b2EoaWQpLAoJCSJtZXRlcklkIiwgaXRvYShtZXRlcklEKSwKCQkiY29uc3VtZXIiLCBjb25zdW1lci5TdHJpbmcoKSwKCQkiZGVwb3NpdCIsIGl0b2EoYW1vdW50KSwKCSkKCXJldHVybiBpZAp9CgovLyBEZXBvc2l0IGFkZHMgdGhlIGF0dGFjaGVkIGNvaW5zIHRvIHRoZSBjYWxsZXIncyBvd24gZW5yb2xsbWVudCBkZXBvc2l0LgovLyBFbGFwc2VkIHVzYWdlIHNldHRsZXMgZmlyc3QsIHNvIGEgdG9wLXVwIGxhbmRzIG9uIGEgY3VycmVudCBiYWxhbmNlLgpmdW5jIERlcG9zaXQoY3VyIHJlYWxtLCBlbnJvbGxJRCBpbnQ2NCkgewoJcGF5ZXIsIGFtb3VudCA6PSBjb2luaW8uUmVjZWl2ZSgwLCBjdXIsIERlbm9tKQoJZSA6PSBtdXN0R2V0RW5yb2xsbWVudChlbnJvbGxJRCkKCWlmIHBheWVyICE9IGUuY29uc3VtZXIgewoJCXBhbmljKCJvbmx5IHRoZSBjb25zdW1lciBtYXkgZGVwb3NpdCIpCgl9CglpZiBlLnN0YXR1cyAhPSBFbnJvbGxBY3RpdmUgewoJCXBhbmljKCJlbnJvbGxtZW50IGlzICIgKyBlLnN0YXR1cykKCX0KCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYXR0YWNoIHRoZSBkZXBvc2l0IHRvIHRoZSBjYWxsIikKCX0KCXNldHRsZUVsYXBzZWQoZSkKCWxlZGdlci5NdXN0RGVwb3NpdChlbnJvbGxLZXkoZW5yb2xsSUQpLCBhbW91bnQsIDApCgljaGFpbi5FbWl0KCJEZXBvc2l0ZWQiLAoJCSJlbnJvbGxJZCIsIGl0b2EoZW5yb2xsSUQpLAoJCSJhbW91bnQiLCBpdG9hKGFtb3VudCksCgkJImJhbGFuY2UiLCBpdG9hKGxlZGdlci5CYWxhbmNlT2YoZW5yb2xsS2V5KGVucm9sbElEKSkpLAoJKQp9CgovLyBXaXRoZHJhd0RlcG9zaXQgcmV0dXJucyBhbW91bnQgb2YgdGhlIGNhbGxlcidzIG93biBlbnJvbGxtZW50IGRlcG9zaXQuCi8vIFRoZSBjdXJyZW50IHBlcmlvZCdzIHBlbmRpbmcgY2hhcmdlIHN0YXlzIGNvdmVyZWQ6IHdpdGhkcmF3YWJsZSBpcwovLyBiYWxhbmNlIOKIkiBDaGFyZ2UoY3VycmVudCB1c2FnZSksIHNvIGEgcHJvdmlkZXIncyBhbHJlYWR5LXJlY29yZGVkIHVzYWdlIGNhbgovLyBuZXZlciBiZSBkZWZ1bmRlZC4gRWxhcHNlZCB1c2FnZSBzZXR0bGVzIGZpcnN0LgpmdW5jIFdpdGhkcmF3RGVwb3NpdChjdXIgcmVhbG0sIGVucm9sbElELCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgllIDo9IG11c3RHZXRFbnJvbGxtZW50KGVucm9sbElEKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IGUuY29uc3VtZXIgewoJCXBhbmljKCJvbmx5IHRoZSBjb25zdW1lciBtYXkgd2l0aGRyYXcgdGhlIGRlcG9zaXQiKQoJfQoJaWYgZS5zdGF0dXMgIT0gRW5yb2xsQWN0aXZlIHsKCQlwYW5pYygiZW5yb2xsbWVudCBpcyAiICsgZS5zdGF0dXMpCgl9CglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCXNldHRsZUVsYXBzZWQoZSkKCXBlbmRpbmcgOj0gY2hhcmdlRm9yKGUsIGUudXNhZ2UpCglmcmVlIDo9IGxlZGdlci5CYWxhbmNlT2YoZW5yb2xsS2V5KGVucm9sbElEKSkgLSBwZW5kaW5nCglpZiBhbW91bnQgPiBmcmVlIHsKCQlwYW5pYygid2l0aGRyYXdhYmxlIGlzICIgKyBpdG9hKGZyZWUpICsgRGVub20gKyAiIChiYWxhbmNlIG1pbnVzIHRoZSBwZW5kaW5nIGNoYXJnZSAiICsKCQkJaXRvYShwZW5kaW5nKSArIERlbm9tICsgIikiKQoJfQoJbGVkZ2VyLk11c3RXaXRoZHJhdyhlbnJvbGxLZXkoZW5yb2xsSUQpLCBhbW91bnQpCgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiRGVwb3NpdFdpdGhkcmF3biIsCgkJImVucm9sbElkIiwgaXRvYShlbnJvbGxJRCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCSkKfQoKLy8gRXhpdCBjbG9zZXMgdGhlIGNhbGxlcidzIG93biBlbnJvbGxtZW50OiBlbGFwc2VkIHBlcmlvZHMgc2V0dGxlLCB0aGUKLy8gQ1VSUkVOVCBwZXJpb2QncyByZWNvcmRlZCB1c2FnZSBzZXR0bGVzIGltbWVkaWF0ZWx5ICh0aGUgcHJvdmlkZXIgc2VydmVkCi8vIGl0OyBleGl0aW5nIGlzIG5vdCBhbiBlc2NhcGUgZnJvbSBpdCksIHRoZSByZW1haW5pbmcgZGVwb3NpdCByZWZ1bmRzIGluCi8vIGZ1bGwsIGFuZCB0aGUgc2xvdCBmcmVlcy4gVGVybWluYWwuCmZ1bmMgRXhpdChjdXIgcmVhbG0sIGVucm9sbElEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJZSA6PSBtdXN0R2V0RW5yb2xsbWVudChlbnJvbGxJRCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBlLmNvbnN1bWVyIHsKCQlwYW5pYygib25seSB0aGUgY29uc3VtZXIgbWF5IGV4aXQiKQoJfQoJaWYgZS5zdGF0dXMgIT0gRW5yb2xsQWN0aXZlIHsKCQlwYW5pYygiZW5yb2xsbWVudCBpcyAiICsgZS5zdGF0dXMpCgl9CglzZXR0bGVFbGFwc2VkKGUpCglzZXR0bGVVc2FnZShlKSAvLyB0aGUgY3VycmVudCBwYXJ0aWFsIHBlcmlvZCwgY2hhcmdlZCBvbiB3aGF0IHdhcyBjb25zdW1lZAoKCXJlZnVuZCwgZXJyIDo9IGxlZGdlci5XaXRoZHJhd0FsbChlbnJvbGxLZXkoZW5yb2xsSUQpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJZS5zdGF0dXMgPSBFbnJvbGxFeGl0ZWQKCWFjdGl2ZUJ5S2V5LlJlbW92ZShwYWRJRChlLm1ldGVySUQpICsgInwiICsgZS5jb25zdW1lci5TdHJpbmcoKSkKCWRlY0NvdW50ZXIoY29uc3VtZXJOdW0sIGUuY29uc3VtZXIpCglpZiByZWZ1bmQgPiAwIHsKCQljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgcmVmdW5kKQoJfQoJY2hhaW4uRW1pdCgiRXhpdGVkIiwKCQkiZW5yb2xsSWQiLCBpdG9hKGVucm9sbElEKSwKCQkicmVmdW5kIiwgaXRvYShyZWZ1bmQpLAoJKQp9CgovLyBTZXR0bGUgc2V0dGxlcyBhbnkgZnVsbHktZWxhcHNlZCBwZXJpb2Qgb2YgYW4gZW5yb2xsbWVudC4gUGVybWlzc2lvbmxlc3MgYnkKLy8gZGVzaWduIOKAlCBsaWtlIHRoZSBzaWJsaW5nIHJlYWxtcycgdmFsdmVzLCBubyBzZXR0bGVtZW50J3MgbGl2ZW5lc3MgbWF5Ci8vIGRlcGVuZCBvbiBlaXRoZXIgcGFydHkgc2hvd2luZyB1cC4gTm8gY29pbnMgbWF5IHJpZGUgb24gaXQsIGFuZCBjYWxsaW5nIGl0Ci8vIG9uIGFuIGVucm9sbG1lbnQgd2l0aCBub3RoaW5nIGVsYXBzZWQgaXMgYSByZWZ1c2VkIG5vLW9wIHNvIHRoZSBldmVudAovLyBzdHJlYW0gbmV2ZXIgY2FycmllcyBlbXB0eSBzZXR0bGVtZW50cy4KZnVuYyBTZXR0bGUoY3VyIHJlYWxtLCBlbnJvbGxJRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWUgOj0gbXVzdEdldEVucm9sbG1lbnQoZW5yb2xsSUQpCglpZiBlLnN0YXR1cyAhPSBFbnJvbGxBY3RpdmUgewoJCXBhbmljKCJlbnJvbGxtZW50IGlzICIgKyBlLnN0YXR1cykKCX0KCWlmIGN1cnJlbnRQZXJpb2QoZSkgPD0gZS51c2FnZVBlcmlvZCB7CgkJcGFuaWMoIm5vdGhpbmcgdG8gc2V0dGxlOiB0aGUgY3VycmVudCBwZXJpb2QgaXMgc3RpbGwgb3BlbiIpCgl9CglzZXR0bGVFbGFwc2VkKGUpCn0KCi8vIC0tLSBwYXlvdXRzIC0tLQoKLy8gQ2xhaW0gc2VuZHMgYW1vdW50IHVnbm90IG9mIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZSBiYWNrIHRvIHRoZQovLyBjYWxsZXIuIFByb3ZpZGVycyBlYXJuIGludG8gdGhpcyBiYWxhbmNlIGF0IGV2ZXJ5IHNldHRsZW1lbnQuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3KGNhbGxlci5TdHJpbmcoKSwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBDbGFpbUFsbCBzZW5kcyB0aGUgY2FsbGVyJ3MgZW50aXJlIGNsYWltYWJsZSBiYWxhbmNlIGJhY2sgdG8gdGhlIGNhbGxlci4KLy8gRmFpbHMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBjbGFpbS4KZnVuYyBDbGFpbUFsbChjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gV2l0aGRyYXdGZWVzIHNlbmRzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gdGhlIGZlZSByZWNpcGllbnQuIE9ubHkgdGhlIGZlZQovLyByZWNpcGllbnQgbWF5IGNhbGwgaXQsIGFuZCBvbmx5IHRoZSBwb3QgbW92ZXMuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJYW1vdW50IDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkZlZXNXaXRoZHJhd24iLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFN3ZWVwRGVub20gcmVjb3ZlcnMgb3V0LW9mLWJhbmQgY29pbnMgKHNlbnQgYnkgcmF3IGJhbmsgdHJhbnNmZXIsIG91dHNpZGUKLy8gYW55IGVudHJ5cG9pbnQpIHRvIHRoZSBmZWUgcmVjaXBpZW50LiBGb3IgdGhlIGxlZGdlciBkZW5vbSB0aGUgcmVzZXJ2ZSBpcwovLyBMaWFiaWxpdGllcygpIOKAlCB1c2VyIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdCBhcmUgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlLgovLyBGZWUgcmVjaXBpZW50IG9ubHkuCmZ1bmMgU3dlZXBEZW5vbShjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJcmVzZXJ2ZSA6PSBpbnQ2NCgwKQoJaWYgZGVub20gPT0gRGVub20gewoJCXJlc2VydmUgPSBsZWRnZXIuTGlhYmlsaXRpZXMoKQoJfQoJc3dlcHQgOj0gY29pbmlvLlN3ZWVwKDAsIGN1ciwgZmVlUmVjaXBpZW50LCBkZW5vbSwgcmVzZXJ2ZSkKCWNoYWluLkVtaXQoIlN1cnBsdXNTd2VwdCIsICJ0byIsIGZlZVJlY2lwaWVudC5TdHJpbmcoKSwgImNvaW5zIiwgaXRvYShzd2VwdCkrZGVub20pCn0KCi8vIC0tLSBhZG1pbmlzdHJhdGlvbiAodHdvLXN0ZXAgdHJhbnNmZXIsIHRoZSBob3VzZSBwYXR0ZXJuKSAtLS0KCi8vIFNldEZlZUJwcyBzZXRzIHRoZSBwcm90b2NvbCBmZWUgc25hcHNob3R0ZWQgaW50byBORVcgbWV0ZXJzLiBBZG1pbiBvbmx5LgovLyBObyBleGlzdGluZyBtZXRlciBvciBlbnJvbGxtZW50IG1vdmVzLgpmdW5jIFNldEZlZUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgYnBzIDwgMCB8fCBicHMgPiBNYXhGZWVCcHMgewoJCXBhbmljKCJmZWUgbXVzdCBiZSAwLi4iICsgaXRvYShNYXhGZWVCcHMpICsgIiBicHMiKQoJfQoJZmVlQnBzID0gYnBzCgljaGFpbi5FbWl0KCJGZWVTZXQiLCAiYnBzIiwgaXRvYShicHMpKQp9CgovLyBTZXRGZWVSZWNpcGllbnQgcG9pbnRzIGZlZSB3aXRoZHJhd2FsIGFuZCBzd2VlcHMgYXQgcmVjaXBpZW50LiBBZG1pbiBvbmx5LgpmdW5jIFNldEZlZVJlY2lwaWVudChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9CglpZiAhcmVjaXBpZW50LklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgcmVjaXBpZW50IikKCX0KCWZlZVJlY2lwaWVudCA9IHJlY2lwaWVudAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50U2V0IiwgInRvIiwgcmVjaXBpZW50LlN0cmluZygpKQp9CgovLyBUcmFuc2ZlckFkbWluIHN0YWdlcyBzdWNjZXNzb3IgYXMgdGhlIG5leHQgYWRtaW47IEFjY2VwdEFkbWluIGNvbXBsZXRlcyBpdC4KLy8gVHdvLXN0ZXAgd2l0aCBjb25zZW50IOKAlCBhIG9uZS1zdGVwIHRyYW5zZmVyIGJyaWNrZWQgcmVzb3VyY2VzIGluIHR3byBwcmlvcgovLyBhdWRpdHMgKHNlcnZpY2VfcmVnaXN0cnkgWTQsIHBlcm1pc3Npb25fcmVnaXN0cnkgWTQpLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBzdWNjZXNzb3IgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgIXN1Y2Nlc3Nvci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHN1Y2Nlc3NvciIpCgl9CglwZW5kaW5nQWRtaW4gPSBzdWNjZXNzb3IKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJTdGFnZWQiLCAidG8iLCBzdWNjZXNzb3IuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyBhIHN0YWdlZCBhZG1pbiB0cmFuc2Zlci4gUGVuZGluZyBhZG1pbiBvbmx5LgpmdW5jIEFjY2VwdEFkbWluKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHBlbmRpbmdBZG1pbiA9PSAiIiB8fCBjYWxsZXIgIT0gcGVuZGluZ0FkbWluIHsKCQlwYW5pYygibm8gYWRtaW4gdHJhbnNmZXIgc3RhZ2VkIGZvciBjYWxsZXIiKQoJfQoJYWRtaW4gPSBwZW5kaW5nQWRtaW4KCXBlbmRpbmdBZG1pbiA9ICIiCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVycmVkIiwgInRvIiwgY2FsbGVyLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgKG5vbi1jcm9zc2luZzogY3Jvc3MtcmVhbG0gcmVhZGFibGUpIC0tLQoKLy8gUHJpY2VPZiBwcmljZXMgdW5pdHMgb2YgbWV0ZXIgbWV0ZXJJRCBhdCBpdHMgc2NoZWR1bGU6IHRoZSBjaGFyZ2UgYSBwZXJpb2QKLy8gY2xvc2luZyBhdCBleGFjdGx5IHRoYXQgdXNhZ2Ugd291bGQgc2V0dGxlLiBUaGUgcXVvdGUgZXZlcnkgY29uc3VtZXIgY2FuCi8vIHRha2UgYmVmb3JlIGVucm9sbGluZyBhbmQgZXZlcnkgcHJvdmlkZXIgY2FuIHNob3cgYmVzaWRlIGFuIGludm9pY2UuCmZ1bmMgUHJpY2VPZihtZXRlcklELCB1bml0cyBpbnQ2NCkgaW50NjQgewoJbSA6PSBtdXN0R2V0TWV0ZXIobWV0ZXJJRCkKCWlmIHVuaXRzIDwgMCB7CgkJcGFuaWMoInVuaXRzIG11c3QgYmUgbm9uLW5lZ2F0aXZlIikKCX0KCWJhc2UsIG9rIDo9IG11bENoZWNrZWQodW5pdHMsIG0udW5pdFByaWNlKQoJaWYgIW9rIHsKCQlwYW5pYygiYmFzZSBvdmVyZmxvdyIpCgl9CgljLCBlcnIgOj0gbS5zY2hlZC5DaGFyZ2UoYmFzZSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJjaGFyZ2U6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBjCn0KCi8vIFBlbmRpbmdDaGFyZ2VPZiBpcyB0aGUgY2hhcmdlIHRoZSBlbnJvbGxtZW50J3MgY3VycmVudCByZWNvcmRlZCB1c2FnZSB3b3VsZAovLyBzZXR0bGUgYXQg4oCUIHdoYXQgV2l0aGRyYXdEZXBvc2l0IGhvbGRzIGJhY2suCmZ1bmMgUGVuZGluZ0NoYXJnZU9mKGVucm9sbElEIGludDY0KSBpbnQ2NCB7CgllIDo9IG11c3RHZXRFbnJvbGxtZW50KGVucm9sbElEKQoJcmV0dXJuIGNoYXJnZUZvcihlLCBlLnVzYWdlKQp9CgovLyBCYWxhbmNlT2YgaXMgYW4gZW5yb2xsbWVudCdzIGRlcG9zaXRlZCBiYWxhbmNlIGFzIHRoZSBMRURHRVIgaG9sZHMgaXQg4oCUCi8vIGluY2x1ZGluZyBhIG5vdC15ZXQtc2V0dGxlZCBlbGFwc2VkIHBlcmlvZCdzIGNoYXJnZTsgbmV0IHZpZXc6IHN1YnRyYWN0Ci8vIFBlbmRpbmdDaGFyZ2VPZi4KZnVuYyBCYWxhbmNlT2YoZW5yb2xsSUQgaW50NjQpIGludDY0IHsKCW11c3RHZXRFbnJvbGxtZW50KGVucm9sbElEKQoJcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoZW5yb2xsS2V5KGVucm9sbElEKSkKfQoKLy8gQ2hhcmdlSGVhZHJvb21PZiBpcyBob3cgbXVjaCBNT1JFIGNoYXJnZSB0aGUgY3VycmVudCBwZXJpb2QgY291bGQgYWJzb3JiCi8vIGJlZm9yZSBSZWNvcmQncyBkZXBvc2l0IGJvdW5kIHJlZnVzZXM6IGJhbGFuY2Ug4oiSIHBlbmRpbmcgY2hhcmdlLgpmdW5jIENoYXJnZUhlYWRyb29tT2YoZW5yb2xsSUQgaW50NjQpIGludDY0IHsKCWUgOj0gbXVzdEdldEVucm9sbG1lbnQoZW5yb2xsSUQpCglyZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihlbnJvbGxLZXkoZW5yb2xsSUQpKSAtIGNoYXJnZUZvcihlLCBlLnVzYWdlKQp9CgovLyBNZXRlckluZm8gcmV0dXJucyBhIG1ldGVyJ3MgdGVybXMuCmZ1bmMgTWV0ZXJJbmZvKG1ldGVySUQgaW50NjQpIChwcm92aWRlciBhZGRyZXNzLCB0aXRsZSwgdW5pdCBzdHJpbmcsIHVuaXRQcmljZSwgcGVyaW9kQmxvY2tzLCBtZXRlckZlZUJwcyBpbnQ2NCwgc3RhdHVzIHN0cmluZywgbGlmZXRpbWVFbnJvbGxtZW50cyBpbnQ2NCkgewoJbSA6PSBtdXN0R2V0TWV0ZXIobWV0ZXJJRCkKCXJldHVybiBtLnByb3ZpZGVyLCBtLnRpdGxlLCBtLnVuaXQsIG0udW5pdFByaWNlLCBtLnBlcmlvZEJsb2NrcywgbS5mZWVCcHMsIG0uc3RhdHVzLCBtLmVucm9sbG1lbnRzCn0KCi8vIFNjaGVkdWxlT2YgcmV0dXJucyBhIG1ldGVyJ3Mgc2NoZWR1bGUgYXMgaXRzIGVkZ2UgYW5kIHJhdGUgc2xpY2VzLgpmdW5jIFNjaGVkdWxlT2YobWV0ZXJJRCBpbnQ2NCkgKGVkZ2VzLCByYXRlcyBbXWludDY0KSB7CgltIDo9IG11c3RHZXRNZXRlcihtZXRlcklEKQoJcmV0dXJuIG0uc2NoZWQuRWRnZXMoKSwgbS5zY2hlZC5SYXRlcygpCn0KCi8vIEVucm9sbEluZm8gcmV0dXJucyBhbiBlbnJvbGxtZW50J3Mgc3RhdGUuIHVzYWdlL3VzYWdlUGVyaW9kIGFyZSB0aGUgcmF3Ci8vIGFjY3VtdWxhdG9yIOKAlCBhbiBlbGFwc2VkLCB1bnNldHRsZWQgcGVyaW9kIHJlYWRzIGhlcmUgZXhhY3RseSBhcyBpdCB3aWxsCi8vIHNldHRsZS4KZnVuYyBFbnJvbGxJbmZvKGVucm9sbElEIGludDY0KSAobWV0ZXJJRCBpbnQ2NCwgY29uc3VtZXIsIHByb3ZpZGVyIGFkZHJlc3MsIHN0YXR1cyBzdHJpbmcsIHN0YXJ0SGVpZ2h0LCB1c2FnZSwgdXNhZ2VQZXJpb2QsIHNldHRsZWRQZXJpb2RzIGludDY0KSB7CgllIDo9IG11c3RHZXRFbnJvbGxtZW50KGVucm9sbElEKQoJcmV0dXJuIGUubWV0ZXJJRCwgZS5jb25zdW1lciwgZS5wcm92aWRlciwgZS5zdGF0dXMsIGUuc3RhcnRIZWlnaHQsIGUudXNhZ2UsIGUudXNhZ2VQZXJpb2QsIGUucGVyaW9kcwp9CgovLyBBY3RpdmVFbnJvbGxJRCByZXNvbHZlcyB0aGUgY2FsbGVyLWZyZWUgKG1ldGVyLCBjb25zdW1lcikgaW5kZXguCmZ1bmMgQWN0aXZlRW5yb2xsSUQobWV0ZXJJRCBpbnQ2NCwgY29uc3VtZXIgYWRkcmVzcykgKGludDY0LCBib29sKSB7Cgl2IDo9IGFjdGl2ZUJ5S2V5LkdldChwYWRJRChtZXRlcklEKSArICJ8IiArIGNvbnN1bWVyLlN0cmluZygpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHYuKGludDY0KSwgdHJ1ZQp9CgovLyBDdXJyZW50UGVyaW9kT2YgaXMgdGhlIHBlcmlvZCBpbmRleCBub3cgb3BlbiBmb3IgYW4gZW5yb2xsbWVudC4KZnVuYyBDdXJyZW50UGVyaW9kT2YoZW5yb2xsSUQgaW50NjQpIGludDY0IHsgcmV0dXJuIGN1cnJlbnRQZXJpb2QobXVzdEdldEVucm9sbG1lbnQoZW5yb2xsSUQpKSB9CgpmdW5jIEFkbWluKCkgYWRkcmVzcyAgICAgICAgICAgIHsgcmV0dXJuIGFkbWluIH0KZnVuYyBQZW5kaW5nQWRtaW4oKSBhZGRyZXNzICAgICB7IHJldHVybiBwZW5kaW5nQWRtaW4gfQpmdW5jIEZlZVJlY2lwaWVudCgpIGFkZHJlc3MgICAgIHsgcmV0dXJuIGZlZVJlY2lwaWVudCB9CmZ1bmMgRmVlQnBzKCkgaW50NjQgICAgICAgICAgICAgeyByZXR1cm4gZmVlQnBzIH0KZnVuYyBOdW1NZXRlcnMoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBuZXh0TWV0ZXIgfQpmdW5jIE51bUVucm9sbG1lbnRzKCkgaW50NjQgICAgIHsgcmV0dXJuIG5leHRFbnIgfQpmdW5jIFVzZXJzVG90YWwoKSBpbnQ2NCAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgIHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KZnVuYyBMaWFiaWxpdGllcygpIGludDY0ICAgICAgICB7IHJldHVybiBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CmZ1bmMgQ2xhaW1hYmxlT2YoYSBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuQmFsYW5jZU9mKGEuU3RyaW5nKCkpIH0KZnVuYyBIZWxkKCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgICAgICAgICAgeyByZXR1cm4gc2VsZiB9CmZ1bmMgSGVpZ2h0KCkgaW50NjQgICAgICAgICAgICAgeyByZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIH0KCi8vIC0tLSBpbnRlcm5hbHMgLS0tCgovLyBjdXJyZW50UGVyaW9kIGlzIHRoZSBpbmRleCBvZiB0aGUgcGVyaW9kIG9wZW4gYXQgdGhlIGNoYWluIGhlYWQuCmZ1bmMgY3VycmVudFBlcmlvZChlICplbnJvbGxtZW50KSBpbnQ2NCB7CglyZXR1cm4gKHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSAtIGUuc3RhcnRIZWlnaHQpIC8gZS5wZXJpb2RCbG9ja3MKfQoKLy8gY2hhcmdlRm9yIHByaWNlcyB1c2FnZSB1bml0cyBhdCB0aGUgZW5yb2xsbWVudCdzIGNvcGllZCB0ZXJtcy4KZnVuYyBjaGFyZ2VGb3IoZSAqZW5yb2xsbWVudCwgdXNhZ2UgaW50NjQpIGludDY0IHsKCWlmIHVzYWdlID09IDAgewoJCXJldHVybiAwCgl9CgliYXNlLCBvayA6PSBtdWxDaGVja2VkKHVzYWdlLCBlLnVuaXRQcmljZSkKCWlmICFvayB7CgkJcGFuaWMoImJhc2Ugb3ZlcmZsb3ciKQoJfQoJYywgZXJyIDo9IGUuc2NoZWQuQ2hhcmdlKGJhc2UpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygiY2hhcmdlOiAiICsgZXJyLkVycm9yKCkpCgl9CglyZXR1cm4gYwp9CgovLyBzZXR0bGVFbGFwc2VkIHNldHRsZXMgdGhlIHVzYWdlIGFjY3VtdWxhdG9yIGlmIGl0cyBwZXJpb2QgaGFzIGNsb3NlZCwgdGhlbgovLyByZS1hbmNob3JzIHRoZSBhY2N1bXVsYXRvciBvbiB0aGUgY3VycmVudCBwZXJpb2QuIEV4YWN0IGJlY2F1c2UgdXNhZ2UgY2FuCi8vIG9ubHkgZXZlciBiZWxvbmcgdG8gb25lIHBlcmlvZDogcGVyaW9kcyBiZXR3ZWVuIHVzYWdlUGVyaW9kIGFuZCBub3cgaGFkIG5vCi8vIHJlY29yZGVkIHVzYWdlIGFuZCBzbyBvd2UgemVyby4KZnVuYyBzZXR0bGVFbGFwc2VkKGUgKmVucm9sbG1lbnQpIHsKCWNwIDo9IGN1cnJlbnRQZXJpb2QoZSkKCWlmIGNwIDw9IGUudXNhZ2VQZXJpb2QgewoJCXJldHVybgoJfQoJc2V0dGxlVXNhZ2UoZSkKCWUudXNhZ2VQZXJpb2QgPSBjcAp9CgovLyBzZXR0bGVVc2FnZSBjaGFyZ2VzIHRoZSBhY2N1bXVsYXRvciB3aGVyZSBpdCBzdGFuZHMgYW5kIG1vdmVzIHRoZSBmdW5kczoKLy8gZW5yb2xsbWVudCBkZXBvc2l0IC0+IHByb3ZpZGVyIGNsYWltYWJsZSwgcHJvdG9jb2wgZmVlIHNwbGl0IGF0IHRoZQovLyBlbnJvbGxtZW50J3Mgc25hcHNob3R0ZWQgYnBzLiBSZWNvcmQncyBkZXBvc2l0IGJvdW5kIGlzIHdoYXQgZ3VhcmFudGVlcyB0aGUKLy8gd2l0aGRyYXdhbCBjYW5ub3QgZmFpbDsgaWYgdGhhdCBpbnZhcmlhbnQgd2VyZSBldmVyIGJyb2tlbiB0aGUgbGVkZ2VyJ3Mgb3duCi8vIHJlZnVzYWwgYWJvcnRzIHRoZSB3aG9sZSB0cmFuc2FjdGlvbiByYXRoZXIgdGhhbiB1bmRlci1zZXR0bGluZy4KZnVuYyBzZXR0bGVVc2FnZShlICplbnJvbGxtZW50KSB7CglpZiBlLnVzYWdlID09IDAgewoJCXJldHVybgoJfQoJY2hhcmdlIDo9IGNoYXJnZUZvcihlLCBlLnVzYWdlKQoJLy8gQSB6ZXJvIGNoYXJnZSBpcyBhIExFR0FMIHNldHRsZW1lbnQsIG5vdCBhIGRlZ2VuZXJhdGUgb25lOiB0aGUgcmVhbG0ncwoJLy8gb3duIGRvYyByZWNvbW1lbmRzIGEgMC1yYXRlIGZpcnN0IHRpZXIgZm9yIGZyZWUgYWxsb3dhbmNlcywgYW5kIHRoZQoJLy8gcGVyLXNsaWNlIGZsb29yIHByaWNlcyBzbWFsbCBiYXNlcyBhdCAwIHVuZGVyIHBvc2l0aXZlIHJhdGVzIHRvby4gVGhlCgkvLyBsZWRnZXIgcmVmdXNlcyBhIHplcm8tYW1vdW50IG1vdmUgKGZlZWxlZGdlcjogYW1vdW50IG11c3QgYmUgcG9zaXRpdmUpLAoJLy8gc28gYW4gdW5jb25kaXRpb25hbCBNdXN0V2l0aGRyYXcgaGVyZSBwYW5pY3MgYW5kIFdFREdFUyB0aGUgZW5yb2xsbWVudAoJLy8gZm9yZXZlciAtLSBldmVyeSBwYXRoIHRvIGl0cyBmdW5kcyByb3V0ZXMgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLiBBdWRpdAoJLy8gZmluZGluZyBSMS4gVGhlIGFjY3VtdWxhdG9yIHN0aWxsIGNsZWFyczsgbm90aGluZyBpcyBvd2VkLCBzbyBub3RoaW5nCgkvLyBtb3Zlcywgbm8gcGVyaW9kIGlzIGNvdW50ZWQgc2V0dGxlZCBhbmQgbm8gU2V0dGxlZCBldmVudCBpcyBlbWl0dGVkCgkvLyAodGhlIGV2ZW50IHN0cmVhbSBjYXJyaWVzIGZ1bmRzIG1vdmVzLCBub3QgZnJlZSB1c2FnZSkuCglpZiBjaGFyZ2UgPiAwIHsKCQlsZWRnZXIuTXVzdFdpdGhkcmF3KGVucm9sbEtleShlLmlkKSwgY2hhcmdlKQoJCWNyZWRpdGVkLCBmZWUgOj0gbGVkZ2VyLk11c3REZXBvc2l0KGUucHJvdmlkZXIuU3RyaW5nKCksIGNoYXJnZSwgZS5mZWVCcHMpCgkJZS5wZXJpb2RzKysKCQljaGFpbi5FbWl0KCJTZXR0bGVkIiwKCQkJImVucm9sbElkIiwgaXRvYShlLmlkKSwKCQkJIm1ldGVySWQiLCBpdG9hKGUubWV0ZXJJRCksCgkJCSJwZXJpb2QiLCBpdG9hKGUudXNhZ2VQZXJpb2QpLAoJCQkidW5pdHMiLCBpdG9hKGUudXNhZ2UpLAoJCQkiY2hhcmdlIiwgaXRvYShjaGFyZ2UpLAoJCQkiY3JlZGl0ZWQiLCBpdG9hKGNyZWRpdGVkKSwKCQkJImZlZSIsIGl0b2EoZmVlKSwKCQkpCgl9CgllLnVzYWdlID0gMAp9CgpmdW5jIG11c3RHZXRNZXRlcihpZCBpbnQ2NCkgKm1ldGVyIHsKCXYgOj0gbWV0ZXJzVC5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIG1ldGVyICIgKyBpdG9hKGlkKSkKCX0KCXJldHVybiB2LigqbWV0ZXIpCn0KCmZ1bmMgbXVzdEdldEVucm9sbG1lbnQoaWQgaW50NjQpICplbnJvbGxtZW50IHsKCXYgOj0gZW5yb2xsbWVudHMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBlbnJvbGxtZW50ICIgKyBpdG9hKGlkKSkKCX0KCXJldHVybiB2LigqZW5yb2xsbWVudCkKfQoKLy8gZW5yb2xsS2V5IGlzIHRoZSBsZWRnZXIgYWNjb3VudCBhbiBlbnJvbGxtZW50J3MgZGVwb3NpdCBsaXZlcyB1bmRlci4gSXQKLy8gY2Fubm90IGNvbGxpZGUgd2l0aCBhIHByb3ZpZGVyJ3MgY2xhaW1hYmxlIGFjY291bnQ6IGFkZHJlc3NlcyBuZXZlciBzdGFydAovLyB3aXRoICcjJy4KZnVuYyBlbnJvbGxLZXkoaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiAiI2VucnwiICsgcGFkSUQoaWQpIH0KCi8vIGFzc2VydE5vU2VuZCByZWZ1c2VzIGNvaW5zIG9uIGV2ZXJ5IG5vbi1wYXlhYmxlIGVudHJ5cG9pbnQuIFJlYWRzIHRoZQovLyBPUklHSU4gZW52ZWxvcGUsIHNvIGEgdHJhbnNhY3Rpb24gdGhhdCBhdHRhY2hlZCBjb2lucyBhbnl3aGVyZSBpcyByZWZ1c2VkCi8vIGV2ZW4gaWYgYW4gaW50ZXJtZWRpYXJ5IGNvbnN1bWVkIHRoZW0uCmZ1bmMgYXNzZXJ0Tm9TZW5kKCkgewoJaWYgIXVuc2FmZS5PcmlnaW5TZW5kKCkuSXNaZXJvKCkgewoJCXBhbmljKCJ0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCi8vIGNvdW50ZXIgcmV0dXJucyB0aGUgbGl2ZS1jb3VudCBjZWxsIGZvciBhLCBjcmVhdGluZyBpdCBhdCB6ZXJvLgpmdW5jIGNvdW50ZXIodHJlZSAqYXZsLlRyZWUsIGEgYWRkcmVzcykgKmludDY0IHsKCWsgOj0gYS5TdHJpbmcoKQoJaWYgdiA6PSB0cmVlLkdldChrKTsgdiAhPSBuaWwgewoJCXJldHVybiB2LigqaW50NjQpCgl9CgluIDo9IGludDY0KDApCgl0cmVlLlNldChrLCAmbikKCXJldHVybiAmbgp9CgovLyBkZWNDb3VudGVyIGRlY3JlbWVudHMgYSdzIGxpdmUgY291bnQgYW5kIHJlbW92ZXMgdGhlIGNlbGwgYXQgemVybyDigJQgdGhlCi8vIGluZGV4IG11c3Qgbm90IGFjY3VtdWxhdGUgZGVhZCBrZXlzIChzZXJ2aWNlX3JlZ2lzdHJ5J3MgbGVzc29uKS4KZnVuYyBkZWNDb3VudGVyKHRyZWUgKmF2bC5UcmVlLCBhIGFkZHJlc3MpIHsKCWsgOj0gYS5TdHJpbmcoKQoJdiA6PSB0cmVlLkdldChrKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJjb3VudGVyIHVuZGVyZmxvdzogbm8gY2VsbCBmb3IgIiArIGspCgl9CgluIDo9IHYuKCppbnQ2NCkKCSpuLS0KCWlmICpuIDwgMCB7CgkJcGFuaWMoImNvdW50ZXIgdW5kZXJmbG93IGZvciAiICsgaykKCX0KCWlmICpuID09IDAgewoJCXRyZWUuUmVtb3ZlKGspCgl9Cn0KCi8vIHBhcnNlSW50NjRMaXN0IHBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBpbnQ2NCBsaXN0LCBib3VuZGluZyB0aGUgZWxlbWVudAovLyBjb3VudCBCRUZPUkUgbWF0ZXJpYWxpc2luZyB2YWx1ZXMgc28gYSB0aG91c2FuZC1lbGVtZW50IHN0cmluZyBkaWVzIG9uCi8vIGNvdW50LCBub3QgbWVtb3J5IChyL3JlY2VpdmFibGVzJyBib3VuZGluZyBhcmd1bWVudCkuICIiIGlzIHRoZSBlbXB0eSBsaXN0LgpmdW5jIHBhcnNlSW50NjRMaXN0KHMgc3RyaW5nLCBtYXggaW50LCB3aGF0IHN0cmluZykgW11pbnQ2NCB7CglpZiBzID09ICIiIHsKCQlyZXR1cm4gbmlsCgl9Cgl2YXIgb3V0IFtdaW50NjQKCXN0YXJ0IDo9IDAKCWZvciBpIDo9IDA7IGkgPD0gbGVuKHMpOyBpKysgewoJCWlmIGkgPCBsZW4ocykgJiYgc1tpXSAhPSAnLCcgewoJCQljb250aW51ZQoJCX0KCQlpZiBsZW4ob3V0KSA+PSBtYXggewoJCQlwYW5pYygidG9vIG1hbnkgIiArIHdoYXQgKyAiczogYXQgbW9zdCAiICsgc3RyY29udi5JdG9hKG1heCkpCgkJfQoJCWZpZWxkIDo9IHNbc3RhcnQ6aV0KCQlzdGFydCA9IGkgKyAxCgkJbiwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQodHJpbVNwYWNlcyhmaWVsZCksIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoImJhZCAiICsgd2hhdCArICIgIiArIGZpZWxkICsgIjogIiArIGVyci5FcnJvcigpKQoJCX0KCQlvdXQgPSBhcHBlbmQob3V0LCBuKQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHRyaW1TcGFjZXMocyBzdHJpbmcpIHN0cmluZyB7CglpLCBqIDo9IDAsIGxlbihzKQoJZm9yIGkgPCBqICYmIHNbaV0gPT0gJyAnIHsKCQlpKysKCX0KCWZvciBqID4gaSAmJiBzW2otMV0gPT0gJyAnIHsKCQlqLS0KCX0KCXJldHVybiBzW2k6al0KfQoKLy8gYWRkQ2hlY2tlZCAvIG11bENoZWNrZWQgYXJlIGludDY0IG92ZXJmbG93LWNoZWNrZWQgYXJpdGhtZXRpYy4gV3JpdHRlbiBoZXJlCi8vIHJhdGhlciB0aGFuIGltcG9ydGVkIGJlY2F1c2UgdGhleSBhcmUgdHdvIGxpbmVzIGVhY2ggYW5kIHRoZSBob3VzZSBrZWVwcwovLyBpdHMgcGF5bWVudCBhcml0aG1ldGljIHZpc2libGUgYXQgdGhlIGNhbGwgc2l0ZS4KZnVuYyBhZGRDaGVja2VkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcyA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHMgPCBhKSB8fCAoYiA8IDAgJiYgcyA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBzLCB0cnVlCn0KCmZ1bmMgbXVsQ2hlY2tlZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCWlmIGEgPT0gMCB8fCBiID09IDAgewoJCXJldHVybiAwLCB0cnVlCgl9CglwIDo9IGEgKiBiCglpZiBwL2IgIT0gYSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gcCwgdHJ1ZQp9CgpmdW5jIHBhZElEKGlkIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChpZCwgMTApCglmb3IgbGVuKHMpIDwgMTIgewoJCXMgPSAiMCIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CgovLyAtLS0gUmVuZGVyIC0tLQoKLy8gUmVuZGVyIHNob3dzIHRoZSBjYXRhbG9nIGF0ICIiLCBhIG1ldGVyIGF0ICJtZXRlci88aWQ+IiwgYW4gZW5yb2xsbWVudCBhdAovLyAiZW5yb2xsLzxpZD4iLiBFdmVyeSB1c2VyIHN0cmluZyBpcyBzYW5pdGl6ZWQ7IGV2ZXJ5IGxpc3QgaXMgYm91bmRlZCBieQovLyBSZW5kZXJMaW1pdCB3aXRoIHRoZSBib3VuZCBzdGF0ZWQuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJc3dpdGNoIHsKCWNhc2UgcGF0aCA9PSAiIjoKCQlyZXR1cm4gcmVuZGVySG9tZSgpCgljYXNlIGhhc1ByZWZpeChwYXRoLCAibWV0ZXIvIik6CgkJcmV0dXJuIHJlbmRlck1ldGVyKHBhdGhbbGVuKCJtZXRlci8iKTpdKQoJY2FzZSBoYXNQcmVmaXgocGF0aCwgImVucm9sbC8iKToKCQlyZXR1cm4gcmVuZGVyRW5yb2xsbWVudChwYXRoW2xlbigiZW5yb2xsLyIpOl0pCglkZWZhdWx0OgoJCXJldHVybiAidW5rbm93biBwYXRoOyB0cnkgXCJcIiwgXCJtZXRlci88aWQ+XCIgb3IgXCJlbnJvbGwvPGlkPlwiXG4iCgl9Cn0KCmZ1bmMgcmVuZGVySG9tZSgpIHN0cmluZyB7CglvdXQgOj0gIiMgbWV0ZXJzIOKAlCB1c2FnZS1iYXNlZCBiaWxsaW5nLCBncmFkdWF0ZWQgcHJpY2luZ1xuXG4iCglvdXQgKz0gIk1ldGVyczogIiArIGl0b2EobmV4dE1ldGVyKSArICIgwrcgZW5yb2xsbWVudHM6ICIgKyBpdG9hKG5leHRFbnIpICsKCQkiIMK3IGxpYWJpbGl0aWVzOiAiICsgaXRvYShsZWRnZXIuTGlhYmlsaXRpZXMoKSkgKyBEZW5vbSArCgkJIiDCtyBmZWVzIGFjY3J1ZWQ6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuXG4iCglvdXQgKz0gInwgaWQgfCB0aXRsZSB8IHVuaXQgfCBsaXN0IHByaWNlIHwgcGVyaW9kIHwgc3RhdHVzIHxcbnwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIKCS8vIE5ld2VzdC1maXJzdCwgbWF0Y2hpbmcgci9zdWJzY3JpcHRpb25zOiB1bmRlciBvbGRlc3QtZmlyc3QgYSBzcXVhdHRlcgoJLy8gcmV0aXJlcyAyMCBlYXJseSBtZXRlcnMgb25jZSBhbmQgb3ducyB0aGUgdmlzaWJsZSBjYXRhbG9nIGZvcmV2ZXI7CgkvLyBuZXdlc3QtZmlyc3QgbWFrZXMgdGhhdCBjb3N0IGNvbnRpbnVvdXMgcmUtY3JlYXRpb24uIEF1ZGl0IGZpbmRpbmcgWTIuCglzaG93biA6PSAwCgltZXRlcnNULlJldmVyc2VJdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCW0gOj0gdi4oKm1ldGVyKQoJCS8vIFRhYmxlQ2VsbCwgbm90IElubGluZVRleHQ6IHRoZXNlIHN0cmluZ3Mgc2l0IGJldHdlZW4gR0ZNIHBpcGVzLCBhbmQKCQkvLyBJbmxpbmVUZXh0IGRlbGliZXJhdGVseSBsZWF2ZXMgfCBsaXRlcmFsIC0tIGEgcHJvdmlkZXIgdGl0bGUgd2l0aCBhCgkJLy8gcGlwZSB3b3VsZCBpbmplY3QgY2VsbHMgYW5kIHNwb29mIHRoZSBwcmljZSBhbmQgc3RhdHVzIGNvbHVtbnMgb2YKCQkvLyB0aGUgb25lIHBhZ2UgYSBjb25zdW1lciByZWFkcyBiZWZvcmUgZW5yb2xsaW5nLiBBdWRpdCBmaW5kaW5nIFkxLgoJCW91dCArPSAifCAiICsgaXRvYShtLmlkKSArICIgfCAiICsgc2FuaXRpemUuVGFibGVDZWxsKG0udGl0bGUpICsgIiB8ICIgKwoJCQlzYW5pdGl6ZS5UYWJsZUNlbGwobS51bml0KSArICIgfCAiICsgaXRvYShtLnVuaXRQcmljZSkgKyBEZW5vbSArICIgfCAiICsKCQkJaXRvYShtLnBlcmlvZEJsb2NrcykgKyAiIGJsb2NrcyB8ICIgKyBtLnN0YXR1cyArICIgfFxuIgoJCXNob3duKysKCQlyZXR1cm4gc2hvd24gPj0gUmVuZGVyTGltaXQKCX0pCglpZiBuZXh0TWV0ZXIgPiBpbnQ2NChzaG93bikgewoJCW91dCArPSAiXG4oZmlyc3QgIiArIGl0b2EoaW50NjQoc2hvd24pKSArICIgb2YgIiArIGl0b2EobmV4dE1ldGVyKSArICIgbWV0ZXJzKVxuIgoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlck1ldGVyKGlkU3RyIHN0cmluZykgc3RyaW5nIHsKCWlkLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChpZFN0ciwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICJiYWQgbWV0ZXIgaWRcbiIKCX0KCXYgOj0gbWV0ZXJzVC5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAidW5rbm93biBtZXRlciAiICsgaWRTdHIgKyAiXG4iCgl9CgltIDo9IHYuKCptZXRlcikKCW91dCA6PSAiIyBtZXRlciAiICsgaXRvYShtLmlkKSArICIg4oCUICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KG0udGl0bGUpICsgIlxuXG4iCglvdXQgKz0gIi0gcHJvdmlkZXI6ICIgKyBtLnByb3ZpZGVyLlN0cmluZygpICsgIlxuIgoJb3V0ICs9ICItIHVuaXQ6ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KG0udW5pdCkgKyAiIGF0IGxpc3QgIiArIGl0b2EobS51bml0UHJpY2UpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gcGVyaW9kOiAiICsgaXRvYShtLnBlcmlvZEJsb2NrcykgKyAiIGJsb2NrcyDCtyBmZWU6ICIgKyBpdG9hKG0uZmVlQnBzKSArICIgYnBzIMK3IHN0YXR1czogIiArIG0uc3RhdHVzICsgIlxuIgoJb3V0ICs9ICItIGxpZmV0aW1lIGVucm9sbG1lbnRzOiAiICsgaXRvYShtLmVucm9sbG1lbnRzKSArICJcblxuIgoJb3V0ICs9ICJTY2hlZHVsZSBvdmVyIHRoZSBwZXJpb2QgYmFzZSAodW5pdHMgw5cgbGlzdCk6XG5cbnwgdGllciBmcm9tIChiYXNlICIgKyBEZW5vbSArICIpIHwgcmF0ZSAoLzEwMDAwKSB8XG58LS0tfC0tLXxcbiIKCWVkZ2VzLCByYXRlcyA6PSBtLnNjaGVkLkVkZ2VzKCksIG0uc2NoZWQuUmF0ZXMoKQoJbG8gOj0gaW50NjQoMCkKCWZvciBpLCByIDo9IHJhbmdlIHJhdGVzIHsKCQlvdXQgKz0gInwgIiArIGl0b2EobG8pICsgIiB8ICIgKyBpdG9hKHIpICsgIiB8XG4iCgkJaWYgaSA8IGxlbihlZGdlcykgewoJCQlsbyA9IGVkZ2VzW2ldCgkJfQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlckVucm9sbG1lbnQoaWRTdHIgc3RyaW5nKSBzdHJpbmcgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KGlkU3RyLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gImJhZCBlbnJvbGxtZW50IGlkXG4iCgl9Cgl2IDo9IGVucm9sbG1lbnRzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICJ1bmtub3duIGVucm9sbG1lbnQgIiArIGlkU3RyICsgIlxuIgoJfQoJZSA6PSB2LigqZW5yb2xsbWVudCkKCXBlbmRpbmcgOj0gY2hhcmdlRm9yKGUsIGUudXNhZ2UpCglvdXQgOj0gIiMgZW5yb2xsbWVudCAiICsgaXRvYShlLmlkKSArICIgKG1ldGVyICIgKyBpdG9hKGUubWV0ZXJJRCkgKyAiKVxuXG4iCglvdXQgKz0gIi0gY29uc3VtZXI6ICIgKyBlLmNvbnN1bWVyLlN0cmluZygpICsgIlxuIgoJb3V0ICs9ICItIHByb3ZpZGVyOiAiICsgZS5wcm92aWRlci5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBzdGF0dXM6ICIgKyBlLnN0YXR1cyArICIgwrcgc2V0dGxlZCBwZXJpb2RzOiAiICsgaXRvYShlLnBlcmlvZHMpICsgIlxuIgoJb3V0ICs9ICItIHBlcmlvZCAiICsgaXRvYShjdXJyZW50UGVyaW9kKGUpKSArICIgb3BlbjsgdXNhZ2UgYWNjdW11bGF0b3I6ICIgKwoJCWl0b2EoZS51c2FnZSkgKyAiIHVuaXRzIGluIHBlcmlvZCAiICsgaXRvYShlLnVzYWdlUGVyaW9kKSArICJcbiIKCW91dCArPSAiLSBiYWxhbmNlOiAiICsgaXRvYShsZWRnZXIuQmFsYW5jZU9mKGVucm9sbEtleShlLmlkKSkpICsgRGVub20gKwoJCSIgwrcgcGVuZGluZyBjaGFyZ2U6ICIgKyBpdG9hKHBlbmRpbmcpICsgRGVub20gKyAiXG4iCglyZXR1cm4gb3V0Cn0KCmZ1bmMgaGFzUHJlZml4KHMsIHAgc3RyaW5nKSBib29sIHsKCXJldHVybiBsZW4ocykgPj0gbGVuKHApICYmIHNbOmxlbihwKV0gPT0gcAp9CiINMTAwMDAwMDB1Z25vdBISCPD51kESCzEzNzc0MHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkDuOz+yKXkVPkVeVu588AUi9FAIrKV90MMIkIVqHuxYg3jX0689/ttMfDwgnyGKjpWaIFivsu11V1/kZnDx9BuXGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}