{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "owwJQnFzpFVTqb78rDjUEKoOQW63hRRZQu5TeNaoxU8=",
    "height": "604615",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "24721",
            "fee_delta": "2472100ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/permission_registry"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "43877389",
      "GasUsed": "29251583"
    },
    "tx": "CtSPAQoML3ZtLm1fYWRkcGtnEsKPAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKFjwEKE3Blcm1pc3Npb25fcmVnaXN0cnkSR2duby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9wZXJtaXNzaW9uX3JlZ2lzdHJ5Gm4KC2dub21vZC50b21sEl9tb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3Blcm1pc3Npb25fcmVnaXN0cnkiCmdubyA9ICIwLjkiChqzjQEKF3Blcm1pc3Npb25fcmVnaXN0cnkuZ25vEpaNAXBhY2thZ2UgcGVybWlzc2lvbl9yZWdpc3RyeQoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzb3J0IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgopCgpjb25zdCAoCgkvLyBNYXhSZXNvdXJjZXMgYm91bmRzIHRvdGFsIHJlZ2lzdHJ5IHN0YXRlLiBSYWlzZWQgZnJvbSB0aGUgdXBzdHJlYW0KCS8vIDIwMCBhcyBwYXJ0IG9mIHRoZSBSMSByZW1lZGlhdGlvbjogd2l0aCBhIHBlci1hZG1pbiBxdW90YSBub3cKCS8vIGNhcnJ5aW5nIHRoZSBhbnRpLW1vbm9wb2x5IGR1dHksIHRoZSBnbG9iYWwgY2FwIGlzIGEgcHVyZSBzdGF0ZQoJLy8gYm91bmQgcmF0aGVyIHRoYW4gdGhlIHNvbGUgZGVmZW5zZSBhZ2FpbnN0IG5hbWVzcGFjZSBleGhhdXN0aW9uLgoJTWF4UmVzb3VyY2VzID0gMTAwMAoKCS8vIE1heFJlc291cmNlc1BlckFkbWluIGJvdW5kcyBob3cgbWFueSByZXNvdXJjZXMgb25lIGFkZHJlc3MgbWF5IGhvbGQKCS8vIGF0IG9uY2UuIFIxIChhdWRpdCAyMDI2LTA5LTIxKTogdGhlIHVwc3RyZWFtIGRlc2lnbiBoYWQgb25seSBhCgkvLyBnbG9iYWwgY2FwIG9uIGEgcGVybWlzc2lvbmxlc3Mgc2hhcmVkIHJlZ2lzdHJ5LCBzbyBvbmUgdW5wcml2aWxlZ2VkCgkvLyBrZXkgY291bGQgb2NjdXB5IGV2ZXJ5IHNsb3QgZm9yIH4yMDAgY2hlYXAgdHJhbnNhY3Rpb25zIGFuZAoJLy8gcGVybWFuZW50bHkgZGVueSB0aGUgcmVnaXN0cnkgdG8gZXZlcnkgb3RoZXIgdGVuYW50LiBEZWxldGVSZXNvdXJjZQoJLy8gaXMgYWRtaW4tb25seSwgc28gdGhlIHNxdWF0IHdhcyBpcnJldmVyc2libGUuCglNYXhSZXNvdXJjZXNQZXJBZG1pbiA9IDIwCgoJTWF4UGVybWlzc2lvbnNQZXJSZXNvdXJjZSA9IDUwCglNYXhIb2xkZXJzUGVyUGVybWlzc2lvbiAgID0gMjAwCglNYXhOYW1lTGVuICAgICAgICAgICAgICAgID0gNjQKCgkvLyBSZXNlcnZhdGlvblBlcmlvZCBpcyBob3cgbG9uZyBhIGRlbGV0ZWQgcmVzb3VyY2UgbmFtZSBzdGF5cwoJLy8gcmVzZXJ2ZWQuIEZpbml0ZSAocmUtYXVkaXQgMjAyNi0wOS0wMik6IGV0ZXJuYWwgdG9tYnN0b25lcyBsZXQgYW4KCS8vIGF0dGFja2VyIGN5Y2xlIGNyZWF0ZS9kZWxldGUgdG8gbG9jayB0aGUgbmFtZXNwYWNlIGZvcmV2ZXIuCglSZXNlcnZhdGlvblBlcmlvZCA9IGludDY0KDkwICogMjQgKiAzNjAwKSAvLyA5MCBkYXlzCgoJLy8gUmVuZGVyIGJvdW5kcyAoWTMsIGF1ZGl0IDIwMjYtMDktMjEpLiBSZW5kZXIgd2Fsa3MgdGhlIHdob2xlCgkvLyByZWdpc3RyeSBhbmQgaXMgcmVhY2hhYmxlIGJ5IGFueSB2aWV3ZXIgdGhyb3VnaCBnbm93ZWIgYW5kCgkvLyB2bS9xcmVuZGVyLCBzbyBpdHMgY29zdCBpcyBib3JuZSBieSB0aGlyZCBwYXJ0aWVzIHJhdGhlciB0aGFuIGJ5CgkvLyB3aG9ldmVyIGdyZXcgdGhlIHN0YXRlLiBVbmNhcHBlZCwgdGhlIGRlY2xhcmVkIGxpbWl0cyBhbGxvd2VkCgkvLyAxMDAwKjUwKjIwMCByZW5kZXJlZCBob2xkZXIgZW50cmllcy4gVGhlIGZ1bGwgZGF0YSBzdGF5cyBhdmFpbGFibGUKCS8vIHRocm91Z2ggTGlzdFJlc291cmNlcyAvIEdldFBlcm1pc3Npb25zIC8gSGFzLCB3aGljaCBhcmUgYm91bmRlZCBwZXIKCS8vIGNhbGwgYnkgY29uc3RydWN0aW9uLgoJTWF4UmVuZGVyUmVzb3VyY2VzICAgPSAyMAoJTWF4UmVuZGVyUGVybWlzc2lvbnMgPSA4CglNYXhSZW5kZXJIb2xkZXJzICAgICA9IDEwCikKCi8vIFJlc2VydmF0aW9uIGhvbGRzIGEgZGVsZXRlZCByZXNvdXJjZSBuYW1lIGZvciBpdHMgZm9ybWVyIGFkbWluIEFORAovLyBpdHMgb3JpZ2luYWwgY3JlYXRvciwgYW5kIGV4cGlyZXMuCnR5cGUgUmVzZXJ2YXRpb24gc3RydWN0IHsKCUFkbWluICAgYWRkcmVzcwoJQ3JlYXRvciBhZGRyZXNzCglFeHBpcmVzIHRpbWUuVGltZQp9CgovLyByZXNvdXJjZXMgbWFwcyBhIHJlc291cmNlIG5hbWUgdG8gdGhlIGFkbWluIGFkZHJlc3MgdGhhdCBjb250cm9scyBpdC4KdmFyIHJlc291cmNlcyBtYXBbc3RyaW5nXWFkZHJlc3MKCi8vIHJlc291cmNlTmFtZXMgdHJhY2tzIHRoZSBpbnNlcnRpb24tb3JkZXJlZCBsaXN0IG9mIHJlc291cmNlIG5hbWVzIHNvCi8vIExpc3RSZXNvdXJjZXMgY2FuIGl0ZXJhdGUgd2l0aG91dCBzY2FubmluZyB0aGUgbWFwLgp2YXIgcmVzb3VyY2VOYW1lcyBbXXN0cmluZwoKLy8gcGVybWlzc2lvbnMgbWFwcyByZXNvdXJjZSAtPiBwZXJtaXNzaW9uIC0+IGFkZHJlc3MgLT4gZ3JhbnRlZC4KLy8gVGhyZWUtbGV2ZWwgbmVzdGluZyBnaXZlcyBPKDEpIGxvb2t1cCBmb3IgSGFzKCkuCnZhciBwZXJtaXNzaW9ucyBtYXBbc3RyaW5nXW1hcFtzdHJpbmddbWFwW2FkZHJlc3NdYm9vbAoKLy8gcGVybUxpc3QgdHJhY2tzIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZGlzdGluY3QgcGVybWlzc2lvbiBuYW1lcyBwZXIKLy8gcmVzb3VyY2UsIHNvIEdldFBlcm1pc3Npb25zIGNhbiBpdGVyYXRlIHdpdGhvdXQgc2Nhbm5pbmcgdGhlIGZ1bGwgbWFwLgp2YXIgcGVybUxpc3QgbWFwW3N0cmluZ11bXXN0cmluZwoKLy8gcmV0aXJlZCBtYXBzIGEgZGVsZXRlZCByZXNvdXJjZSBuYW1lIHRvIGl0cyB0aW1lLWJvdW5kZWQKLy8gcmVzZXJ2YXRpb24uIENvbnN1bWVycyBhdXRob3JpemUgYWdhaW5zdCByZXNvdXJjZSBuYW1lcywgc28gYQovLyBmcmVlZCBuYW1lIG11c3Qgbm90IGJlIGNsYWltYWJsZSBieSBhbiBhdHRhY2tlciB3aGlsZSBpbnRlZ3JhdG9ycwovLyBtYXkgc3RpbGwgcmVmZXJlbmNlIGl0IOKAlCBidXQgdGhlIGhvbGQgZXhwaXJlcyBzbyB0b21ic3RvbmVzIGNhbm5vdAovLyBsb2NrIHRoZSBuYW1lc3BhY2UgZm9yZXZlci4KdmFyIHJldGlyZWQgbWFwW3N0cmluZ10qUmVzZXJ2YXRpb24KCi8vIHJlc291cmNlQ3JlYXRvcnMgcmVjb3JkcyBlYWNoIHJlc291cmNlJ3MgT1JJR0lOQUwgY3JlYXRvciwKLy8gaW1tdXRhYmxlIHRocm91Z2ggYWRtaW4gdHJhbnNmZXJzLCBzbyBhIGhvc3RpbGUgYWRtaW4tdHJhbnNmZXJlZQovLyBjYW5ub3QgcGVybWFuZW50bHkgc3RyYW5kIGEgbmFtZSBhZ2FpbnN0IHRoZSBwcm9qZWN0IHRoYXQgbWFkZSBpdC4KdmFyIHJlc291cmNlQ3JlYXRvcnMgbWFwW3N0cmluZ11hZGRyZXNzCgovLyBhZG1pblJlc291cmNlcyBjb3VudHMgdGhlIGxpdmUgcmVzb3VyY2VzIGVhY2ggYWRkcmVzcyBhZG1pbmlzdGVycywgc28KLy8gTWF4UmVzb3VyY2VzUGVyQWRtaW4gY2FuIGJlIGVuZm9yY2VkIGluIE8oMSkuIEVudHJpZXMgYXJlIHJlbW92ZWQgd2hlbgovLyB0aGUgY291bnQgcmVhY2hlcyB6ZXJvIHNvIHRoZSBtYXAgdHJhY2tzIGxpdmUgYWRtaW5zIG9ubHkgKFIxKS4KdmFyIGFkbWluUmVzb3VyY2VzIG1hcFthZGRyZXNzXWludAoKLy8gcGVuZGluZ0FkbWlucyBob2xkcyBub21pbmF0ZWQtYnV0LW5vdC15ZXQtYWNjZXB0ZWQgYWRtaW5zLCBrZXllZCBieQovLyByZXNvdXJjZSBuYW1lLiBBZG1pbiBoYW5kb2ZmIGlzIHR3by1zdGVwIChZNCk6IG5vbWluYXRpbmcgaXMKLy8gcmV2ZXJzaWJsZSwgb25seSB0aGUgbm9taW5lZSdzIG93biBhY2NlcHRhbmNlIGlzIGZpbmFsLgp2YXIgcGVuZGluZ0FkbWlucyBtYXBbc3RyaW5nXWFkZHJlc3MKCmZ1bmMgaW5pdCgpIHsKCXJlc291cmNlcyA9IG1ha2UobWFwW3N0cmluZ11hZGRyZXNzKQoJcmVzb3VyY2VOYW1lcyA9IFtdc3RyaW5ne30KCXBlcm1pc3Npb25zID0gbWFrZShtYXBbc3RyaW5nXW1hcFtzdHJpbmddbWFwW2FkZHJlc3NdYm9vbCkKCXBlcm1MaXN0ID0gbWFrZShtYXBbc3RyaW5nXVtdc3RyaW5nKQoJcmV0aXJlZCA9IG1ha2UobWFwW3N0cmluZ10qUmVzZXJ2YXRpb24pCglyZXNvdXJjZUNyZWF0b3JzID0gbWFrZShtYXBbc3RyaW5nXWFkZHJlc3MpCglhZG1pblJlc291cmNlcyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJcGVuZGluZ0FkbWlucyA9IG1ha2UobWFwW3N0cmluZ11hZGRyZXNzKQp9CgovLyBtdXN0QmVBZG1pbiBwYW5pY3MgaWYgd2hvIGlzIG5vdCB0aGUgYWRtaW4gb2YgdGhlIHJlc291cmNlLgovLwovLyBZMSAoYXVkaXQgMjAyNi0wOS0yMSk6IGlkZW50aXR5IGlzIG5vdyBwYXNzZWQgaW4gZnJvbSB0aGUgY3Jvc3NpbmcKLy8gZW50cnlwb2ludCdzIG93biBgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpYCByYXRoZXIgdGhhbiByZWNvbXB1dGVkIGJ5Ci8vIGEgbm9uLWNyb3NzaW5nIGhlbHBlciB2aWEgdW5zYWZlLlByZXZpb3VzUmVhbG0oKS4gVGhlIHN0YWNrLXdhbGtpbmcKLy8gZm9ybSByZXR1cm5lZCB0aGUgY29ycmVjdCBhZGRyZXNzIG9uIGV2ZXJ5IHBhdGggdGhpcyByZWFsbSBhY3R1YWxseQovLyBleHBvc2VzLCBidXQgbm90aGluZyBpbiB0aGUgdHlwZSBzeXN0ZW0gdGllZCBpdCB0byB0aGUgaW1tZWRpYXRlCi8vIGNhbGxlciDigJQgYSBmdXR1cmUgbm9uLWNyb3NzaW5nIGV4cG9ydGVkIGhlbHBlciBjYWxsaW5nIGl0IHdvdWxkIGhhdmUKLy8gc2lsZW50bHkgcmVzb2x2ZWQgaXRzIGltcG9ydGVyJ3MgY2FsbGVyIGluc3RlYWQgb2YgaXRzIGltcG9ydGVyCi8vIChzZWN1cml0eS5tZCBDbGFzcyAyKS4gVGhyZWFkaW5nIGBjdXJgIG1ha2VzIHRoZSBiaW5kaW5nIHN0cnVjdHVyYWwuCmZ1bmMgbXVzdEJlQWRtaW4od2hvIGFkZHJlc3MsIHJlc291cmNlIHN0cmluZykgewoJYWRtaW4sIGV4aXN0cyA6PSByZXNvdXJjZXNbcmVzb3VyY2VdCglpZiAhZXhpc3RzIHsKCQlwYW5pYygicmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzb3VyY2UpCgl9CglpZiB3aG8gIT0gYWRtaW4gewoJCXBhbmljKCJwZXJtaXNzaW9uIGRlbmllZDogY2FsbGVyIGlzIG5vdCBhZG1pbiBvZiAiICsgcmVzb3VyY2UpCgl9Cn0KCi8vIHJlamVjdFN0cmF5U2VuZCBhYm9ydHMgYSB0cmFuc2FjdGlvbiB0aGF0IGF0dGFjaGVzIGNvaW5zLiBUaGlzIHJlYWxtCi8vIGhhcyBubyBiYW5rZXIsIG5vIHBheWFibGUgcGF0aCBhbmQgbm8gd2l0aGRyYXdhbCBmdW5jdGlvbiwgc28gY29pbnMKLy8gYXR0YWNoZWQgdG8gYW55IGVudHJ5cG9pbnQgd291bGQgYmUgcGVybWFuZW50bHkgc3RyYW5kZWQgYXQgdGhlIHJlYWxtCi8vIGFkZHJlc3MgKFk1LCBzZWN1cml0eS5tZCDCpyBvcGVyYXRpb25hbCkuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIHJlYWxtIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCi8vIHJlbGVhc2VBZG1pblNsb3QgZGVjcmVtZW50cyBhbiBhZG1pbidzIGxpdmUtcmVzb3VyY2UgY291bnQsIGRlbGV0aW5nCi8vIHRoZSBlbnRyeSB3aGVuIGl0IHJlYWNoZXMgemVybyBzbyBhZG1pblJlc291cmNlcyBuZXZlciBhY2N1bXVsYXRlcwovLyB6ZXJvLXZhbHVlZCBrZXlzLgpmdW5jIHJlbGVhc2VBZG1pblNsb3QoYSBhZGRyZXNzKSB7CglhZG1pblJlc291cmNlc1thXS0tCglpZiBhZG1pblJlc291cmNlc1thXSA8PSAwIHsKCQlkZWxldGUoYWRtaW5SZXNvdXJjZXMsIGEpCgl9Cn0KCi8vIGlzVmFsaWROYW1lIHJlc3RyaWN0cyByZXNvdXJjZSBhbmQgcGVybWlzc2lvbiBuYW1lcyB0byBsb3dlcmNhc2UKLy8gYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMuIEJleW9uZCBoeWdpZW5lIHRoaXMgaXMgYSBzZWN1cml0eQovLyBwcm9wZXJ0eTogbmFtZXMgYXBwZWFyIGluIGNvbXBvc2l0ZSB0cnVzdCBkZWNpc2lvbnMgYW5kIHJlbmRlcmVkCi8vIG91dHB1dCwgc28gbm8gZGVsaW1pdGVyIG9yIG1hcmtkb3duIGNoYXJhY3RlciBtYXkgZW50ZXIgb25lLgpmdW5jIGlzVmFsaWROYW1lKG5hbWUgc3RyaW5nKSBib29sIHsKCWlmIG5hbWUgPT0gIiIgfHwgbGVuKG5hbWUpID4gTWF4TmFtZUxlbiB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgXywgYyA6PSByYW5nZSBuYW1lIHsKCQlpZiAhKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBjID09ICdfJykgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIG5hbWVSdWxlVGV4dChraW5kIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBraW5kICsgIiBuYW1lIG11c3QgYmUgMS0iICsgc3RyY29udi5JdG9hKE1heE5hbWVMZW4pICsKCQkiIGNoYXJzLCBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMgb25seSIKfQoKLy8gLS0tLS0tLS0tLSB3cml0ZSBvcGVyYXRpb25zIC0tLS0tLS0tLS0KCi8vIENyZWF0ZVJlc291cmNlIHJlZ2lzdGVycyBhIG5ldyBuYW1lZCByZXNvdXJjZS4gVGhlIGNhbGxlciBiZWNvbWVzIGl0cwovLyBhZG1pbiBhbmQgaXMgdGhlIG9ubHkgYWRkcmVzcyB0aGF0IGNhbiBncmFudCBvciByZXZva2UgcGVybWlzc2lvbnMgb24KLy8gaXQuIEEgZGVsZXRlZCByZXNvdXJjZSBuYW1lIHN0YXlzIHJlc2VydmVkIGZvciBpdHMgZm9ybWVyIGFkbWluIGFuZAovLyBpdHMgb3JpZ2luYWwgY3JlYXRvciB1bnRpbCB0aGUgcmVzZXJ2YXRpb24gZXhwaXJlcy4KLy8KLy8gRWFjaCBhZGRyZXNzIG1heSBhZG1pbmlzdGVyIGF0IG1vc3QgTWF4UmVzb3VyY2VzUGVyQWRtaW4gcmVzb3VyY2VzIGF0Ci8vIG9uY2UsIGFuZCB0aGUgcmVnaXN0cnkgaG9sZHMgYXQgbW9zdCBNYXhSZXNvdXJjZXMgaW4gdG90YWwuCmZ1bmMgQ3JlYXRlUmVzb3VyY2UoY3VyIHJlYWxtLCByZXNvdXJjZU5hbWUgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJd2hvIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCWlmICFpc1ZhbGlkTmFtZShyZXNvdXJjZU5hbWUpIHsKCQlwYW5pYyhuYW1lUnVsZVRleHQoInJlc291cmNlIikpCgl9CglpZiBfLCBleGlzdHMgOj0gcmVzb3VyY2VzW3Jlc291cmNlTmFtZV07IGV4aXN0cyB7CgkJcGFuaWMoInJlc291cmNlIGFscmVhZHkgZXhpc3RzOiAiICsgcmVzb3VyY2VOYW1lKQoJfQoKCWNyZWF0b3IgOj0gd2hvCglpZiByZXMsIHdhc1JldGlyZWQgOj0gcmV0aXJlZFtyZXNvdXJjZU5hbWVdOyB3YXNSZXRpcmVkIHsKCQlpZiB0aW1lLk5vdygpLkFmdGVyKHJlcy5FeHBpcmVzKSB7CgkJCS8vIFRoZSBob2xkIGxhcHNlZDogZHJvcCB0aGUgdG9tYnN0b25lIG5vdyByYXRoZXIgdGhhbiBsZWF2aW5nCgkJCS8vIGl0IGZvciB0aGUgc3VjY2VzcyBwYXRoIGJlbG93LCBzbyBhIGxhcHNlZCByZXNlcnZhdGlvbiBpcwoJCQkvLyByZWNsYWltZWQgZXZlbiBpZiB0aGlzIGNhbGwgZ29lcyBvbiB0byBhYm9ydC4KCQkJZGVsZXRlKHJldGlyZWQsIHJlc291cmNlTmFtZSkKCQl9IGVsc2UgewoJCQlpZiB3aG8gIT0gcmVzLkFkbWluICYmIHdobyAhPSByZXMuQ3JlYXRvciB7CgkJCQlwYW5pYygicmVzb3VyY2UgbmFtZSBpcyByZXNlcnZlZCBmb3IgaXRzIGZvcm1lciBhZG1pbjogIiArIHJlc291cmNlTmFtZSkKCQkJfQoJCQkvLyByb3VuZC0zIGF1ZGl0OiBhbiBpbi13aW5kb3cgcmUtY3JlYXRlIG11c3QgUFJFU0VSVkUgdGhlCgkJCS8vIG9yaWdpbmFsIGNyZWF0b3Ig4oCUIG90aGVyd2lzZSBhIGhvc3RpbGUgYWRtaW4tdHJhbnNmZXJlZSBjb3VsZAoJCQkvLyBkZWxldGUgYW5kIGluc3RhbnRseSByZS1jcmVhdGUsIGVyYXNpbmcgdGhlIG9yaWdpbmFsIHByb2plY3QncwoJCQkvLyByZWNsYWltIHJpZ2h0IGZvciBldmVyeSBmdXR1cmUgY3ljbGUKCQkJaWYgcmVzLkNyZWF0b3IgIT0gIiIgewoJCQkJY3JlYXRvciA9IHJlcy5DcmVhdG9yCgkJCX0KCQl9Cgl9CglpZiBsZW4ocmVzb3VyY2VzKSA+PSBNYXhSZXNvdXJjZXMgewoJCXBhbmljKCJnbG9iYWwgcmVzb3VyY2UgbGltaXQgcmVhY2hlZCIpCgl9CglpZiBhZG1pblJlc291cmNlc1t3aG9dID49IE1heFJlc291cmNlc1BlckFkbWluIHsKCQlwYW5pYygicGVyLWFkbWluIHJlc291cmNlIGxpbWl0IHJlYWNoZWQiKQoJfQoKCXJlc291cmNlc1tyZXNvdXJjZU5hbWVdID0gd2hvCglhZG1pblJlc291cmNlc1t3aG9dKysKCXJlc291cmNlQ3JlYXRvcnNbcmVzb3VyY2VOYW1lXSA9IGNyZWF0b3IKCXJlc291cmNlTmFtZXMgPSBhcHBlbmQocmVzb3VyY2VOYW1lcywgcmVzb3VyY2VOYW1lKQoJcGVybWlzc2lvbnNbcmVzb3VyY2VOYW1lXSA9IG1ha2UobWFwW3N0cmluZ11tYXBbYWRkcmVzc11ib29sKQoJcGVybUxpc3RbcmVzb3VyY2VOYW1lXSA9IFtdc3RyaW5ne30KCWRlbGV0ZShyZXRpcmVkLCByZXNvdXJjZU5hbWUpCn0KCi8vIERlbGV0ZVJlc291cmNlIHJlbW92ZXMgYSByZXNvdXJjZSBhbmQgZXZlcnkgcGVybWlzc2lvbiB1bmRlciBpdC4gT25seQovLyB0aGUgcmVzb3VyY2UgYWRtaW4gY2FuIGNhbGwgdGhpcy4gVGhlIG5hbWUgc3RheXMgcmVzZXJ2ZWQgZm9yIHRoZQovLyBjYWxsZXIgYW5kIGZvciB0aGUgb3JpZ2luYWwgY3JlYXRvcjogbm9ib2R5IGVsc2UgY2FuIHJlLWNyZWF0ZSBpdCBhbmQKLy8gaW5oZXJpdCBpdHMgY29uc3VtZXJzIHVudGlsIHRoZSByZXNlcnZhdGlvbiBleHBpcmVzLgpmdW5jIERlbGV0ZVJlc291cmNlKGN1ciByZWFsbSwgcmVzb3VyY2VOYW1lIHN0cmluZykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXdobyA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCW11c3RCZUFkbWluKHdobywgcmVzb3VyY2VOYW1lKQoKCXJldGlyZWRbcmVzb3VyY2VOYW1lXSA9ICZSZXNlcnZhdGlvbnsKCQlBZG1pbjogICB3aG8sCgkJQ3JlYXRvcjogcmVzb3VyY2VDcmVhdG9yc1tyZXNvdXJjZU5hbWVdLAoJCUV4cGlyZXM6IHRpbWUuTm93KCkuQWRkKHRpbWUuRHVyYXRpb24oUmVzZXJ2YXRpb25QZXJpb2QpICogdGltZS5TZWNvbmQpLAoJfQoJcmVsZWFzZUFkbWluU2xvdCh3aG8pCglkZWxldGUocmVzb3VyY2VzLCByZXNvdXJjZU5hbWUpCglkZWxldGUocmVzb3VyY2VDcmVhdG9ycywgcmVzb3VyY2VOYW1lKQoJZGVsZXRlKHBlcm1pc3Npb25zLCByZXNvdXJjZU5hbWUpCglkZWxldGUocGVybUxpc3QsIHJlc291cmNlTmFtZSkKCS8vIGEgbm9taW5hdGlvbiBjYW5ub3Qgb3V0bGl2ZSB0aGUgcmVzb3VyY2UgaXQgd2FzIG1hZGUgYWdhaW5zdAoJZGVsZXRlKHBlbmRpbmdBZG1pbnMsIHJlc291cmNlTmFtZSkKCWZvciBpLCBuIDo9IHJhbmdlIHJlc291cmNlTmFtZXMgewoJCWlmIG4gPT0gcmVzb3VyY2VOYW1lIHsKCQkJcmVzb3VyY2VOYW1lcyA9IGFwcGVuZChyZXNvdXJjZU5hbWVzWzppXSwgcmVzb3VyY2VOYW1lc1tpKzE6XS4uLikKCQkJYnJlYWsKCQl9Cgl9Cn0KCi8vIEdyYW50IGdpdmVzIGFuIGFkZHJlc3MgYSBuYW1lZCBwZXJtaXNzaW9uIG9uIGEgcmVzb3VyY2UuIE9ubHkgdGhlCi8vIHJlc291cmNlIGFkbWluIGNhbiBjYWxsIHRoaXMuIFBhbmljcyBpZiB0aGUgcGVybWlzc2lvbiBpcyBhbHJlYWR5Ci8vIGdyYW50ZWQgdG8gYXZvaWQgc2lsZW50IG5vLW9wcy4KZnVuYyBHcmFudChjdXIgcmVhbG0sIHJlc291cmNlTmFtZSwgcGVybWlzc2lvbiBzdHJpbmcsIGFkZHIgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCW11c3RCZUFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSwgcmVzb3VyY2VOYW1lKQoJaWYgIWlzVmFsaWROYW1lKHBlcm1pc3Npb24pIHsKCQlwYW5pYyhuYW1lUnVsZVRleHQoInBlcm1pc3Npb24iKSkKCX0KCWlmIGFkZHIgPT0gIiIgfHwgIWFkZHIuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBhZGRyZXNzOiAiICsgc3RyaW5nKGFkZHIpKQoJfQoKCXBlcm1zIDo9IHBlcm1pc3Npb25zW3Jlc291cmNlTmFtZV0KCWlmIHBlcm1zW3Blcm1pc3Npb25dID09IG5pbCB7CgkJaWYgbGVuKHBlcm1MaXN0W3Jlc291cmNlTmFtZV0pID49IE1heFBlcm1pc3Npb25zUGVyUmVzb3VyY2UgewoJCQlwYW5pYygicGVybWlzc2lvbiBsaW1pdCByZWFjaGVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2VOYW1lKQoJCX0KCQlwZXJtc1twZXJtaXNzaW9uXSA9IG1ha2UobWFwW2FkZHJlc3NdYm9vbCkKCQlwZXJtTGlzdFtyZXNvdXJjZU5hbWVdID0gYXBwZW5kKHBlcm1MaXN0W3Jlc291cmNlTmFtZV0sIHBlcm1pc3Npb24pCgl9CgoJaWYgcGVybXNbcGVybWlzc2lvbl1bYWRkcl0gewoJCXBhbmljKCJwZXJtaXNzaW9uIGFscmVhZHkgZ3JhbnRlZDogIiArIHBlcm1pc3Npb24gKyAiIHRvICIgKyBzdHJpbmcoYWRkcikpCgl9CglpZiBsZW4ocGVybXNbcGVybWlzc2lvbl0pID49IE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uIHsKCQlwYW5pYygiaG9sZGVyIGxpbWl0IHJlYWNoZWQgZm9yIHBlcm1pc3Npb24gIiArIHBlcm1pc3Npb24pCgl9CglwZXJtc1twZXJtaXNzaW9uXVthZGRyXSA9IHRydWUKfQoKLy8gUmV2b2tlIHJlbW92ZXMgYSBwZXJtaXNzaW9uIGZyb20gYW4gYWRkcmVzcy4gT25seSB0aGUgcmVzb3VyY2UgYWRtaW4KLy8gY2FuIGNhbGwgdGhpcy4gUGFuaWNzIGlmIHRoZSBwZXJtaXNzaW9uIHdhcyBub3QgZ3JhbnRlZC4gQSBwZXJtaXNzaW9uCi8vIGxlZnQgd2l0aCBubyBob2xkZXJzIGlzIHBydW5lZCBmcm9tIHRoZSByZXNvdXJjZSdzIHBlcm1pc3Npb24gbGlzdC4KZnVuYyBSZXZva2UoY3VyIHJlYWxtLCByZXNvdXJjZU5hbWUsIHBlcm1pc3Npb24gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgltdXN0QmVBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIHJlc291cmNlTmFtZSkKCglwZXJtcyA6PSBwZXJtaXNzaW9uc1tyZXNvdXJjZU5hbWVdCglpZiBwZXJtc1twZXJtaXNzaW9uXSA9PSBuaWwgfHwgIXBlcm1zW3Blcm1pc3Npb25dW2FkZHJdIHsKCQlwYW5pYygicGVybWlzc2lvbiBub3QgZ3JhbnRlZDogIiArIHBlcm1pc3Npb24gKyAiIHRvICIgKyBzdHJpbmcoYWRkcikpCgl9CglkZWxldGUocGVybXNbcGVybWlzc2lvbl0sIGFkZHIpCgoJaWYgbGVuKHBlcm1zW3Blcm1pc3Npb25dKSA9PSAwIHsKCQlkZWxldGUocGVybXMsIHBlcm1pc3Npb24pCgkJZm9yIGksIHAgOj0gcmFuZ2UgcGVybUxpc3RbcmVzb3VyY2VOYW1lXSB7CgkJCWlmIHAgPT0gcGVybWlzc2lvbiB7CgkJCQlwZXJtTGlzdFtyZXNvdXJjZU5hbWVdID0gYXBwZW5kKHBlcm1MaXN0W3Jlc291cmNlTmFtZV1bOmldLCBwZXJtTGlzdFtyZXNvdXJjZU5hbWVdW2krMTpdLi4uKQoJCQkJYnJlYWsKCQkJfQoJCX0KCX0KfQoKLy8gVHJhbnNmZXJBZG1pbiBub21pbmF0ZXMgYSBuZXcgYWRtaW4gZm9yIGEgcmVzb3VyY2UuIE9ubHkgdGhlIGN1cnJlbnQKLy8gYWRtaW4gY2FuIGNhbGwgdGhpcywgYW5kIHRoZSBoYW5kb2ZmIGRvZXMgTk9UIHRha2UgZWZmZWN0IHVudGlsIHRoZQovLyBub21pbmVlIGNhbGxzIEFjY2VwdEFkbWluLgovLwovLyBZNCAoYXVkaXQgMjAyNi0wOS0yMSk6IHRoZSB1cHN0cmVhbSBvbmUtc3RlcCB0cmFuc2ZlciBtYWRlIGEKLy8gd2VsbC1mb3JtZWQtYnV0LXVub3duZWQgZGVzdGluYXRpb24gcGVybWFuZW50bHkgZmF0YWwuIGFkZHJlc3MuSXNWYWxpZAovLyBvbmx5IGNoZWNrcyBiZWNoMzIgZm9ybSwgc28gYSBtaXN0eXBlZCBhZGRyZXNzIHBhc3NlZCB0aGUgY2hlY2sgYW5kCi8vIGxlZnQgdGhlIHJlc291cmNlIHdpdGggYW4gYWRtaW4gbm9ib2R5IGNvbnRyb2xzIOKAlCBpdCBjb3VsZCBuZXZlciBhZ2FpbgovLyBiZSBncmFudGVkIG9uLCByZXZva2VkIGZyb20sIHRyYW5zZmVycmVkIG9yIGRlbGV0ZWQsIGFuZCBpdHMgc2xvdCB3YXMKLy8gbG9zdCBmcm9tIGJvdGggdGhlIGdsb2JhbCBjYXAgYW5kIHRoZSBmb3JtZXIgYWRtaW4ncyBxdW90YSBmb3JldmVyLgovLyBOb21pbmF0aW9uIGlzIHJldmVyc2libGU7IG9ubHkgdGhlIG5vbWluZWUncyBjb25zZW50IGlzIGZpbmFsLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCByZXNvdXJjZU5hbWUgc3RyaW5nLCBuZXdBZG1pbiBhZGRyZXNzKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJd2hvIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJbXVzdEJlQWRtaW4od2hvLCByZXNvdXJjZU5hbWUpCglpZiBuZXdBZG1pbiA9PSAiIiB8fCAhbmV3QWRtaW4uSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBuZXcgYWRtaW4gYWRkcmVzczogIiArIHN0cmluZyhuZXdBZG1pbikpCgl9CglpZiBuZXdBZG1pbiA9PSB3aG8gewoJCXBhbmljKCJuZXcgYWRtaW4gaXMgYWxyZWFkeSB0aGUgYWRtaW4gb2YgIiArIHJlc291cmNlTmFtZSkKCX0KCXBlbmRpbmdBZG1pbnNbcmVzb3VyY2VOYW1lXSA9IG5ld0FkbWluCn0KCi8vIENhbmNlbEFkbWluVHJhbnNmZXIgd2l0aGRyYXdzIGEgcGVuZGluZyBub21pbmF0aW9uLiBPbmx5IHRoZSBjdXJyZW50Ci8vIGFkbWluIGNhbiBjYWxsIHRoaXMuCmZ1bmMgQ2FuY2VsQWRtaW5UcmFuc2ZlcihjdXIgcmVhbG0sIHJlc291cmNlTmFtZSBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgltdXN0QmVBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIHJlc291cmNlTmFtZSkKCWlmIF8sIG9rIDo9IHBlbmRpbmdBZG1pbnNbcmVzb3VyY2VOYW1lXTsgIW9rIHsKCQlwYW5pYygibm8gcGVuZGluZyBhZG1pbiB0cmFuc2ZlciBmb3IgIiArIHJlc291cmNlTmFtZSkKCX0KCWRlbGV0ZShwZW5kaW5nQWRtaW5zLCByZXNvdXJjZU5hbWUpCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyBhIHBlbmRpbmcgaGFuZG9mZjsgb25seSB0aGUgbm9taW5lZSBtYXkgY2FsbCBpdC4KLy8gVGhlIG5vbWluZWUncyBxdW90YSBpcyBjaGVja2VkIEhFUkUg4oCUIGF0IGNvbnNlbnQgdGltZSDigJQgc28gYQovLyBub21pbmF0aW9uIGNhbiBuZXZlciBwdXNoIGFuIGFjY291bnQgcGFzdCBNYXhSZXNvdXJjZXNQZXJBZG1pbiB3aXRob3V0Ci8vIHRoYXQgYWNjb3VudCBhZ3JlZWluZyB0byBjYXJyeSB0aGUgcmVzb3VyY2UuCmZ1bmMgQWNjZXB0QWRtaW4oY3VyIHJlYWxtLCByZXNvdXJjZU5hbWUgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJd2hvIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCW5vbWluZWUsIHBlbmRpbmcgOj0gcGVuZGluZ0FkbWluc1tyZXNvdXJjZU5hbWVdCglpZiAhcGVuZGluZyB7CgkJcGFuaWMoIm5vIHBlbmRpbmcgYWRtaW4gdHJhbnNmZXIgZm9yICIgKyByZXNvdXJjZU5hbWUpCgl9CglpZiB3aG8gIT0gbm9taW5lZSB7CgkJcGFuaWMoImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgYWRtaW4gb2YgIiArIHJlc291cmNlTmFtZSkKCX0KCWZvcm1lciwgZXhpc3RzIDo9IHJlc291cmNlc1tyZXNvdXJjZU5hbWVdCglpZiAhZXhpc3RzIHsKCQlwYW5pYygicmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzb3VyY2VOYW1lKQoJfQoJaWYgYWRtaW5SZXNvdXJjZXNbd2hvXSA+PSBNYXhSZXNvdXJjZXNQZXJBZG1pbiB7CgkJcGFuaWMoImFjY2VwdGluZyB3b3VsZCBleGNlZWQgdGhlIHBlci1hZG1pbiByZXNvdXJjZSBsaW1pdCIpCgl9CgoJcmVsZWFzZUFkbWluU2xvdChmb3JtZXIpCglhZG1pblJlc291cmNlc1t3aG9dKysKCXJlc291cmNlc1tyZXNvdXJjZU5hbWVdID0gd2hvCglkZWxldGUocGVuZGluZ0FkbWlucywgcmVzb3VyY2VOYW1lKQp9CgovLyAtLS0tLS0tLS0tIHJlYWQtb25seSBxdWVyaWVzIC0tLS0tLS0tLS0KCi8vIEhhcyByZXR1cm5zIHRydWUgaWYgYWRkciBob2xkcyB0aGUgbmFtZWQgcGVybWlzc2lvbiBvbiB0aGUgcmVzb3VyY2UuCi8vIFJldHVybnMgZmFsc2UgKG5ldmVyIHBhbmljcykgZm9yIHVua25vd24gcmVzb3VyY2VzIG9yIHBlcm1pc3Npb25zLgovLwovLyBJTlRFR1JBVE9SIENPTlRSQUNUIChZNyk6IEhhcyB0YWtlcyB0aGUgc3ViamVjdCBhZGRyZXNzIGV4cGxpY2l0bHkgYW5kCi8vIHBlcmZvcm1zIE5PIGNhbGxlciBhdXRoZW50aWNhdGlvbiDigJQgaXQgYW5zd2VycyAiZG9lcyB0aGlzIGFkZHJlc3MgaG9sZAovLyB0aGlzIHBlcm1pc3Npb24iLCBub3QgIm1heSBteSBjYWxsZXIgZG8gdGhpcyIuIEEgY29uc3VtaW5nIHJlYWxtIG11c3QKLy8gZGVyaXZlIGFkZHIgZnJvbSBpdHMgb3duIGNyb3NzaW5nIGVudHJ5cG9pbnQncyBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKLy8gYW5kIHBhc3MgaXQgaW4uIERlcml2aW5nIGl0IGluc2lkZSBhIG5vbi1jcm9zc2luZyBoZWxwZXIgdmlhCi8vIHVuc2FmZS5QcmV2aW91c1JlYWxtKCkgcmVzb2x2ZXMgdGhlIGNvbnN1bWVyJ3Mgb3duIGNhbGxlcidzIGNhbGxlciBhbmQKLy8gaXMgYSBDbGFzcy0yIGRlc2lnbmF0aW9uLWZvcmdlcnkgYnVnIGluIHRoZSBjb25zdW1lci4KZnVuYyBIYXMocmVzb3VyY2VOYW1lLCBwZXJtaXNzaW9uIHN0cmluZywgYWRkciBhZGRyZXNzKSBib29sIHsKCXBlcm1zLCBleGlzdHMgOj0gcGVybWlzc2lvbnNbcmVzb3VyY2VOYW1lXQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIGZhbHNlCgl9Cglob2xkZXJzIDo9IHBlcm1zW3Blcm1pc3Npb25dCglpZiBob2xkZXJzID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gaG9sZGVyc1thZGRyXQp9CgovLyBHZXRQZXJtaXNzaW9ucyByZXR1cm5zIGFsbCBwZXJtaXNzaW9uIG5hbWVzIGdyYW50ZWQgdG8gYWRkciBvbiBhCi8vIHJlc291cmNlLCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuIFJldHVybnMgIm5vbmUiIGlmIHRoZSBhZGRyZXNzCi8vIGhhcyBubyBwZXJtaXNzaW9ucy4KZnVuYyBHZXRQZXJtaXNzaW9ucyhyZXNvdXJjZU5hbWUgc3RyaW5nLCBhZGRyIGFkZHJlc3MpIHN0cmluZyB7CglwZXJtcywgZXhpc3RzIDo9IHBlcm1pc3Npb25zW3Jlc291cmNlTmFtZV0KCWlmICFleGlzdHMgewoJCXJldHVybiAibm9uZSIKCX0KCgl2YXIgcmVzdWx0IFtdc3RyaW5nCglmb3IgXywgcGVybSA6PSByYW5nZSBwZXJtTGlzdFtyZXNvdXJjZU5hbWVdIHsKCQlob2xkZXJzIDo9IHBlcm1zW3Blcm1dCgkJaWYgaG9sZGVycyAhPSBuaWwgJiYgaG9sZGVyc1thZGRyXSB7CgkJCXJlc3VsdCA9IGFwcGVuZChyZXN1bHQsIHBlcm0pCgkJfQoJfQoJaWYgbGVuKHJlc3VsdCkgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihyZXN1bHQsICIsICIpCn0KCi8vIExpc3RSZXNvdXJjZXMgcmV0dXJucyBhbGwgcmVnaXN0ZXJlZCByZXNvdXJjZSBuYW1lcyBhcyBhIGNvbW1hLXNlcGFyYXRlZAovLyBzdHJpbmcgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBSZXR1cm5zICJub25lIiBpZiBubyByZXNvdXJjZXMgZXhpc3QuCmZ1bmMgTGlzdFJlc291cmNlcygpIHN0cmluZyB7CglpZiBsZW4ocmVzb3VyY2VOYW1lcykgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihyZXNvdXJjZU5hbWVzLCAiLCAiKQp9CgovLyBHZXRBZG1pbiByZXR1cm5zIHRoZSBhZG1pbiBhZGRyZXNzIG9mIGEgcmVzb3VyY2UuCmZ1bmMgR2V0QWRtaW4ocmVzb3VyY2VOYW1lIHN0cmluZykgc3RyaW5nIHsKCWFkbWluLCBleGlzdHMgOj0gcmVzb3VyY2VzW3Jlc291cmNlTmFtZV0KCWlmICFleGlzdHMgewoJCXJldHVybiAibm90IGZvdW5kIgoJfQoJcmV0dXJuIHN0cmluZyhhZG1pbikKfQoKLy8gR2V0UGVuZGluZ0FkbWluIHJldHVybnMgdGhlIG5vbWluYXRlZCBhZG1pbiBhd2FpdGluZyBhY2NlcHRhbmNlIGZvciBhCi8vIHJlc291cmNlLCBvciAibm9uZSIuCmZ1bmMgR2V0UGVuZGluZ0FkbWluKHJlc291cmNlTmFtZSBzdHJpbmcpIHN0cmluZyB7CglhLCBvayA6PSBwZW5kaW5nQWRtaW5zW3Jlc291cmNlTmFtZV0KCWlmICFvayB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZyhhKQp9CgovLyAtLS0tLS0tLS0tIHJlbmRlciAtLS0tLS0tLS0tCgovLyBSZW5kZXIgcmV0dXJucyBhIG1hcmtkb3duIG92ZXJ2aWV3LiBOZXZlciBwYW5pY3MuIE91dHB1dCBpcyBib3VuZGVkCi8vIGJ5IE1heFJlbmRlclJlc291cmNlcyAvIE1heFJlbmRlclBlcm1pc3Npb25zIC8gTWF4UmVuZGVySG9sZGVycyAoWTMpOwovLyB0cnVuY2F0ZWQgc2VjdGlvbnMgbmFtZSB0aGUgcXVlcnkgdG8gdXNlIGZvciBjb21wbGV0ZSBkYXRhLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHJlc291cmNlcyA9PSBuaWwgfHwgbGVuKHJlc291cmNlTmFtZXMpID09IDAgewoJCXJldHVybiAiIyBQZXJtaXNzaW9uIFJlZ2lzdHJ5XG5cbk5vIHJlc291cmNlcyByZWdpc3RlcmVkLlxuIgoJfQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBQZXJtaXNzaW9uIFJlZ2lzdHJ5XG5cbiIpCgliLldyaXRlU3RyaW5nKCJSZWdpc3RlcmVkIHJlc291cmNlczogIiArIHN0cmNvbnYuSXRvYShsZW4ocmVzb3VyY2VOYW1lcykpICsgIlxuXG4iKQoKCXNob3duIDo9IGxlbihyZXNvdXJjZU5hbWVzKQoJaWYgc2hvd24gPiBNYXhSZW5kZXJSZXNvdXJjZXMgewoJCXNob3duID0gTWF4UmVuZGVyUmVzb3VyY2VzCgl9CgoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgcmVzb3VyY2VOYW1lc1s6c2hvd25dIHsKCQlhZG1pbiA6PSByZXNvdXJjZXNbbmFtZV0KCQliLldyaXRlU3RyaW5nKCIjIyAiICsgbmFtZSArICJcblxuIikKCQliLldyaXRlU3RyaW5nKCIqKkFkbWluOioqIGAiICsgc3RyaW5nKGFkbWluKSArICJgXG5cbiIpCgkJaWYgcCwgb2sgOj0gcGVuZGluZ0FkbWluc1tuYW1lXTsgb2sgewoJCQliLldyaXRlU3RyaW5nKCIqKlBlbmRpbmcgYWRtaW46KiogYCIgKyBzdHJpbmcocCkgKyAiYCAoYXdhaXRpbmcgYWNjZXB0YW5jZSlcblxuIikKCQl9CgoJCXBlcm1zLCBleGlzdHMgOj0gcGVybWlzc2lvbnNbbmFtZV0KCQlpZiAhZXhpc3RzIHx8IGxlbihwZXJtcykgPT0gMCB7CgkJCWIuV3JpdGVTdHJpbmcoIl9ObyBwZXJtaXNzaW9ucyBkZWZpbmVkLl9cblxuIikKCQkJY29udGludWUKCQl9CgoJCW5hbWVzIDo9IHBlcm1MaXN0W25hbWVdCgkJcFNob3duIDo9IGxlbihuYW1lcykKCQlpZiBwU2hvd24gPiBNYXhSZW5kZXJQZXJtaXNzaW9ucyB7CgkJCXBTaG93biA9IE1heFJlbmRlclBlcm1pc3Npb25zCgkJfQoKCQliLldyaXRlU3RyaW5nKCJ8IFBlcm1pc3Npb24gfCBBZGRyZXNzZXMgfFxuIikKCQliLldyaXRlU3RyaW5nKCJ8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfFxuIikKCgkJZm9yIF8sIHBlcm0gOj0gcmFuZ2UgbmFtZXNbOnBTaG93bl0gewoJCQlob2xkZXJzIDo9IHBlcm1zW3Blcm1dCgkJCWlmIGhvbGRlcnMgPT0gbmlsIHx8IGxlbihob2xkZXJzKSA9PSAwIHsKCQkJCWNvbnRpbnVlCgkJCX0KCQkJdmFyIGFkZHJzIFtdc3RyaW5nCgkJCWZvciBhZGRyIDo9IHJhbmdlIGhvbGRlcnMgewoJCQkJaWYgaG9sZGVyc1thZGRyXSB7CgkJCQkJYWRkcnMgPSBhcHBlbmQoYWRkcnMsIHN0cmluZyhhZGRyKSkKCQkJCX0KCQkJfQoJCQkvLyBzb3J0IHRoZSBGVUxMIGhvbGRlciBzZXQgYmVmb3JlIHRydW5jYXRpbmcsIHNvIHRoZSBzdWJzZXQKCQkJLy8gc2hvd24gaXMgYSBkZXRlcm1pbmlzdGljIGZ1bmN0aW9uIG9mIHN0YXRlIHJhdGhlciB0aGFuIG9mCgkJCS8vIG1hcCBsYXlvdXQKCQkJc29ydC5TdHJpbmdzKGFkZHJzKQoJCQlleHRyYSA6PSAwCgkJCWlmIGxlbihhZGRycykgPiBNYXhSZW5kZXJIb2xkZXJzIHsKCQkJCWV4dHJhID0gbGVuKGFkZHJzKSAtIE1heFJlbmRlckhvbGRlcnMKCQkJCWFkZHJzID0gYWRkcnNbOk1heFJlbmRlckhvbGRlcnNdCgkJCX0KCQkJZm9yIGksIGEgOj0gcmFuZ2UgYWRkcnMgewoJCQkJYWRkcnNbaV0gPSAiYCIgKyBhICsgImAiCgkJCX0KCQkJY2VsbCA6PSBzdHJpbmdzLkpvaW4oYWRkcnMsICIsICIpCgkJCWlmIGV4dHJhID4gMCB7CgkJCQljZWxsICs9ICIsIOKApiArIiArIHN0cmNvbnYuSXRvYShleHRyYSkgKyAiIG1vcmUiCgkJCX0KCQkJYi5Xcml0ZVN0cmluZygifCAiICsgcGVybSArICIgfCAiICsgY2VsbCArICIgfFxuIikKCQl9CgkJaWYgbGVuKG5hbWVzKSA+IHBTaG93biB7CgkJCWIuV3JpdGVTdHJpbmcoIlxuX+KApiAiICsgc3RyY29udi5JdG9hKGxlbihuYW1lcyktcFNob3duKSArCgkJCQkiIG1vcmUgcGVybWlzc2lvbihzKSBvbiB0aGlzIHJlc291cmNlLiBVc2UgR2V0UGVybWlzc2lvbnMgb3IgSGFzIGZvciBjb21wbGV0ZSBkYXRhLl9cbiIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoIlxuIikKCX0KCglpZiBsZW4ocmVzb3VyY2VOYW1lcykgPiBzaG93biB7CgkJYi5Xcml0ZVN0cmluZygiX+KApiAiICsgc3RyY29udi5JdG9hKGxlbihyZXNvdXJjZU5hbWVzKS1zaG93bikgKwoJCQkiIG1vcmUgcmVzb3VyY2Uocykgbm90IHNob3duLiBVc2UgTGlzdFJlc291cmNlcywgR2V0UGVybWlzc2lvbnMgb3IgSGFzIGZvciBjb21wbGV0ZSBkYXRhLl9cbiIpCgl9CgoJcmV0dXJuIGIuU3RyaW5nKCkKfQoiDTEwMDAwMDAwdWdub3QSEQiakOwpEgo4Nzc1NnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkAJmb+WipYNlkVUBKOiv2rV0xBBmtR7bzsWpn2gr/13hjLxoNxb+eEUA2pkPtuevWBVApRn+wkPB10EvcInQYRsGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}