ZGlmZiAtLWdpdCBhL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHMucHkgYi9NYWMvQ29udHJpYi9tb3JlZmluZGVydG9vbHMvbW9yZWZpbmRlcnRvb2xzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE2ZTVhLi4wMDAwMDAwCi0tLSBhL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MDggKzAsMCBAQAotIiIiVXRpbGl0eSByb3V0aW5lcyBkZXBlbmRpbmcgb24gdGhlIGZpbmRlciwKLWluc3BpcmVkIGJ5IGZpbmRlcnRvb2xzLCBidXQgZXh0ZW5kZWQuCi1Nb3N0IGV2ZW50cyBoYXZlIGJlZW4gY2FwdHVyZWQgZnJvbQotTGFzc28gQ2FwdHVyZSBBRSBhbmQgdGhhbiB0cmFuc2xhdGVkIHRvIHB5dGhvbiBjb2RlLgotCi1JTVBPUlRBTlQKLU5vdGUgdGhhdCB0aGUgcHJvY2Vzc2VzKCkgZnVuY3Rpb24gcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzCi1kZXBlbmRpbmcgb24gdGhlIE9TIHZlcnNpb24gaXQgaXMgcnVubmluZyBvbi4gT24gTWFjT1MgOQotdGhlIEZpbmRlciByZXR1cm5zIHRoZSBwcm9jZXNzICpuYW1lcyogd2hpY2ggY2FuIHRoZW4gYmUKLXVzZWQgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGVtLiBPbiBNYWNPUyA4LjYgYW5kIGVhcmxpZXIKLXRoZSBGaW5kZXIgcmV0dXJucyBhIGNvZGUgd2hpY2ggZG9lcyBub3Qgc2VlbSB0byB3b3JrLgotU28gYm90dG9tIGxpbmU6IHRoZSBwcm9jZXNzZXMoKSBzdHVmZiBkb2VzIG5vdCB3b3JrIG9uIDwgTWFjT1M5Ci0KLVdyaXR0ZW4gYnkgZXJpa0BsZXR0ZXJyb3IuY29tCi0iIiIKLQotaW1wb3J0IEZpbmRlcl83XzBfU3VpdGUsIEZpbmRlcl9TdWl0ZQotaW1wb3J0IEFwcGxlRXZlbnRzCi1pbXBvcnQgYWV0b29scwotaW1wb3J0IE1hY09TCi1pbXBvcnQgc3lzCi1pbXBvcnQgbWFjZnMKLWltcG9ydCBhZXR5cGVzCi1mcm9tIHR5cGVzIGltcG9ydCAqCi0KLV9fdmVyc2lvbl9fID0gJzEuMCcKLW1vcmVmaW5kZXJ0b29sc2Vycm9yID0gJ21vcmVmaW5kZXJ0b29scyBFcnJvcicKLQotCi1TSUdOQVRVUkU9J01BQ1MnCi0KLWNsYXNzIEZpbmRlcihhZXRvb2xzLlRhbGtUbywgRmluZGVyX1N1aXRlLkZpbmRlcl9TdWl0ZSwgRmluZGVyXzdfMF9TdWl0ZS5GaW5kZXJfN18wX1N1aXRlKToKLQlwYXNzCi0JCi1fZmluZGVyX3RhbGtlciA9IE5vbmUKLQotZGVmIF9nZXRmaW5kZXIoKToKLQkiIiJyZXR1cm5zIGJhc2ljIChyZWN5Y2xhYmxlKSBGaW5kZXIgQUUgaW50ZXJmYWNlIG9iamVjdCIiIgotCWdsb2JhbCBfZmluZGVyX3RhbGtlcgotCWlmIG5vdCBfZmluZGVyX3RhbGtlcjoKLQkJX2ZpbmRlcl90YWxrZXIgPSBGaW5kZXIoU0lHTkFUVVJFKQotCV9maW5kZXJfdGFsa2VyLnNlbmRfZmxhZ3MgPSAoIF9maW5kZXJfdGFsa2VyLnNlbmRfZmxhZ3MgfCAKLQkJQXBwbGVFdmVudHMua0FFQ2FuSW50ZXJhY3QgfCBBcHBsZUV2ZW50cy5rQUVDYW5Td2l0Y2hMYXllcikKLQlyZXR1cm4gX2ZpbmRlcl90YWxrZXIKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCVRoZSBvcmlnaW5hbCBmaW5kZXJ0b29scwotIwotCi1kZWYgbGF1bmNoKGZpbGUpOgotCSIiIk9wZW4gYSBmaWxlIHRocnUgdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JZnNzID0gbWFjZnMuRlNTcGVjKGZpbGUpCi0JdlJlZk51bSwgcGFySUQsIG5hbWUgPSBmc3MuYXNfdHVwbGUoKQotCWRpcl9mc3MgPSBtYWNmcy5GU1NwZWMoKHZSZWZOdW0sIHBhcklELCAnJykpCi0JZmlsZV9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCi0JZGlyX2FsaWFzID0gZGlyX2Zzcy5OZXdBbGlhcygpCi0JcmV0dXJuIGZpbmRlci5vcGVuKGRpcl9hbGlhcywgaXRlbXM9W2ZpbGVfYWxpYXNdKQotCQotZGVmIFByaW50KGZpbGUpOgotCSIiIlByaW50IGEgZmlsZSB0aHJ1IHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYyIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWZzcyA9IG1hY2ZzLkZTU3BlYyhmaWxlKQotCXZSZWZOdW0sIHBhcklELCBuYW1lID0gZnNzLmFzX3R1cGxlKCkKLQlkaXJfZnNzID0gbWFjZnMuRlNTcGVjKCh2UmVmTnVtLCBwYXJJRCwgJycpKQotCWZpbGVfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQotCWRpcl9hbGlhcyA9IGRpcl9mc3MuTmV3QWxpYXMoKQotCXJldHVybiBmaW5kZXIuX3ByaW50KGRpcl9hbGlhcywgaXRlbXM9W2ZpbGVfYWxpYXNdKQotCQotZGVmIGNvcHkoc3JjLCBkc3RkaXIpOgotCSIiIkNvcHkgYSBmaWxlIHRvIGEgZm9sZGVyIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0Jc3JjX2ZzcyA9IG1hY2ZzLkZTU3BlYyhzcmMpCi0JZHN0X2ZzcyA9IG1hY2ZzLkZTU3BlYyhkc3RkaXIpCi0Jc3JjX2FsaWFzID0gc3JjX2Zzcy5OZXdBbGlhcygpCi0JZHN0X2FsaWFzID0gZHN0X2Zzcy5OZXdBbGlhcygpCi0JcmV0dXJuIGZpbmRlci5jb3B5X3RvKGRzdF9hbGlhcywgX2Zyb209W3NyY19hbGlhc10pCi0KLWRlZiBtb3ZlKHNyYywgZHN0ZGlyKToKLQkiIiJNb3ZlIGEgZmlsZSB0byBhIGZvbGRlciIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCXNyY19mc3MgPSBtYWNmcy5GU1NwZWMoc3JjKQotCWRzdF9mc3MgPSBtYWNmcy5GU1NwZWMoZHN0ZGlyKQotCXNyY19hbGlhcyA9IHNyY19mc3MuTmV3QWxpYXMoKQotCWRzdF9hbGlhcyA9IGRzdF9mc3MuTmV3QWxpYXMoKQotCXJldHVybiBmaW5kZXIubW92ZV90byhkc3RfYWxpYXMsIF9mcm9tPVtzcmNfYWxpYXNdKQotCi1kZWYgc2xlZXAoKToKLQkiIiJQdXQgdGhlIG1hYyB0byBzbGVlcCIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWZpbmRlci5zbGVlcCgpCi0JCi1kZWYgc2h1dGRvd24oKToKLQkiIiJTaHV0IHRoZSBtYWMgZG93biIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWZpbmRlci5zaHV0X2Rvd24oKQotCQotZGVmIHJlc3RhcnQoKToKLQkiIiJSZXN0YXJ0IHRoZSBtYWMiIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlmaW5kZXIucmVzdGFydCgpCi0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwlBZGRpdGlvbmFsIGZpbmRlcnRvb2xzCi0jCi0KLWRlZiByZXZlYWwoZmlsZSk6Ci0JIiIiUmV2ZWFsIGEgZmlsZSBpbiB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JZnNzID0gbWFjZnMuRlNTcGVjKGZpbGUpCi0JZmlsZV9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCi0JcmV0dXJuIGZpbmRlci5yZXZlYWwoZmlsZV9hbGlhcykKLQkKLWRlZiBzZWxlY3QoZmlsZSk6Ci0JIiIic2VsZWN0IGEgZmlsZSBpbiB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JZnNzID0gbWFjZnMuRlNTcGVjKGZpbGUpCi0JZmlsZV9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCi0JcmV0dXJuIGZpbmRlci5zZWxlY3QoZmlsZV9hbGlhcykKLQkKLWRlZiB1cGRhdGUoZmlsZSk6Ci0JIiIiVXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIHRvIG1hdGNoIAotCXRoZWlyIG9uLWRpc2sgcmVwcmVzZW50YXRpb24uIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlmc3MgPSBtYWNmcy5GU1NwZWMoZmlsZSkKLQlmaWxlX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKLQlyZXR1cm4gZmluZGVyLnVwZGF0ZShmaWxlX2FsaWFzKQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMJTW9yZSBmaW5kZXJ0b29scwotIwotCi1kZWYgY29tbWVudChvYmplY3QsIGNvbW1lbnQ9Tm9uZSk6Ci0JIiIiY29tbWVudDogZ2V0IG9yIHNldCB0aGUgRmluZGVyLWNvbW1lbnQgb2YgdGhlIGl0ZW0sIGRpc3BsYXllZCBpbiB0aGUgs0dldCBJbmZvsiB3aW5kb3cuIiIiCi0Jb2JqZWN0ID0gbWFjZnMuRlNTcGVjKG9iamVjdCkKLQlmc3MgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQotCW9iamVjdF9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCi0JaWYgY29tbWVudCA9PSBOb25lOgotCQlyZXR1cm4gX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKQotCWVsc2U6Ci0JCXJldHVybiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1lbnQpCi0JCi1kZWYgX3NldGNvbW1lbnQob2JqZWN0X2FsaWFzLCBjb21tZW50KToKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQnKSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlhcmdzWyJkYXRhIl0gPSBjb21tZW50Ci0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQotCi1kZWYgX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKToKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQnKSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCi0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwlHZXQgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcm9jZXNzZXMgaW4gdGhlIEZpbmRlci4KLQotZGVmIHByb2Nlc3NlcygpOgotCSIiInByb2Nlc3NlcyByZXR1cm5zIGEgbGlzdCBvZiBhbGwgYWN0aXZlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoaXMgY29tcHV0ZXIgYW5kIHRoZWlyIGNyZWF0b3JzLiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlwcm9jZXNzbmFtZXMgPSBbXQotCXByb2Nlc3NudW1iZXJzID0gW10KLQljcmVhdG9ycyA9IFtdCi0JcGFydGl0aW9ucyA9IFtdCi0JdXNlZCA9IFtdCi0JIyMgZ2V0IHRoZSBwcm9jZXNzbmFtZXMgb3IgZWxzZSB0aGUgcHJvY2Vzc251bWJlcnMKLQlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJjcycpLCBmb3JtPSJpbmR4Iiwgc2VsZD1hZXR5cGVzLlVua25vd24oJ2Fic28nLCAiYWxsICIpLCBmcj1Ob25lKQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JcCA9IFtdCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXAgPSAgYXJnc1snLS0tLSddCi0JCWZvciBwcm9jIGluIHA6Ci0JCQlpZiBoYXNhdHRyKHByb2MsICdzZWxkJyk6Ci0JCQkJIyBpdCBoYXMgYSByZWFsIG5hbWUKLQkJCQlwcm9jZXNzbmFtZXMuYXBwZW5kKHByb2Muc2VsZCkKLQkJCWVsaWYgaGFzYXR0cihwcm9jLCAndHlwZScpOgotCQkJCWlmIHByb2MudHlwZSA9PSAicHNuICI6Ci0JCQkJCSMgaXQgaGFzIGEgcHJvY2VzcyBudW1iZXIKLQkJCQkJcHJvY2Vzc251bWJlcnMuYXBwZW5kKHByb2MuZGF0YSkKLQkjIyBnZXQgdGhlIGNyZWF0b3JzCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJjcycpLCBmb3JtPSJpbmR4Iiwgc2VsZD1hZXR5cGVzLlVua25vd24oJ2Fic28nLCAiYWxsICIpLCBmcj1Ob25lKQotCWFyZ3NbJy0tLS0nXSA9ICBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2ZjcnQnKSwgZnI9YWVvYmpfMCkKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJnKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlwID0gIGFyZ3NbJy0tLS0nXQotCQlmb3IgcHJvYyBpbiBwOgotCQkJY3JlYXRvcnMuYXBwZW5kKHByb2MudHlwZSkKLQkjIyBjb25jYXRlbmF0ZSBpbiBvbmUgZGljdAotCXJlc3VsdCA9IFtdCi0JaWYgbGVuKHByb2Nlc3NuYW1lcykgPiBsZW4ocHJvY2Vzc251bWJlcnMpOgotCQlkYXRhID0gcHJvY2Vzc25hbWVzCi0JZWxzZToKLQkJZGF0YSA9IHByb2Nlc3NudW1iZXJzCi0JZm9yIGkgaW4gcmFuZ2UobGVuKGNyZWF0b3JzKSk6Ci0JCXJlc3VsdC5hcHBlbmQoKGRhdGFbaV0sIGNyZWF0b3JzW2ldKSkKLQlyZXR1cm4gcmVzdWx0Ci0KLWNsYXNzIF9wcm9jZXNzOgotCXBhc3MKLQotZGVmIGlzYWN0aXZlcHJvY2Vzcyhwcm9jZXNzbmFtZSk6Ci0JIiIiQ2hlY2sgb2YgcHJvY2Vzc25hbWUgaXMgYWN0aXZlLiBNYWNPUzkiIiIKLQlhbGwgPSBwcm9jZXNzZXMoKQotCW9rID0gMAotCWZvciBuLCBjIGluIGFsbDoKLQkJaWYgbiA9PSBwcm9jZXNzbmFtZToKLQkJCXJldHVybiAxCi0JcmV0dXJuIDAKLQkKLWRlZiBwcm9jZXNzaW5mbyhwcm9jZXNzbmFtZSk6Ci0JIiIiUmV0dXJuIGFuIG9iamVjdCB3aXRoIGFsbCBwcm9jZXNzIHByb3BlcnRpZXMgYXMgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc25hbWUuIE1hY09TOSIiIgotCXAgPSBfcHJvY2VzcygpCi0JCi0JaWYgcHJvY2Vzc25hbWUgPT0gIkZpbmRlciI6Ci0JCXAucGFydGl0aW9uID0gTm9uZQotCQlwLnVzZWQgPSBOb25lCi0JZWxzZToKLQkJcC5wYXJ0aXRpb24gPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnYXBwdCcpCi0JCXAudXNlZCA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwdXNkJykKLQlwLnZpc2libGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHZpcycpCQkjSXMgdGhlIHByb2Nlc3MnIGxheWVyIHZpc2libGU/Ci0JcC5mcm9udG1vc3QgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncGlzZicpCSNJcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnRtb3N0IHByb2Nlc3M/Ci0JcC5maWxlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2ZpbGUnKQkJCSN0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzIHdhcyBsYXVuY2hlZAotCXAuZmlsZXR5cGUgID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2FzdHknKQkJI3RoZSBPU1R5cGUgb2YgdGhlIGZpbGUgdHlwZSBvZiB0aGUgcHJvY2VzcwotCXAuY3JlYXRvcnR5cGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnZmNydCcpCSN0aGUgT1NUeXBlIG9mIHRoZSBjcmVhdG9yIG9mIHRoZSBwcm9jZXNzICh0aGUgc2lnbmF0dXJlKQotCXAuYWNjZXB0aGlnaGxldmVsID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3JldnQnKQkjSXMgdGhlIHByb2Nlc3MgaGlnaC1sZXZlbCBldmVudCBhd2FyZSAoYWNjZXB0cyBvcGVuIGFwcGxpY2F0aW9uLCBvcGVuIGRvY3VtZW50LCBwcmludCBkb2N1bWVudCwgYW5kIHF1aXQpPwotCXAuaGFzc2NyaXB0aW5nID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2hzY3InKQkJI0RvZXMgdGhlIHByb2Nlc3MgaGF2ZSBhIHNjcmlwdGluZyB0ZXJtaW5vbG9neSwgaS5lLiwgY2FuIGl0IGJlIHNjcmlwdGVkPwotCXJldHVybiBwCi0JCi1kZWYgX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgcHJvcGVydHkpOgotCSIiInJldHVybiB0aGUgcGFydGl0aW9uIHNpemUgYW5kIG1lbW9yeSB1c2VkIGZvciBwcm9jZXNzbmFtZSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09Im5hbWUiLCBzZWxkPXByb2Nlc3NuYW1lLCBmcj1Ob25lKQotCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKHByb3BlcnR5KSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCi0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwlNZXNzIGFyb3VuZCB3aXRoIEZpbmRlciB3aW5kb3dzLgotCQotZGVmIG9wZW53aW5kb3cob2JqZWN0KToKLQkiIiJPcGVuIGEgRmluZGVyIHdpbmRvdyBmb3Igb2JqZWN0LCBTcGVjaWZ5IG9iamVjdCBieSBuYW1lIG9yIGZzc3BlYy4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlvYmplY3QgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQotCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JX2NvZGUgPSAnYWV2dCcKLQlfc3ViY29kZSA9ICdvZG9jJwotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMAotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCQotZGVmIGNsb3Nld2luZG93KG9iamVjdCk6Ci0JIiIiQ2xvc2UgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIsIFNwZWNpZnkgYnkgcGF0aC4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlmc3MgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQotCW9iamVjdF9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCV9jb2RlID0gJ2NvcmUnCi0JX3N1YmNvZGUgPSAnY2xvcycKLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQotZGVmIGxvY2F0aW9uKG9iamVjdCwgcG9zPU5vbmUpOgotCSIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgotCUlmIHBvcz1Ob25lLCBsb2NhdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LiIiIgotCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKLQlpZiBub3QgcG9zOgotCQlyZXR1cm4gX2dldGxvY2F0aW9uKG9iamVjdF9hbGlhcykKLQlyZXR1cm4gX3NldGxvY2F0aW9uKG9iamVjdF9hbGlhcywgcG9zKQotCQotZGVmIF9zZXRsb2NhdGlvbihvYmplY3RfYWxpYXMsICh4LCB5KSk6Ci0JIiIiX3NldGxvY2F0aW9uOiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpY29uIGZvciB0aGUgb2JqZWN0LiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8wMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQotCWFyZ3NbImRhdGEiXSA9IFt4LCB5XQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJzZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JcmV0dXJuICh4LHkpCi0JCi1kZWYgX2dldGxvY2F0aW9uKG9iamVjdF9hbGlhcyk6Ci0JIiIiX2dldGxvY2F0aW9uOiBnZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpY29uIGZvciB0aGUgb2JqZWN0LiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8wMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXBvcyA9IGFyZ3NbJy0tLS0nXQotCQlyZXR1cm4gcG9zLmgsIHBvcy52Ci0KLWRlZiBsYWJlbChvYmplY3QsIGluZGV4PU5vbmUpOgotCSIiImxhYmVsOiBzZXQgb3IgZ2V0IHRoZSBsYWJlbCBvZiB0aGUgaXRlbS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLiIiIgotCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKLQlpZiBpbmRleCA9PSBOb25lOgotCQlyZXR1cm4gX2dldGxhYmVsKG9iamVjdF9hbGlhcykKLQlpZiBpbmRleCA8IDAgb3IgaW5kZXggPiA3OgotCQlpbmRleCA9IDAKLQlyZXR1cm4gX3NldGxhYmVsKG9iamVjdF9hbGlhcywgaW5kZXgpCi0JCi1kZWYgX2dldGxhYmVsKG9iamVjdF9hbGlhcyk6Ci0JIiIibGFiZWw6IEdldCB0aGUgbGFiZWwgZm9yIHRoZSBvYmplY3QuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQotCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdsYWJpJyksIGZyPWFlb2JqXzAwKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQotCi1kZWYgX3NldGxhYmVsKG9iamVjdF9hbGlhcywgaW5kZXgpOgotCSIiImxhYmVsOiBTZXQgdGhlIGxhYmVsIGZvciB0aGUgb2JqZWN0LiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlfY29kZSA9ICdjb3JlJwotCV9zdWJjb2RlID0gJ3NldGQnCi0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCi0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2xhYmknKSwgZnI9YWVvYmpfMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8xCi0JYXJnc1siZGF0YSJdID0gaW5kZXgKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlyZXR1cm4gaW5kZXgKLQotZGVmIHdpbmRvd3ZpZXcoZm9sZGVyLCB2aWV3PU5vbmUpOgotCSIiIndpbmRvd3ZpZXc6IFNldCB0aGUgdmlldyBvZiB0aGUgd2luZG93IGZvciB0aGUgZm9sZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCi0JMCA9IGJ5IGljb24gKGRlZmF1bHQpCi0JMSA9IGJ5IG5hbWUKLQkyID0gYnkgYnV0dG9uCi0JIiIiCi0JZnNzID0gbWFjZnMuRlNTcGVjKGZvbGRlcikKLQlmb2xkZXJfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQotCWlmIHZpZXcgPT0gTm9uZToKLQkJcmV0dXJuIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcykKLQlyZXR1cm4gX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3KQotCQotZGVmIF9zZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcywgdmlldz0wKToKLQkiIiJzZXQgdGhlIHdpbmRvd3ZpZXciIiIKLQlhdHRycyA9IHt9Ci0JYXJncyA9IHt9Ci0JaWYgdmlldyA9PSAxOgotCQlfdiA9IGFldHlwZXMuVHlwZSgncG5hbScpCi0JZWxpZiB2aWV3ID09IDI6Ci0JCV92ID0gYWV0eXBlcy5UeXBlKCdsZ2J1JykKLQllbHNlOgotCQlfdiA9IGFldHlwZXMuVHlwZSgnaWltZycpCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCi0JCQlmb3JtID0gJ2FsaXMnLCBzZWxkID0gZm9sZGVyX2FsaWFzLCBmcj1Ob25lKQotCWFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybSA9ICdwcm9wJywgc2VsZCA9IGFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQotCWFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybSA9ICdwcm9wJywgc2VsZCA9IGFldHlwZXMuVHlwZSgncHZldycpLCBmcj1hZW9ial8xKQotCWFlb2JqXzMgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybSA9ICdwcm9wJywgc2VsZCA9IF92LCBmcj1Ob25lKQotCV9jb2RlID0gJ2NvcmUnCi0JX3N1YmNvZGUgPSAnc2V0ZCcKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8yCi0JYXJnc1snZGF0YSddID0gYWVvYmpfMwotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCi0KLWRlZiBfZ2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMpOgotCSIiImdldCB0aGUgd2luZG93dmlldyIiIgotCWF0dHJzID0ge30KLQlhcmdzID0ge30KLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMDApCi0JYWVvYmpfMDIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B2ZXcnKSwgZnI9YWVvYmpfMDEpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDIKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCXZpZXdzID0geydpaW1nJzowLCAncG5hbSc6MSwgJ2xnYnUnOjJ9Ci0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiB2aWV3c1thcmdzWyctLS0tJ10uZW51bV0KLQotZGVmIHdpbmRvd3NpemUoZm9sZGVyLCBzaXplPU5vbmUpOgotCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBzaXplPSh3LCBoKSwgU3BlY2lmeSBieSBwYXRoLgotCUlmIHNpemU9Tm9uZSwgd2luZG93c2l6ZSB3aWxsIHJldHVybiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSB3aW5kb3cuCi0JU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgotCSIiIgotCWZzcyA9IG1hY2ZzLkZTU3BlYyhmb2xkZXIpCi0JZm9sZGVyX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKLQlvcGVud2luZG93KGZzcykKLQlpZiBub3Qgc2l6ZToKLQkJcmV0dXJuIF9nZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcykKLQlyZXR1cm4gX3NldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzLCBzaXplKQotCQotZGVmIF9zZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcywgKHcsIGgpKToKLQkiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCV9jb2RlID0gJ2NvcmUnCi0JX3N1YmNvZGUgPSAnc2V0ZCcKLQlhZXZhcjAwID0gW3csIGhdCi0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0JYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMgotCWFyZ3NbImRhdGEiXSA9IGFldmFyMDAKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlyZXR1cm4gKHcsIGgpCi0JCQotZGVmIF9nZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcyk6Ci0JIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvICh3LCBoKSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0JYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMgotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KLQotZGVmIHdpbmRvd3Bvc2l0aW9uKGZvbGRlciwgcG9zPU5vbmUpOgotCSIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4iIiIKLQlmc3MgPSBtYWNmcy5GU1NwZWMoZm9sZGVyKQotCWZvbGRlcl9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCi0Jb3BlbndpbmRvdyhmc3MpCi0JaWYgbm90IHBvczoKLQkJcmV0dXJuIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMpCi0JaWYgdHlwZShwb3MpID09IEluc3RhbmNlVHlwZToKLQkJIyBwb3MgbWlnaHQgYmUgYSBRRFBvaW50IG9iamVjdCBhcyByZXR1cm5lZCBieSBfZ2V0d2luZG93cG9zaXRpb24KLQkJcG9zID0gKHBvcy5oLCBwb3MudikKLQlyZXR1cm4gX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgcG9zKQotCQkJCi1kZWYgX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgKHgsIHkpKToKLQkiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpLiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0JYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMgotCWFyZ3NbImRhdGEiXSA9IFt4LCB5XQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdzZXRkJywgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KLQotZGVmIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMpOgotCSIiIkdldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciwgU3BlY2lmeSBieSBwYXRoLiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0JYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMgotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KLQotZGVmIGljb24ob2JqZWN0LCBpY29uZGF0YT1Ob25lKToKLQkiIiJpY29uIHNldHMgdGhlIGljb24gb2Ygb2JqZWN0LCBpZiBubyBpY29uZGF0YSBpcyBnaXZlbiwKLQlpY29uIHdpbGwgcmV0dXJuIGFuIEFFIG9iamVjdCB3aXRoIGJpbmFyeSBkYXRhIGZvciB0aGUgY3VycmVudCBpY29uLgotCUlmIGxlZnQgdW50b3VjaGVkLCB0aGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gcGFzdGUgdGhlIGljb24gb24gYW5vdGhlciBmaWxlLgotCURldmVsb3BtZW50IG9wcG9ydHVuaXR5OiBnZXQgYW5kIHNldCB0aGUgZGF0YSBhcyBQSUNULiIiIgotCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKLQlpZiBpY29uZGF0YSA9PSBOb25lOgotCQlyZXR1cm4gX2dldGljb24ob2JqZWN0X2FsaWFzKQotCXJldHVybiBfc2V0aWNvbihvYmplY3RfYWxpYXMsIGljb25kYXRhKQotCQotZGVmIF9nZXRpY29uKG9iamVjdF9hbGlhcyk6Ci0JIiIiZ2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LiBCaW5hcnkgZGF0YSBvZiBzb21lIHNvcnQuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnaWltZycpLCBmcj1hZW9ial8wMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KLQotZGVmIF9zZXRpY29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpOgotCSIiInNldCB0aGUgaWNvbmRhdGEgZm9yIG9iamVjdCwgZm9ybWF0dGVkIGFzIHByb2R1Y2VkIGJ5IF9nZXRpY29uKCkiIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCAKLQkJCWZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCi0JYXJnc1siZGF0YSJdID0gaWNvbmRhdGEKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddLmRhdGEKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCVZvbHVtZXMgYW5kIHNlcnZlcnMuCi0JCi1kZWYgbW91bnR2b2x1bWUodm9sdW1lLCBzZXJ2ZXI9Tm9uZSwgdXNlcm5hbWU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6Ci0JIiIibW91bnQgYSB2b2x1bWUsIGxvY2FsIG9yIG9uIGEgc2VydmVyIG9uIEFwcGxlVGFsay4KLQlOb3RlOiBtb3VudGluZyBhIEFTSVAgc2VydmVyIHJlcXVpcmVzIGEgZGlmZmVyZW50IG9wZXJhdGlvbi4KLQlzZXJ2ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZlciB3aGVyZSB0aGUgdm9sdW1lIGJlbG9uZ3MKLQl1c2VybmFtZSwgcGFzc3dvcmQgYmVsb25nIHRvIGEgcmVnaXN0ZXJlZCB1c2VyIG9mIHRoZSB2b2x1bWUuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWlmIHBhc3N3b3JkOgotCQlhcmdzWyJQQVNTIl0gPSBwYXNzd29yZAotCWlmIHVzZXJuYW1lOgotCQlhcmdzWyJVU0VSIl0gPSB1c2VybmFtZQotCWlmIHNlcnZlcjoKLQkJYXJnc1siU1JWUiJdID0gc2VydmVyCi0JYXJnc1snLS0tLSddID0gdm9sdW1lCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJhZXZ0IiwgIm12b2wiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQotCi1kZWYgdW5tb3VudHZvbHVtZSh2b2x1bWUpOgotCSIiInVubW91bnQgYSB2b2x1bWUgdGhhdCdzIG9uIHRoZSBkZXNrdG9wIiIiCi0JcHV0YXdheSh2b2x1bWUpCi0JCi1kZWYgcHV0YXdheShvYmplY3QpOgotCSIiInB1dGggdGhlIG9iamVjdCBhd2F5LCB3aGVyZWV2ZXIgaXQgY2FtZSBmcm9tLiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2RpcycpLCBmb3JtPSJuYW1lIiwgc2VsZD1vYmplY3QsIGZyPU5vbmUpCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IHRhbGtlci5zZW5kKCJmbmRyIiwgInB0d3kiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMJTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMKLSMKLQotZGVmIHZvbHVtZWxldmVsKGxldmVsKToKLQkiIiJzZXQgdGhlIGF1ZGlvIG91dHB1dCBsZXZlbCwgcGFyYW1ldGVyIGJldHdlZW4gMCAoc2lsZW50KSBhbmQgNyAoZnVsbCBibGFzdCkiIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JaWYgbGV2ZWwgPCAwOgotCQlsZXZlbCA9IDAKLQllbGlmIGxldmVsID4gNzoKLQkJbGV2ZWwgPSA3Ci0JYXJnc1snLS0tLSddID0gbGV2ZWwKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImFldnQiLCAic3R2bCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCi0KLWRlZiBPU3ZlcnNpb24oKToKLQkiIiJyZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHN5c3RlbSBzb2Z0d2FyZSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgndmVyMicpLCBmcj1Ob25lKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAwCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQotCi1kZWYgZmlsZXNoYXJpbmcoKToKLQkiIiJyZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGZpbGVzaGFyaW5nIGFuZCB3aGV0aGVyIGl0IGlzIHN0YXJ0aW5nIHVwIG9yIG5vdDoKLQkJLTEJZmlsZSBzaGFyaW5nIGlzIG9mZiBhbmQgbm90IHN0YXJ0aW5nIHVwCi0JCTAJZmlsZSBzaGFyaW5nIGlzIG9mZiBhbmQgc3RhcnRpbmcgdXAKLQkJMQlmaWxlIHNoYXJpbmcgaXMgb24iIiIKLQlzdGF0dXMgPSAtMQotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCSMgc2VlIGlmIGl0IGlzIG9uCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZnNocicpLCBmcj1Ob25lKQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCWlmIGFyZ3NbJy0tLS0nXSA9PSAwOgotCQkJc3RhdHVzID0gLTEKLQkJZWxzZToKLQkJCXN0YXR1cyA9IDEKLQkjIGlzIGl0IHN0YXJ0aW5nIHVwIHBlcmNoYW5jZT8KLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmc3VwJyksIGZyPU5vbmUpCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJaWYgYXJnc1snLS0tLSddID09IDE6Ci0JCQlzdGF0dXMgPSAwCi0JcmV0dXJuIHN0YXR1cwotCQotZGVmIG1vdmV0b3RyYXNoKHBhdGgpOgotCSIiIm1vdmUgdGhlIG9iamVjdCB0byB0aGUgdHJhc2giIiIKLQlmc3MgPSBtYWNmcy5GU1NwZWMocGF0aCkKLQl0cmFzaGZvbGRlciA9IG1hY2ZzLkZTU3BlYyhtYWNmcy5GaW5kRm9sZGVyKGZzcy5hc190dXBsZSgpWzBdLCAndHJzaCcsIDApICsgKCIiLCkpLmFzX3BhdGhuYW1lKCkKLQlmaW5kZXJ0b29scy5tb3ZlKHBhdGgsIHRyYXNoZm9sZGVyKQotCi1kZWYgZW1wdHl0cmFzaCgpOgotCSIiImVtcHR5IHRoZSB0cmFzaCIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Ryc2gnKSwgZnI9Tm9uZSkKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImZuZHIiLCAiZW1wdCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCmRpZmYgLS1naXQgYS9NYWMvQ29udHJpYi9tb3JlZmluZGVydG9vbHMvbW9yZWZpbmRlcnRvb2xzdGVzdC5weSBiL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHN0ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzlkMjVlLi4wMDAwMDAwCi0tLSBhL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHN0ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotIiIiU29tZSB0ZXN0cyBvZiB2YXJpb3VzIG1vcmVmaW5kZXJ0b29scyBmdW5jdGlvbnMuCi1UaGlzIGRvZXMgbm90IHRlc3QgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBhbHJlYWR5IGRlZmluZWQgYW5kIHRlc3RlZCBpbiBmaW5kZXJ0b29scy4KLTEwIDEwIDIwMDAgZXJpa0BsZXR0ZXJyb3IuY29tCi0iIiIKLQotaW1wb3J0IG1vcmVmaW5kZXJ0b29scwotaW1wb3J0IG9zLnBhdGgKLWltcG9ydCBNYWNPUwotaW1wb3J0IHJhbmRvbQotCi1tZnQgPSBtb3JlZmluZGVydG9vbHMKLQotcHJpbnQgJ1xubW9yZWZpbmRlcnRvb2xzIHZlcnNpb24gJXNcblRlc3RzIGNvbWluZyB1cIonICVtZnQuX192ZXJzaW9uX18KLQotIyBtaXNjZWxsYW5lb3VzCi1wcmludCAnXHRmaWxlc2hhcmluZyBvbj8nLAltZnQuZmlsZXNoYXJpbmcoKQkJIyBpcyBmaWxlIHNoYXJpbmcgb24sIG9mZiwgc3RhcnRpbmcgdXA/Ci1wcmludCAnXHRPUyB2ZXJzaW9uJywgCQltZnQuT1N2ZXJzaW9uKCkJCSMgdGhlIHZlcnNpb24gb2YgdGhlIHN5c3RlbSBzb2Z0d2FyZQotCi0jIHNldCB0aGUgc291bmR2b2x1bWUgaW4gYSBzaW1wbGUgd2F5Ci1wcmludCAnXHRTeXN0ZW0gYmVlcCB2b2x1bWUnCi1mb3IgaSBpbiByYW5nZSgwLCA3KToKLQltZnQudm9sdW1lbGV2ZWwoaSkJCQotCU1hY09TLlN5c0JlZXAoKQotCi0jIEZpbmRlcidzIHdpbmRvd3MsIGZpbGUgbG9jYXRpb24sIGZpbGUgYXR0cmlidXRlcwotZiA9IF9fZmlsZV9fCQkJCSMgZ2V0IGEgcGF0aCBuYW1lIHRoYXQgaXMgaW5ub2NlbnQgdG8gcGxheSB3aXRoIGFuZCBhbHdheXMgd29ya3MKLW1mdC5yZXZlYWwoZikJCQkJIyByZXZlYWwgdGhpcyBmaWxlIGluIGEgRmluZGVyIHdpbmRvdwotbWZ0LnNlbGVjdChmKQkJCQkjIHNlbGVjdCB0aGlzIGZpbGUKLQotYmFzZSwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZikKLW1mdC5jbG9zZXdpbmRvdyhiYXNlKQkjIGNsb3NlIHRoZSB3aW5kb3cgdGhpcyBmaWxlIGlzIGluCShvcGVuZWQgYnkgcmV2ZWFsKQotbWZ0Lm9wZW53aW5kb3coYmFzZSkJCSMgb3BlbiBpdCBhZ2FpbgotbWZ0LndpbmRvd3ZpZXcoYmFzZSwgMSkJIyBzZXQgdGhlIHZpZXcgYnkgbGlzdAotCi1tZnQubGFiZWwoZiwgMikJCQkJIyBzZXQgdGhlIGxhYmVsIG9mIHRoaXMgZmlsZSB0byBzb21ldGhpbmcgb3JhbmdlCi1wcmludCAnXHRsYWJlbCcsIG1mdC5sYWJlbChmKQkjIGdldCB0aGUgbGFiZWwgb2YgdGhpcyBmaWxlCi0KLSMgdGhlIGZpbGUgbG9jYXRpb24gb25seSB3b3JrcyBpbiBhIHdpbmRvdyB3aXRoIGljb24gdmlldyEKLXByaW50ICdSYW5kb20gbG9jYXRpb25zIGZvciBhbiBpY29uJwotbWZ0LndpbmRvd3ZpZXcoYmFzZSwgMCkJCSMgc2V0IHRoZSB2aWV3IGJ5IGljb24KLW1mdC53aW5kb3dzaXplKGJhc2UsICg2MDAsIDYwMCkpCi1mb3IgaSBpbiByYW5nZSg1MCk6Ci0JbWZ0LmxvY2F0aW9uKGYsIChyYW5kb20ucmFuZGludCgxMCwgNTkwKSwgcmFuZG9tLnJhbmRpbnQoMTAsIDU5MCkpKQotCi1tZnQud2luZG93c2l6ZShiYXNlLCAoMjAwLCA0MDApKQotbWZ0LndpbmRvd3ZpZXcoYmFzZSwgMSkJCSMgc2V0IHRoZSB2aWV3IGJ5IGljb24KLQotb3JncG9zID0gbWZ0LndpbmRvd3Bvc2l0aW9uKGJhc2UpCi1wcmludCAnQW5pbWF0ZWQgd2luZG93IGxvY2F0aW9uJwotZm9yIGkgaW4gcmFuZ2UoMTApOgotCXBvcyA9ICgxMDAraSoxMCwgMTAwK2kqMTApCi0JbWZ0LndpbmRvd3Bvc2l0aW9uKGJhc2UsIHBvcykKLQlwcmludCAnXHR3aW5kb3cgcG9zaXRpb24nLCBwb3MKLW1mdC53aW5kb3dwb3NpdGlvbihiYXNlLCBvcmdwb3MpCSMgcGFyayBpdCB3aGVyZSBpdCB3YXMgYmVmb3JligotCi1wcmludCAnUHV0IGEgY29tbWVudCBpbiBmaWxlJywgZiwgJzonCi1wcmludCAnXHQnLCBtZnQuY29tbWVudChmKQkJIyBwcmludCB0aGUgRmluZGVyIGNvbW1lbnQgdGhpcyBmaWxlIGhhcwotcyA9ICdUaGlzIGlzIGEgY29tbWVudCBubyBvbmUgcmVhZHMhJwotbWZ0LmNvbW1lbnQoZiwgcykJCQkjIHNldCB0aGUgRmluZGVyIGNvbW1lbnQKLQotIwotIwotIwl0aGUgZm9sbG93aW5nIGNvZGUgZG9lcyBub3Qgd29yayBvbiBNYWNPUyB2ZXJzaW9ucyBvbGRlciB0aGFuIE1hY09TIDkuCi0jCi0jCi0KLWlmIDA6Ci0JcHJpbnQgJ01hY09TOSBvciBiZXR0ZXIgc3BlY2lmaWMgZnVuY3Rpb25zJwotCSMgcHJvY2Vzc2VzCi0JcHIgPSBtZnQucHJvY2Vzc2VzKCkJCSMgcmV0dXJuIGEgbGlzdCBvZiB0dXBsZXMgd2l0aCAoYWN0aXZlX3Byb2Nlc3NuYW1lLCBjcmVhdG9yY29kZSkKLQlwcmludCAnUmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50IGFjdGl2ZSBwcm9jZXNzZXM6JwotCWZvciBwIGluIHByOgotCQlwcmludCAnXHQnLCBwCi0JCi0JIyBnZXQgYXR0cmlidXRlcyBvZiB0aGUgZmlyc3QgcHJvY2VzcyBpbiB0aGUgbGlzdAotCXByaW50ICdBdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBsaXN0OicKLQlwaW5mbyA9IG1mdC5wcm9jZXNzaW5mbyhwclswXVswXSkKLQlwcmludCAnXHQnLCBwclswXVswXQotCXByaW50ICdcdFx0bWVtb3J5IHBhcnRpdGlvbicsIHBpbmZvLnBhcnRpdGlvbgkJIyB0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byB0aGlzIHByb2Nlc3MKLQlwcmludCAnXHRcdG1lbW9yeSB1c2VkJywgcGluZm8udXNlZAkJCSMgdGhlIG1lbW9yeSBhY3R1YWxsIHVzZWQgYnkgdGhpcyBwcm9jZXNzCi0JcHJpbnQgJ1x0XHRpcyB2aXNpYmxlJywgcGluZm8udmlzaWJsZQkJCSMgaXMgdGhlIHByb2Nlc3MgdmlzaWJsZSB0byB0aGUgdXNlcgotCXByaW50ICdcdFx0aXMgZnJvbnRtb3N0JywgcGluZm8uZnJvbnRtb3N0CQkjIGlzIHRoZSBwcm9jZXNzIHRoZSBmcm9udCBtb3N0IG9uZT8KLQlwcmludCAnXHRcdGhhcyBzY3JpcHRpbmcnLCBwaW5mby5oYXNzY3JpcHRpbmcJCSMgaXMgdGhlIHByb2Nlc3Mgc2NyaXB0YWJsZT8KLQlwcmludCAnXHRcdGFjY2VwdHMgaGlnaCBsZXZlbCBldmVudHMnLCAJcGluZm8uYWNjZXB0aGlnaGxldmVsCSMgZG9lcyB0aGUgcHJvY2VzcyBhY2NlcHQgaGlnaCBsZXZlbCBhcHBsZWV2ZW50cz8KLXByaW50ICdEb25lLicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9NYWMvQ29udHJpYi9tb3JlZmluZGVydG9vbHMvcmVhZG1lLnR4dCBiL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIzMWFiLi4wMDAwMDAwCi0tLSBhL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaGUgbW9yZWZpbmRlcnRvb2xzIG1vZHVsZSBpcyBhbiBleHRlbnNpb24gdG8gZmluZGVydG9vbHMsIGRvbmF0ZWQgYnkgRXJpawotdmFuIEJsb2tsYW5kLCBlcmlrQGxldHRlcnJvci5jb20uIFRoZSByZWFzb24gaXQgaXMgaW5jbHVkZWQgaW4gQ29udHJpYiBpbiBzdGVhZAotb2YgaW5jb3Jwb3JhdGVkIGluIGZpbmRlcnRvb2xzIGlzIGxhY2sgb2YgdGltZSBiZWZvcmUgdGhlIHJlbGVhc2UsIGl0IHdpbGwgYmUKLWluY29ycG9yYXRlZCBpbiB0aGUgbmV4dCByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvTWFjL0xpYi9maW5kZXJ0b29scy5weSBiL01hYy9MaWIvZmluZGVydG9vbHMucHkKaW5kZXggNDVmM2U5ZTguLmRkZTMyOWEgMTAwNjQ0Ci0tLSBhL01hYy9MaWIvZmluZGVydG9vbHMucHkKKysrIGIvTWFjL0xpYi9maW5kZXJ0b29scy5weQpAQCAtMSwxNSArMSwzNSBAQAotIiIiVXRpbGl0eSByb3V0aW5lcyBkZXBlbmRpbmcgb24gdGhlIGZpbmRlci4iIiIKKyIiIlV0aWxpdHkgcm91dGluZXMgZGVwZW5kaW5nIG9uIHRoZSBmaW5kZXIsCithIGNvbWJpbmF0aW9uIG9mIGNvZGUgYnkgSmFjayBKYW5zZW4gYW5kIGVyaWtAbGV0dGVycm9yLmNvbS4KIAorTW9zdCBldmVudHMgaGF2ZSBiZWVuIGNhcHR1cmVkIGZyb20KK0xhc3NvIENhcHR1cmUgQUUgYW5kIHRoYW4gdHJhbnNsYXRlZCB0byBweXRob24gY29kZS4KKworSU1QT1JUQU5UCitOb3RlIHRoYXQgdGhlIHByb2Nlc3NlcygpIGZ1bmN0aW9uIHJldHVybnMgZGlmZmVyZW50IHZhbHVlcworZGVwZW5kaW5nIG9uIHRoZSBPUyB2ZXJzaW9uIGl0IGlzIHJ1bm5pbmcgb24uIE9uIE1hY09TIDkKK3RoZSBGaW5kZXIgcmV0dXJucyB0aGUgcHJvY2VzcyAqbmFtZXMqIHdoaWNoIGNhbiB0aGVuIGJlCit1c2VkIHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlbS4gT24gTWFjT1MgOC42IGFuZCBlYXJsaWVyCit0aGUgRmluZGVyIHJldHVybnMgYSBjb2RlIHdoaWNoIGRvZXMgbm90IHNlZW0gdG8gd29yay4KK1NvIGJvdHRvbSBsaW5lOiB0aGUgcHJvY2Vzc2VzKCkgc3R1ZmYgZG9lcyBub3Qgd29yayBvbiA8IE1hY09TOQorCitNb3N0bHkgd3JpdHRlbiBieSBlcmlrQGxldHRlcnJvci5jb20KKyIiIgogaW1wb3J0IEZpbmRlcgogaW1wb3J0IEFwcGxlRXZlbnRzCiBpbXBvcnQgYWV0b29scwogaW1wb3J0IE1hY09TCiBpbXBvcnQgc3lzCiBpbXBvcnQgbWFjZnMKK2ltcG9ydCBhZXR5cGVzCitmcm9tIHR5cGVzIGltcG9ydCAqCisKK19fdmVyc2lvbl9fID0gJzEuMScKK0Vycm9yID0gJ2ZpbmRlcnRvb2xzLkVycm9yJwogCiBfZmluZGVyX3RhbGtlciA9IE5vbmUKIAogZGVmIF9nZXRmaW5kZXIoKToKKwkiIiJyZXR1cm5zIGJhc2ljIChyZWN5Y2xhYmxlKSBGaW5kZXIgQUUgaW50ZXJmYWNlIG9iamVjdCIiIgogCWdsb2JhbCBfZmluZGVyX3RhbGtlcgogCWlmIG5vdCBfZmluZGVyX3RhbGtlcjoKIAkJX2ZpbmRlcl90YWxrZXIgPSBGaW5kZXIuRmluZGVyKCkKQEAgLTY3LDkgKzg3LDYxNSBAQAogCSIiIlJlc3RhcnQgdGhlIG1hYyIiIgogCWZpbmRlciA9IF9nZXRmaW5kZXIoKQogCWZpbmRlci5yZXN0YXJ0KCkKLQkKIAotZGVmIG1haW4oKToKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIwlBZGRpdGlvbmFsIGZpbmRlcnRvb2xzCisjCisKK2RlZiByZXZlYWwoZmlsZSk6CisJIiIiUmV2ZWFsIGEgZmlsZSBpbiB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJZnNzID0gbWFjZnMuRlNTcGVjKGZpbGUpCisJZmlsZV9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJcmV0dXJuIGZpbmRlci5yZXZlYWwoZmlsZV9hbGlhcykKKwkKK2RlZiBzZWxlY3QoZmlsZSk6CisJIiIic2VsZWN0IGEgZmlsZSBpbiB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJZnNzID0gbWFjZnMuRlNTcGVjKGZpbGUpCisJZmlsZV9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJcmV0dXJuIGZpbmRlci5zZWxlY3QoZmlsZV9hbGlhcykKKwkKK2RlZiB1cGRhdGUoZmlsZSk6CisJIiIiVXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIHRvIG1hdGNoIAorCXRoZWlyIG9uLWRpc2sgcmVwcmVzZW50YXRpb24uIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlmc3MgPSBtYWNmcy5GU1NwZWMoZmlsZSkKKwlmaWxlX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlyZXR1cm4gZmluZGVyLnVwZGF0ZShmaWxlX2FsaWFzKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMJTW9yZSBmaW5kZXJ0b29scworIworCitkZWYgY29tbWVudChvYmplY3QsIGNvbW1lbnQ9Tm9uZSk6CisJIiIiY29tbWVudDogZ2V0IG9yIHNldCB0aGUgRmluZGVyLWNvbW1lbnQgb2YgdGhlIGl0ZW0sIGRpc3BsYXllZCBpbiB0aGUgs0dldCBJbmZvsiB3aW5kb3cuIiIiCisJb2JqZWN0ID0gbWFjZnMuRlNTcGVjKG9iamVjdCkKKwlmc3MgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQorCW9iamVjdF9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJaWYgY29tbWVudCA9PSBOb25lOgorCQlyZXR1cm4gX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKQorCWVsc2U6CisJCXJldHVybiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1lbnQpCisJCitkZWYgX3NldGNvbW1lbnQob2JqZWN0X2FsaWFzLCBjb21tZW50KToKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQnKSwgZnI9YWVvYmpfMDApCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKwlhcmdzWyJkYXRhIl0gPSBjb21tZW50CisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKToKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQnKSwgZnI9YWVvYmpfMDApCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIwlHZXQgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcm9jZXNzZXMgaW4gdGhlIEZpbmRlci4KKworZGVmIHByb2Nlc3NlcygpOgorCSIiInByb2Nlc3NlcyByZXR1cm5zIGEgbGlzdCBvZiBhbGwgYWN0aXZlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoaXMgY29tcHV0ZXIgYW5kIHRoZWlyIGNyZWF0b3JzLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlwcm9jZXNzbmFtZXMgPSBbXQorCXByb2Nlc3NudW1iZXJzID0gW10KKwljcmVhdG9ycyA9IFtdCisJcGFydGl0aW9ucyA9IFtdCisJdXNlZCA9IFtdCisJIyMgZ2V0IHRoZSBwcm9jZXNzbmFtZXMgb3IgZWxzZSB0aGUgcHJvY2Vzc251bWJlcnMKKwlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJjcycpLCBmb3JtPSJpbmR4Iiwgc2VsZD1hZXR5cGVzLlVua25vd24oJ2Fic28nLCAiYWxsICIpLCBmcj1Ob25lKQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJcCA9IFtdCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXAgPSAgYXJnc1snLS0tLSddCisJCWZvciBwcm9jIGluIHA6CisJCQlpZiBoYXNhdHRyKHByb2MsICdzZWxkJyk6CisJCQkJIyBpdCBoYXMgYSByZWFsIG5hbWUKKwkJCQlwcm9jZXNzbmFtZXMuYXBwZW5kKHByb2Muc2VsZCkKKwkJCWVsaWYgaGFzYXR0cihwcm9jLCAndHlwZScpOgorCQkJCWlmIHByb2MudHlwZSA9PSAicHNuICI6CisJCQkJCSMgaXQgaGFzIGEgcHJvY2VzcyBudW1iZXIKKwkJCQkJcHJvY2Vzc251bWJlcnMuYXBwZW5kKHByb2MuZGF0YSkKKwkjIyBnZXQgdGhlIGNyZWF0b3JzCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJjcycpLCBmb3JtPSJpbmR4Iiwgc2VsZD1hZXR5cGVzLlVua25vd24oJ2Fic28nLCAiYWxsICIpLCBmcj1Ob25lKQorCWFyZ3NbJy0tLS0nXSA9ICBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2ZjcnQnKSwgZnI9YWVvYmpfMCkKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJnKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlwID0gIGFyZ3NbJy0tLS0nXQorCQljcmVhdG9ycyA9IHBbOl0KKwkjIyBjb25jYXRlbmF0ZSBpbiBvbmUgZGljdAorCXJlc3VsdCA9IFtdCisJaWYgbGVuKHByb2Nlc3NuYW1lcykgPiBsZW4ocHJvY2Vzc251bWJlcnMpOgorCQlkYXRhID0gcHJvY2Vzc25hbWVzCisJZWxzZToKKwkJZGF0YSA9IHByb2Nlc3NudW1iZXJzCisJZm9yIGkgaW4gcmFuZ2UobGVuKGNyZWF0b3JzKSk6CisJCXJlc3VsdC5hcHBlbmQoKGRhdGFbaV0sIGNyZWF0b3JzW2ldKSkKKwlyZXR1cm4gcmVzdWx0CisKK2NsYXNzIF9wcm9jZXNzOgorCXBhc3MKKworZGVmIGlzYWN0aXZlcHJvY2Vzcyhwcm9jZXNzbmFtZSk6CisJIiIiQ2hlY2sgb2YgcHJvY2Vzc25hbWUgaXMgYWN0aXZlLiBNYWNPUzkiIiIKKwlhbGwgPSBwcm9jZXNzZXMoKQorCW9rID0gMAorCWZvciBuLCBjIGluIGFsbDoKKwkJaWYgbiA9PSBwcm9jZXNzbmFtZToKKwkJCXJldHVybiAxCisJcmV0dXJuIDAKKwkKK2RlZiBwcm9jZXNzaW5mbyhwcm9jZXNzbmFtZSk6CisJIiIiUmV0dXJuIGFuIG9iamVjdCB3aXRoIGFsbCBwcm9jZXNzIHByb3BlcnRpZXMgYXMgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc25hbWUuIE1hY09TOSIiIgorCXAgPSBfcHJvY2VzcygpCisJCisJaWYgcHJvY2Vzc25hbWUgPT0gIkZpbmRlciI6CisJCXAucGFydGl0aW9uID0gTm9uZQorCQlwLnVzZWQgPSBOb25lCisJZWxzZToKKwkJcC5wYXJ0aXRpb24gPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnYXBwdCcpCisJCXAudXNlZCA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwdXNkJykKKwlwLnZpc2libGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHZpcycpCQkjSXMgdGhlIHByb2Nlc3MnIGxheWVyIHZpc2libGU/CisJcC5mcm9udG1vc3QgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncGlzZicpCSNJcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnRtb3N0IHByb2Nlc3M/CisJcC5maWxlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2ZpbGUnKQkJCSN0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzIHdhcyBsYXVuY2hlZAorCXAuZmlsZXR5cGUgID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2FzdHknKQkJI3RoZSBPU1R5cGUgb2YgdGhlIGZpbGUgdHlwZSBvZiB0aGUgcHJvY2VzcworCXAuY3JlYXRvcnR5cGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnZmNydCcpCSN0aGUgT1NUeXBlIG9mIHRoZSBjcmVhdG9yIG9mIHRoZSBwcm9jZXNzICh0aGUgc2lnbmF0dXJlKQorCXAuYWNjZXB0aGlnaGxldmVsID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3JldnQnKQkjSXMgdGhlIHByb2Nlc3MgaGlnaC1sZXZlbCBldmVudCBhd2FyZSAoYWNjZXB0cyBvcGVuIGFwcGxpY2F0aW9uLCBvcGVuIGRvY3VtZW50LCBwcmludCBkb2N1bWVudCwgYW5kIHF1aXQpPworCXAuaGFzc2NyaXB0aW5nID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2hzY3InKQkJI0RvZXMgdGhlIHByb2Nlc3MgaGF2ZSBhIHNjcmlwdGluZyB0ZXJtaW5vbG9neSwgaS5lLiwgY2FuIGl0IGJlIHNjcmlwdGVkPworCXJldHVybiBwCisJCitkZWYgX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgcHJvcGVydHkpOgorCSIiInJldHVybiB0aGUgcGFydGl0aW9uIHNpemUgYW5kIG1lbW9yeSB1c2VkIGZvciBwcm9jZXNzbmFtZSIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09Im5hbWUiLCBzZWxkPXByb2Nlc3NuYW1lLCBmcj1Ob25lKQorCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKHByb3BlcnR5KSwgZnI9YWVvYmpfMDApCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIwlNZXNzIGFyb3VuZCB3aXRoIEZpbmRlciB3aW5kb3dzLgorCQorZGVmIG9wZW53aW5kb3cob2JqZWN0KToKKwkiIiJPcGVuIGEgRmluZGVyIHdpbmRvdyBmb3Igb2JqZWN0LCBTcGVjaWZ5IG9iamVjdCBieSBuYW1lIG9yIGZzc3BlYy4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlvYmplY3QgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQorCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJX2NvZGUgPSAnYWV2dCcKKwlfc3ViY29kZSA9ICdvZG9jJworCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMAorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCQorZGVmIGNsb3Nld2luZG93KG9iamVjdCk6CisJIiIiQ2xvc2UgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIsIFNwZWNpZnkgYnkgcGF0aC4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlmc3MgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQorCW9iamVjdF9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCV9jb2RlID0gJ2NvcmUnCisJX3N1YmNvZGUgPSAnY2xvcycKKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKworZGVmIGxvY2F0aW9uKG9iamVjdCwgcG9zPU5vbmUpOgorCSIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgorCUlmIHBvcz1Ob25lLCBsb2NhdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LiIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlpZiBub3QgcG9zOgorCQlyZXR1cm4gX2dldGxvY2F0aW9uKG9iamVjdF9hbGlhcykKKwlyZXR1cm4gX3NldGxvY2F0aW9uKG9iamVjdF9hbGlhcywgcG9zKQorCQorZGVmIF9zZXRsb2NhdGlvbihvYmplY3RfYWxpYXMsICh4LCB5KSk6CisJIiIiX3NldGxvY2F0aW9uOiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpY29uIGZvciB0aGUgb2JqZWN0LiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8wMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorCWFyZ3NbImRhdGEiXSA9IFt4LCB5XQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJzZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJcmV0dXJuICh4LHkpCisJCitkZWYgX2dldGxvY2F0aW9uKG9iamVjdF9hbGlhcyk6CisJIiIiX2dldGxvY2F0aW9uOiBnZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpY29uIGZvciB0aGUgb2JqZWN0LiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8wMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXBvcyA9IGFyZ3NbJy0tLS0nXQorCQlyZXR1cm4gcG9zLmgsIHBvcy52CisKK2RlZiBsYWJlbChvYmplY3QsIGluZGV4PU5vbmUpOgorCSIiImxhYmVsOiBzZXQgb3IgZ2V0IHRoZSBsYWJlbCBvZiB0aGUgaXRlbS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLiIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlpZiBpbmRleCA9PSBOb25lOgorCQlyZXR1cm4gX2dldGxhYmVsKG9iamVjdF9hbGlhcykKKwlpZiBpbmRleCA8IDAgb3IgaW5kZXggPiA3OgorCQlpbmRleCA9IDAKKwlyZXR1cm4gX3NldGxhYmVsKG9iamVjdF9hbGlhcywgaW5kZXgpCisJCitkZWYgX2dldGxhYmVsKG9iamVjdF9hbGlhcyk6CisJIiIibGFiZWw6IEdldCB0aGUgbGFiZWwgZm9yIHRoZSBvYmplY3QuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdsYWJpJyksIGZyPWFlb2JqXzAwKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX3NldGxhYmVsKG9iamVjdF9hbGlhcywgaW5kZXgpOgorCSIiImxhYmVsOiBTZXQgdGhlIGxhYmVsIGZvciB0aGUgb2JqZWN0LiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlfY29kZSA9ICdjb3JlJworCV9zdWJjb2RlID0gJ3NldGQnCisJYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCisJCQlmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2xhYmknKSwgZnI9YWVvYmpfMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8xCisJYXJnc1siZGF0YSJdID0gaW5kZXgKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlyZXR1cm4gaW5kZXgKKworZGVmIHdpbmRvd3ZpZXcoZm9sZGVyLCB2aWV3PU5vbmUpOgorCSIiIndpbmRvd3ZpZXc6IFNldCB0aGUgdmlldyBvZiB0aGUgd2luZG93IGZvciB0aGUgZm9sZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCisJMCA9IGJ5IGljb24gKGRlZmF1bHQpCisJMSA9IGJ5IG5hbWUKKwkyID0gYnkgYnV0dG9uCisJIiIiCisJZnNzID0gbWFjZnMuRlNTcGVjKGZvbGRlcikKKwlmb2xkZXJfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCWlmIHZpZXcgPT0gTm9uZToKKwkJcmV0dXJuIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcykKKwlyZXR1cm4gX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3KQorCQorZGVmIF9zZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcywgdmlldz0wKToKKwkiIiJzZXQgdGhlIHdpbmRvd3ZpZXciIiIKKwlhdHRycyA9IHt9CisJYXJncyA9IHt9CisJaWYgdmlldyA9PSAxOgorCQlfdiA9IGFldHlwZXMuVHlwZSgncG5hbScpCisJZWxpZiB2aWV3ID09IDI6CisJCV92ID0gYWV0eXBlcy5UeXBlKCdsZ2J1JykKKwllbHNlOgorCQlfdiA9IGFldHlwZXMuVHlwZSgnaWltZycpCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCisJCQlmb3JtID0gJ2FsaXMnLCBzZWxkID0gZm9sZGVyX2FsaWFzLCBmcj1Ob25lKQorCWFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybSA9ICdwcm9wJywgc2VsZCA9IGFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQorCWFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybSA9ICdwcm9wJywgc2VsZCA9IGFldHlwZXMuVHlwZSgncHZldycpLCBmcj1hZW9ial8xKQorCWFlb2JqXzMgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybSA9ICdwcm9wJywgc2VsZCA9IF92LCBmcj1Ob25lKQorCV9jb2RlID0gJ2NvcmUnCisJX3N1YmNvZGUgPSAnc2V0ZCcKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8yCisJYXJnc1snZGF0YSddID0gYWVvYmpfMworCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiBfZ2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMpOgorCSIiImdldCB0aGUgd2luZG93dmlldyIiIgorCWF0dHJzID0ge30KKwlhcmdzID0ge30KKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMDApCisJYWVvYmpfMDIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B2ZXcnKSwgZnI9YWVvYmpfMDEpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDIKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCXZpZXdzID0geydpaW1nJzowLCAncG5hbSc6MSwgJ2xnYnUnOjJ9CisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiB2aWV3c1thcmdzWyctLS0tJ10uZW51bV0KKworZGVmIHdpbmRvd3NpemUoZm9sZGVyLCBzaXplPU5vbmUpOgorCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBzaXplPSh3LCBoKSwgU3BlY2lmeSBieSBwYXRoLgorCUlmIHNpemU9Tm9uZSwgd2luZG93c2l6ZSB3aWxsIHJldHVybiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSB3aW5kb3cuCisJU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgorCSIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhmb2xkZXIpCisJZm9sZGVyX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlvcGVud2luZG93KGZzcykKKwlpZiBub3Qgc2l6ZToKKwkJcmV0dXJuIF9nZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcykKKwlyZXR1cm4gX3NldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzLCBzaXplKQorCQorZGVmIF9zZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcywgKHcsIGgpKToKKwkiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCV9jb2RlID0gJ2NvcmUnCisJX3N1YmNvZGUgPSAnc2V0ZCcKKwlhZXZhcjAwID0gW3csIGhdCisJYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksCisJCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisJYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMgorCWFyZ3NbImRhdGEiXSA9IGFldmFyMDAKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlyZXR1cm4gKHcsIGgpCisJCQorZGVmIF9nZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcyk6CisJIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvICh3LCBoKSIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCisJCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisJYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMgorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIHdpbmRvd3Bvc2l0aW9uKGZvbGRlciwgcG9zPU5vbmUpOgorCSIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4iIiIKKwlmc3MgPSBtYWNmcy5GU1NwZWMoZm9sZGVyKQorCWZvbGRlcl9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJb3BlbndpbmRvdyhmc3MpCisJaWYgbm90IHBvczoKKwkJcmV0dXJuIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMpCisJaWYgdHlwZShwb3MpID09IEluc3RhbmNlVHlwZToKKwkJIyBwb3MgbWlnaHQgYmUgYSBRRFBvaW50IG9iamVjdCBhcyByZXR1cm5lZCBieSBfZ2V0d2luZG93cG9zaXRpb24KKwkJcG9zID0gKHBvcy5oLCBwb3MudikKKwlyZXR1cm4gX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgcG9zKQorCQkJCitkZWYgX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgKHgsIHkpKToKKwkiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCisJCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisJYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMgorCWFyZ3NbImRhdGEiXSA9IFt4LCB5XQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdzZXRkJywgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMpOgorCSIiIkdldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciwgU3BlY2lmeSBieSBwYXRoLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCisJCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisJYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMgorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIGljb24ob2JqZWN0LCBpY29uZGF0YT1Ob25lKToKKwkiIiJpY29uIHNldHMgdGhlIGljb24gb2Ygb2JqZWN0LCBpZiBubyBpY29uZGF0YSBpcyBnaXZlbiwKKwlpY29uIHdpbGwgcmV0dXJuIGFuIEFFIG9iamVjdCB3aXRoIGJpbmFyeSBkYXRhIGZvciB0aGUgY3VycmVudCBpY29uLgorCUlmIGxlZnQgdW50b3VjaGVkLCB0aGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gcGFzdGUgdGhlIGljb24gb24gYW5vdGhlciBmaWxlLgorCURldmVsb3BtZW50IG9wcG9ydHVuaXR5OiBnZXQgYW5kIHNldCB0aGUgZGF0YSBhcyBQSUNULiIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlpZiBpY29uZGF0YSA9PSBOb25lOgorCQlyZXR1cm4gX2dldGljb24ob2JqZWN0X2FsaWFzKQorCXJldHVybiBfc2V0aWNvbihvYmplY3RfYWxpYXMsIGljb25kYXRhKQorCQorZGVmIF9nZXRpY29uKG9iamVjdF9hbGlhcyk6CisJIiIiZ2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LiBCaW5hcnkgZGF0YSBvZiBzb21lIHNvcnQuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgCisJCQlmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKKwkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnaWltZycpLCBmcj1hZW9ial8wMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIF9zZXRpY29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpOgorCSIiInNldCB0aGUgaWNvbmRhdGEgZm9yIG9iamVjdCwgZm9ybWF0dGVkIGFzIHByb2R1Y2VkIGJ5IF9nZXRpY29uKCkiIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCAKKwkJCWZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisJYXJnc1siZGF0YSJdID0gaWNvbmRhdGEKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddLmRhdGEKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCVZvbHVtZXMgYW5kIHNlcnZlcnMuCisJCitkZWYgbW91bnR2b2x1bWUodm9sdW1lLCBzZXJ2ZXI9Tm9uZSwgdXNlcm5hbWU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6CisJIiIibW91bnQgYSB2b2x1bWUsIGxvY2FsIG9yIG9uIGEgc2VydmVyIG9uIEFwcGxlVGFsay4KKwlOb3RlOiBtb3VudGluZyBhIEFTSVAgc2VydmVyIHJlcXVpcmVzIGEgZGlmZmVyZW50IG9wZXJhdGlvbi4KKwlzZXJ2ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZlciB3aGVyZSB0aGUgdm9sdW1lIGJlbG9uZ3MKKwl1c2VybmFtZSwgcGFzc3dvcmQgYmVsb25nIHRvIGEgcmVnaXN0ZXJlZCB1c2VyIG9mIHRoZSB2b2x1bWUuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWlmIHBhc3N3b3JkOgorCQlhcmdzWyJQQVNTIl0gPSBwYXNzd29yZAorCWlmIHVzZXJuYW1lOgorCQlhcmdzWyJVU0VSIl0gPSB1c2VybmFtZQorCWlmIHNlcnZlcjoKKwkJYXJnc1siU1JWUiJdID0gc2VydmVyCisJYXJnc1snLS0tLSddID0gdm9sdW1lCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJhZXZ0IiwgIm12b2wiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgdW5tb3VudHZvbHVtZSh2b2x1bWUpOgorCSIiInVubW91bnQgYSB2b2x1bWUgdGhhdCdzIG9uIHRoZSBkZXNrdG9wIiIiCisJcHV0YXdheSh2b2x1bWUpCisJCitkZWYgcHV0YXdheShvYmplY3QpOgorCSIiInB1dGggdGhlIG9iamVjdCBhd2F5LCB3aGVyZWV2ZXIgaXQgY2FtZSBmcm9tLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2RpcycpLCBmb3JtPSJuYW1lIiwgc2VsZD1vYmplY3QsIGZyPU5vbmUpCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IHRhbGtlci5zZW5kKCJmbmRyIiwgInB0d3kiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMJTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMKKyMKKworZGVmIHZvbHVtZWxldmVsKGxldmVsKToKKwkiIiJzZXQgdGhlIGF1ZGlvIG91dHB1dCBsZXZlbCwgcGFyYW1ldGVyIGJldHdlZW4gMCAoc2lsZW50KSBhbmQgNyAoZnVsbCBibGFzdCkiIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJaWYgbGV2ZWwgPCAwOgorCQlsZXZlbCA9IDAKKwllbGlmIGxldmVsID4gNzoKKwkJbGV2ZWwgPSA3CisJYXJnc1snLS0tLSddID0gbGV2ZWwKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImFldnQiLCAic3R2bCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiBPU3ZlcnNpb24oKToKKwkiIiJyZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHN5c3RlbSBzb2Z0d2FyZSIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgndmVyMicpLCBmcj1Ob25lKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAwCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgZmlsZXNoYXJpbmcoKToKKwkiIiJyZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGZpbGVzaGFyaW5nIGFuZCB3aGV0aGVyIGl0IGlzIHN0YXJ0aW5nIHVwIG9yIG5vdDoKKwkJLTEJZmlsZSBzaGFyaW5nIGlzIG9mZiBhbmQgbm90IHN0YXJ0aW5nIHVwCisJCTAJZmlsZSBzaGFyaW5nIGlzIG9mZiBhbmQgc3RhcnRpbmcgdXAKKwkJMQlmaWxlIHNoYXJpbmcgaXMgb24iIiIKKwlzdGF0dXMgPSAtMQorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCSMgc2VlIGlmIGl0IGlzIG9uCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZnNocicpLCBmcj1Ob25lKQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCWlmIGFyZ3NbJy0tLS0nXSA9PSAwOgorCQkJc3RhdHVzID0gLTEKKwkJZWxzZToKKwkJCXN0YXR1cyA9IDEKKwkjIGlzIGl0IHN0YXJ0aW5nIHVwIHBlcmNoYW5jZT8KKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmc3VwJyksIGZyPU5vbmUpCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJaWYgYXJnc1snLS0tLSddID09IDE6CisJCQlzdGF0dXMgPSAwCisJcmV0dXJuIHN0YXR1cworCQorZGVmIG1vdmV0b3RyYXNoKHBhdGgpOgorCSIiIm1vdmUgdGhlIG9iamVjdCB0byB0aGUgdHJhc2giIiIKKwlmc3MgPSBtYWNmcy5GU1NwZWMocGF0aCkKKwl0cmFzaGZvbGRlciA9IG1hY2ZzLkZTU3BlYyhtYWNmcy5GaW5kRm9sZGVyKGZzcy5hc190dXBsZSgpWzBdLCAndHJzaCcsIDApICsgKCIiLCkpLmFzX3BhdGhuYW1lKCkKKwlmaW5kZXJ0b29scy5tb3ZlKHBhdGgsIHRyYXNoZm9sZGVyKQorCitkZWYgZW1wdHl0cmFzaCgpOgorCSIiImVtcHR5IHRoZSB0cmFzaCIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Ryc2gnKSwgZnI9Tm9uZSkKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImZuZHIiLCAiZW1wdCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisKKworZGVmIF90ZXN0KCk6CisJcHJpbnQgJ09yaWdpbmFsIGZpbmRlcnRvb2xzIGZ1bmN0aW9uYWxpdHkgdGVzdC4uLicKIAlwcmludCAnVGVzdGluZyBsYXVuY2guLi4nCiAJZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoJ0ZpbGUgdG8gbGF1bmNoOicpCiAJaWYgb2s6CkBAIC0xMjgsNyArNzU0LDgwIEBACiAJCQlwcmludCAnUmVzdWx0OicsIHJlc3VsdAogCQlwcmludCAnUHJlc3MgcmV0dXJuLScsCiAJCXN5cy5zdGRpbi5yZWFkbGluZSgpCi0JCQorCitkZWYgX3Rlc3QyKCk6CisJcHJpbnQgJ1xubW9yZWZpbmRlcnRvb2xzIHZlcnNpb24gJXNcblRlc3RzIGNvbWluZyB1cIonICVfX3ZlcnNpb25fXworCWltcG9ydCBvcworCWltcG9ydCByYW5kb20KKworCSMgbWlzY2VsbGFuZW91cworCXByaW50ICdcdGZpbGVzaGFyaW5nIG9uPycsCWZpbGVzaGFyaW5nKCkJCSMgaXMgZmlsZSBzaGFyaW5nIG9uLCBvZmYsIHN0YXJ0aW5nIHVwPworCXByaW50ICdcdE9TIHZlcnNpb24nLCAJCU9TdmVyc2lvbigpCQkjIHRoZSB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0gc29mdHdhcmUKKworCSMgc2V0IHRoZSBzb3VuZHZvbHVtZSBpbiBhIHNpbXBsZSB3YXkKKwlwcmludCAnXHRTeXN0ZW0gYmVlcCB2b2x1bWUnCisJZm9yIGkgaW4gcmFuZ2UoMCwgNyk6CisJCXZvbHVtZWxldmVsKGkpCQkKKwkJTWFjT1MuU3lzQmVlcCgpCisKKwkjIEZpbmRlcidzIHdpbmRvd3MsIGZpbGUgbG9jYXRpb24sIGZpbGUgYXR0cmlidXRlcworCW9wZW4oIkBmaW5kZXJ0b29sc3Rlc3QiLCAidyIpCisJZiA9IG1hY2ZzLkZTU3BlYygiQGZpbmRlcnRvb2xzdGVzdCIpLmFzX3BhdGhuYW1lKCkKKwlyZXZlYWwoZikJCQkJIyByZXZlYWwgdGhpcyBmaWxlIGluIGEgRmluZGVyIHdpbmRvdworCXNlbGVjdChmKQkJCQkjIHNlbGVjdCB0aGlzIGZpbGUKKworCWJhc2UsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGYpCisJY2xvc2V3aW5kb3coYmFzZSkJIyBjbG9zZSB0aGUgd2luZG93IHRoaXMgZmlsZSBpcyBpbgkob3BlbmVkIGJ5IHJldmVhbCkKKwlvcGVud2luZG93KGJhc2UpCQkjIG9wZW4gaXQgYWdhaW4KKwl3aW5kb3d2aWV3KGJhc2UsIDEpCSMgc2V0IHRoZSB2aWV3IGJ5IGxpc3QKKworCWxhYmVsKGYsIDIpCQkJCSMgc2V0IHRoZSBsYWJlbCBvZiB0aGlzIGZpbGUgdG8gc29tZXRoaW5nIG9yYW5nZQorCXByaW50ICdcdGxhYmVsJywgbGFiZWwoZikJIyBnZXQgdGhlIGxhYmVsIG9mIHRoaXMgZmlsZQorCisJIyB0aGUgZmlsZSBsb2NhdGlvbiBvbmx5IHdvcmtzIGluIGEgd2luZG93IHdpdGggaWNvbiB2aWV3IQorCXByaW50ICdSYW5kb20gbG9jYXRpb25zIGZvciBhbiBpY29uJworCXdpbmRvd3ZpZXcoYmFzZSwgMCkJCSMgc2V0IHRoZSB2aWV3IGJ5IGljb24KKwl3aW5kb3dzaXplKGJhc2UsICg2MDAsIDYwMCkpCisJZm9yIGkgaW4gcmFuZ2UoNTApOgorCQlsb2NhdGlvbihmLCAocmFuZG9tLnJhbmRpbnQoMTAsIDU5MCksIHJhbmRvbS5yYW5kaW50KDEwLCA1OTApKSkKKworCXdpbmRvd3NpemUoYmFzZSwgKDIwMCwgNDAwKSkKKwl3aW5kb3d2aWV3KGJhc2UsIDEpCQkjIHNldCB0aGUgdmlldyBieSBpY29uCisKKwlvcmdwb3MgPSB3aW5kb3dwb3NpdGlvbihiYXNlKQorCXByaW50ICdBbmltYXRlZCB3aW5kb3cgbG9jYXRpb24nCisJZm9yIGkgaW4gcmFuZ2UoMTApOgorCQlwb3MgPSAoMTAwK2kqMTAsIDEwMCtpKjEwKQorCQl3aW5kb3dwb3NpdGlvbihiYXNlLCBwb3MpCisJCXByaW50ICdcdHdpbmRvdyBwb3NpdGlvbicsIHBvcworCXdpbmRvd3Bvc2l0aW9uKGJhc2UsIG9yZ3BvcykJIyBwYXJrIGl0IHdoZXJlIGl0IHdhcyBiZWZvcmWKCisKKwlwcmludCAnUHV0IGEgY29tbWVudCBpbiBmaWxlJywgZiwgJzonCisJcHJpbnQgJ1x0JywgY29tbWVudChmKQkJIyBwcmludCB0aGUgRmluZGVyIGNvbW1lbnQgdGhpcyBmaWxlIGhhcworCXMgPSAnVGhpcyBpcyBhIGNvbW1lbnQgbm8gb25lIHJlYWRzIScKKwljb21tZW50KGYsIHMpCQkJIyBzZXQgdGhlIEZpbmRlciBjb21tZW50CisJCitkZWYgX3Rlc3QzKCk6CisJcHJpbnQgJ01hY09TOSBvciBiZXR0ZXIgc3BlY2lmaWMgZnVuY3Rpb25zJworCSMgcHJvY2Vzc2VzCisJcHIgPSBwcm9jZXNzZXMoKQkJIyByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyB3aXRoIChhY3RpdmVfcHJvY2Vzc25hbWUsIGNyZWF0b3Jjb2RlKQorCXByaW50ICdSZXR1cm4gYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIHByb2Nlc3NlczonCisJZm9yIHAgaW4gcHI6CisJCXByaW50ICdcdCcsIHAKKwkKKwkjIGdldCBhdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBsaXN0CisJcHJpbnQgJ0F0dHJpYnV0ZXMgb2YgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIGxpc3Q6JworCXBpbmZvID0gcHJvY2Vzc2luZm8ocHJbMF1bMF0pCisJcHJpbnQgJ1x0JywgcHJbMF1bMF0KKwlwcmludCAnXHRcdG1lbW9yeSBwYXJ0aXRpb24nLCBwaW5mby5wYXJ0aXRpb24JCSMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhpcyBwcm9jZXNzCisJcHJpbnQgJ1x0XHRtZW1vcnkgdXNlZCcsIHBpbmZvLnVzZWQJCQkjIHRoZSBtZW1vcnkgYWN0dWFsbCB1c2VkIGJ5IHRoaXMgcHJvY2VzcworCXByaW50ICdcdFx0aXMgdmlzaWJsZScsIHBpbmZvLnZpc2libGUJCQkjIGlzIHRoZSBwcm9jZXNzIHZpc2libGUgdG8gdGhlIHVzZXIKKwlwcmludCAnXHRcdGlzIGZyb250bW9zdCcsIHBpbmZvLmZyb250bW9zdAkJIyBpcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnQgbW9zdCBvbmU/CisJcHJpbnQgJ1x0XHRoYXMgc2NyaXB0aW5nJywgcGluZm8uaGFzc2NyaXB0aW5nCQkjIGlzIHRoZSBwcm9jZXNzIHNjcmlwdGFibGU/CisJcHJpbnQgJ1x0XHRhY2NlcHRzIGhpZ2ggbGV2ZWwgZXZlbnRzJywgCXBpbmZvLmFjY2VwdGhpZ2hsZXZlbAkjIGRvZXMgdGhlIHByb2Nlc3MgYWNjZXB0IGhpZ2ggbGV2ZWwgYXBwbGVldmVudHM/CisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisJX3Rlc3QoKQorCV90ZXN0MigpCisJX3Rlc3QzKCkKIAkK