Files
JimKarvo 765fb04420 fix: use event.Reviewers instead of e.RequestedReviewer for review_requested
The review_requested case was reading e.RequestedReviewer (singular *GiteaUser),
but in some Gitea versions/webhook payloads this field is nil while the
reviewer data comes in requested_reviewers (plural array).
Now uses event.Reviewers from normalizePREvent, which handles both
PullRequest.RequestedReviewers and top-level requested_reviewers.
Keeps e.RequestedReviewer as a fallback for older Gitea versions.
2026-06-23 11:01:47 +00:00

1 line
21 KiB
Go

cGFja2FnZSBldmVudAoKaW1wb3J0ICgKCSJjb250ZXh0IgoJInN0cmluZ3MiCgkidGltZSIKCgkiZ2l0aHViLmNvbS9ycy96ZXJvbG9nIgoKCSJnaXRodWIuY29tL3ZpbmNlbnRjLWFmay9naXRlYS1ub3RpZmljYXRpb24taHViL2ludGVybmFsL2NvbmZpZyIKCSJnaXRodWIuY29tL3ZpbmNlbnRjLWFmay9naXRlYS1ub3RpZmljYXRpb24taHViL2ludGVybmFsL3dlYmhvb2siCikKCi8vIElkZW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXMgR2l0ZWEgdXNlcnMgdG8gZXh0ZXJuYWwgaWRlbnRpdGllcyAoZS5nLiwgU2xhY2spCnR5cGUgSWRlbnRpdHlSZXNvbHZlciBpbnRlcmZhY2UgewoJUmVzb2x2ZShjdHggY29udGV4dC5Db250ZXh0LCB1c2VyIFVzZXIpICgqUmVzb2x2ZWRJZGVudGl0eSwgZXJyb3IpCn0KCi8vIFJlc29sdmVkSWRlbnRpdHkgcmVwcmVzZW50cyBhIHJlc29sdmVkIGV4dGVybmFsIGlkZW50aXR5CnR5cGUgUmVzb2x2ZWRJZGVudGl0eSBzdHJ1Y3QgewoJRW1haWwgICAgc3RyaW5nIGBqc29uOiJlbWFpbCJgCglTbGFja0lEICBzdHJpbmcgYGpzb246InNsYWNrX2lkImAKCVNsYWNrTmFtZSBzdHJpbmcgYGpzb246InNsYWNrX25hbWUiYAp9CgovLyBOb3RpZmllciBzZW5kcyBub3RpZmljYXRpb25zCnR5cGUgTm90aWZpZXIgaW50ZXJmYWNlIHsKCVNlbmREaXJlY3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdXNlcklEIHN0cmluZywgbXNnICpOb3RpZmljYXRpb24pIGVycm9yCglTZW5kQ2hhbm5lbChjdHggY29udGV4dC5Db250ZXh0LCBjaGFubmVsIHN0cmluZywgbXNnICpOb3RpZmljYXRpb24pIGVycm9yCn0KCi8vIFByb2Nlc3NvciBwcm9jZXNzZXMgd2ViaG9vayBldmVudHMgYW5kIGdlbmVyYXRlcyBub3RpZmljYXRpb25zCnR5cGUgUHJvY2Vzc29yIHN0cnVjdCB7CgljZmcgICAgICAqY29uZmlnLkNvbmZpZwoJcmVzb2x2ZXIgSWRlbnRpdHlSZXNvbHZlcgoJbm90aWZpZXIgTm90aWZpZXIKCWxvZ2dlciAgIHplcm9sb2cuTG9nZ2VyCn0KCi8vIE5ld1Byb2Nlc3NvciBjcmVhdGVzIGEgbmV3IGV2ZW50IHByb2Nlc3NvcgpmdW5jIE5ld1Byb2Nlc3NvcihjZmcgKmNvbmZpZy5Db25maWcsIHJlc29sdmVyIElkZW50aXR5UmVzb2x2ZXIsIG5vdGlmaWVyIE5vdGlmaWVyLCBsb2dnZXIgemVyb2xvZy5Mb2dnZXIpICpQcm9jZXNzb3IgewoJcmV0dXJuICZQcm9jZXNzb3J7CgkJY2ZnOiAgICAgIGNmZywKCQlyZXNvbHZlcjogcmVzb2x2ZXIsCgkJbm90aWZpZXI6IG5vdGlmaWVyLAoJCWxvZ2dlcjogICBsb2dnZXIuV2l0aCgpLlN0cigiY29tcG9uZW50IiwgInByb2Nlc3NvciIpLkxvZ2dlcigpLAoJfQp9CgovLyBIYW5kbGVQdWxsUmVxdWVzdCBwcm9jZXNzZXMgcHVsbCByZXF1ZXN0IGV2ZW50cwpmdW5jIChwICpQcm9jZXNzb3IpIEhhbmRsZVB1bGxSZXF1ZXN0KGUgKndlYmhvb2suUHVsbFJlcXVlc3RFdmVudCkgewoJY3R4IDo9IGNvbnRleHQuQmFja2dyb3VuZCgpCglldmVudCA6PSBwLm5vcm1hbGl6ZVBSRXZlbnQoZSkKCglwLmxvZ2dlci5EZWJ1ZygpLgoJCVN0cigiYWN0aW9uIiwgZS5BY3Rpb24pLgoJCUludCgiYXNzaWduZWVzX2NvdW50IiwgbGVuKGV2ZW50LkFzc2lnbmVlcykpLgoJCUludCgicmV2aWV3ZXJzX2NvdW50IiwgbGVuKGV2ZW50LlJldmlld2VycykpLgoJCVN0cigiYWN0b3IiLCBldmVudC5BY3Rvci5HaXRlYVVzZXJuYW1lKS4KCQlNc2coInByb2Nlc3NpbmcgUFIgZXZlbnQiKQoKCXZhciB1c2Vyc1RvTm90aWZ5IFtdc3RydWN0IHsKCQl1c2VyICAgVXNlcgoJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCX0KCglzd2l0Y2ggZS5BY3Rpb24gewoJY2FzZSAib3BlbmVkIjoKCQlldmVudC5UeXBlID0gVHlwZVBST3BlbmVkCgkJLy8gTm90aWZ5IGFzc2lnbmVlcyBhbmQgcmV2aWV3ZXJzCgkJaWYgcC5jZmcuUnVsZXMuUFIuTm90aWZ5QXNzaWduZWVzIHsKCQkJZm9yIF8sIHUgOj0gcmFuZ2UgZXZlbnQuQXNzaWduZWVzIHsKCQkJCXAubG9nZ2VyLkRlYnVnKCkuU3RyKCJhc3NpZ25lZSIsIHUuR2l0ZWFVc2VybmFtZSkuTXNnKCJhZGRpbmcgYXNzaWduZWUgdG8gbm90aWZ5IikKCQkJCXVzZXJzVG9Ob3RpZnkgPSBhcHBlbmQodXNlcnNUb05vdGlmeSwgc3RydWN0IHsKCQkJCQl1c2VyICAgVXNlcgoJCQkJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCQkJCX17dSwgUmVhc29uQXNzaWduZWV9KQoJCQl9CgkJfQoJCWlmIHAuY2ZnLlJ1bGVzLlBSLk5vdGlmeVJldmlld2VycyB7CgkJCWZvciBfLCB1IDo9IHJhbmdlIGV2ZW50LlJldmlld2VycyB7CgkJCQlwLmxvZ2dlci5EZWJ1ZygpLlN0cigicmV2aWV3ZXIiLCB1LkdpdGVhVXNlcm5hbWUpLk1zZygiYWRkaW5nIHJldmlld2VyIHRvIG5vdGlmeSIpCgkJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQkJdXNlciAgIFVzZXIKCQkJCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgkJCQl9e3UsIFJlYXNvblJldmlld2VyfSkKCQkJfQoJCX0KCgljYXNlICJjbG9zZWQiOgoJCWlmIGUuUHVsbFJlcXVlc3QuTWVyZ2VkIHsKCQkJZXZlbnQuVHlwZSA9IFR5cGVQUk1lcmdlZAoJCX0gZWxzZSB7CgkJCWV2ZW50LlR5cGUgPSBUeXBlUFJDbG9zZWQKCQl9CgkJLy8gTm90aWZ5IG93bmVyCgkJaWYgcC5jZmcuUnVsZXMuUFIuTm90aWZ5T3duZXIgJiYgZXZlbnQuT3duZXIgIT0gbmlsIHsKCQkJdXNlcnNUb05vdGlmeSA9IGFwcGVuZCh1c2Vyc1RvTm90aWZ5LCBzdHJ1Y3QgewoJCQkJdXNlciAgIFVzZXIKCQkJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCQkJfXsqZXZlbnQuT3duZXIsIFJlYXNvbk93bmVyfSkKCQl9CgoJY2FzZSAiYXNzaWduZWQiOgoJCWV2ZW50LlR5cGUgPSBUeXBlUFJBc3NpZ25lZAoJCS8vIE5vdGlmeSBuZXdseSBhc3NpZ25lZCB1c2VyCgkJaWYgZS5Bc3NpZ25lZSAhPSBuaWwgJiYgcC5jZmcuUnVsZXMuUFIuTm90aWZ5QXNzaWduZWVzIHsKCQkJcC5sb2dnZXIuRGVidWcoKS5TdHIoImFzc2lnbmVlIiwgZS5Bc3NpZ25lZS5Mb2dpbikuTXNnKCJhZGRpbmcgbmV3bHkgYXNzaWduZWQgdXNlciB0byBub3RpZnkiKQoJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQl1c2VyICAgVXNlcgoJCQkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJCQl9e2dpdGVhVXNlclRvVXNlcigqZS5Bc3NpZ25lZSksIFJlYXNvbkFzc2lnbmVlfSkKCQl9CgoJY2FzZSAicmV2aWV3X3JlcXVlc3RlZCI6CgkJZXZlbnQuVHlwZSA9IFR5cGVQUlJldmlld1JlcXVlc3RlZAoJCS8vIFVzZSBub3JtYWxpemVkIHJldmlld2VycyBmcm9tIG5vcm1hbGl6ZVBSRXZlbnQKCQkvLyAoY292ZXJzIGJvdGggUHVsbFJlcXVlc3QuUmVxdWVzdGVkUmV2aWV3ZXJzIGFuZCB0b3AtbGV2ZWwgcmVxdWVzdGVkX3Jldmlld2VycyBhcnJheSkKCQlpZiBsZW4oZXZlbnQuUmV2aWV3ZXJzKSA+IDAgewoJCQlmb3IgXywgdSA6PSByYW5nZSBldmVudC5SZXZpZXdlcnMgewoJCQkJcC5sb2dnZXIuRGVidWcoKS5TdHIoInJlcXVlc3RlZF9yZXZpZXdlciIsIHUuR2l0ZWFVc2VybmFtZSkuTXNnKCJyZXZpZXdfcmVxdWVzdGVkIGV2ZW50IikKCQkJCXVzZXJzVG9Ob3RpZnkgPSBhcHBlbmQodXNlcnNUb05vdGlmeSwgc3RydWN0IHsKCQkJCQl1c2VyICAgVXNlcgoJCQkJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCQkJCX17dSwgUmVhc29uUmV2aWV3ZXJ9KQoJCQl9CgkJfSBlbHNlIGlmIGUuUmVxdWVzdGVkUmV2aWV3ZXIgIT0gbmlsIHsKCQkJLy8gRmFsbGJhY2s6IHNpbmd1bGFyIGZpZWxkIChvbGRlciBHaXRlYSB2ZXJzaW9ucyBvciBwYXJ0aWFsIHBheWxvYWRzKQoJCQlwLmxvZ2dlci5EZWJ1ZygpLlN0cigicmVxdWVzdGVkX3Jldmlld2VyIiwgZS5SZXF1ZXN0ZWRSZXZpZXdlci5Mb2dpbikuTXNnKCJyZXZpZXdfcmVxdWVzdGVkIGV2ZW50IChzaW5ndWxhciBmYWxsYmFjaykiKQoJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQl1c2VyICAgVXNlcgoJCQkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJCQl9e2dpdGVhVXNlclRvVXNlcigqZS5SZXF1ZXN0ZWRSZXZpZXdlciksIFJlYXNvblJldmlld2VyfSkKCQl9IGVsc2UgewoJCQlwLmxvZ2dlci5EZWJ1ZygpLk1zZygicmV2aWV3X3JlcXVlc3RlZCBldmVudCBidXQgbm8gcmV2aWV3ZXIgZm91bmQgaW4gYW55IGZpZWxkIikKCQl9CgoJY2FzZSAic3luY2hyb25pemUiOgoJCWV2ZW50LlR5cGUgPSBUeXBlUFJTeW5jaHJvbml6ZWQKCQkvLyBBZGQgY29tbWl0cyBpbmZvIHRvIGV2ZW50CgkJZXZlbnQuQ29tbWl0cyA9IG1ha2UoW11Db21taXRJbmZvLCAwLCBsZW4oZS5Db21taXRzKSkKCQlmb3IgXywgYyA6PSByYW5nZSBlLkNvbW1pdHMgewoJCQkvLyBHZXQgZmlyc3QgbGluZSBvZiBjb21taXQgbWVzc2FnZQoJCQltc2cgOj0gYy5NZXNzYWdlCgkJCWlmIGlkeCA6PSBzdHJpbmdzLkluZGV4KG1zZywgIlxuIik7IGlkeCA+IDAgewoJCQkJbXNnID0gbXNnWzppZHhdCgkJCX0KCQkJZXZlbnQuQ29tbWl0cyA9IGFwcGVuZChldmVudC5Db21taXRzLCBDb21taXRJbmZvewoJCQkJU0hBOiAgICAgYy5JRFs6N10sIC8vIFNob3J0IFNIQQoJCQkJTWVzc2FnZTogbXNnLAoJCQkJVVJMOiAgICAgYy5VUkwsCgkJCQlBdXRob3I6ICBjLkF1dGhvci5OYW1lLAoJCQl9KQoJCX0KCQkvLyBOb3RpZnkgb3duZXIgKHdpbGwgYmUgZmlsdGVyZWQgb3V0IGlmIHRoZXkgcHVzaGVkIHRoZSBjb21taXRzKQoJCWlmIHAuY2ZnLlJ1bGVzLlBSLk5vdGlmeU93bmVyICYmIGV2ZW50Lk93bmVyICE9IG5pbCB7CgkJCXVzZXJzVG9Ob3RpZnkgPSBhcHBlbmQodXNlcnNUb05vdGlmeSwgc3RydWN0IHsKCQkJCXVzZXIgICBVc2VyCgkJCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgkJCX17KmV2ZW50Lk93bmVyLCBSZWFzb25Pd25lcn0pCgkJfQoJCS8vIE5vdGlmeSByZXZpZXdlcnMKCQlpZiBwLmNmZy5SdWxlcy5QUi5Ob3RpZnlSZXZpZXdlcnMgewoJCQlmb3IgXywgdSA6PSByYW5nZSBldmVudC5SZXZpZXdlcnMgewoJCQkJdXNlcnNUb05vdGlmeSA9IGFwcGVuZCh1c2Vyc1RvTm90aWZ5LCBzdHJ1Y3QgewoJCQkJCXVzZXIgICBVc2VyCgkJCQkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJCQkJfXt1LCBSZWFzb25SZXZpZXdlcn0pCgkJCX0KCQl9CgkJLy8gTm90aWZ5IGFzc2lnbmVlcwoJCWlmIHAuY2ZnLlJ1bGVzLlBSLk5vdGlmeUFzc2lnbmVlcyB7CgkJCWZvciBfLCB1IDo9IHJhbmdlIGV2ZW50LkFzc2lnbmVlcyB7CgkJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQkJdXNlciAgIFVzZXIKCQkJCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgkJCQl9e3UsIFJlYXNvbkFzc2lnbmVlfSkKCQkJfQoJCX0KCX0KCgkvLyBSZW1vdmUgdGhlIGFjdG9yIGZyb20gbm90aWZpY2F0aW9ucyAoZG9uJ3Qgbm90aWZ5IHlvdXJzZWxmKQoJYmVmb3JlRmlsdGVyIDo9IGxlbih1c2Vyc1RvTm90aWZ5KQoJdXNlcnNUb05vdGlmeSA9IHAuZmlsdGVyT3V0QWN0b3IodXNlcnNUb05vdGlmeSwgZXZlbnQuQWN0b3IpCglwLmxvZ2dlci5EZWJ1ZygpLgoJCUludCgiYmVmb3JlX2ZpbHRlciIsIGJlZm9yZUZpbHRlcikuCgkJSW50KCJhZnRlcl9maWx0ZXIiLCBsZW4odXNlcnNUb05vdGlmeSkpLgoJCVN0cigiYWN0b3JfZmlsdGVyZWQiLCBldmVudC5BY3Rvci5HaXRlYVVzZXJuYW1lKS4KCQlNc2coImZpbHRlcmVkIG91dCBhY3RvciBmcm9tIG5vdGlmaWNhdGlvbnMiKQoKCS8vIFNlbmQgbm90aWZpY2F0aW9ucwoJcC5zZW5kTm90aWZpY2F0aW9ucyhjdHgsIGV2ZW50LCB1c2Vyc1RvTm90aWZ5KQp9CgovLyBIYW5kbGVQdWxsUmVxdWVzdFJldmlldyBwcm9jZXNzZXMgUFIgcmV2aWV3IGV2ZW50cwpmdW5jIChwICpQcm9jZXNzb3IpIEhhbmRsZVB1bGxSZXF1ZXN0UmV2aWV3KGUgKndlYmhvb2suUHVsbFJlcXVlc3RSZXZpZXdFdmVudCkgewoJY3R4IDo9IGNvbnRleHQuQmFja2dyb3VuZCgpCglldmVudCA6PSBwLm5vcm1hbGl6ZVJldmlld0V2ZW50KGUpCgoJdmFyIHVzZXJzVG9Ob3RpZnkgW11zdHJ1Y3QgewoJCXVzZXIgICBVc2VyCgkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJfQoKCS8vIE5vdGlmeSBQUiBvd25lciBhYm91dCB0aGUgcmV2aWV3CglpZiBwLmNmZy5SdWxlcy5QUi5Ob3RpZnlPd25lciAmJiBldmVudC5Pd25lciAhPSBuaWwgewoJCXVzZXJzVG9Ob3RpZnkgPSBhcHBlbmQodXNlcnNUb05vdGlmeSwgc3RydWN0IHsKCQkJdXNlciAgIFVzZXIKCQkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJCX17KmV2ZW50Lk93bmVyLCBSZWFzb25Pd25lcn0pCgl9CgoJLy8gUmVtb3ZlIHRoZSBhY3RvcgoJdXNlcnNUb05vdGlmeSA9IHAuZmlsdGVyT3V0QWN0b3IodXNlcnNUb05vdGlmeSwgZXZlbnQuQWN0b3IpCgoJcC5zZW5kTm90aWZpY2F0aW9ucyhjdHgsIGV2ZW50LCB1c2Vyc1RvTm90aWZ5KQp9CgovLyBIYW5kbGVQdWxsUmVxdWVzdENvbW1lbnQgcHJvY2Vzc2VzIFBSIGNvbW1lbnQgZXZlbnRzCmZ1bmMgKHAgKlByb2Nlc3NvcikgSGFuZGxlUHVsbFJlcXVlc3RDb21tZW50KGUgKndlYmhvb2suUHVsbFJlcXVlc3RDb21tZW50RXZlbnQpIHsKCWN0eCA6PSBjb250ZXh0LkJhY2tncm91bmQoKQoJZXZlbnQgOj0gcC5ub3JtYWxpemVQUkNvbW1lbnRFdmVudChlKQoKCWlmIGUuQWN0aW9uICE9ICJjcmVhdGVkIiB7CgkJcmV0dXJuIC8vIE9ubHkgbm90aWZ5IG9uIG5ldyBjb21tZW50cwoJfQoKCXZhciB1c2Vyc1RvTm90aWZ5IFtdc3RydWN0IHsKCQl1c2VyICAgVXNlcgoJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCX0KCgkvLyBOb3RpZnkgUFIgb3duZXIKCWlmIHAuY2ZnLlJ1bGVzLkNvbW1lbnQuTm90aWZ5VGhyZWFkT3duZXIgJiYgZXZlbnQuT3duZXIgIT0gbmlsIHsKCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCXVzZXIgICBVc2VyCgkJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCQl9eypldmVudC5Pd25lciwgUmVhc29uT3duZXJ9KQoJfQoKCS8vIEV4dHJhY3QgYW5kIG5vdGlmeSBtZW50aW9uZWQgdXNlcnMKCWlmIHAuY2ZnLlJ1bGVzLkNvbW1lbnQuTm90aWZ5TWVudGlvbmVkIHsKCQltZW50aW9uZWRVc2VycyA6PSBFeHRyYWN0TWVudGlvbnMoZS5Db21tZW50LkJvZHkpCgkJZm9yIF8sIHVzZXJuYW1lIDo9IHJhbmdlIG1lbnRpb25lZFVzZXJzIHsKCQkJdXNlcnNUb05vdGlmeSA9IGFwcGVuZCh1c2Vyc1RvTm90aWZ5LCBzdHJ1Y3QgewoJCQkJdXNlciAgIFVzZXIKCQkJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCQkJfXtVc2Vye0dpdGVhVXNlcm5hbWU6IHVzZXJuYW1lfSwgUmVhc29uTWVudGlvbn0pCgkJfQoJfQoKCS8vIE5vdGlmeSByZXZpZXdlcnMKCWlmIHAuY2ZnLlJ1bGVzLkNvbW1lbnQuTm90aWZ5UmV2aWV3ZXJzIHsKCQlmb3IgXywgdSA6PSByYW5nZSBldmVudC5SZXZpZXdlcnMgewoJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQl1c2VyICAgVXNlcgoJCQkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJCQl9e3UsIFJlYXNvblJldmlld2VyfSkKCQl9Cgl9CgoJLy8gUmVtb3ZlIHRoZSBhY3RvcgoJdXNlcnNUb05vdGlmeSA9IHAuZmlsdGVyT3V0QWN0b3IodXNlcnNUb05vdGlmeSwgZXZlbnQuQWN0b3IpCgoJcC5zZW5kTm90aWZpY2F0aW9ucyhjdHgsIGV2ZW50LCB1c2Vyc1RvTm90aWZ5KQp9CgovLyBIYW5kbGVJc3N1ZSBwcm9jZXNzZXMgaXNzdWUgZXZlbnRzCmZ1bmMgKHAgKlByb2Nlc3NvcikgSGFuZGxlSXNzdWUoZSAqd2ViaG9vay5Jc3N1ZUV2ZW50KSB7CgljdHggOj0gY29udGV4dC5CYWNrZ3JvdW5kKCkKCWV2ZW50IDo9IHAubm9ybWFsaXplSXNzdWVFdmVudChlKQoKCXZhciB1c2Vyc1RvTm90aWZ5IFtdc3RydWN0IHsKCQl1c2VyICAgVXNlcgoJCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KCX0KCglzd2l0Y2ggZS5BY3Rpb24gewoJY2FzZSAib3BlbmVkIjoKCQlldmVudC5UeXBlID0gVHlwZUlzc3VlT3BlbmVkCgkJLy8gTm90aWZ5IGFzc2lnbmVlcwoJCWlmIHAuY2ZnLlJ1bGVzLklzc3VlLk5vdGlmeUFzc2lnbmVlcyB7CgkJCWZvciBfLCB1IDo9IHJhbmdlIGV2ZW50LkFzc2lnbmVlcyB7CgkJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQkJdXNlciAgIFVzZXIKCQkJCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgkJCQl9e3UsIFJlYXNvbkFzc2lnbmVlfSkKCQkJfQoJCX0KCgljYXNlICJjbG9zZWQiOgoJCWV2ZW50LlR5cGUgPSBUeXBlSXNzdWVDbG9zZWQKCQkvLyBOb3RpZnkgb3duZXIKCQlpZiBldmVudC5Pd25lciAhPSBuaWwgewoJCQl1c2Vyc1RvTm90aWZ5ID0gYXBwZW5kKHVzZXJzVG9Ob3RpZnksIHN0cnVjdCB7CgkJCQl1c2VyICAgVXNlcgoJCQkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJCQl9eypldmVudC5Pd25lciwgUmVhc29uT3duZXJ9KQoJCX0KCX0KCgkvLyBSZW1vdmUgdGhlIGFjdG9yCgl1c2Vyc1RvTm90aWZ5ID0gcC5maWx0ZXJPdXRBY3Rvcih1c2Vyc1RvTm90aWZ5LCBldmVudC5BY3RvcikKCglwLnNlbmROb3RpZmljYXRpb25zKGN0eCwgZXZlbnQsIHVzZXJzVG9Ob3RpZnkpCn0KCi8vIEhhbmRsZUlzc3VlQ29tbWVudCBwcm9jZXNzZXMgaXNzdWUgY29tbWVudCBldmVudHMKZnVuYyAocCAqUHJvY2Vzc29yKSBIYW5kbGVJc3N1ZUNvbW1lbnQoZSAqd2ViaG9vay5Jc3N1ZUNvbW1lbnRFdmVudCkgewoJY3R4IDo9IGNvbnRleHQuQmFja2dyb3VuZCgpCglldmVudCA6PSBwLm5vcm1hbGl6ZUlzc3VlQ29tbWVudEV2ZW50KGUpCgoJaWYgZS5BY3Rpb24gIT0gImNyZWF0ZWQiIHsKCQlyZXR1cm4KCX0KCgl2YXIgdXNlcnNUb05vdGlmeSBbXXN0cnVjdCB7CgkJdXNlciAgIFVzZXIKCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgl9CgoJLy8gTm90aWZ5IGlzc3VlIG93bmVyCglpZiBwLmNmZy5SdWxlcy5Db21tZW50Lk5vdGlmeVRocmVhZE93bmVyICYmIGV2ZW50Lk93bmVyICE9IG5pbCB7CgkJdXNlcnNUb05vdGlmeSA9IGFwcGVuZCh1c2Vyc1RvTm90aWZ5LCBzdHJ1Y3QgewoJCQl1c2VyICAgVXNlcgoJCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgkJfXsqZXZlbnQuT3duZXIsIFJlYXNvbk93bmVyfSkKCX0KCgkvLyBFeHRyYWN0IGFuZCBub3RpZnkgbWVudGlvbmVkIHVzZXJzCglpZiBwLmNmZy5SdWxlcy5Db21tZW50Lk5vdGlmeU1lbnRpb25lZCB7CgkJbWVudGlvbmVkVXNlcnMgOj0gRXh0cmFjdE1lbnRpb25zKGUuQ29tbWVudC5Cb2R5KQoJCWZvciBfLCB1c2VybmFtZSA6PSByYW5nZSBtZW50aW9uZWRVc2VycyB7CgkJCXVzZXJzVG9Ob3RpZnkgPSBhcHBlbmQodXNlcnNUb05vdGlmeSwgc3RydWN0IHsKCQkJCXVzZXIgICBVc2VyCgkJCQlyZWFzb24gTm90aWZpY2F0aW9uUmVhc29uCgkJCX17VXNlcntHaXRlYVVzZXJuYW1lOiB1c2VybmFtZX0sIFJlYXNvbk1lbnRpb259KQoJCX0KCX0KCgkvLyBSZW1vdmUgdGhlIGFjdG9yCgl1c2Vyc1RvTm90aWZ5ID0gcC5maWx0ZXJPdXRBY3Rvcih1c2Vyc1RvTm90aWZ5LCBldmVudC5BY3RvcikKCglwLnNlbmROb3RpZmljYXRpb25zKGN0eCwgZXZlbnQsIHVzZXJzVG9Ob3RpZnkpCn0KCi8vIHNlbmROb3RpZmljYXRpb25zIHJlc29sdmVzIHVzZXJzIGFuZCBzZW5kcyBub3RpZmljYXRpb25zCmZ1bmMgKHAgKlByb2Nlc3Nvcikgc2VuZE5vdGlmaWNhdGlvbnMoY3R4IGNvbnRleHQuQ29udGV4dCwgZXZlbnQgKkV2ZW50LCB1c2VycyBbXXN0cnVjdCB7Cgl1c2VyICAgVXNlcgoJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgp9KSB7CgkvLyBEZWR1cGxpY2F0ZSB1c2VycwoJc2VlbiA6PSBtYWtlKG1hcFtzdHJpbmddYm9vbCkKCglmb3IgXywgdSA6PSByYW5nZSB1c2VycyB7CgkJa2V5IDo9IHUudXNlci5HaXRlYVVzZXJuYW1lCgkJaWYga2V5ID09ICIiIHsKCQkJa2V5ID0gdS51c2VyLkVtYWlsCgkJfQoJCWlmIHNlZW5ba2V5XSB7CgkJCWNvbnRpbnVlCgkJfQoJCXNlZW5ba2V5XSA9IHRydWUKCgkJLy8gUmVzb2x2ZSB1c2VyIGlkZW50aXR5CgkJaWRlbnRpdHksIGVyciA6PSBwLnJlc29sdmVyLlJlc29sdmUoY3R4LCB1LnVzZXIpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXAubG9nZ2VyLldhcm4oKS4KCQkJCUVycihlcnIpLgoJCQkJU3RyKCJ1c2VybmFtZSIsIHUudXNlci5HaXRlYVVzZXJuYW1lKS4KCQkJCU1zZygiZmFpbGVkIHRvIHJlc29sdmUgdXNlciBpZGVudGl0eSIpCgkJCWNvbnRpbnVlCgkJfQoKCQlpZiBpZGVudGl0eS5TbGFja0lEID09ICIiIHsKCQkJcC5sb2dnZXIuRGVidWcoKS4KCQkJCVN0cigidXNlcm5hbWUiLCB1LnVzZXIuR2l0ZWFVc2VybmFtZSkuCgkJCQlNc2coInVzZXIgaGFzIG5vIFNsYWNrIElELCBza2lwcGluZyBub3RpZmljYXRpb24iKQoJCQljb250aW51ZQoJCX0KCgkJLy8gQ3JlYXRlIG5vdGlmaWNhdGlvbgoJCW5vdGlmaWNhdGlvbiA6PSAmTm90aWZpY2F0aW9uewoJCQlUYXJnZXRVc2VyOiB1LnVzZXIsCgkJCUV2ZW50OiAgICAgIGV2ZW50LAoJCQlSZWFzb246ICAgICB1LnJlYXNvbiwKCQkJTWVzc2FnZTogICAgcC5mb3JtYXRNZXNzYWdlKGV2ZW50LCB1LnJlYXNvbiksCgkJfQoKCQkvLyBTZW5kIERNCgkJaWYgZXJyIDo9IHAubm90aWZpZXIuU2VuZERpcmVjdChjdHgsIGlkZW50aXR5LlNsYWNrSUQsIG5vdGlmaWNhdGlvbik7IGVyciAhPSBuaWwgewoJCQlwLmxvZ2dlci5FcnJvcigpLgoJCQkJRXJyKGVycikuCgkJCQlTdHIoInNsYWNrX2lkIiwgaWRlbnRpdHkuU2xhY2tJRCkuCgkJCQlNc2coImZhaWxlZCB0byBzZW5kIG5vdGlmaWNhdGlvbiIpCgkJfSBlbHNlIHsKCQkJcC5sb2dnZXIuSW5mbygpLgoJCQkJU3RyKCJzbGFja19pZCIsIGlkZW50aXR5LlNsYWNrSUQpLgoJCQkJU3RyKCJyZWFzb24iLCBzdHJpbmcodS5yZWFzb24pKS4KCQkJCVN0cigiZXZlbnRfdHlwZSIsIHN0cmluZyhldmVudC5UeXBlKSkuCgkJCQlNc2coIm5vdGlmaWNhdGlvbiBzZW50IikKCQl9Cgl9Cn0KCi8vIGZpbHRlck91dEFjdG9yIHJlbW92ZXMgdGhlIGV2ZW50IGFjdG9yIGZyb20gdGhlIG5vdGlmaWNhdGlvbiBsaXN0CmZ1bmMgKHAgKlByb2Nlc3NvcikgZmlsdGVyT3V0QWN0b3IodXNlcnMgW11zdHJ1Y3QgewoJdXNlciAgIFVzZXIKCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KfSwgYWN0b3IgVXNlcikgW11zdHJ1Y3QgewoJdXNlciAgIFVzZXIKCXJlYXNvbiBOb3RpZmljYXRpb25SZWFzb24KfSB7Cgl2YXIgZmlsdGVyZWQgW11zdHJ1Y3QgewoJCXVzZXIgICBVc2VyCgkJcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbgoJfQoJZm9yIF8sIHUgOj0gcmFuZ2UgdXNlcnMgewoJCWlmIHUudXNlci5HaXRlYVVzZXJuYW1lICE9IGFjdG9yLkdpdGVhVXNlcm5hbWUgewoJCQlmaWx0ZXJlZCA9IGFwcGVuZChmaWx0ZXJlZCwgdSkKCQl9Cgl9CglyZXR1cm4gZmlsdGVyZWQKfQoKLy8gZm9ybWF0TWVzc2FnZSBjcmVhdGVzIGEgaHVtYW4tcmVhZGFibGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UKZnVuYyAocCAqUHJvY2Vzc29yKSBmb3JtYXRNZXNzYWdlKGV2ZW50ICpFdmVudCwgcmVhc29uIE5vdGlmaWNhdGlvblJlYXNvbikgc3RyaW5nIHsKCS8vIFRoaXMgd2lsbCBiZSBlbmhhbmNlZCBsYXRlciB3aXRoIHRlbXBsYXRlcwoJc3dpdGNoIGV2ZW50LlR5cGUgewoJY2FzZSBUeXBlUFJPcGVuZWQ6CgkJcmV0dXJuICJOZXcgUFIgb3BlbmVkIgoJY2FzZSBUeXBlUFJDbG9zZWQ6CgkJcmV0dXJuICJQUiBjbG9zZWQiCgljYXNlIFR5cGVQUk1lcmdlZDoKCQlyZXR1cm4gIlBSIG1lcmdlZCIKCWNhc2UgVHlwZVBSUmV2aWV3UmVxdWVzdGVkOgoJCXJldHVybiAiUmV2aWV3IHJlcXVlc3RlZCIKCWNhc2UgVHlwZVBSUmV2aWV3ZWQ6CgkJcmV0dXJuICJQUiByZXZpZXdlZCIKCWNhc2UgVHlwZVBSQ29tbWVudGVkOgoJCXJldHVybiAiTmV3IGNvbW1lbnQgb24gUFIiCgljYXNlIFR5cGVJc3N1ZU9wZW5lZDoKCQlyZXR1cm4gIk5ldyBpc3N1ZSBvcGVuZWQiCgljYXNlIFR5cGVJc3N1ZUNsb3NlZDoKCQlyZXR1cm4gIklzc3VlIGNsb3NlZCIKCWNhc2UgVHlwZUlzc3VlQ29tbWVudGVkOgoJCXJldHVybiAiTmV3IGNvbW1lbnQgb24gaXNzdWUiCglkZWZhdWx0OgoJCXJldHVybiAiTmV3IG5vdGlmaWNhdGlvbiIKCX0KfQoKLy8gTm9ybWFsaXphdGlvbiBoZWxwZXJzCmZ1bmMgKHAgKlByb2Nlc3Nvcikgbm9ybWFsaXplUFJFdmVudChlICp3ZWJob29rLlB1bGxSZXF1ZXN0RXZlbnQpICpFdmVudCB7Cglvd25lciA6PSBnaXRlYVVzZXJUb1VzZXIoZS5QdWxsUmVxdWVzdC5Vc2VyKQoKCS8vIEdldCByZXZpZXdlcnMgZnJvbSBib3RoIHBvc3NpYmxlIGxvY2F0aW9uczoKCS8vIC0gZS5QdWxsUmVxdWVzdC5SZXF1ZXN0ZWRSZXZpZXdlcnM6IHByZXNlbnQgaW4gb3BlbmVkIGFjdGlvbgoJLy8gLSBlLlJlcXVlc3RlZFJldmlld2VyczogcHJlc2VudCBpbiByZXZpZXdfcmVxdWVzdGVkIGFjdGlvbgoJdmFyIHJldmlld2VycyBbXVVzZXIKCWlmIGxlbihlLlB1bGxSZXF1ZXN0LlJlcXVlc3RlZFJldmlld2VycykgPiAwIHsKCQlyZXZpZXdlcnMgPSBnaXRlYVVzZXJzVG9Vc2VycyhlLlB1bGxSZXF1ZXN0LlJlcXVlc3RlZFJldmlld2VycykKCX0gZWxzZSBpZiBsZW4oZS5SZXF1ZXN0ZWRSZXZpZXdlcnMpID4gMCB7CgkJcmV2aWV3ZXJzID0gZ2l0ZWFVc2Vyc1RvVXNlcnMoZS5SZXF1ZXN0ZWRSZXZpZXdlcnMpCgl9CgoJcmV0dXJuICZFdmVudHsKCQlUaW1lc3RhbXA6ICAgIHRpbWUuTm93KCksCgkJQWN0b3I6ICAgICAgICBnaXRlYVVzZXJUb1VzZXIoZS5TZW5kZXIpLAoJCVJlcG9OYW1lOiAgICAgZS5SZXBvc2l0b3J5Lk5hbWUsCgkJUmVwb0Z1bGxOYW1lOiBlLlJlcG9zaXRvcnkuRnVsbE5hbWUsCgkJUmVwb1VSTDogICAgICBlLlJlcG9zaXRvcnkuSFRNTFVSTCwKCQlOdW1iZXI6ICAgICAgIGUuUHVsbFJlcXVlc3QuTnVtYmVyLAoJCVRpdGxlOiAgICAgICAgZS5QdWxsUmVxdWVzdC5UaXRsZSwKCQlCb2R5OiAgICAgICAgIGUuUHVsbFJlcXVlc3QuQm9keSwKCQlVUkw6ICAgICAgICAgIGUuUHVsbFJlcXVlc3QuSFRNTFVSTCwKCQlPd25lcjogICAgICAgICZvd25lciwKCQlBc3NpZ25lZXM6ICAgIGdpdGVhVXNlcnNUb1VzZXJzKGUuUHVsbFJlcXVlc3QuQXNzaWduZWVzKSwKCQlSZXZpZXdlcnM6ICAgIHJldmlld2VycywKCX0KfQoKZnVuYyAocCAqUHJvY2Vzc29yKSBub3JtYWxpemVSZXZpZXdFdmVudChlICp3ZWJob29rLlB1bGxSZXF1ZXN0UmV2aWV3RXZlbnQpICpFdmVudCB7Cglvd25lciA6PSBnaXRlYVVzZXJUb1VzZXIoZS5QdWxsUmVxdWVzdC5Vc2VyKQoJcmV0dXJuICZFdmVudHsKCQlUeXBlOiAgICAgICAgIFR5cGVQUlJldmlld2VkLAoJCVRpbWVzdGFtcDogICAgdGltZS5Ob3coKSwKCQlBY3RvcjogICAgICAgIGdpdGVhVXNlclRvVXNlcihlLlNlbmRlciksCgkJUmVwb05hbWU6ICAgICBlLlJlcG9zaXRvcnkuTmFtZSwKCQlSZXBvRnVsbE5hbWU6IGUuUmVwb3NpdG9yeS5GdWxsTmFtZSwKCQlSZXBvVVJMOiAgICAgIGUuUmVwb3NpdG9yeS5IVE1MVVJMLAoJCU51bWJlcjogICAgICAgZS5QdWxsUmVxdWVzdC5OdW1iZXIsCgkJVGl0bGU6ICAgICAgICBlLlB1bGxSZXF1ZXN0LlRpdGxlLAoJCVVSTDogICAgICAgICAgZS5QdWxsUmVxdWVzdC5IVE1MVVJMLAoJCU93bmVyOiAgICAgICAgJm93bmVyLAoJCVJldmlld1N0YXRlOiAgZS5SZXZpZXcuU3RhdGUsCgkJQ29tbWVudEJvZHk6ICBlLlJldmlldy5Cb2R5LAoJfQp9CgpmdW5jIChwICpQcm9jZXNzb3IpIG5vcm1hbGl6ZVBSQ29tbWVudEV2ZW50KGUgKndlYmhvb2suUHVsbFJlcXVlc3RDb21tZW50RXZlbnQpICpFdmVudCB7Cglvd25lciA6PSBnaXRlYVVzZXJUb1VzZXIoZS5QdWxsUmVxdWVzdC5Vc2VyKQoJcmV0dXJuICZFdmVudHsKCQlUeXBlOiAgICAgICAgIFR5cGVQUkNvbW1lbnRlZCwKCQlUaW1lc3RhbXA6ICAgIHRpbWUuTm93KCksCgkJQWN0b3I6ICAgICAgICBnaXRlYVVzZXJUb1VzZXIoZS5TZW5kZXIpLAoJCVJlcG9OYW1lOiAgICAgZS5SZXBvc2l0b3J5Lk5hbWUsCgkJUmVwb0Z1bGxOYW1lOiBlLlJlcG9zaXRvcnkuRnVsbE5hbWUsCgkJUmVwb1VSTDogICAgICBlLlJlcG9zaXRvcnkuSFRNTFVSTCwKCQlOdW1iZXI6ICAgICAgIGUuUHVsbFJlcXVlc3QuTnVtYmVyLAoJCVRpdGxlOiAgICAgICAgZS5QdWxsUmVxdWVzdC5UaXRsZSwKCQlVUkw6ICAgICAgICAgIGUuUHVsbFJlcXVlc3QuSFRNTFVSTCwKCQlPd25lcjogICAgICAgICZvd25lciwKCQlSZXZpZXdlcnM6ICAgIGdpdGVhVXNlcnNUb1VzZXJzKGUuUHVsbFJlcXVlc3QuUmVxdWVzdGVkUmV2aWV3ZXJzKSwKCQlDb21tZW50Qm9keTogIGUuQ29tbWVudC5Cb2R5LAoJCUNvbW1lbnRVUkw6ICAgZS5Db21tZW50LkhUTUxVUkwsCgl9Cn0KCmZ1bmMgKHAgKlByb2Nlc3Nvcikgbm9ybWFsaXplSXNzdWVFdmVudChlICp3ZWJob29rLklzc3VlRXZlbnQpICpFdmVudCB7Cglvd25lciA6PSBnaXRlYVVzZXJUb1VzZXIoZS5Jc3N1ZS5Vc2VyKQoJcmV0dXJuICZFdmVudHsKCQlUaW1lc3RhbXA6ICAgIHRpbWUuTm93KCksCgkJQWN0b3I6ICAgICAgICBnaXRlYVVzZXJUb1VzZXIoZS5TZW5kZXIpLAoJCVJlcG9OYW1lOiAgICAgZS5SZXBvc2l0b3J5Lk5hbWUsCgkJUmVwb0Z1bGxOYW1lOiBlLlJlcG9zaXRvcnkuRnVsbE5hbWUsCgkJUmVwb1VSTDogICAgICBlLlJlcG9zaXRvcnkuSFRNTFVSTCwKCQlOdW1iZXI6ICAgICAgIGUuSXNzdWUuTnVtYmVyLAoJCVRpdGxlOiAgICAgICAgZS5Jc3N1ZS5UaXRsZSwKCQlCb2R5OiAgICAgICAgIGUuSXNzdWUuQm9keSwKCQlVUkw6ICAgICAgICAgIGUuSXNzdWUuSFRNTFVSTCwKCQlPd25lcjogICAgICAgICZvd25lciwKCQlBc3NpZ25lZXM6ICAgIGdpdGVhVXNlcnNUb1VzZXJzKGUuSXNzdWUuQXNzaWduZWVzKSwKCX0KfQoKZnVuYyAocCAqUHJvY2Vzc29yKSBub3JtYWxpemVJc3N1ZUNvbW1lbnRFdmVudChlICp3ZWJob29rLklzc3VlQ29tbWVudEV2ZW50KSAqRXZlbnQgewoJb3duZXIgOj0gZ2l0ZWFVc2VyVG9Vc2VyKGUuSXNzdWUuVXNlcikKCXJldHVybiAmRXZlbnR7CgkJVHlwZTogICAgICAgICBUeXBlSXNzdWVDb21tZW50ZWQsCgkJVGltZXN0YW1wOiAgICB0aW1lLk5vdygpLAoJCUFjdG9yOiAgICAgICAgZ2l0ZWFVc2VyVG9Vc2VyKGUuU2VuZGVyKSwKCQlSZXBvTmFtZTogICAgIGUuUmVwb3NpdG9yeS5OYW1lLAoJCVJlcG9GdWxsTmFtZTogZS5SZXBvc2l0b3J5LkZ1bGxOYW1lLAoJCVJlcG9VUkw6ICAgICAgZS5SZXBvc2l0b3J5LkhUTUxVUkwsCgkJTnVtYmVyOiAgICAgICBlLklzc3VlLk51bWJlciwKCQlUaXRsZTogICAgICAgIGUuSXNzdWUuVGl0bGUsCgkJVVJMOiAgICAgICAgICBlLklzc3VlLkhUTUxVUkwsCgkJT3duZXI6ICAgICAgICAmb3duZXIsCgkJQ29tbWVudEJvZHk6ICBlLkNvbW1lbnQuQm9keSwKCQlDb21tZW50VVJMOiAgIGUuQ29tbWVudC5IVE1MVVJMLAoJfQp9CgpmdW5jIGdpdGVhVXNlclRvVXNlcih1IHdlYmhvb2suR2l0ZWFVc2VyKSBVc2VyIHsKCXVzZXJuYW1lIDo9IHUuTG9naW4KCWlmIHVzZXJuYW1lID09ICIiIHsKCQl1c2VybmFtZSA9IHUuVXNlcm5hbWUKCX0KCXJldHVybiBVc2VyewoJCUdpdGVhSUQ6ICAgICAgIHUuSUQsCgkJR2l0ZWFVc2VybmFtZTogdXNlcm5hbWUsCgkJRW1haWw6ICAgICAgICAgdS5FbWFpbCwKCQlGdWxsTmFtZTogICAgICB1LkZ1bGxOYW1lLAoJfQp9CgpmdW5jIGdpdGVhVXNlcnNUb1VzZXJzKHVzZXJzIFtdd2ViaG9vay5HaXRlYVVzZXIpIFtdVXNlciB7CglyZXN1bHQgOj0gbWFrZShbXVVzZXIsIGxlbih1c2VycykpCglmb3IgaSwgdSA6PSByYW5nZSB1c2VycyB7CgkJcmVzdWx0W2ldID0gZ2l0ZWFVc2VyVG9Vc2VyKHUpCgl9CglyZXR1ycm4gcmVzdWx0Cn0K