memoscan
← all memos

Memo 0x20700df9…69cc60 on Ethereum

ICBjb25zdCBjYW52YXMgPSB0aGlzLnN0YXRlLmNhbnZhczsKICAgICAgICBjb25zdCBkcHIgPSBNYXRoLm1pbih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxLCAyKTsKICAgICAgICAKICAgICAgICAvLyBTZXQgZGlzcGxheSBzaXplIChDU1MgcGl4ZWxzKQogICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JzsKICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICsgJ3B4JzsKICAgICAgICAKICAgICAgICAvLyBTZXQgYWN0dWFsIGNhbnZhcyByZXNvbHV0aW9uIChhY2NvdW50aW5nIGZvciBkZXZpY2UgcGl4ZWwgcmF0aW8pCiAgICAgICAgY2FudmFzLndpZHRoID0gd2luZG93LmlubmVyV2lkdGggKiBkcHI7CiAgICAgICAgY2FudmFzLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAqIGRwcjsKICAgICAgICAKICAgICAgICBMb2dnZXIuZGVidWcoJ0FQUCcsIGBDYW52YXMgcmVzaXplZDogJHtjYW52YXMud2lkdGh9eCR7Y2FudmFzLmhlaWdodH0gKERQUjogJHtkcHJ9KWApOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFNldHVwIHdpbmRvdyByZXNpemUgaGFuZGxlcgogICAgICovCiAgICBzZXR1cFJlc2l6ZUhhbmRsZXIoKSB7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHsKICAgICAgICAgICAgdGhpcy5yZXNpemVDYW52YXMoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIE5vdGlmeSByZW5kZXJlciBvZiByZXNpemUgKHJlY3JlYXRlcyBpbnRlcm1lZGlhdGUgdGV4dHVyZXMpCiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmVyLnJlc2l6ZSgKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmNhbnZhcy53aWR0aCwKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmNhbnZhcy5oZWlnaHQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAKICAgICAgICBMb2dnZXIuZGVidWcoJ0FQUCcsICdSZXNpemUgaGFuZGxlciBzZXR1cCcpOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFN0YXJ0IHJlbmRlciBsb29wCiAgICAgKi8KICAgIHN0YXJ0UmVuZGVyTG9vcCgpIHsKICAgICAgICBpZiAodGhpcy5zdGF0ZS5yZW5kZXJpbmcuaXNSdW5uaW5nKSB7CiAgICAgICAgICAgIExvZ2dlci53YXJuKCdBUFAnLCAnUmVuZGVyIGxvb3AgYWxyZWFkeSBydW5uaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5zdGF0ZS5yZW5kZXJpbmcuaXNSdW5uaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmluZy5sYXN0RnJhbWVUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgdGhpcy5zdGF0ZS5yZW5kZXJpbmcuZnBzVXBkYXRlVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgIAogICAgICAgIExvZ2dlci5pbmZvKCdBUFAnLCAnUmVuZGVyIGxvb3Agc3RhcnRlZCcpOwogICAgICAgIAogICAgICAgIC8vIFN0YXJ0IGFuaW1hdGlvbiBsb29wCiAgICAgICAgdGhpcy5yZW5kZXIocGVyZm9ybWFuY2Uubm93KCkpOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFN0b3AgcmVuZGVyIGxvb3AKICAgICAqLwogICAgc3RvcFJlbmRlckxvb3AoKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnJlbmRlcmluZy5pc1J1bm5pbmcpIHJldHVybjsKICAgICAgICAKICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmluZy5pc1J1bm5pbmcgPSBmYWxzZTsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5zdGF0ZS5yZW5kZXJpbmcuYW5pbWF0aW9uRnJhbWVJZCkgewogICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnN0YXRlLnJlbmRlcmluZy5hbmltYXRpb25GcmFtZUlkKTsKICAgICAgICAgICAgdGhpcy5zdGF0ZS5yZW5kZXJpbmcuYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIExvZ2dlci5pbmZvKCdBUFAnLCAnUmVuZGVyIGxvb3Agc3RvcHBlZCcpOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1haW4gcmVuZGVyIGZ1bmN0aW9uIC0gUGhhc2UgQzogTXVsdGktcGFzcyByZW5kZXJpbmcgc3VwcG9ydAogICAgICovCiAgICByZW5kZXIodGltZXN0YW1wKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnJlbmRlcmluZy5pc1J1bm5pbmcpIHJldHVybjsKICAgICAgICAKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBVcGRhdGUgRlBTIGNvdW50ZXIKICAgICAgICAgICAgdGhpcy51cGRhdGVGUFModGltZXN0YW1wKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHVzZXIgaXMgaW50ZXJhY3RpbmcKICAgICAgICAgICAgY29uc3QgaXNJbnRlcmFjdGluZyA9IHRoaXMuc3RhdGUuZWZmZWN0TWFuYWdlci5pc0ludGVyYWN0aW5nKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaXNJbnRlcmFjdGluZykgewogICAgICAgICAgICAgICAgLy8gUEhBU0UgQzogTXVsdGktcGFzcyByZW5kZXJpbmcgKFN0YXRpYyDihpIgUGl4ZWxpemF0aW9uKQogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJNdWx0aVBhc3ModGltZXN0YW1wKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFBIQVNFIEI6IFNpbmdsZS1wYXNzIHJlbmRlcmluZyAoU3RhdGljIG9ubHkpCiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclNpbmdsZVBhc3ModGltZXN0YW1wKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVXBkYXRlIGZyYW1lIGNvdW50ZXIKICAgICAgICAgICAgdGhpcy5zdGF0ZS5yZW5kZXJpbmcuZnJhbWVDb3VudCsrOwogICAgICAgICAgICAKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBMb2dnZXIuZXJyb3IoJ0FQUCcsICdSZW5kZXIgZXJyb3I6JywgZXJyb3IpOwogICAgICAgICAgICB0aGlzLnN0b3BSZW5kZXJMb29wKCk7CiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdSZW5kZXJpbmcgZXJyb3Igb2NjdXJyZWQuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHMuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gUmVxdWVzdCBuZXh0IGZyYW1lCiAgICAgICAgdGhpcy5yZXF1ZXN0TmV4dEZyYW1lKCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2luZ2xlLXBhc3MgcmVuZGVyaW5nOiBUViBTdGF0aWMgZGlyZWN0bHkgdG8gc2NyZWVuCiAgICAgKi8KICAgIHJlbmRlclNpbmdsZVBhc3ModGltZXN0YW1wKSB7CiAgICAgICAgY29uc3Qgc3RhdGljRWZmZWN0ID0gdGhpcy5zdGF0ZS5lZmZlY3RzLnN0YXRpY0VmZmVjdDsKICAgICAgICBpZiAoIXN0YXRpY0VmZmVjdCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIC8vIFVwZGF0ZSBlZmZlY3QgdGltZQogICAgICAgIGNvbnN0IHRpbWVJblNlY29uZHMgPSAodGltZXN0YW1wIC0gdGhpcy5zdGF0ZS5hcHAuc3RhcnRUaW1lKSAvIDEwMDAuMDsKICAgICAgICBzdGF0aWNFZmZlY3QudXBkYXRlVGltZSh0aW1lSW5TZWNvbmRzKTsKICAgICAgICAKICAgICAgICAvLyBEZWxlZ2F0ZSB0byByZW5kZXJlciAoaGFuZGxlcyBXZWJHUFUgb3IgV2ViR0wpCiAgICAgICAgdGhpcy5zdGF0ZS5yZW5kZXJlci5yZW5kZXJTaW5nbGVQYXNzKAogICAgICAgICAgICBzdGF0aWNFZmZlY3QsCiAgICAgICAgICAgIHRpbWVzdGFtcCwKICAgICAgICAgICAgdGhpcy5zdGF0ZS5jYW52YXMud2lkdGgsCiAgICAgICAgICAgIHRoaXMuc3RhdGUuY2FudmFzLmhlaWdodAogICAgICAgICk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTXVsdGktcGFzcyByZW5kZXJpbmc6IFRWIFN0YXRpYyDihpIgVGV4dHVyZSDihpIgUGl4ZWxpemF0aW9uIOKGkiBTY3JlZW4KICAgICAqLwogICAgcmVuZGVyTXVsdGlQYXNzKHRpbWVzdGFtcCkgewogICAgICAgIGNvbnN0IHN0YXRpY0VmZmVjdCA9IHRoaXMuc3RhdGUuZWZmZWN0cy5zdGF0aWNFZmZlY3Q7CiAgICAgICAgY29uc3QgcGl4ZWxpemF0aW9uRWZmZWN0ID0gdGhpcy5zdGF0ZS5lZmZlY3RzLnBpeGVsaXphdGlvbkVmZmVjdDsKICAgICAgICAKICAgICAgICBpZiAoIXN0YXRpY0VmZmVjdCB8fCAhcGl4ZWxpemF0aW9uRWZmZWN0KSByZXR1cm47CiAgICAgICAgCiAgICAgICAgLy8gVXBkYXRlIHRpbWUgZm9yIGJvdGggZWZmZWN0cwogICAgICAgIGNvbnN0IHRpbWVJblNlY29uZHMgPSAodGltZXN0YW1wIC0gdGhpcy5zdGF0ZS5hcHAuc3RhcnRUaW1lKSAvIDEwMDAuMDsKICAgICAgICBzdGF0aWNFZmZlY3QudXBkYXRlVGltZSh0aW1lSW5TZWNvbmRzKTsKICAgICAgICBwaXhlbGl6YXRpb25FZmZlY3QudXBkYXRlVGltZSh0aW1lSW5TZWNvbmRzKTsKICAgICAgICAKICAgICAgICAvLyBEZWJ1ZzogTG9nIHJlbmRlcmluZyBwYXJhbWV0ZXJzCiAgICAgICAgY29uc3QgcGl4ZWxQYXJhbXMgPSBwaXhlbGl6YXRpb25FZmZlY3QuZ2V0TWFwcGVkUGFyYW1ldGVycygpOwogICAgICAgIExvZ2dlci5kZWJ1ZygnQVBQJywgYFJlbmRlciBYPSR7cGl4ZWxpemF0aW9uRWZmZWN0LnN0YXRlLnBhcmFtZXRlcnMueC50b0ZpeGVkKDMpfSBZPSR7cGl4ZWxpemF0aW9uRWZmZWN0LnN0YXRlLnBhcmFtZXRlcnMueS50b0ZpeGVkKDMpfSDihpIgcGl4ZWxSb3dzPSR7cGl4ZWxQYXJhbXMucGl4ZWxSb3dzfSBibGVuZD0ke3BpeGVsUGFyYW1zLmJsZW5kRmFjdG9yLnRvRml4ZWQoMil9YCk7CiAgICAgICAgCiAgICAgICAgLy8gRGVsZWdhdGUgdG8gcmVuZGVyZXIgKGhhbmRsZXMgV2ViR1BVIG9yIFdlYkdMIG11bHRpLXBhc3MpCiAgICAgICAgdGhpcy5zdGF0ZS5yZW5kZXJlci5yZW5kZXJNdWx0aVBhc3MoCiAgICAgICAgICAgIHN0YXRpY0VmZmVjdCwKICAgICAgICAgICAgcGl4ZWxpemF0aW9uRWZmZWN0LAogICAgICAgICAgICB0aW1lc3RhbXAsCiAgICAgICAgICAgIHRoaXMuc3RhdGUuY2FudmFzLndpZHRoLAogICAgICAgICAgICB0aGlzLnN0YXRlLmNhbnZhcy5oZWlnaHQKICAgICAgICApOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJlcXVlc3QgbmV4dCBhbmltYXRpb24gZnJhbWUKICAgICAqLwogICAgcmVxdWVzdE5leHRGcmFtZSgpIHsKICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmluZy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCh0KSA9PiB0aGlzLnJlbmRlcih0KSk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogVXBkYXRlIEZQUyBjb3VudGVyCiAgICAgKi8KICAgIHVwZGF0ZUZQUyh0aW1lc3RhbXApIHsKICAgICAgICBjb25zdCBkZWx0YVRpbWUgPSB0aW1lc3RhbXAgLSB0aGlzLnN0YXRlLnJlbmRlcmluZy5sYXN0RnJhbWVUaW1lOwogICAgICAgIHRoaXMuc3RhdGUucmVuZGVyaW5nLmxhc3RGcmFtZVRpbWUgPSB0aW1lc3RhbXA7CiAgICAgICAgCiAgICAgICAgLy8gVXBkYXRlIEZQUyBkaXNwbGF5IGV2ZXJ5IHNlY29uZAogICAgICAgIGlmICh0aW1lc3RhbXAgLSB0aGlzLnN0YXRlLnJlbmRlcmluZy5mcHNVcGRhdGVUaW1lID4gMTAwMCkgewogICAgICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmluZy5mcHMgPSBNYXRoLnJvdW5kKAogICAgICAgICAgICAgICAgMTAwMCAvIGRlbHRhVGltZQogICAgICAgICAgICApOwogICAgICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmluZy5mcHNVcGRhdGVUaW1lID0gdGltZXN0YW1wOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gTG9nIEZQUyBwZXJpb2RpY2FsbHkgKGV2ZXJ5IDUgc2Vjb25kcykKICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVuZGVyaW5nLmZyYW1lQ291bnQgJSAzMDAgPT09IDApIHsKICAgICAgICAgICAgICAgIExvZ2dlci5kZWJ1ZygnQVBQJywgYEZQUzogJHt0aGlzLnN0YXRlLnJlbmRlcmluZy5mcHN9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQXR0ZW1wdCB0byBsb2NrIHNjcmVlbiBvcmllbnRhdGlvbiB0byBsYW5kc2NhcGUgKG1vYmlsZSkKICAgICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHVzZXIgaW50ZXJhY3Rpb24gZm9yIHBlcm1pc3Npb24KICAgICAqIE5vdGU6IEFuZHJvaWQgQ2hyb21lIHJlcXVpcmVzIGZ1bGxzY3JlZW4gbW9kZSBmb3Igb3JpZW50YXRpb24gbG9jayB0byB3b3JrCiAgICAgKi8KICAgIGFzeW5jIGxvY2tPcmllbnRhdGlvbigpIHsKICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgbG9ja2VkIG9yIGF0dGVtcHRlZAogICAgICAgIGlmICh0aGlzLnN0YXRlLmFwcC5vcmllbnRhdGlvbkxvY2tlZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIFNjcmVlbiBPcmllbnRhdGlvbiBBUEkgaXMgYXZhaWxhYmxlCiAgICAgICAgICAgIGlmIChzY3JlZW4ub3JpZW50YXRpb24gJiYgc2NyZWVuLm9yaWVudGF0aW9uLmxvY2spIHsKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2NrIG9yaWVudGF0aW9uCiAgICAgICAgICAgICAgICBhd2FpdCBzY3JlZW4ub3JpZW50YXRpb24ubG9jaygnbGFuZHNjYXBlJyk7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmFwcC5vcmllbnRhdGlvbkxvY2tlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBMb2dnZXIuaW5mbygnQVBQJywgJ1NjcmVlbiBvcmllbnRhdGlvbiBsb2NrZWQgdG8gbGFuZHNjYXBlJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBMb2dnZXIuZGVidWcoJ0FQUCcsICdTY3JlZW4gT3JpZW50YXRpb24gQVBJIG5vdCBhdmFpbGFibGUgKGRlc2t0b3Agb3IgdW5zdXBwb3J0ZWQgYnJvd3NlciknKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIC8vIE9yaWVudGF0aW9uIGxvY2sgZmFpbGVkIC0gdGhpcyBpcyBleHBlY3RlZCBvbiBBbmRyb2lkIHdpdGhvdXQgZnVsbHNjcmVlbgogICAgICAgICAgICAvLyBNYXJrIGFzIGF0dGVtcHRlZCBzbyB3ZSBkb24ndCBrZWVwIHRyeWluZwogICAgICAgICAgICB0aGlzLnN0YXRlLmFwcC5vcmllbnRhdGlvbkxvY2tlZCA9IHRydWU7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1NlY3VyaXR5RXJyb3InIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2Z1bGxzY3JlZW4nKSkgewogICAgICAgICAgICAgICAgTG9nZ2VyLmluZm8oJ0FQUCcsICdPcmllbnRhdGlvbiBsb2NrIHJlcXVpcmVzIGZ1bGxzY3JlZW4gb24gdGhpcyBkZXZpY2UgKEFuZHJvaWQpLiBBcHAgd29ya3MgZmluZSB3aXRob3V0IGl0LicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgTG9nZ2VyLmRlYnVnKCdBUFAnLCAnQ291bGQgbm90IGxvY2sgb3JpZW50YXRpb246JywgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICogU2hvdyBlcnJvciBtZXNzYWdlIHRvIHVzZXIKICAgICAqLwogICAgc2hvd0Vycm9yKG1lc3NhZ2UpIHsKICAgICAgICAvLyBTaWxlbnRseSBsb2cgdG8gY29uc29sZSAtIG5vIHBvcHVwcwogICAgICAgIExvZ2dlci5lcnJvcignQVBQJywgbWVzc2FnZSk7CiAgICAgICAgLy8gVXNlciBzZWVzIHN0YXRpYyBldmVuIGlmIGVycm9ycyBvY2N1cgogICAgICAgIC8vIENoZWNrIGNvbnNvbGUgKEYxMikgZm9yIGRlYnVnZ2luZyBpbmZvCiAgICB9CiAgICAKICAgIC8qKgogICAgICogR2V0IGFwcGxpY2F0aW9uIHN0YXRlIGZvciBkZWJ1Z2dpbmcKICAgICAqLwogICAgZ2V0U3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaXNJbml0aWFsaXplZDogdGhpcy5zdGF0ZS5hcHAuaXNJbml0aWFsaXplZCwKICAgICAgICAgICAgaXNSZW5kZXJpbmc6IHRoaXMuc3RhdGUucmVuZGVyaW5nLmlzUnVubmluZywKICAgICAgICAgICAgZnBzOiB0aGlzLnN0YXRlLnJlbmRlcmluZy5mcHMsCiAgICAgICAgICAgIGZyYW1lQ291bnQ6IHRoaXMuc3RhdGUucmVuZGVyaW5nLmZyYW1lQ291bnQsCiAgICAgICAgICAgIHJlbmRlcmVyOiB0aGlzLnN0YXRlLnJlbmRlcmVyPy5nZXRUeXBlKCkgfHwgJ25vbmUnLAogICAgICAgICAgICBjYW52YXNTaXplOiB7CiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5zdGF0ZS5jYW52YXM/LndpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnN0YXRlLmNhbnZhcz8uaGVpZ2h0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVmZmVjdE1hbmFnZXI6IHRoaXMuc3RhdGUuZWZmZWN0TWFuYWdlcj8uZ2V0U3RhdGUoKSwKICAgICAgICAgICAgaW5wdXRDb250cm9sbGVyOiB0aGlzLnN0YXRlLmlucHV0Q29udHJvbGxlcj8uZ2V0U3RhdGUoKSwKICAgICAgICAgICAgYXVkaW9Db250cm9sbGVyOiB0aGlzLnN0YXRlLmF1ZGlvQ29udHJvbGxlcj8uZ2V0U3RhdGUoKSwKICAgICAgICAgICAgaXNJbnRlcmFjdGluZzogdGhpcy5zdGF0ZS5lZmZlY3RNYW5hZ2VyPy5pc0ludGVyYWN0aW5nKCkKICAgICAgICB9OwogICAgfQogICAgCiAgICAvKioKICAgICAqIENsZWFuIHVwIHJlc291cmNlcwogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIExvZ2dlci5pbmZvKCdBUFAnLCAnRGVzdHJveWluZyBhcHBsaWNhdGlvbi4uLicpOwogICAgICAgIAogICAgICAgIHRoaXMuc3RvcFJlbmRlckxvb3AoKTsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5zdGF0ZS5pbnB1dENvbnRyb2xsZXIpIHsKICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnB1dENvbnRyb2xsZXIuZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5zdGF0ZS5hdWRpb0NvbnRyb2xsZXIpIHsKICAgICAgICAgICAgdGhpcy5zdGF0ZS5hdWRpb0NvbnRyb2xsZXIuZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZmZlY3RNYW5hZ2VyKSB7CiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWZmZWN0TWFuYWdlci5kZXN0cm95KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5zdGF0ZS5yZW5kZXJlcikgewogICAgICAgICAgICB0aGlzLnN0YXRlLnJlbmRlcmVyLmRlc3Ryb3koKTsKICAgICAgICB9CgogICAgICAgIExvZ2dlci5pbmZvKCdBUFAnLCAnQXBwbGljYXRpb24gZGVzdHJveWVkJyk7CiAgICB9Cn0KCi8vIEluaXRpYWxpemUgYW5kIHN0YXJ0IGFwcGxpY2F0aW9uIHdoZW4gRE9NIGlzIHJlYWR5CmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7CiAgICBMb2dnZXIuaW5mbygnTUFJTicsICdTdGFydGluZyBUViBTdGF0aWMgQXBwbGljYXRpb24uLi4nKTsKICAgIAogICAgdHJ5IHsKICAgICAgICAvLyBDcmVhdGUgYW5kIGluaXRpYWxpemUgYXBwCiAgICAgICAgY29uc3QgYXBwID0gbmV3IFRWU3RhdGljQXBwKCk7CiAgICAgICAgYXdhaXQgYXBwLmluaXRpYWxpemUoKTsKICAgICAgICAKICAgICAgICAvLyBNYWtlIGFwcCBnbG9iYWxseSBhY2Nlc3NpYmxlIGZvciBkZWJ1Z2dpbmcKICAgICAgICB3aW5kb3cudHZTdGF0aWNBcHAgPSBhcHA7CiAgICAgICAgCiAgICAgICAgTG9nZ2VyLmluZm8oJ01BSU4nLCAnQXBwbGljYXRpb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkhJyk7CiAgICAgICAgTG9nZ2VyLmluZm8oJ01BSU4nLCAnRGVidWcgc2hvcnRjdXRzOiBDdHJsK1NoaWZ0K0QgKHRvZ2dsZSBvdmVybGF5KSwgQ3RybCtTaGlmdCtMIChkb3dubG9hZCBsb2dzKScpOwogICAgICAgIAogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBMb2dnZXIuZXJyb3IoJ01BSU4nLCAnRmFpbGVkIHRvIHN0YXJ0IGFwcGxpY2F0aW9uOicsIGVycm9yKTsKICAgICAgICAvLyBTaWxlbnRseSBmYWlsIC0gY2hlY2sgY29uc29sZSBmb3IgZGV0YWlscwogICAgICAgIC8vIEFwcCB3aWxsIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIFdlYkdMIGlmIFdlYkdQVSB1bmF2YWlsYWJsZQogICAgfQp9CgovLyBTdGFydCB3aGVuIERPTSBpcyByZWFkeQppZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgbWFpbik7Cn0gZWxzZSB7CiAgICBtYWluKCk7Cn0KCgogICAgPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==