From: James C. <ly...@gm...> - 2007-11-27 00:07:28
|
SW5kZXg6IHMzY21kL3RydW5rL3MzY21kDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gczNjbWQvdHJ1 bmsvczNjbWQJKHJldmlzaW9uIDE1NikNCisrKyBzM2NtZC90cnVuay9zM2NtZAkod29ya2lu ZyBjb3B5KQ0KQEAgLTEsNzQ5ICsxLDc3NCBAQA0KLSMhL3Vzci9iaW4vZW52IHB5dGhvbgot Ci0jIyBBbWF6b24gUzMgbWFuYWdlcgotIyMgQXV0aG9yOiBNaWNoYWwgTHVkdmlnIDxtaWNo YWxAbG9naXguY3o+Ci0jIyAgICAgICAgIGh0dHA6Ly93d3cubG9naXguY3ovbWljaGFsCi0j IyBMaWNlbnNlOiBHUEwgVmVyc2lvbiAyCi0KLWltcG9ydCBzeXMKLWltcG9ydCBsb2dnaW5n Ci1pbXBvcnQgdGltZQotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBlcnJubwotaW1w b3J0IHB3ZCwgZ3JwCi0KLWZyb20gY29weSBpbXBvcnQgY29weQotZnJvbSBvcHRwYXJzZSBp bXBvcnQgT3B0aW9uUGFyc2VyLCBPcHRpb24sIE9wdGlvblZhbHVlRXJyb3IsIEluZGVudGVk SGVscEZvcm1hdHRlcgotZnJvbSBsb2dnaW5nIGltcG9ydCBkZWJ1ZywgaW5mbywgd2Fybmlu ZywgZXJyb3IKLWZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUK LQotIyMgT3VyIG1vZHVsZXMKLWZyb20gUzMgaW1wb3J0IFBrZ0luZm8KLWZyb20gUzMuUzMg aW1wb3J0ICoKLWZyb20gUzMuQ29uZmlnIGltcG9ydCBDb25maWcKLWZyb20gUzMuUzNVcmkg aW1wb3J0ICoKLWZyb20gUzMgaW1wb3J0IFV0aWxzCi0KLQotZGVmIG91dHB1dChtZXNzYWdl KToKLQlwcmludCBtZXNzYWdlCi0KLWRlZiBjaGVja19hcmdzX3R5cGUoYXJncywgdHlwZSwg dmVyYm9zZV90eXBlKToKLQlmb3IgYXJnIGluIGFyZ3M6Ci0JCWlmIFMzVXJpKGFyZykudHlw ZSAhPSB0eXBlOgotCQkJcmFpc2UgUGFyYW1ldGVyRXJyb3IoIkV4cGVjdGluZyAlcyBpbnN0 ZWFkIG9mICclcyciICUgKHZlcmJvc2VfdHlwZSwgYXJnKSkKLQotZGVmIGNtZF9kdShhcmdz KToKLQlzMyA9IFMzKENvbmZpZygpKQotCWlmIGxlbihhcmdzKSA+IDA6Ci0JCXVyaSA9IFMz VXJpKGFyZ3NbMF0pCi0JCWlmIHVyaS50eXBlID09ICJzMyIgYW5kIHVyaS5oYXNfYnVja2V0 KCk6Ci0JCQlzdWJjbWRfYnVja2V0X3VzYWdlKHMzLCB1cmkpCi0JCQlyZXR1cm4KLQlzdWJj bWRfYnVja2V0X3VzYWdlX2FsbChzMykKLQotZGVmIHN1YmNtZF9idWNrZXRfdXNhZ2VfYWxs KHMzKToKLQlyZXNwb25zZSA9IHMzLmxpc3RfYWxsX2J1Y2tldHMoKQotCi0JYnVja2V0c19z aXplID0gMAotCWZvciBidWNrZXQgaW4gcmVzcG9uc2VbImxpc3QiXToKLQkJc2l6ZSA9IHN1 YmNtZF9idWNrZXRfdXNhZ2UoczMsIFMzVXJpKCJzMzovLyIgKyBidWNrZXRbIk5hbWUiXSkp Ci0JCWlmIHNpemUgIT0gTm9uZToKLQkJCWJ1Y2tldHNfc2l6ZSArPSBzaXplCi0JdG90YWxf c2l6ZSwgc2l6ZV9jb2VmZiA9IGZvcm1hdFNpemUoYnVja2V0c19zaXplLCBDb25maWcoKS5o dW1hbl9yZWFkYWJsZV9zaXplcykKLQl0b3RhbF9zaXplX3N0ciA9IHN0cih0b3RhbF9zaXpl KSArIHNpemVfY29lZmYgCi0Jb3V0cHV0KCIiLnJqdXN0KDgsICItIikpCi0Jb3V0cHV0KCIl cyBUb3RhbCIgJSAodG90YWxfc2l6ZV9zdHIubGp1c3QoOCkpKQotCi1kZWYgc3ViY21kX2J1 Y2tldF91c2FnZShzMywgdXJpKToKLQlidWNrZXQgPSB1cmkuYnVja2V0KCkKLQlvYmplY3Qg PSB1cmkub2JqZWN0KCkKLQotCWlmIG9iamVjdC5lbmRzd2l0aCgnKicpOgotCQlvYmplY3Qg PSBvYmplY3RbOi0xXQotCXRyeToKLQkJcmVzcG9uc2UgPSBzMy5idWNrZXRfbGlzdChidWNr ZXQsIHByZWZpeCA9IG9iamVjdCkKLQlleGNlcHQgUzNFcnJvciwgZToKLQkJaWYgUzMuY29k ZXMuaGFzX2tleShlLkNvZGUpOgotCQkJZXJyb3IoUzMuY29kZXNbZS5Db2RlXSAlIGJ1Y2tl dCkKLQkJCXJldHVybgotCQllbHNlOgotCQkJcmFpc2UKLQlidWNrZXRfc2l6ZSA9IDAKLQlm b3Igb2JqZWN0IGluIHJlc3BvbnNlWyJsaXN0Il06Ci0JCXNpemUsIHNpemVfY29lZmYgPSBm b3JtYXRTaXplKG9iamVjdFsiU2l6ZSJdLCBGYWxzZSkKLQkJYnVja2V0X3NpemUgKz0gc2l6 ZQotCXRvdGFsX3NpemUsIHNpemVfY29lZmYgPSBmb3JtYXRTaXplKGJ1Y2tldF9zaXplLCBD b25maWcoKS5odW1hbl9yZWFkYWJsZV9zaXplcykKLQl0b3RhbF9zaXplX3N0ciA9IHN0cih0 b3RhbF9zaXplKSArIHNpemVfY29lZmYgCi0Jb3V0cHV0KCIlcyAlcyIgJSAodG90YWxfc2l6 ZV9zdHIubGp1c3QoOCksIHVyaSkpCi0JcmV0dXJuIGJ1Y2tldF9zaXplCi0KLWRlZiBjbWRf bHMoYXJncyk6Ci0JczMgPSBTMyhDb25maWcoKSkKLQlpZiBsZW4oYXJncykgPiAwOgotCQl1 cmkgPSBTM1VyaShhcmdzWzBdKQotCQlpZiB1cmkudHlwZSA9PSAiczMiIGFuZCB1cmkuaGFz X2J1Y2tldCgpOgotCQkJc3ViY21kX2J1Y2tldF9saXN0KHMzLCB1cmkpCi0JCQlyZXR1cm4K LQlzdWJjbWRfYnVja2V0c19saXN0X2FsbChzMykKLQotZGVmIGNtZF9idWNrZXRzX2xpc3Rf YWxsX2FsbChhcmdzKToKLQlzMyA9IFMzKENvbmZpZygpKQotCi0JcmVzcG9uc2UgPSBzMy5s aXN0X2FsbF9idWNrZXRzKCkKLQotCWZvciBidWNrZXQgaW4gcmVzcG9uc2VbImxpc3QiXToK LQkJc3ViY21kX2J1Y2tldF9saXN0KHMzLCBTM1VyaSgiczM6Ly8iICsgYnVja2V0WyJOYW1l Il0pKQotCQlvdXRwdXQoIiIpCi0KLQotZGVmIHN1YmNtZF9idWNrZXRzX2xpc3RfYWxsKHMz KToKLQlyZXNwb25zZSA9IHMzLmxpc3RfYWxsX2J1Y2tldHMoKQotCWZvciBidWNrZXQgaW4g cmVzcG9uc2VbImxpc3QiXToKLQkJb3V0cHV0KCIlcyAgczM6Ly8lcyIgJSAoCi0JCQlmb3Jt YXREYXRlVGltZShidWNrZXRbIkNyZWF0aW9uRGF0ZSJdKSwKLQkJCWJ1Y2tldFsiTmFtZSJd LAotCQkJKSkKLQotZGVmIHN1YmNtZF9idWNrZXRfbGlzdChzMywgdXJpKToKLQlidWNrZXQg PSB1cmkuYnVja2V0KCkKLQlvYmplY3QgPSB1cmkub2JqZWN0KCkKLQotCW91dHB1dCgiQnVj a2V0ICclcyc6IiAlIGJ1Y2tldCkKLQlpZiBvYmplY3QuZW5kc3dpdGgoJyonKToKLQkJb2Jq ZWN0ID0gb2JqZWN0WzotMV0KLQl0cnk6Ci0JCXJlc3BvbnNlID0gczMuYnVja2V0X2xpc3Qo YnVja2V0LCBwcmVmaXggPSBvYmplY3QpCi0JZXhjZXB0IFMzRXJyb3IsIGU6Ci0JCWlmIFMz LmNvZGVzLmhhc19rZXkoZS5pbmZvWyJDb2RlIl0pOgotCQkJZXJyb3IoUzMuY29kZXNbZS5p bmZvWyJDb2RlIl1dICUgYnVja2V0KQotCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlyYWlzZQot CWZvciBvYmplY3QgaW4gcmVzcG9uc2VbImxpc3QiXToKLQkJc2l6ZSwgc2l6ZV9jb2VmZiA9 IGZvcm1hdFNpemUob2JqZWN0WyJTaXplIl0sIENvbmZpZygpLmh1bWFuX3JlYWRhYmxlX3Np emVzKQotCQlvdXRwdXQoIiVzICAlcyVzICAlcyIgJSAoCi0JCQlmb3JtYXREYXRlVGltZShv YmplY3RbIkxhc3RNb2RpZmllZCJdKSwKLQkJCXN0cihzaXplKS5yanVzdCg4KSwgc2l6ZV9j b2VmZi5sanVzdCgxKSwKLQkJCXVyaS5jb21wb3NlX3VyaShidWNrZXQsIG9iamVjdFsiS2V5 Il0pLAotCQkJKSkKLQotZGVmIGNtZF9idWNrZXRfY3JlYXRlKGFyZ3MpOgotCXVyaSA9IFMz VXJpKGFyZ3NbMF0pCi0JaWYgbm90IHVyaS50eXBlID09ICJzMyIgb3Igbm90IHVyaS5oYXNf YnVja2V0KCkgb3IgdXJpLmhhc19vYmplY3QoKToKLQkJcmFpc2UgUGFyYW1ldGVyRXJyb3Io IkV4cGVjdGluZyBTMyBVUkkgd2l0aCBqdXN0IHRoZSBidWNrZXQgbmFtZSBzZXQgaW5zdGVh ZCBvZiAnJXMnIiAlIGFyZ3NbMF0pCi0JdHJ5OgotCQlzMyA9IFMzKENvbmZpZygpKQotCQly ZXNwb25zZSA9IHMzLmJ1Y2tldF9jcmVhdGUodXJpLmJ1Y2tldCgpLCBjZmcuYnVja2V0X2xv Y2F0aW9uKQotCWV4Y2VwdCBTM0Vycm9yLCBlOgotCQlpZiBTMy5jb2Rlcy5oYXNfa2V5KGUu aW5mb1siQ29kZSJdKToKLQkJCWVycm9yKFMzLmNvZGVzW2UuaW5mb1siQ29kZSJdXSAlIHVy aS5idWNrZXQoKSkKLQkJCXJldHVybgotCQllbHNlOgotCQkJcmFpc2UKLQlvdXRwdXQoIkJ1 Y2tldCAnJXMnIGNyZWF0ZWQiICUgdXJpLmJ1Y2tldCgpKQotCi1kZWYgY21kX2J1Y2tldF9k ZWxldGUoYXJncyk6Ci0JdXJpID0gUzNVcmkoYXJnc1swXSkKLQlpZiBub3QgdXJpLnR5cGUg PT0gInMzIiBvciBub3QgdXJpLmhhc19idWNrZXQoKSBvciB1cmkuaGFzX29iamVjdCgpOgot CQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigiRXhwZWN0aW5nIFMzIFVSSSB3aXRoIGp1c3QgdGhl IGJ1Y2tldCBuYW1lIHNldCBpbnN0ZWFkIG9mICclcyciICUgYXJnc1swXSkKLQl0cnk6Ci0J CXMzID0gUzMoQ29uZmlnKCkpCi0JCXJlc3BvbnNlID0gczMuYnVja2V0X2RlbGV0ZSh1cmku YnVja2V0KCkpCi0JZXhjZXB0IFMzRXJyb3IsIGU6Ci0JCWlmIFMzLmNvZGVzLmhhc19rZXko ZS5pbmZvWyJDb2RlIl0pOgotCQkJZXJyb3IoUzMuY29kZXNbZS5pbmZvWyJDb2RlIl1dICUg dXJpLmJ1Y2tldCgpKQotCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlyYWlzZQotCW91dHB1dCgi QnVja2V0ICclcycgcmVtb3ZlZCIgJSB1cmkuYnVja2V0KCkpCi0KLWRlZiBjbWRfYnVja2V0 X2luZm8oYXJncyk6Ci0JdXJpID0gUzNVcmkoYXJnc1swXSkKLQlpZiBub3QgdXJpLnR5cGUg PT0gInMzIiBvciBub3QgdXJpLmhhc19idWNrZXQoKSBvciB1cmkuaGFzX29iamVjdCgpOgot CQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigiRXhwZWN0aW5nIFMzIFVSSSB3aXRoIGp1c3QgdGhl IGJ1Y2tldCBuYW1lIHNldCBpbnN0ZWFkIG9mICclcyciICUgYXJnc1swXSkKLQl0cnk6Ci0J CXMzID0gUzMoQ29uZmlnKCkpCi0JCXJlc3BvbnNlID0gczMuYnVja2V0X2luZm8odXJpLmJ1 Y2tldCgpKQotCWV4Y2VwdCBTM0Vycm9yLCBlOgotCQlpZiBTMy5jb2Rlcy5oYXNfa2V5KGUu aW5mb1siQ29kZSJdKToKLQkJCWVycm9yKFMzLmNvZGVzW2UuaW5mb1siQ29kZSJdXSAlIHVy aS5idWNrZXQoKSkKLQkJCXJldHVybgotCQllbHNlOgotCQkJcmFpc2UKLQlvdXRwdXQoIkJ1 Y2tldCAnJXMnOiIgJSB1cmkuYnVja2V0KCkpCi0Jb3V0cHV0KCIgICBMb2NhdGlvbjogJXMi ICUgcmVzcG9uc2VbJ2J1Y2tldC1sb2NhdGlvbiddKQotCi1kZWYgY21kX29iamVjdF9wdXQo YXJncyk6Ci0JczMgPSBTMyhDb25maWcoKSkKLQotCXVyaV9hcmcgPSBhcmdzLnBvcCgpCi0J Y2hlY2tfYXJnc190eXBlKGFyZ3MsICdmaWxlJywgJ2ZpbGVuYW1lJykKLQotCXVyaSA9IFMz VXJpKHVyaV9hcmcpCi0JaWYgdXJpLnR5cGUgIT0gInMzIjoKLQkJcmFpc2UgUGFyYW1ldGVy RXJyb3IoIkV4cGVjdGluZyBTMyBVUkkgaW5zdGVhZCBvZiAnJXMnIiAlIHVyaV9hcmcpCi0K LQlpZiBsZW4oYXJncykgPiAxIGFuZCB1cmkub2JqZWN0KCkgIT0gIiIgYW5kIG5vdCBDb25m aWcoKS5mb3JjZToKLQkJZXJyb3IoIldoZW4gdXBsb2FkaW5nIG11bHRpcGxlIGZpbGVzIHRo ZSBsYXN0IGFyZ3VtZW50IG11c3QiKQotCQllcnJvcigiYmUgYSBTMyBVUkkgc3BlY2lmeWlu ZyBqdXN0IHRoZSBidWNrZXQgbmFtZSIpCi0JCWVycm9yKCJXSVRIT1VUIG9iamVjdCBuYW1l ISIpCi0JCWVycm9yKCJBbHRlcm5hdGl2ZWx5IHVzZSAtLWZvcmNlIGFyZ3VtZW50IGFuZCB0 aGUgc3BlY2lmaWVkIikKLQkJZXJyb3IoIm9iamVjdCBuYW1lIHdpbGwgYmUgcHJlZml4ZWQg dG8gYWxsIHN0b3JlZCBmaWxlbmFtZXMuIikKLQkJc3lzLmV4aXQoMSkKLQkKLQlzZXEgPSAw Ci0JdG90YWwgPSBsZW4oYXJncykKLQlmb3IgZmlsZSBpbiBhcmdzOgotCQlzZXEgKz0gMQot CQl1cmlfYXJnX2ZpbmFsID0gc3RyKHVyaSkKLQkJaWYgbGVuKGFyZ3MpID4gMSBvciB1cmku b2JqZWN0KCkgPT0gIiI6Ci0JCQl1cmlfYXJnX2ZpbmFsICs9IG9zLnBhdGguYmFzZW5hbWUo ZmlsZSkKLQkJCi0JCXVyaV9maW5hbCA9IFMzVXJpKHVyaV9hcmdfZmluYWwpCi0JCWV4dHJh X2hlYWRlcnMgPSB7fQotCQlyZWFsX2ZpbGVuYW1lID0gZmlsZQotCQlpZiBDb25maWcoKS5l bmNyeXB0OgotCQkJZXhpdGNvZGUsIHJlYWxfZmlsZW5hbWUsIGV4dHJhX2hlYWRlcnNbIngt YW16LW1ldGEtczN0b29scy1ncGdlbmMiXSA9IGdwZ19lbmNyeXB0KGZpbGUpCi0JCXJlc3Bv bnNlID0gczMub2JqZWN0X3B1dF91cmkocmVhbF9maWxlbmFtZSwgdXJpX2ZpbmFsLCBleHRy YV9oZWFkZXJzKQotCQlvdXRwdXQoIkZpbGUgJyVzJyBzdG9yZWQgYXMgJXMgKCVkIGJ5dGVz KSBbJWQgb2YgJWRdIiAlCi0JCQkoZmlsZSwgdXJpX2ZpbmFsLCByZXNwb25zZVsic2l6ZSJd LAotCQkJc2VxLCB0b3RhbCkpCi0JCWlmIENvbmZpZygpLmFjbF9wdWJsaWM6Ci0JCQlvdXRw dXQoIlB1YmxpYyBVUkwgb2YgdGhlIG9iamVjdCBpczogJXMiICUKLQkJCQkodXJpLnB1Ymxp Y191cmwoKSkpCi0JCWlmIENvbmZpZygpLmVuY3J5cHQgYW5kIHJlYWxfZmlsZW5hbWUgIT0g ZmlsZToKLQkJCWRlYnVnKCJSZW1vdmluZyB0ZW1wb3JhcnkgZW5jcnlwdGVkIGZpbGU6ICVz IiAlIHJlYWxfZmlsZW5hbWUpCi0JCQlvcy5yZW1vdmUocmVhbF9maWxlbmFtZSkKLQotZGVm IGNtZF9vYmplY3RfZ2V0KGFyZ3MpOgotCXMzID0gUzMoQ29uZmlnKCkpCi0KLQlpZiBub3Qg UzNVcmkoYXJnc1swXSkudHlwZSA9PSAnczMnOgotCQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigi RXhwZWN0aW5nIFMzIFVSSSBpbnN0ZWFkIG9mICclcyciICUgYXJnc1swXSkKLQotCWRlc3Rp bmF0aW9uX2RpciA9IE5vbmUKLQlkZXN0aW5hdGlvbl9maWxlID0gTm9uZQotCWlmIGxlbihh cmdzKSA+IDE6Ci0JCWlmIFMzVXJpKGFyZ3NbLTFdKS50eXBlID09ICdzMyc6Ci0JCQkjIGFs bCBTMywgdXNlIG9iamVjdCBuYW1lcyB0byBsb2NhbCBkaXIKLQkJCWNoZWNrX2FyZ3NfdHlw ZShhcmdzLCB0eXBlPSJzMyIsIHZlcmJvc2VfdHlwZT0iUzMgVVJJIikJIyBNYXkgcmFpc2Ug UGFyYW1ldGVyRXJyb3IKLQkJZWxzZToKLQkJCWlmIChsZW4oYXJncykgPiAyKToKLQkJCQkj IGxhc3QgbXVzdCBiZSBkaXIsIGFsbCBwcmVjZWRpbmcgUzMKLQkJCQlpZiBub3Qgb3MucGF0 aC5pc2RpcihhcmdzWy0xXSk6Ci0JCQkJCXJhaXNlIFBhcmFtZXRlckVycm9yKCJMYXN0IHBh cmFtZXRlciBtdXN0IGJlIGEgZGlyZWN0b3J5IikKLQkJCQlkZXN0aW5hdGlvbl9kaXIgPSBh cmdzLnBvcCgpCi0JCQkJY2hlY2tfYXJnc190eXBlKGFyZ3MsIHR5cGU9InMzIiwgdmVyYm9z ZV90eXBlPSJTMyBVUkkiKQkjIE1heSByYWlzZSBQYXJhbWV0ZXJFcnJvcgotCQkJZWxzZToK LQkJCQkjIGxhc3QgbXVzdCBiZSBhIGRpciBvciBhIGZpbGVuYW1lCi0JCQkJaWYgb3MucGF0 aC5pc2RpcihhcmdzWy0xXSk6Ci0JCQkJCWRlc3RpbmF0aW9uX2RpciA9IGFyZ3MucG9wKCkK LQkJCQllbHNlOgotCQkJCQlkZXN0aW5hdGlvbl9maWxlID0gYXJncy5wb3AoKQotCi0Jd2hp bGUgKGxlbihhcmdzKSk6Ci0JCXVyaV9hcmcgPSBhcmdzLnBvcCgwKQotCQl1cmkgPSBTM1Vy aSh1cmlfYXJnKQotCi0JCWlmIGRlc3RpbmF0aW9uX2ZpbGU6Ci0JCQlkZXN0aW5hdGlvbiA9 IGRlc3RpbmF0aW9uX2ZpbGUKLQkJZWxpZiBkZXN0aW5hdGlvbl9kaXI6Ci0JCQlkZXN0aW5h dGlvbiA9IGRlc3RpbmF0aW9uX2RpciArICIvIiArIHVyaS5vYmplY3QoKQotCQllbHNlOgot CQkJIyBCeSBkZWZhdWx0IHRoZSBkZXN0aW5hdGlvbiBmaWxlbmFtZSBpcyB0aGUgb2JqZWN0 IG5hbWUKLQkJCWRlc3RpbmF0aW9uID0gdXJpLm9iamVjdCgpCi0KLQkJaWYgbm90IENvbmZp ZygpLmZvcmNlIGFuZCBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6Ci0JCQlyYWlzZSBQ YXJhbWV0ZXJFcnJvcigiRmlsZSAlcyBhbHJlYWR5IGV4aXN0cy4gVXNlIC0tZm9yY2UgdG8g b3ZlcndyaXRlIGl0IiAlIGRlc3RpbmF0aW9uKQotCQlyZXNwb25zZSA9IHMzLm9iamVjdF9n ZXRfdXJpKHVyaSwgZGVzdGluYXRpb24pCi0JCWlmIHJlc3BvbnNlWyJoZWFkZXJzIl0uaGFz X2tleSgieC1hbXotbWV0YS1zM3Rvb2xzLWdwZ2VuYyIpOgotCQkJZ3BnX2RlY3J5cHQoZGVz dGluYXRpb24sIHJlc3BvbnNlWyJoZWFkZXJzIl1bIngtYW16LW1ldGEtczN0b29scy1ncGdl bmMiXSkKLQkJCXJlc3BvbnNlWyJzaXplIl0gPSBvcy5zdGF0KGRlc3RpbmF0aW9uKVs2XQot CQlpZiBkZXN0aW5hdGlvbiAhPSAiLSI6Ci0JCQlvdXRwdXQoIk9iamVjdCAlcyBzYXZlZCBh cyAnJXMnICglZCBieXRlcykiICUKLQkJCQkodXJpLCBkZXN0aW5hdGlvbiwgcmVzcG9uc2Vb InNpemUiXSkpCi0KLWRlZiBjbWRfb2JqZWN0X2RlbChhcmdzKToKLQlzMyA9IFMzKENvbmZp ZygpKQotCi0Jd2hpbGUgKGxlbihhcmdzKSk6Ci0JCXVyaV9hcmcgPSBhcmdzLnBvcCgwKQot CQl1cmkgPSBTM1VyaSh1cmlfYXJnKQotCQlpZiB1cmkudHlwZSAhPSAiczMiIG9yIG5vdCB1 cmkuaGFzX29iamVjdCgpOgotCQkJcmFpc2UgUGFyYW1ldGVyRXJyb3IoIkV4cGVjdGluZyBT MyBVUkkgaW5zdGVhZCBvZiAnJXMnIiAlIHVyaV9hcmcpCi0KLQkJcmVzcG9uc2UgPSBzMy5v YmplY3RfZGVsZXRlX3VyaSh1cmkpCi0JCW91dHB1dCgiT2JqZWN0ICVzIGRlbGV0ZWQiICUg dXJpKQotCi1kZWYgY21kX3N5bmMoYXJncyk6Ci0JZGVmIF9idWlsZF9hdHRyX2hlYWRlcihz cmMpOgotCQlhdHRycyA9IHt9Ci0JCXN0ID0gb3Muc3RhdF9yZXN1bHQob3Muc3RhdChzcmMp KQotCQlmb3IgYXR0ciBpbiBjZmcucHJlc2VydmVfYXR0cnNfbGlzdDoKLQkJCWlmIGF0dHIg PT0gJ3VuYW1lJzoKLQkJCQl2YWwgPSBwd2QuZ2V0cHd1aWQoc3Quc3RfdWlkKS5wd19uYW1l Ci0JCQllbGlmIGF0dHIgPT0gJ2duYW1lJzoKLQkJCQl2YWwgPSBncnAuZ2V0Z3JnaWQoc3Qu c3RfZ2lkKS5ncl9uYW1lCi0JCQllbHNlOgotCQkJCXZhbCA9IGdldGF0dHIoc3QsICdzdF8n ICsgYXR0cikKLQkJCWF0dHJzW2F0dHJdID0gdmFsCi0JCXJlc3VsdCA9ICIiCi0JCWZvciBr IGluIGF0dHJzOiByZXN1bHQgKz0gIiVzOiVzLyIgJSAoaywgYXR0cnNba10pCi0JCXJldHVy biB7ICd4LWFtei1tZXRhLXMzY21kLWF0dHJzJyA6IHJlc3VsdFs6LTFdIH0KLQlzcmMgPSBh cmdzLnBvcCgwKQotCWlmIFMzVXJpKHNyYykudHlwZSAhPSAiZmlsZSI6Ci0JCXJhaXNlIFBh cmFtZXRlckVycm9yKCJTb3VyY2UgbXVzdCBiZSBhIGxvY2FsIHBhdGggaW5zdGVhZCBvZjog JXMiICUgc3JjKQotCWRzdCA9IGFyZ3MucG9wKDApCi0JaWYgbm90IGRzdC5lbmRzd2l0aCgn LycpOgotCQlkc3QgKz0gIi8iCi0JZHN0X3VyaSA9IFMzVXJpKGRzdCkKLQlpZiBkc3RfdXJp LnR5cGUgIT0gInMzIjoKLQkJcmFpc2UgUGFyYW1ldGVyRXJyb3IoIkRlc3RpbmF0aW9uIG11 c3QgYmUgYSBTMyBVUkkgaW5zdGVhZCBvZjogJXMiICUgZHN0KQotCWlmIChsZW4oYXJncykp OgotCQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigiVG9vIG1hbnkgcGFyYW1ldGVycyEgRXhwZWN0 ZWQ6ICVzIiAlIGNvbW1hbmRzWydzeW5jJ11bJ3BhcmFtJ10pCi0KLQlzMyA9IFMzKENvbmZp ZygpKQotCi0Jb3V0cHV0KCJDb21waWxpbmcgbGlzdCBvZiBsb2NhbCBmaWxlcy4uLiIpCi0J aWYgb3MucGF0aC5pc2RpcihzcmMpOgotCQlsb2NfYmFzZSA9IG9zLnBhdGguam9pbihzcmMs ICIiKQotCQlmaWxlbGlzdCA9IG9zLndhbGsoc3JjKQotCWVsc2U6Ci0JCWxvY19iYXNlID0g Ii4vIgotCQlmaWxlbGlzdCA9IFsoICcuJywgW10sIFtzcmNdICldCi0JbG9jX2Jhc2VfbGVu ID0gbGVuKGxvY19iYXNlKQotCWxvY19saXN0ID0ge30KLQlmb3Igcm9vdCwgZGlycywgZmls ZXMgaW4gZmlsZWxpc3Q6Ci0JCSMjIFRPRE86IGltcGxlbWVudCBleHBsaWNpdCBleGNsdWRl Ci0JCWZvciBmIGluIGZpbGVzOgotCQkJZnVsbF9uYW1lID0gb3MucGF0aC5qb2luKHJvb3Qs IGYpCi0JCQlpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZnVsbF9uYW1lKToKLQkJCQljb250aW51 ZQotCQkJaWYgb3MucGF0aC5pc2xpbmsoZnVsbF9uYW1lKToKLQkJCQkjIyBTeW5jaHJvbml6 ZSBzeW1saW5rcy4uLiBvbmUgZGF5Ci0JCQkJIyMgZm9yIG5vdyBza2lwIG92ZXIKLQkJCQlj b250aW51ZQotCQkJZmlsZSA9IGZ1bGxfbmFtZVtsb2NfYmFzZV9sZW46XQotCQkJc3IgPSBv cy5zdGF0X3Jlc3VsdChvcy5sc3RhdChmdWxsX25hbWUpKQotCQkJbG9jX2xpc3RbZmlsZV0g PSB7Ci0JCQkJJ2Z1bGxfbmFtZScgOiBmdWxsX25hbWUsCi0JCQkJJ3NpemUnIDogc3Iuc3Rf c2l6ZSwgCi0JCQkJJ210aW1lJyA6IHNyLnN0X210aW1lLAotCQkJCSMjIFRPRE86IFBvc3Np Ymx5IG1vcmUgdG8gc2F2ZSBoZXJlLi4uCi0JCQl9Ci0JbG9jX2NvdW50ID0gbGVuKGxvY19s aXN0KQotCQotCW91dHB1dCgiUmV0cmlldmluZyBsaXN0IG9mIHJlbW90ZSBmaWxlcy4uLiIp Ci0JcmVzcG9uc2UgPSBzMy5idWNrZXRfbGlzdChkc3RfdXJpLmJ1Y2tldCgpLCBwcmVmaXgg PSBkc3RfdXJpLm9iamVjdCgpKQotCi0JcmVtX2Jhc2UgPSBkc3RfdXJpLm9iamVjdCgpCi0J cmVtX2Jhc2VfbGVuID0gbGVuKHJlbV9iYXNlKQotCXJlbV9saXN0ID0ge30KLQlyZW1fY291 bnQgPSBsZW4ocmVzcG9uc2VbJ2xpc3QnXSkKLQlmb3Igb2JqZWN0IGluIHJlc3BvbnNlWyds aXN0J106Ci0JCWtleSA9IG9iamVjdFsnS2V5J11bcmVtX2Jhc2VfbGVuOl0uZW5jb2RlKCd1 dGYtOCcpCi0JCXJlbV9saXN0W2tleV0gPSB7IAotCQkJJ3NpemUnIDogaW50KG9iamVjdFsn U2l6ZSddKSwKLQkJCSMgJ210aW1lJyA6IGRhdGVTM3RvVW5peChvYmplY3RbJ0xhc3RNb2Rp ZmllZCddKSwgIyMgVGhhdCdzIHVwbG9hZCB0aW1lLCBub3Qgb3VyIGxhc3Rtb2QgdGltZSA6 LSgKLQkJCSdtZDUnIDogb2JqZWN0WydFVGFnJ11bMTotMV0sCi0JCQknb2JqZWN0X2tleScg OiBvYmplY3RbJ0tleSddLmVuY29kZSgndXRmLTgnKSwKLQkJfQotCW91dHB1dCgiRm91bmQg JWQgbG9jYWwgZmlsZXMsICVkIHJlbW90ZSBmaWxlcyIgJSAobG9jX2NvdW50LCByZW1fY291 bnQpKQotCi0Jb3V0cHV0KCJWZXJpZnlpbmcgY2hlY2tzdW1zLi4uIikKLQlmb3IgZmlsZSBp biBsb2NfbGlzdC5rZXlzKCk6Ci0JCWRlYnVnKCJDaGVja2luZyAlcyAuLi4iICUgZmlsZSkK LQkJaWYgcmVtX2xpc3QuaGFzX2tleShmaWxlKToKLQkJCWRlYnVnKCIlcyBleGlzdHMgaW4g cmVtb3RlIGxpc3QiICUgZmlsZSkKLQkJCSMjIENoZWNrIHNpemUgZmlyc3QKLQkJCWlmIHJl bV9saXN0W2ZpbGVdWydzaXplJ10gPT0gbG9jX2xpc3RbZmlsZV1bJ3NpemUnXToKLQkJCQlk ZWJ1ZygiJXMgc2FtZSBzaXplOiAlcyIgJSAoZmlsZSwgcmVtX2xpc3RbZmlsZV1bJ3NpemUn XSkpCi0JCQkJIyMgLi4uIHNhbWUgc2l6ZSwgY2hlY2sgTUQ1Ci0JCQkJbG9jX21kNSA9IFV0 aWxzLmhhc2hfZmlsZV9tZDUobG9jX2xpc3RbZmlsZV1bJ2Z1bGxfbmFtZSddKQotCQkJCWlm IGxvY19tZDUgPT0gcmVtX2xpc3RbZmlsZV1bJ21kNSddOgotCQkJCQlkZWJ1ZygiJXMgbWQ1 IG1hdGNoZXM6ICVzIiAlIChmaWxlLCByZW1fbGlzdFtmaWxlXVsnbWQ1J10pKQotCQkJCQkj IyBDaGVja3N1bXMgYXJlIHRoZSBzYW1lLgotCQkJCQkjIyBSZW1vdmUgZnJvbSBsb2NhbC1s aXN0LCBhbGwgdGhhdCBpcyBsZWZ0IHRoZXJlIHdpbGwgYmUgdXBsb2FkZWQKLQkJCQkJZGVi dWcoIiVzIHJlbW92ZWQgZnJvbSBsb2NhbCBsaXN0IC0gdXBsb2FkIG5vdCBuZWVkZWQiICUg ZmlsZSkKLQkJCQkJZGVsKGxvY19saXN0W2ZpbGVdKQotCQkJCWVsc2U6Ci0JCQkJCWRlYnVn KCIhICVzIG1kNSBtaXNtYXRjaDogbG9jYWw9JXMgcmVtb3RlPSVzIiAlIChmaWxlLCBsb2Nf bWQ1LCByZW1fbGlzdFtmaWxlXVsnbWQ1J10pKQotCQkJZWxzZToKLQkJCQlkZWJ1ZygiISAl cyBzaXplIG1pc21hdGNoOiBsb2NhbD0lcyByZW1vdGU9JXMiICUgKGZpbGUsIGxvY19saXN0 W2ZpbGVdWydzaXplJ10sIHJlbV9saXN0W2ZpbGVdWydzaXplJ10pKQotICAgICAgICAgICAg ICAgICAgICAgICAgCi0JCQkjIyBSZW1vdmUgZnJvbSByZW1vdGUtbGlzdCwgYWxsIHRoYXQg aXMgbGVmdCB0aGVyZSB3aWxsIGJlIGRlbGV0ZWQKLQkJCWRlYnVnKCIlcyByZW1vdmVkIGZy b20gcmVtb3RlIGxpc3QiICUgZmlsZSkKLQkJCWRlbChyZW1fbGlzdFtmaWxlXSkKLQotCW91 dHB1dCgiU3VtbWFyeTogJWQgbG9jYWwgZmlsZXMgdG8gdXBsb2FkLCAlZCByZW1vdGUgZmls ZXMgdG8gZGVsZXRlIiAlIChsZW4obG9jX2xpc3QpLCBsZW4ocmVtX2xpc3QpKSkKLQlmb3Ig ZmlsZSBpbiByZW1fbGlzdDoKLQkJdXJpID0gUzNVcmkoInMzOi8vIiArIGRzdF91cmkuYnVj a2V0KCkrIi8iK3JlbV9saXN0W2ZpbGVdWydvYmplY3Rfa2V5J10pCi0JCWlmIGNmZy5kZWxl dGVfcmVtb3ZlZDoKLQkJCXJlc3BvbnNlID0gczMub2JqZWN0X2RlbGV0ZV91cmkodXJpKQot CQkJb3V0cHV0KCJkZWxldGVkICclcyciICUgdXJpKQotCQllbHNlOgotCQkJb3V0cHV0KCJu b3QtZGVsZXRlZCAnJXMnIiAlIHVyaSkKLQotCXRvdGFsX3NpemUgPSAwCi0JdG90YWxfY291 bnQgPSBsZW4obG9jX2xpc3QpCi0Jc2VxID0gMAotCWRzdF9iYXNlID0gZHN0X3VyaS51cmko KQotCWlmIG5vdCBkc3RfYmFzZVstMV0gPT0gIi8iOiBkc3RfYmFzZSArPSAiLyIKLQlmaWxl X2xpc3QgPSBsb2NfbGlzdC5rZXlzKCkKLQlmaWxlX2xpc3Quc29ydCgpCi0JZm9yIGZpbGUg aW4gZmlsZV9saXN0OgotCQlzZXEgKz0gMQotCQlzcmMgPSBsb2NfbGlzdFtmaWxlXVsnZnVs bF9uYW1lJ10KLQkJdXJpID0gUzNVcmkoZHN0X2Jhc2UgKyBmaWxlKQotCQlpZiBjZmcucHJl c2VydmVfYXR0cnM6Ci0JCQlhdHRyX2hlYWRlciA9IF9idWlsZF9hdHRyX2hlYWRlcihzcmMp Ci0JCQlkZWJ1ZyhhdHRyX2hlYWRlcikKLQkJcmVzcG9uc2UgPSBzMy5vYmplY3RfcHV0X3Vy aShzcmMsIHVyaSwgYXR0cl9oZWFkZXIpCi0JCW91dHB1dCgic3RvcmVkICclcycgYXMgJyVz JyAoJWQgYnl0ZXMpIFslZCBvZiAlZF0iICUgKHNyYywgdXJpLCByZXNwb25zZVsic2l6ZSJd LCBzZXEsIHRvdGFsX2NvdW50KSkKLQkJdG90YWxfc2l6ZSArPSByZXNwb25zZVsic2l6ZSJd Ci0Jb3V0cHV0KCJEb25lLiBVcGxvYWRlZCAlZCBieXRlcy4iICUgdG90YWxfc2l6ZSkKLQot ZGVmIHJlc29sdmVfbGlzdChsc3QsIGFyZ3MpOgotCXJldHZhbCA9IFtdCi0JZm9yIGl0ZW0g aW4gbHN0OgotCQlyZXR2YWwuYXBwZW5kKGl0ZW0gJSBhcmdzKQotCXJldHVybiByZXR2YWwK LQotZGVmIGdwZ19jb21tYW5kKGNvbW1hbmQsIHBhc3NwaHJhc2UgPSAiIik6Ci0JcF9pbiwg cF9vdXQgPSBvcy5wb3BlbjQoY29tbWFuZCkKLQlpZiBjb21tYW5kLmNvdW50KCItLXBhc3Nw aHJhc2UtZmQiKToKLQkJcF9pbi53cml0ZShwYXNzcGhyYXNlKyJcbiIpCi0JCXBfaW4uZmx1 c2goKQotCWZvciBsaW5lIGluIHBfb3V0OgotCQlpbmZvKGxpbmUuc3RyaXAoKSkKLQlwX3Bp ZCwgcF9leGl0Y29kZSA9IG9zLndhaXQoKQotCXJldHVybiBwX2V4aXRjb2RlCi0KLWRlZiBn cGdfZW5jcnlwdChmaWxlbmFtZSk6Ci0JdG1wX2ZpbGVuYW1lID0gVXRpbHMubWt0bXBmaWxl KCkKLQlhcmdzID0gewotCQkiZ3BnX2NvbW1hbmQiIDogY2ZnLmdwZ19jb21tYW5kLAotCQki cGFzc3BocmFzZV9mZCIgOiAiMCIsCi0JCSJpbnB1dF9maWxlIiA6IGZpbGVuYW1lLCAKLQkJ Im91dHB1dF9maWxlIiA6IHRtcF9maWxlbmFtZSwKLQl9Ci0JaW5mbygiRW5jcnlwdGluZyBm aWxlICUoaW5wdXRfZmlsZSlzIHRvICUob3V0cHV0X2ZpbGUpcy4uLiIgJSBhcmdzKQotCWNv bW1hbmQgPSByZXNvbHZlX2xpc3QoY2ZnLmdwZ19lbmNyeXB0LnNwbGl0KCIgIiksIGFyZ3Mp Ci0JY29kZSA9IGdwZ19jb21tYW5kKGNvbW1hbmQsIGNmZy5ncGdfcGFzc3BocmFzZSkKLQly ZXR1cm4gKGNvZGUsIHRtcF9maWxlbmFtZSwgImdwZyIpCi0KLWRlZiBncGdfZGVjcnlwdChm aWxlbmFtZSwgZ3BnZW5jX2hlYWRlciA9ICIiLCBpbl9wbGFjZSA9IFRydWUpOgotCXRtcF9m aWxlbmFtZSA9IFV0aWxzLm1rdG1wZmlsZShmaWxlbmFtZSkKLQlhcmdzID0gewotCQkiZ3Bn X2NvbW1hbmQiIDogY2ZnLmdwZ19jb21tYW5kLAotCQkicGFzc3BocmFzZV9mZCIgOiAiMCIs Ci0JCSJpbnB1dF9maWxlIiA6IGZpbGVuYW1lLCAKLQkJIm91dHB1dF9maWxlIiA6IHRtcF9m aWxlbmFtZSwKLQl9Ci0JaW5mbygiRGVjcnlwdGluZyBmaWxlICUoaW5wdXRfZmlsZSlzIHRv ICUob3V0cHV0X2ZpbGUpcy4uLiIgJSBhcmdzKQotCWNvbW1hbmQgPSByZXNvbHZlX2xpc3Qo Y2ZnLmdwZ19kZWNyeXB0LnNwbGl0KCIgIiksIGFyZ3MpCi0JY29kZSA9IGdwZ19jb21tYW5k KGNvbW1hbmQsIGNmZy5ncGdfcGFzc3BocmFzZSkKLQlpZiBjb2RlID09IDAgYW5kIGluX3Bs YWNlOgotCQlkZWJ1ZygiUmVuYW1pbmcgJXMgdG8gJXMiICUgKHRtcF9maWxlbmFtZSwgZmls ZW5hbWUpKQotCQlvcy51bmxpbmsoZmlsZW5hbWUpCi0JCW9zLnJlbmFtZSh0bXBfZmlsZW5h bWUsIGZpbGVuYW1lKQotCQl0bXBfZmlsZW5hbWUgPSBmaWxlbmFtZQotCXJldHVybiAoY29k ZSwgdG1wX2ZpbGVuYW1lKQotCi1kZWYgcnVuX2NvbmZpZ3VyZShjb25maWdfZmlsZSk6Ci0J Y2ZnID0gQ29uZmlnKCkKLQlvcHRpb25zID0gWwotCQkoImFjY2Vzc19rZXkiLCAiQWNjZXNz IEtleSIsICJBY2Nlc3Mga2V5IGFuZCBTZWNyZXQga2V5IGFyZSB5b3VyIGlkZW50aWZpZXJz IGZvciBBbWF6b24gUzMiKSwKLQkJKCJzZWNyZXRfa2V5IiwgIlNlY3JldCBLZXkiKSwKLQkJ KCJncGdfcGFzc3BocmFzZSIsICJFbmNyeXB0aW9uIHBhc3N3b3JkIiwgIkVuY3J5cHRpb24g cGFzc3dvcmQgaXMgdXNlZCB0byBwcm90ZWN0IHlvdXIgZmlsZXMgZnJvbSByZWFkaW5nXG5i eSB1bmF1dGhvcml6ZWQgcGVyc29ucyB3aGlsZSBpbiB0cmFuc2ZlciB0byBTMyIpLAotCQko ImdwZ19jb21tYW5kIiwgIlBhdGggdG8gR1BHIHByb2dyYW0iKSwKLQkJKCJ1c2VfaHR0cHMi LCAiVXNlIEhUVFBTIHByb3RvY29sIiwgIldoZW4gdXNpbmcgc2VjdXJlIEhUVFBTIHByb3Rv Y29sIGFsbCBjb21tdW5pY2F0aW9uIHdpdGggQW1hem9uIFMzXG5zZXJ2ZXJzIGlzIHByb3Rl Y3RlZCBmcm9tIDNyZCBwYXJ0eSBlYXZlc2Ryb3BwaW5nLiBUaGlzIG1ldGhvZCBpc1xuc2xv d2VyIHRoYW4gcGxhaW4gSFRUUCBhbmQgY2FuJ3QgYmUgdXNlZCBpZiB5b3UncmUgYmVoaW5k IGEgcHJveHkiKSwKLQkJKCJwcm94eV9ob3N0IiwgIkhUVFAgUHJveHkgc2VydmVyIG5hbWUi LCAiT24gc29tZSBuZXR3b3JrcyBhbGwgaW50ZXJuZXQgYWNjZXNzIG11c3QgZ28gdGhyb3Vn aCBhIEhUVFAgcHJveHkuXG5Ucnkgc2V0dGluZyBpdCBoZXJlIGlmIHlvdSBjYW4ndCBjb25l Y3QgdG8gUzMgZGlyZWN0bHkiKSwKLQkJKCJwcm94eV9wb3J0IiwgIkhUVFAgUHJveHkgc2Vy dmVyIHBvcnQiKSwKLQkJXQotCSMjIE9wdGlvbi1zcGVjZmljIGRlZmF1bHRzCi0JaWYgZ2V0 YXR0cihjZmcsICJncGdfY29tbWFuZCIpID09ICIiOgotCQlzZXRhdHRyKGNmZywgImdwZ19j b21tYW5kIiwgZmluZF9leGVjdXRhYmxlKCJncGciKSkKLQotCWlmIGdldGF0dHIoY2ZnLCAi cHJveHlfaG9zdCIpID09ICIiIGFuZCBvcy5nZXRlbnYoImh0dHBfcHJveHkiKToKLQkJcmVf bWF0Y2g9cmUubWF0Y2goIihodHRwOi8vKT8oW146XSspOihcZCspIiwgb3MuZ2V0ZW52KCJo dHRwX3Byb3h5IikpCi0JCWlmIHJlX21hdGNoOgotCQkJc2V0YXR0cihjZmcsICJwcm94eV9o b3N0IiwgcmVfbWF0Y2guZ3JvdXBzKClbMV0pCi0JCQlzZXRhdHRyKGNmZywgInByb3h5X3Bv cnQiLCByZV9tYXRjaC5ncm91cHMoKVsyXSkKLQotCXRyeToKLQkJd2hpbGUgMToKLQkJCW91 dHB1dCgiXG5FbnRlciBuZXcgdmFsdWVzIG9yIGFjY2VwdCBkZWZhdWx0cyBpbiBicmFja2V0 cyB3aXRoIEVudGVyLiIpCi0JCQlvdXRwdXQoIlJlZmVyIHRvIHVzZXIgbWFudWFsIGZvciBk ZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbGwgb3B0aW9ucy4iKQotCQkJZm9yIG9wdGlvbiBp biBvcHRpb25zOgotCQkJCXByb21wdCA9IG9wdGlvblsxXQotCQkJCSMjIE9wdGlvbi1zcGVj aWZpYyBoYW5kbGluZwotCQkJCWlmIG9wdGlvblswXSA9PSAncHJveHlfaG9zdCcgYW5kIGdl dGF0dHIoY2ZnLCAndXNlX2h0dHBzJykgPT0gVHJ1ZToKLQkJCQkJc2V0YXR0cihjZmcsIG9w dGlvblswXSwgIiIpCi0JCQkJCWNvbnRpbnVlCi0JCQkJaWYgb3B0aW9uWzBdID09ICdwcm94 eV9wb3J0JyBhbmQgZ2V0YXR0cihjZmcsICdwcm94eV9ob3N0JykgPT0gIiI6Ci0JCQkJCXNl dGF0dHIoY2ZnLCBvcHRpb25bMF0sIDApCi0JCQkJCWNvbnRpbnVlCi0KLQkJCQl0cnk6Ci0J CQkJCXZhbCA9IGdldGF0dHIoY2ZnLCBvcHRpb25bMF0pCi0JCQkJCWlmIHR5cGUodmFsKSBp cyBib29sOgotCQkJCQkJdmFsID0gdmFsIGFuZCAiWWVzIiBvciAiTm8iCi0JCQkJCWlmIHZh bCBub3QgaW4gKE5vbmUsICIiKToKLQkJCQkJCXByb21wdCArPSAiIFslc10iICUgdmFsCi0J CQkJZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotCQkJCQlwYXNzCi0KLQkJCQlpZiBsZW4ob3B0 aW9uKSA+PSAzOgotCQkJCQlvdXRwdXQoIlxuJXMiICUgb3B0aW9uWzJdKQotCi0JCQkJdmFs ID0gcmF3X2lucHV0KHByb21wdCArICI6ICIpCi0JCQkJaWYgdmFsICE9ICIiOgotCQkJCQlp ZiB0eXBlKGdldGF0dHIoY2ZnLCBvcHRpb25bMF0pKSBpcyBib29sOgotCQkJCQkJIyBUdXJu ICdZZXMnIGludG8gVHJ1ZSwgZXZlcnl0aGluZyBlbHNlIGludG8gRmFsc2UKLQkJCQkJCXZh bCA9IHZhbC5sb3dlcigpLnN0YXJ0c3dpdGgoJ3knKQotCQkJCQlzZXRhdHRyKGNmZywgb3B0 aW9uWzBdLCB2YWwpCi0JCQlvdXRwdXQoIlxuTmV3IHNldHRpbmdzOiIpCi0JCQlmb3Igb3B0 aW9uIGluIG9wdGlvbnM6Ci0JCQkJb3V0cHV0KCIgICVzOiAlcyIgJSAob3B0aW9uWzFdLCBn ZXRhdHRyKGNmZywgb3B0aW9uWzBdKSkpCi0JCQl2YWwgPSByYXdfaW5wdXQoIlxuVGVzdCBh Y2Nlc3Mgd2l0aCBzdXBwbGllZCBjcmVkZW50aWFscz8gW1kvbl0gIikKLQkJCWlmIHZhbC5s b3dlcigpLnN0YXJ0c3dpdGgoInkiKSBvciB2YWwgPT0gIiI6Ci0JCQkJdHJ5OgotCQkJCQlv dXRwdXQoIlBsZWFzZSB3YWl0Li4uIikKLQkJCQkJUzMoQ29uZmlnKCkpLmJ1Y2tldF9saXN0 KCIiLCAiIikKLQkJCQkJb3V0cHV0KCJTdWNjZXNzLiBZb3VyIGFjY2VzcyBrZXkgYW5kIHNl Y3JldCBrZXkgd29ya2VkIGZpbmUgOi0pIikKLQotCQkJCQlvdXRwdXQoIlxuTm93IHZlcmlm eWluZyB0aGF0IGVuY3J5cHRpb24gd29ya3MuLi4iKQotCQkJCQlpZiBub3QgZ2V0YXR0cihj ZmcsICJncGdfY29tbWFuZCIpIG9yIG5vdCBnZXRhdHRyKGNmZywgImdwZ19wYXNzcGhyYXNl Iik6Ci0JCQkJCQlvdXRwdXQoIk5vdCBjb25maWd1cmVkLiBOZXZlciBtaW5kLiIpCi0JCQkJ CWVsc2U6Ci0JCQkJCQlpZiBub3QgZ2V0YXR0cihjZmcsICJncGdfY29tbWFuZCIpOgotCQkJ CQkJCXJhaXNlIEV4Y2VwdGlvbigiUGF0aCB0byBHUEcgcHJvZ3JhbSBub3Qgc2V0IikKLQkJ CQkJCWlmIG5vdCBvcy5wYXRoLmlzZmlsZShnZXRhdHRyKGNmZywgImdwZ19jb21tYW5kIikp OgotCQkJCQkJCXJhaXNlIEV4Y2VwdGlvbigiR1BHIHByb2dyYW0gbm90IGZvdW5kIikKLQkJ CQkJCWZpbGVuYW1lID0gVXRpbHMubWt0bXBmaWxlKCkKLQkJCQkJCWYgPSBvcGVuKGZpbGVu YW1lLCAidyIpCi0JCQkJCQlmLndyaXRlKG9zLnN5cy5jb3B5cmlnaHQpCi0JCQkJCQlmLmNs b3NlKCkKLQkJCQkJCXJldF9lbmMgPSBncGdfZW5jcnlwdChmaWxlbmFtZSkKLQkJCQkJCXJl dF9kZWMgPSBncGdfZGVjcnlwdChyZXRfZW5jWzFdLCByZXRfZW5jWzJdLCBGYWxzZSkKLQkJ CQkJCWhhc2ggPSBbCi0JCQkJCQkJVXRpbHMuaGFzaF9maWxlX21kNShmaWxlbmFtZSksCi0J CQkJCQkJVXRpbHMuaGFzaF9maWxlX21kNShyZXRfZW5jWzFdKSwKLQkJCQkJCQlVdGlscy5o YXNoX2ZpbGVfbWQ1KHJldF9kZWNbMV0pLAotCQkJCQkJXQotCQkJCQkJb3MudW5saW5rKGZp bGVuYW1lKQotCQkJCQkJb3MudW5saW5rKHJldF9lbmNbMV0pCi0JCQkJCQlvcy51bmxpbmso cmV0X2RlY1sxXSkKLQkJCQkJCWlmIGhhc2hbMF0gPT0gaGFzaFsyXSBhbmQgaGFzaFswXSAh PSBoYXNoWzFdOgotCQkJCQkJCW91dHB1dCAoIlN1Y2Nlc3MuIEVuY3J5cHRpb24gYW5kIGRl Y3J5cHRpb24gd29ya2VkIGZpbmUgOi0pIikgCi0JCQkJCQllbHNlOgotCQkJCQkJCXJhaXNl IEV4Y2VwdGlvbigiRW5jcnlwdGlvbiB2ZXJpZmljYXRpb24gZXJyb3IuIikKLQotCQkJCWV4 Y2VwdCBFeGNlcHRpb24sIGU6Ci0JCQkJCWVycm9yKCJUZXN0IGZhaWxlZDogJXMiICUgKGUp KQotCQkJCQl2YWwgPSByYXdfaW5wdXQoIlxuUmV0cnkgY29uZmlndXJhdGlvbj8gW1kvbl0g IikKLQkJCQkJaWYgdmFsLmxvd2VyKCkuc3RhcnRzd2l0aCgieSIpIG9yIHZhbCA9PSAiIjoK LQkJCQkJCWNvbnRpbnVlCi0JCQkJCQotCi0JCQl2YWwgPSByYXdfaW5wdXQoIlxuU2F2ZSBz ZXR0aW5ncz8gW3kvTl0gIikKLQkJCWlmIHZhbC5sb3dlcigpLnN0YXJ0c3dpdGgoInkiKToK LQkJCQlicmVhawotCQkJdmFsID0gcmF3X2lucHV0KCJSZXRyeSBjb25maWd1cmF0aW9uPyBb WS9uXSAiKQotCQkJaWYgdmFsLmxvd2VyKCkuc3RhcnRzd2l0aCgibiIpOgotCQkJCXJhaXNl IEVPRkVycm9yKCkKLQotCQkjIyBPdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlnIGZpbGUsIG1h a2UgaXQgdXNlci1yZWFkYWJsZSBvbmx5Ci0JCW9sZF9tYXNrID0gb3MudW1hc2soMDA3NykK LQkJdHJ5OgotCQkJb3MucmVtb3ZlKGNvbmZpZ19maWxlKQotCQlleGNlcHQgT1NFcnJvciwg ZToKLQkJCWlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgotCQkJCXJhaXNlCi0JCWYgPSBv cGVuKGNvbmZpZ19maWxlLCAidyIpCi0JCW9zLnVtYXNrKG9sZF9tYXNrKQotCQljZmcuZHVt cF9jb25maWcoZikKLQkJZi5jbG9zZSgpCi0JCW91dHB1dCgiQ29uZmlndXJhdGlvbiBzYXZl ZCB0byAnJXMnIiAlIGNvbmZpZ19maWxlKQotCi0JZXhjZXB0IChFT0ZFcnJvciwgS2V5Ym9h cmRJbnRlcnJ1cHQpOgotCQlvdXRwdXQoIlxuQ29uZmlndXJhdGlvbiBhYm9ydGVkLiBDaGFu Z2VzIHdlcmUgTk9UIHNhdmVkLiIpCi0JCXJldHVybgotCQotCWV4Y2VwdCBJT0Vycm9yLCBl OgotCQllcnJvcigiV3JpdGluZyBjb25maWcgZmlsZSBmYWlsZWQ6ICVzOiAlcyIgJSAoY29u ZmlnX2ZpbGUsIGUuc3RyZXJyb3IpKQotCQlzeXMuZXhpdCgxKQotCi1jb21tYW5kcyA9IHt9 Ci1jb21tYW5kc19saXN0ID0gWwotCXsiY21kIjoibWIiLCAibGFiZWwiOiJNYWtlIGJ1Y2tl dCIsICJwYXJhbSI6InMzOi8vQlVDS0VUIiwgImZ1bmMiOmNtZF9idWNrZXRfY3JlYXRlLCAi YXJnYyI6MX0sCi0JeyJjbWQiOiJyYiIsICJsYWJlbCI6IlJlbW92ZSBidWNrZXQiLCAicGFy YW0iOiJzMzovL0JVQ0tFVCIsICJmdW5jIjpjbWRfYnVja2V0X2RlbGV0ZSwgImFyZ2MiOjF9 LAotCXsiY21kIjoiaWIiLCAibGFiZWwiOiJCdWNrZXQgaW5mb3JtYXRpb24iLCAicGFyYW0i OiJzMzovL0JVQ0tFVCIsICJmdW5jIjpjbWRfYnVja2V0X2luZm8sICJhcmdjIjoxfSwKLQl7 ImNtZCI6ImxzIiwgImxhYmVsIjoiTGlzdCBvYmplY3RzIG9yIGJ1Y2tldHMiLCAicGFyYW0i OiJbczM6Ly9CVUNLRVRbL1BSRUZJWF1dIiwgImZ1bmMiOmNtZF9scywgImFyZ2MiOjB9LAot CXsiY21kIjoibGEiLCAibGFiZWwiOiJMaXN0IGFsbCBvYmplY3QgaW4gYWxsIGJ1Y2tldHMi LCAicGFyYW0iOiIiLCAiZnVuYyI6Y21kX2J1Y2tldHNfbGlzdF9hbGxfYWxsLCAiYXJnYyI6 MH0sCi0JeyJjbWQiOiJwdXQiLCAibGFiZWwiOiJQdXQgZmlsZSBpbnRvIGJ1Y2tldCIsICJw YXJhbSI6IkZJTEUgW0ZJTEUuLi5dIHMzOi8vQlVDS0VUWy9QUkVGSVhdIiwgImZ1bmMiOmNt ZF9vYmplY3RfcHV0LCAiYXJnYyI6Mn0sCi0JeyJjbWQiOiJnZXQiLCAibGFiZWwiOiJHZXQg ZmlsZSBmcm9tIGJ1Y2tldCIsICJwYXJhbSI6InMzOi8vQlVDS0VUL09CSkVDVCBMT0NBTF9G SUxFIiwgImZ1bmMiOmNtZF9vYmplY3RfZ2V0LCAiYXJnYyI6MX0sCi0JeyJjbWQiOiJkZWwi LCAibGFiZWwiOiJEZWxldGUgZmlsZSBmcm9tIGJ1Y2tldCIsICJwYXJhbSI6InMzOi8vQlVD S0VUL09CSkVDVCIsICJmdW5jIjpjbWRfb2JqZWN0X2RlbCwgImFyZ2MiOjF9LAotCSN7ImNt ZCI6Im1rZGlyIiwgImxhYmVsIjoiTWFrZSBhIHZpcnR1YWwgUzMgZGlyZWN0b3J5IiwgInBh cmFtIjoiczM6Ly9CVUNLRVQvcGF0aC90by9kaXIiLCAiZnVuYyI6Y21kX21rZGlyLCAiYXJn YyI6MX0sCi0JeyJjbWQiOiJzeW5jIiwgImxhYmVsIjoiU3luY2hyb25pemUgYSBkaXJlY3Rv cnkgdHJlZSB0byBTMyBhbmQgYmFjayIsICJwYXJhbSI6IkxPQ0FMX0RJUiBzMzovL0JVQ0tF VFsvUFJFRklYXSIsICJmdW5jIjpjbWRfc3luYywgImFyZ2MiOjJ9LAotCXsiY21kIjoiZHUi LCAibGFiZWwiOiJEaXNrIHVzYWdlIGJ5IGJ1Y2tldHMiLCAicGFyYW0iOiJbczM6Ly9CVUNL RVRbL1BSRUZJWF1dIiwgImZ1bmMiOmNtZF9kdSwgImFyZ2MiOjB9LAotCV0KLQotZGVmIGZv cm1hdF9jb21tYW5kcyhwcm9nbmFtZSk6Ci0JaGVscCA9ICJDb21tYW5kczpcbiIKLQlmb3Ig Y21kIGluIGNvbW1hbmRzX2xpc3Q6Ci0JCWhlbHAgKz0gIiAgJXNcbiAgICAgICVzICVzICVz XG4iICUgKGNtZFsibGFiZWwiXSwgcHJvZ25hbWUsIGNtZFsiY21kIl0sIGNtZFsicGFyYW0i XSkKLQlyZXR1cm4gaGVscAotCi1jbGFzcyBPcHRpb25NaW1lVHlwZShPcHRpb24pOgotCWRl ZiBjaGVja19taW1ldHlwZShvcHRpb24sIG9wdCwgdmFsdWUpOgotCQlpZiByZS5jb21waWxl KCJeW2EtejAtOV0rL1thLXowLTkrXC4tXSskIiwgcmUuSUdOT1JFQ0FTRSkubWF0Y2godmFs dWUpOgotCQkJcmV0dXJuIHZhbHVlCi0JCXJhaXNlIE9wdGlvblZhbHVlRXJyb3IoIm9wdGlv biAlczogaW52YWxpZCBNSU1FLVR5cGUgZm9ybWF0OiAlciIgJSAob3B0LCB2YWx1ZSkpCi0K LQlUWVBFUyA9IE9wdGlvbi5UWVBFUyArICgibWltZXR5cGUiLCkKLQlUWVBFX0NIRUNLRVIg PSBjb3B5KE9wdGlvbi5UWVBFX0NIRUNLRVIpCi0JVFlQRV9DSEVDS0VSWyJtaW1ldHlwZSJd ID0gY2hlY2tfbWltZXR5cGUKLQotY2xhc3MgTXlIZWxwRm9ybWF0dGVyKEluZGVudGVkSGVs cEZvcm1hdHRlcik6Ci0JZGVmIGZvcm1hdF9lcGlsb2coc2VsZiwgZXBpbG9nKToKLQkJaWYg ZXBpbG9nOgotCQkJcmV0dXJuICJcbiIgKyBlcGlsb2cgKyAiXG4iCi0JCWVsc2U6Ci0JCQly ZXR1cm4gIiIKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQlpZiBmbG9hdCgiJWQu JWQiICUoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpIDwgMi40 OgotCQlzeXMuc3RkZXJyLndyaXRlKCJFUlJPUjogUHl0aG9uIDIuNCBvciBoaWdoZXIgcmVx dWlyZWQsIHNvcnJ5LlxuIikKLQkJc3lzLmV4aXQoMSkKLQotCSMjIFBvcHVsYXRlICJjb21t YW5kcyIgZnJvbSAiY29tbWFuZHNfbGlzdCIKLQlmb3IgY21kIGluIGNvbW1hbmRzX2xpc3Q6 Ci0JCWlmIGNtZC5oYXNfa2V5KCJjbWQiKToKLQkJCWNvbW1hbmRzW2NtZFsiY21kIl1dID0g Y21kCi0KLQlkZWZhdWx0X3ZlcmJvc2l0eSA9IENvbmZpZygpLnZlcmJvc2l0eQotCW9wdHBh cnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fY2xhc3M9T3B0aW9uTWltZVR5cGUsIGZvcm1h dHRlcj1NeUhlbHBGb3JtYXR0ZXIoKSkKLQkjb3B0cGFyc2VyLmRpc2FibGVfaW50ZXJzcGVy c2VkX2FyZ3MoKQotCi0Jb3B0cGFyc2VyLnNldF9kZWZhdWx0cyhjb25maWc9b3MuZ2V0ZW52 KCJIT01FIikrIi8uczNjZmciKQotCW9wdHBhcnNlci5zZXRfZGVmYXVsdHModmVyYm9zaXR5 ID0gZGVmYXVsdF92ZXJib3NpdHkpCi0KLQlvcHRwYXJzZXIuYWRkX29wdGlvbiggICAgICAi LS1jb25maWd1cmUiLCBkZXN0PSJydW5fY29uZmlndXJlIiwgYWN0aW9uPSJzdG9yZV90cnVl IiwgaGVscD0iSW52b2tlIGludGVyYWN0aXZlIChyZSljb25maWd1cmF0aW9uIHRvb2wuIikK LQlvcHRwYXJzZXIuYWRkX29wdGlvbigiLWMiLCAiLS1jb25maWciLCBkZXN0PSJjb25maWci LCBtZXRhdmFyPSJGSUxFIiwgaGVscD0iQ29uZmlnIGZpbGUgbmFtZS4gRGVmYXVsdHMgdG8g JWRlZmF1bHQiKQotCW9wdHBhcnNlci5hZGRfb3B0aW9uKCAgICAgICItLWR1bXAtY29uZmln IiwgZGVzdD0iZHVtcF9jb25maWciLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJEdW1w IGN1cnJlbnQgY29uZmlndXJhdGlvbiBhZnRlciBwYXJzaW5nIGNvbmZpZyBmaWxlcyBhbmQg Y29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGV4aXQuIikKLQotCW9wdHBhcnNlci5hZGRfb3B0 aW9uKCItbiIsICItLWRyeS1ydW4iLCBkZXN0PSJkcnlfcnVuIiwgYWN0aW9uPSJzdG9yZV90 cnVlIiwgaGVscD0iT25seSBzaG93IHdoYXQgc2hvdWxkIGJlIHVwbG9hZGVkIG9yIGRvd25s b2FkZWQgYnV0IGRvbid0IGFjdHVhbGx5IGRvIGl0LiBNYXkgc3RpbGwgcGVyZm9ybSBTMyBy ZXF1ZXN0cyB0byBnZXQgYnVja2V0IGxpc3RpbmdzIHRob3VnaC4iKQotCi0Jb3B0cGFyc2Vy LmFkZF9vcHRpb24oIi1lIiwgIi0tZW5jcnlwdCIsIGRlc3Q9ImVuY3J5cHQiLCBhY3Rpb249 InN0b3JlX3RydWUiLCBoZWxwPSJFbmNyeXB0IGZpbGVzIGJlZm9yZSB1cGxvYWRpbmcgdG8g UzMuIikKLQlvcHRwYXJzZXIuYWRkX29wdGlvbiggICAgICAiLS1uby1lbmNyeXB0IiwgZGVz dD0iZW5jcnlwdCIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBoZWxwPSJEb24ndCBlbmNyeXB0 IGZpbGVzLiIpCi0Jb3B0cGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZm9yY2UiLCBkZXN0 PSJmb3JjZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9IkZvcmNlIG92ZXJ3cml0ZSBh bmQgb3RoZXIgZGFuZ2Vyb3VzIG9wZXJhdGlvbnMuIikKLQlvcHRwYXJzZXIuYWRkX29wdGlv bigiLVAiLCAiLS1hY2wtcHVibGljIiwgZGVzdD0iYWNsX3B1YmxpYyIsIGFjdGlvbj0ic3Rv cmVfdHJ1ZSIsIGhlbHA9IlN0b3JlIG9iamVjdHMgd2l0aCBBQ0wgYWxsb3dpbmcgcmVhZCBi eSBhbnlvbmUuIikKLQlvcHRwYXJzZXIuYWRkX29wdGlvbiggICAgICAiLS1hY2wtcHJpdmF0 ZSIsIGRlc3Q9ImFjbF9wdWJsaWMiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgaGVscD0iU3Rv cmUgb2JqZWN0cyB3aXRoIGRlZmF1bHQgQUNMIGFsbG93aW5nIGFjY2VzcyBieSB5b3Ugb25s eS4iKQotCW9wdHBhcnNlci5hZGRfb3B0aW9uKCAgICAgICItLWRlbGV0ZS1yZW1vdmVkIiwg ZGVzdD0iZGVsZXRlX3JlbW92ZWQiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJEZWxl dGUgcmVtb3RlIG9iamVjdHMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGxvY2FsIGZpbGUgW3N5 bmNdIikKLQlvcHRwYXJzZXIuYWRkX29wdGlvbiggICAgICAiLS1uby1kZWxldGUtcmVtb3Zl ZCIsIGRlc3Q9ImRlbGV0ZV9yZW1vdmVkIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGhlbHA9 IkRvbid0IGRlbGV0ZSByZW1vdGUgb2JqZWN0cy4iKQotCW9wdHBhcnNlci5hZGRfb3B0aW9u KCItcCIsICItLXByZXNlcnZlIiwgZGVzdD0icHJlc2VydmVfYXR0cnMiLCBhY3Rpb249InN0 b3JlX3RydWUiLCBoZWxwPSJQcmVzZXJ2ZSBmaWxlc3lzdGVtIGF0dHJpYnV0ZXMgKG1vZGUs IG93bmVyc2hpcCwgdGltZXN0YW1wcykuIERlZmF1bHQgZm9yIFtzeW5jXSBjb21tYW5kLiIp Ci0Jb3B0cGFyc2VyLmFkZF9vcHRpb24oICAgICAgIi0tbm8tcHJlc2VydmUiLCBkZXN0PSJw cmVzZXJ2ZV9hdHRycyIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBoZWxwPSJEb24ndCBzdG9y ZSBGUyBhdHRyaWJ1dGVzIikKLQlvcHRwYXJzZXIuYWRkX29wdGlvbiggICAgICAiLS1idWNr ZXQtbG9jYXRpb24iLCBkZXN0PSJidWNrZXRfbG9jYXRpb24iLCBoZWxwPSJEYXRhY2VudHJl IHRvIGNyZWF0ZSBidWNrZXQgaW4uIEVpdGhlciBFVSBvciBVUyAoZGVmYXVsdCkiKQotCi0J b3B0cGFyc2VyLmFkZF9vcHRpb24oIi1tIiwgIi0tbWltZS10eXBlIiwgZGVzdD0iZGVmYXVs dF9taW1lX3R5cGUiLCB0eXBlPSJtaW1ldHlwZSIsIG1ldGF2YXI9Ik1JTUUvVFlQRSIsIGhl bHA9IkRlZmF1bHQgTUlNRS10eXBlIHRvIGJlIHNldCBmb3Igb2JqZWN0cyBzdG9yZWQuIikK LQlvcHRwYXJzZXIuYWRkX29wdGlvbigiLU0iLCAiLS1ndWVzcy1taW1lLXR5cGUiLCBkZXN0 PSJndWVzc19taW1lX3R5cGUiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPSJHdWVzcyBN SU1FLXR5cGUgb2YgZmlsZXMgYnkgdGhlaXIgZXh0ZW5zaW9uLiBGYWxscyBiYWNrIHRvIGRl ZmF1bHQgTUlNRS1UeXBlIGFzIHNwZWNpZmllZCBieSAtLW1pbWUtdHlwZSBvcHRpb24iKQot Ci0Jb3B0cGFyc2VyLmFkZF9vcHRpb24oIi1IIiwgIi0taHVtYW4tcmVhZGFibGUtc2l6ZXMi LCBkZXN0PSJodW1hbl9yZWFkYWJsZV9zaXplcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhl bHA9IlByaW50IHNpemVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0uIikKLQotCW9wdHBhcnNl ci5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBkZXN0PSJ2ZXJib3NpdHkiLCBhY3Rp b249InN0b3JlX2NvbnN0IiwgY29uc3Q9bG9nZ2luZy5JTkZPLCBoZWxwPSJFbmFibGUgdmVy Ym9zZSBvdXRwdXQuIikKLQlvcHRwYXJzZXIuYWRkX29wdGlvbigiLWQiLCAiLS1kZWJ1ZyIs IGRlc3Q9InZlcmJvc2l0eSIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBjb25zdD1sb2dnaW5n LkRFQlVHLCBoZWxwPSJFbmFibGUgZGVidWcgb3V0cHV0LiIpCi0Jb3B0cGFyc2VyLmFkZF9v cHRpb24oICAgICAgIi0tdmVyc2lvbiIsIGRlc3Q9InNob3dfdmVyc2lvbiIsIGFjdGlvbj0i c3RvcmVfdHJ1ZSIsIGhlbHA9IlNob3cgczNjbWQgdmVyc2lvbiAoJXMpIGFuZCBleGl0LiIg JSAoUGtnSW5mby52ZXJzaW9uKSkKLQotCW9wdHBhcnNlci5zZXRfdXNhZ2Uob3B0cGFyc2Vy LnVzYWdlICsgIiBDT01NQU5EIFtwYXJhbWV0ZXJzXSIpCi0Jb3B0cGFyc2VyLnNldF9kZXNj cmlwdGlvbignUzNjbWQgaXMgYSB0b29sIGZvciBtYW5hZ2luZyBvYmplY3RzIGluICcrCi0J CSdBbWF6b24gUzMgc3RvcmFnZS4gSXQgYWxsb3dzIGZvciBtYWtpbmcgYW5kIHJlbW92aW5n ICcrCi0JCSciYnVja2V0cyIgYW5kIHVwbG9hZGluZywgZG93bmxvYWRpbmcgYW5kIHJlbW92 aW5nICcrCi0JCScib2JqZWN0cyIgZnJvbSB0aGVzZSBidWNrZXRzLicpCi0Jb3B0cGFyc2Vy LmVwaWxvZyA9IGZvcm1hdF9jb21tYW5kcyhvcHRwYXJzZXIuZ2V0X3Byb2dfbmFtZSgpKQot CW9wdHBhcnNlci5lcGlsb2cgKz0gKCJcblNlZSBwcm9ncmFtIGhvbWVwYWdlIGZvciBtb3Jl IGluZm9ybWF0aW9uIGF0XG4lc1xuIiAlIFBrZ0luZm8udXJsKQotCi0JKG9wdGlvbnMsIGFy Z3MpID0gb3B0cGFyc2VyLnBhcnNlX2FyZ3MoKQotCi0JIyMgU29tZSBtdWNraW5nIHdpdGgg bG9nZ2luZyBsZXZlbHMgdG8gZW5hYmxlIAotCSMjIGRlYnVnZ2luZy92ZXJib3NlIG91dHB1 dCBmb3IgY29uZmlnIGZpbGUgcGFyc2VyIG9uIHJlcXVlc3QKLQlsb2dnaW5nLmJhc2ljQ29u ZmlnKGxldmVsPW9wdGlvbnMudmVyYm9zaXR5LCBmb3JtYXQ9JyUobGV2ZWxuYW1lKXM6ICUo bWVzc2FnZSlzJykKLQkKLQlpZiBvcHRpb25zLnNob3dfdmVyc2lvbjoKLQkJb3V0cHV0KCJz M2NtZCB2ZXJzaW9uICVzIiAlIFBrZ0luZm8udmVyc2lvbikKLQkJc3lzLmV4aXQoMCkKLQot CSMjIE5vdyBmaW5hbGx5IHBhcnNlIHRoZSBjb25maWcgZmlsZQotCXRyeToKLQkJY2ZnID0g Q29uZmlnKG9wdGlvbnMuY29uZmlnKQotCWV4Y2VwdCBJT0Vycm9yLCBlOgotCQlpZiBvcHRp b25zLnJ1bl9jb25maWd1cmU6Ci0JCQljZmcgPSBDb25maWcoKQotCQllbHNlOgotCQkJZXJy b3IoIiVzOiAlcyIgICUgKG9wdGlvbnMuY29uZmlnLCBlLnN0cmVycm9yKSkKLQkJCWVycm9y KCJDb25maWd1cmF0aW9uIGZpbGUgbm90IGF2YWlsYWJsZS4iKQotCQkJZXJyb3IoIkNvbnNp ZGVyIHVzaW5nIC0tY29uZmlndXJlIHBhcmFtZXRlciB0byBjcmVhdGUgb25lLiIpCi0JCQlz eXMuZXhpdCgxKQotCi0JIyMgQW5kIGFnYWluIHNvbWUgbG9nZ2luZyBsZXZlbCBhZGp1c3Rt ZW50cwotCSMjIGFjY29yZGluZyB0byBjb25maWdmaWxlIGFuZCBjb21tYW5kIGxpbmUgcGFy YW1ldGVycwotCWlmIG9wdGlvbnMudmVyYm9zaXR5ICE9IGRlZmF1bHRfdmVyYm9zaXR5Ogot CQljZmcudmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NpdHkKLQlsb2dnaW5nLnJvb3Quc2V0 TGV2ZWwoY2ZnLnZlcmJvc2l0eSkKLQotCSMjIFVwZGF0ZSBDb25maWcgd2l0aCBvdGhlciBw YXJhbWV0ZXJzCi0JZm9yIG9wdGlvbiBpbiBjZmcub3B0aW9uX2xpc3QoKToKLQkJdHJ5Ogot CQkJaWYgZ2V0YXR0cihvcHRpb25zLCBvcHRpb24pICE9IE5vbmU6Ci0JCQkJZGVidWcoIlVw ZGF0aW5nICVzIC0+ICVzIiAlIChvcHRpb24sIGdldGF0dHIob3B0aW9ucywgb3B0aW9uKSkp Ci0JCQkJY2ZnLnVwZGF0ZV9vcHRpb24ob3B0aW9uLCBnZXRhdHRyKG9wdGlvbnMsIG9wdGlv bikpCi0JCWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLQkJCSMjIFNvbWUgQ29uZmlnKCkgb3B0 aW9ucyBhcmUgbm90IHNldHRhYmxlIGZyb20gY29tbWFuZCBsaW5lCi0JCQlwYXNzCi0KLQlp ZiBjZmcuZW5jcnlwdCBhbmQgY2ZnLmdwZ19wYXNzcGhyYXNlID09ICIiOgotCQllcnJvcigi RW5jcnlwdGlvbiByZXF1ZXN0ZWQgYnV0IG5vIHBhc3NwaHJhc2Ugc2V0IGluIGNvbmZpZyBm aWxlLiIpCi0JCWVycm9yKCJQbGVhc2UgcmUtcnVuICdzM2NtZCAtLWNvbmZpZ3VyZScgYW5k IHN1cHBseSBpdC4iKQotCQlzeXMuZXhpdCgxKQotCi0JaWYgb3B0aW9ucy5kdW1wX2NvbmZp ZzoKLQkJY2ZnLmR1bXBfY29uZmlnKHN5cy5zdGRvdXQpCi0JCXN5cy5leGl0KDApCi0KLQlp ZiBvcHRpb25zLnJ1bl9jb25maWd1cmU6Ci0JCXJ1bl9jb25maWd1cmUob3B0aW9ucy5jb25m aWcpCi0JCXN5cy5leGl0KDApCi0KLQlpZiBsZW4oYXJncykgPCAxOgotCQllcnJvcigiTWlz c2luZyBjb21tYW5kLiBQbGVhc2UgcnVuIHdpdGggLS1oZWxwIGZvciBtb3JlIGluZm9ybWF0 aW9uLiIpCi0JCXN5cy5leGl0KDEpCi0KLQljb21tYW5kID0gYXJncy5wb3AoMCkKLQl0cnk6 Ci0JCWRlYnVnKCJDb21tYW5kOiAiICsgY29tbWFuZHNbY29tbWFuZF1bImNtZCJdKQotCQkj IyBXZSBtdXN0IGRvIHRoaXMgbG9va3VwIGluIGV4dHJhIHN0ZXAgdG8gCi0JCSMjIGF2b2lk IGNhdGNoaW5nIGFsbCBLZXlFcnJvciBleGNlcHRpb25zCi0JCSMjIGZyb20gaW5uZXIgZnVu Y3Rpb25zLgotCQljbWRfZnVuYyA9IGNvbW1hbmRzW2NvbW1hbmRdWyJmdW5jIl0KLQlleGNl cHQgS2V5RXJyb3IsIGU6Ci0JCWVycm9yKCJJbnZhbGlkIGNvbW1hbmQ6ICVzIiAlIGUpCi0J CXN5cy5leGl0KDEpCi0KLQlpZiBsZW4oYXJncykgPCBjb21tYW5kc1tjb21tYW5kXVsiYXJn YyJdOgotCQllcnJvcigiTm90IGVub3VnaCBwYXJhbXRlcnMgZm9yIGNvbW1hbmQgJyVzJyIg JSBjb21tYW5kKQotCQlzeXMuZXhpdCgxKQotCi0JdHJ5OgotCQljbWRfZnVuYyhhcmdzKQot CWV4Y2VwdCBTM0Vycm9yLCBlOgotCQllcnJvcigiUzMgZXJyb3I6ICIgKyBzdHIoZSkpCi0J CXN5cy5leGl0KDEpCi0JZXhjZXB0IFBhcmFtZXRlckVycm9yLCBlOgotCQllcnJvcigiUGFy YW1ldGVyIHByb2JsZW06ICIgKyBzdHIoZSkpCi0JCXN5cy5leGl0KDEpCi0KLQlzeXMuZXhp dCgwKQotCisjIS91c3IvYmluL2VudiBweXRob24NCisNCisjIyBBbWF6b24gUzMgbWFuYWdl cg0KKyMjIEF1dGhvcjogTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6Pg0KKyMjICAg ICAgICAgaHR0cDovL3d3dy5sb2dpeC5jei9taWNoYWwNCisjIyBMaWNlbnNlOiBHUEwgVmVy c2lvbiAyDQorDQoraW1wb3J0IHN5cw0KK2ltcG9ydCBsb2dnaW5nDQoraW1wb3J0IHRpbWUN CitpbXBvcnQgb3MNCitpbXBvcnQgcmUNCitpbXBvcnQgZXJybm8NCitpbXBvcnQgcHdkLCBn cnANCisNCitmcm9tIGNvcHkgaW1wb3J0IGNvcHkNCitmcm9tIG9wdHBhcnNlIGltcG9ydCBP cHRpb25QYXJzZXIsIE9wdGlvbiwgT3B0aW9uVmFsdWVFcnJvciwgSW5kZW50ZWRIZWxwRm9y bWF0dGVyDQorZnJvbSBsb2dnaW5nIGltcG9ydCBkZWJ1ZywgaW5mbywgd2FybmluZywgZXJy b3INCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlDQorDQor IyMgT3VyIG1vZHVsZXMNCitmcm9tIFMzIGltcG9ydCBQa2dJbmZvDQorZnJvbSBTMy5TMyBp bXBvcnQgKg0KK2Zyb20gUzMuQ29uZmlnIGltcG9ydCBDb25maWcNCitmcm9tIFMzLlMzVXJp IGltcG9ydCAqDQorZnJvbSBTMyBpbXBvcnQgVXRpbHMNCisNCisNCitkZWYgb3V0cHV0KG1l c3NhZ2UpOg0KKwlwcmludCBtZXNzYWdlDQorDQorZGVmIGNoZWNrX2FyZ3NfdHlwZShhcmdz LCB0eXBlLCB2ZXJib3NlX3R5cGUpOg0KKwlmb3IgYXJnIGluIGFyZ3M6DQorCQlpZiBTM1Vy aShhcmcpLnR5cGUgIT0gdHlwZToNCisJCQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigiRXhwZWN0 aW5nICVzIGluc3RlYWQgb2YgJyVzJyIgJSAodmVyYm9zZV90eXBlLCBhcmcpKQ0KKw0KK2Rl ZiBjbWRfZHUoYXJncyk6DQorCXMzID0gUzMoQ29uZmlnKCkpDQorCWlmIGxlbihhcmdzKSA+ IDA6DQorCQl1cmkgPSBTM1VyaShhcmdzWzBdKQ0KKwkJaWYgdXJpLnR5cGUgPT0gInMzIiBh bmQgdXJpLmhhc19idWNrZXQoKToNCisJCQlzdWJjbWRfYnVja2V0X3VzYWdlKHMzLCB1cmkp DQorCQkJcmV0dXJuDQorCXN1YmNtZF9idWNrZXRfdXNhZ2VfYWxsKHMzKQ0KKw0KK2RlZiBz dWJjbWRfYnVja2V0X3VzYWdlX2FsbChzMyk6DQorCXJlc3BvbnNlID0gczMubGlzdF9hbGxf YnVja2V0cygpDQorDQorCWJ1Y2tldHNfc2l6ZSA9IDANCisJZm9yIGJ1Y2tldCBpbiByZXNw b25zZVsibGlzdCJdOg0KKwkJc2l6ZSA9IHN1YmNtZF9idWNrZXRfdXNhZ2UoczMsIFMzVXJp KCJzMzovLyIgKyBidWNrZXRbIk5hbWUiXSkpDQorCQlpZiBzaXplICE9IE5vbmU6DQorCQkJ YnVja2V0c19zaXplICs9IHNpemUNCisJdG90YWxfc2l6ZSwgc2l6ZV9jb2VmZiA9IGZvcm1h dFNpemUoYnVja2V0c19zaXplLCBDb25maWcoKS5odW1hbl9yZWFkYWJsZV9zaXplcykNCisJ dG90YWxfc2l6ZV9zdHIgPSBzdHIodG90YWxfc2l6ZSkgKyBzaXplX2NvZWZmIA0KKwlvdXRw dXQoIiIucmp1c3QoOCwgIi0iKSkNCisJb3V0cHV0KCIlcyBUb3RhbCIgJSAodG90YWxfc2l6 ZV9zdHIubGp1c3QoOCkpKQ0KKw0KK2RlZiBzdWJjbWRfYnVja2V0X3VzYWdlKHMzLCB1cmkp Og0KKwlidWNrZXQgPSB1cmkuYnVja2V0KCkNCisJb2JqZWN0ID0gdXJpLm9iamVjdCgpDQor DQorCWlmIG9iamVjdC5lbmRzd2l0aCgnKicpOg0KKwkJb2JqZWN0ID0gb2JqZWN0WzotMV0N CisJdHJ5Og0KKwkJcmVzcG9uc2UgPSBzMy5idWNrZXRfbGlzdChidWNrZXQsIHByZWZpeCA9 IG9iamVjdCkNCisJZXhjZXB0IFMzRXJyb3IsIGU6DQorCQlpZiBTMy5jb2Rlcy5oYXNfa2V5 KGUuQ29kZSk6DQorCQkJZXJyb3IoUzMuY29kZXNbZS5Db2RlXSAlIGJ1Y2tldCkNCisJCQly ZXR1cm4NCisJCWVsc2U6DQorCQkJcmFpc2UNCisJYnVja2V0X3NpemUgPSAwDQorCWZvciBv YmplY3QgaW4gcmVzcG9uc2VbImxpc3QiXToNCisJCXNpemUsIHNpemVfY29lZmYgPSBmb3Jt YXRTaXplKG9iamVjdFsiU2l6ZSJdLCBGYWxzZSkNCisJCWJ1Y2tldF9zaXplICs9IHNpemUN CisJdG90YWxfc2l6ZSwgc2l6ZV9jb2VmZiA9IGZvcm1hdFNpemUoYnVja2V0X3NpemUsIENv bmZpZygpLmh1bWFuX3JlYWRhYmxlX3NpemVzKQ0KKwl0b3RhbF9zaXplX3N0ciA9IHN0cih0 b3RhbF9zaXplKSArIHNpemVfY29lZmYgDQorCW91dHB1dCgiJXMgJXMiICUgKHRvdGFsX3Np emVfc3RyLmxqdXN0KDgpLCB1cmkpKQ0KKwlyZXR1cm4gYnVja2V0X3NpemUNCisNCitkZWYg Y21kX2xzKGFyZ3MpOg0KKwlzMyA9IFMzKENvbmZpZygpKQ0KKwlpZiBsZW4oYXJncykgPiAw Og0KKwkJdXJpID0gUzNVcmkoYXJnc1swXSkNCisJCWlmIHVyaS50eXBlID09ICJzMyIgYW5k IHVyaS5oYXNfYnVja2V0KCk6DQorCQkJc3ViY21kX2J1Y2tldF9saXN0KHMzLCB1cmkpDQor CQkJcmV0dXJuDQorCXN1YmNtZF9idWNrZXRzX2xpc3RfYWxsKHMzKQ0KKw0KK2RlZiBjbWRf YnVja2V0c19saXN0X2FsbF9hbGwoYXJncyk6DQorCXMzID0gUzMoQ29uZmlnKCkpDQorDQor CXJlc3BvbnNlID0gczMubGlzdF9hbGxfYnVja2V0cygpDQorDQorCWZvciBidWNrZXQgaW4g cmVzcG9uc2VbImxpc3QiXToNCisJCXN1YmNtZF9idWNrZXRfbGlzdChzMywgUzNVcmkoInMz Oi8vIiArIGJ1Y2tldFsiTmFtZSJdKSkNCisJCW91dHB1dCgiIikNCisNCisNCitkZWYgc3Vi Y21kX2J1Y2tldHNfbGlzdF9hbGwoczMpOg0KKwlyZXNwb25zZSA9IHMzLmxpc3RfYWxsX2J1 Y2tldHMoKQ0KKwlmb3IgYnVja2V0IGluIHJlc3BvbnNlWyJsaXN0Il06DQorCQlvdXRwdXQo IiVzICBzMzovLyVzIiAlICgNCisJCQlmb3JtYXREYXRlVGltZShidWNrZXRbIkNyZWF0aW9u RGF0ZSJdKSwNCisJCQlidWNrZXRbIk5hbWUiXSwNCisJCQkpKQ0KKw0KK2RlZiBzdWJjbWRf YnVja2V0X2xpc3QoczMsIHVyaSk6DQorCWJ1Y2tldCA9IHVyaS5idWNrZXQoKQ0KKwlvYmpl Y3QgPSB1cmkub2JqZWN0KCkNCisNCisJb3V0cHV0KCJCdWNrZXQgJyVzJzoiICUgYnVja2V0 KQ0KKwlpZiBvYmplY3QuZW5kc3dpdGgoJyonKToNCisJCW9iamVjdCA9IG9iamVjdFs6LTFd DQorCXRyeToNCisJCXJlc3BvbnNlID0gczMuYnVja2V0X2xpc3QoYnVja2V0LCBwcmVmaXgg PSBvYmplY3QpDQorCWV4Y2VwdCBTM0Vycm9yLCBlOg0KKwkJaWYgUzMuY29kZXMuaGFzX2tl eShlLmluZm9bIkNvZGUiXSk6DQorCQkJZXJyb3IoUzMuY29kZXNbZS5pbmZvWyJDb2RlIl1d ICUgYnVja2V0KQ0KKwkJCXJldHVybg0KKwkJZWxzZToNCisJCQlyYWlzZQ0KKwlmb3Igb2Jq ZWN0IGluIHJlc3BvbnNlWyJsaXN0Il06DQorCQlzaXplLCBzaXplX2NvZWZmID0gZm9ybWF0 U2l6ZShvYmplY3RbIlNpemUiXSwgQ29uZmlnKCkuaHVtYW5fcmVhZGFibGVfc2l6ZXMpDQor CQlvdXRwdXQoIiVzICAlcyVzICAlcyIgJSAoDQorCQkJZm9ybWF0RGF0ZVRpbWUob2JqZWN0 WyJMYXN0TW9kaWZpZWQiXSksDQorCQkJc3RyKHNpemUpLnJqdXN0KDgpLCBzaXplX2NvZWZm LmxqdXN0KDEpLA0KKwkJCXVyaS5jb21wb3NlX3VyaShidWNrZXQsIG9iamVjdFsiS2V5Il0p LA0KKwkJCSkpDQorDQorZGVmIGNtZF9nZXRtZDUoYXJncyk6DQorCXMzID0gUzMoQ29uZmln KCkpDQorCWlmIGxlbihhcmdzKSA+IDA6DQorCQl1cmkgPSBTM1VyaShhcmdzWzBdKQ0KKwkJ aWYgdXJpLnR5cGUgPT0gInMzIiBhbmQgdXJpLmhhc19idWNrZXQoKToNCisJCQlidWNrZXQg PSB1cmkuYnVja2V0KCkNCisJCQlvYmplY3QgPSB1cmkub2JqZWN0KCkNCisJCQkNCisJCQlp ZiBvYmplY3QuZW5kc3dpdGgoJyonKToNCisJCQkJb2JqZWN0ID0gb2JqZWN0WzotMV0NCisJ CQl0cnk6DQorCQkJCXJlc3BvbnNlID0gczMuYnVja2V0X2xpc3QoYnVja2V0LCBwcmVmaXgg PSBvYmplY3QpDQorCQkJZXhjZXB0IFMzRXJyb3IsIGU6DQorCQkJCWlmIFMzLmNvZGVzLmhh c19rZXkoZS5pbmZvWyJDb2RlIl0pOg0KKwkJCQkJZXJyb3IoUzMuY29kZXNbZS5pbmZvWyJD b2RlIl1dICUgYnVja2V0KQ0KKwkJCQkJcmV0dXJuDQorCQkJCWVsc2U6DQorCQkJCQlyYWlz ZQ0KKwkJCWZvciBvYmplY3QgaW4gcmVzcG9uc2VbImxpc3QiXToNCisJCQkJb3V0cHV0KCIl cyAlcyIgJSAoDQorCQkJCQlvYmplY3RbJ0VUYWcnXVsxOi0xXSwNCisJCQkJCXVyaS5vYmpl Y3QoKSwNCisJCQkJCSkpDQorDQorZGVmIGNtZF9idWNrZXRfY3JlYXRlKGFyZ3MpOg0KKwl1 cmkgPSBTM1VyaShhcmdzWzBdKQ0KKwlpZiBub3QgdXJpLnR5cGUgPT0gInMzIiBvciBub3Qg dXJpLmhhc19idWNrZXQoKSBvciB1cmkuaGFzX29iamVjdCgpOg0KKwkJcmFpc2UgUGFyYW1l dGVyRXJyb3IoIkV4cGVjdGluZyBTMyBVUkkgd2l0aCBqdXN0IHRoZSBidWNrZXQgbmFtZSBz ZXQgaW5zdGVhZCBvZiAnJXMnIiAlIGFyZ3NbMF0pDQorCXRyeToNCisJCXMzID0gUzMoQ29u ZmlnKCkpDQorCQlyZXNwb25zZSA9IHMzLmJ1Y2tldF9jcmVhdGUodXJpLmJ1Y2tldCgpLCBj ZmcuYnVja2V0X2xvY2F0aW9uKQ0KKwlleGNlcHQgUzNFcnJvciwgZToNCisJCWlmIFMzLmNv ZGVzLmhhc19rZXkoZS5pbmZvWyJDb2RlIl0pOg0KKwkJCWVycm9yKFMzLmNvZGVzW2UuaW5m b1siQ29kZSJdXSAlIHVyaS5idWNrZXQoKSkNCisJCQlyZXR1cm4NCisJCWVsc2U6DQorCQkJ cmFpc2UNCisJb3V0cHV0KCJCdWNrZXQgJyVzJyBjcmVhdGVkIiAlIHVyaS5idWNrZXQoKSkN CisNCitkZWYgY21kX2J1Y2tldF9kZWxldGUoYXJncyk6DQorCXVyaSA9IFMzVXJpKGFyZ3Nb MF0pDQorCWlmIG5vdCB1cmkudHlwZSA9PSAiczMiIG9yIG5vdCB1cmkuaGFzX2J1Y2tldCgp IG9yIHVyaS5oYXNfb2JqZWN0KCk6DQorCQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigiRXhwZWN0 aW5nIFMzIFVSSSB3aXRoIGp1c3QgdGhlIGJ1Y2tldCBuYW1lIHNldCBpbnN0ZWFkIG9mICcl cyciICUgYXJnc1swXSkNCisJdHJ5Og0KKwkJczMgPSBTMyhDb25maWcoKSkNCisJCXJlc3Bv bnNlID0gczMuYnVja2V0X2RlbGV0ZSh1cmkuYnVja2V0KCkpDQorCWV4Y2VwdCBTM0Vycm9y LCBlOg0KKwkJaWYgUzMuY29kZXMuaGFzX2tleShlLmluZm9bIkNvZGUiXSk6DQorCQkJZXJy b3IoUzMuY29kZXNbZS5pbmZvWyJDb2RlIl1dICUgdXJpLmJ1Y2tldCgpKQ0KKwkJCXJldHVy bg0KKwkJZWxzZToNCisJCQlyYWlzZQ0KKwlvdXRwdXQoIkJ1Y2tldCAnJXMnIHJlbW92ZWQi ICUgdXJpLmJ1Y2tldCgpKQ0KKw0KK2RlZiBjbWRfYnVja2V0X2luZm8oYXJncyk6DQorCXVy aSA9IFMzVXJpKGFyZ3NbMF0pDQorCWlmIG5vdCB1cmkudHlwZSA9PSAiczMiIG9yIG5vdCB1 cmkuaGFzX2J1Y2tldCgpIG9yIHVyaS5oYXNfb2JqZWN0KCk6DQorCQlyYWlzZSBQYXJhbWV0 ZXJFcnJvcigiRXhwZWN0aW5nIFMzIFVSSSB3aXRoIGp1c3QgdGhlIGJ1Y2tldCBuYW1lIHNl dCBpbnN0ZWFkIG9mICclcyciICUgYXJnc1swXSkNCisJdHJ5Og0KKwkJczMgPSBTMyhDb25m aWcoKSkNCisJCXJlc3BvbnNlID0gczMuYnVja2V0X2luZm8odXJpLmJ1Y2tldCgpKQ0KKwll eGNlcHQgUzNFcnJvciwgZToNCisJCWlmIFMzLmNvZGVzLmhhc19rZXkoZS5pbmZvWyJDb2Rl Il0pOg0KKwkJCWVycm9yKFMzLmNvZGVzW2UuaW5mb1siQ29kZSJdXSAlIHVyaS5idWNrZXQo KSkNCisJCQlyZXR1cm4NCisJCWVsc2U6DQorCQkJcmFpc2UNCisJb3V0cHV0KCJCdWNrZXQg JyVzJzoiICUgdXJpLmJ1Y2tldCgpKQ0KKwlvdXRwdXQoIiAgIExvY2F0aW9uOiAlcyIgJSBy ZXNwb25zZVsnYnVja2V0LWxvY2F0aW9uJ10pDQorDQorZGVmIGNtZF9vYmplY3RfcHV0KGFy Z3MpOg0KKwlzMyA9IFMzKENvbmZpZygpKQ0KKw0KKwl1cmlfYXJnID0gYXJncy5wb3AoKQ0K KwljaGVja19hcmdzX3R5cGUoYXJncywgJ2ZpbGUnLCAnZmlsZW5hbWUnKQ0KKw0KKwl1cmkg PSBTM1VyaSh1cmlfYXJnKQ0KKwlpZiB1cmkudHlwZSAhPSAiczMiOg0KKwkJcmFpc2UgUGFy YW1ldGVyRXJyb3IoIkV4cGVjdGluZyBTMyBVUkkgaW5zdGVhZCBvZiAnJXMnIiAlIHVyaV9h cmcpDQorDQorCWlmIGxlbihhcmdzKSA+IDEgYW5kIHVyaS5vYmplY3QoKSAhPSAiIiBhbmQg bm90IENvbmZpZygpLmZvcmNlOg0KKwkJZXJyb3IoIldoZW4gdXBsb2FkaW5nIG11bHRpcGxl IGZpbGVzIHRoZSBsYXN0IGFyZ3VtZW50IG11c3QiKQ0KKwkJZXJyb3IoImJlIGEgUzMgVVJJ IHNwZWNpZnlpbmcganVzdCB0aGUgYnVja2V0IG5hbWUiKQ0KKwkJZXJyb3IoIldJVEhPVVQg b2JqZWN0IG5hbWUhIikNCisJCWVycm9yKCJBbHRlcm5hdGl2ZWx5IHVzZSAtLWZvcmNlIGFy Z3VtZW50IGFuZCB0aGUgc3BlY2lmaWVkIikNCisJCWVycm9yKCJvYmplY3QgbmFtZSB3aWxs IGJlIHByZWZpeGVkIHRvIGFsbCBzdG9yZWQgZmlsZW5hbWVzLiIpDQorCQlzeXMuZXhpdCgx KQ0KKwkNCisJc2VxID0gMA0KKwl0b3RhbCA9IGxlbihhcmdzKQ0KKwlmb3IgZmlsZSBpbiBh cmdzOg0KKwkJc2VxICs9IDENCisJCXVyaV9hcmdfZmluYWwgPSBzdHIodXJpKQ0KKwkJaWYg bGVuKGFyZ3MpID4gMSBvciB1cmkub2JqZWN0KCkgPT0gIiI6DQorCQkJdXJpX2FyZ19maW5h bCArPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGUpDQorCQkNCisJCXVyaV9maW5hbCA9IFMzVXJp KHVyaV9hcmdfZmluYWwpDQorCQlleHRyYV9oZWFkZXJzID0ge30NCisJCXJlYWxfZmlsZW5h bWUgPSBmaWxlDQorCQlpZiBDb25maWcoKS5lbmNyeXB0Og0KKwkJCWV4aXRjb2RlLCByZWFs X2ZpbGVuYW1lLCBleHRyYV9oZWFkZXJzWyJ4LWFtei1tZXRhLXMzdG9vbHMtZ3BnZW5jIl0g PSBncGdfZW5jcnlwdChmaWxlKQ0KKwkJcmVzcG9uc2UgPSBzMy5vYmplY3RfcHV0X3VyaShy ZWFsX2ZpbGVuYW1lLCB1cmlfZmluYWwsIGV4dHJhX2hlYWRlcnMpDQorCQlvdXRwdXQoIkZp bGUgJyVzJyBzdG9yZWQgYXMgJXMgKCVkIGJ5dGVzKSBbJWQgb2YgJWRdIiAlDQorCQkJKGZp bGUsIHVyaV9maW5hbCwgcmVzcG9uc2VbInNpemUiXSwNCisJCQlzZXEsIHRvdGFsKSkNCisJ CWlmIENvbmZpZygpLmFjbF9wdWJsaWM6DQorCQkJb3V0cHV0KCJQdWJsaWMgVVJMIG9mIHRo ZSBvYmplY3QgaXM6ICVzIiAlDQorCQkJCSh1cmkucHVibGljX3VybCgpKSkNCisJCWlmIENv bmZpZygpLmVuY3J5cHQgYW5kIHJlYWxfZmlsZW5hbWUgIT0gZmlsZToNCisJCQlkZWJ1Zygi UmVtb3ZpbmcgdGVtcG9yYXJ5IGVuY3J5cHRlZCBmaWxlOiAlcyIgJSByZWFsX2ZpbGVuYW1l KQ0KKwkJCW9zLnJlbW92ZShyZWFsX2ZpbGVuYW1lKQ0KKw0KK2RlZiBjbWRfb2JqZWN0X2dl dChhcmdzKToNCisJczMgPSBTMyhDb25maWcoKSkNCisNCisJaWYgbm90IFMzVXJpKGFyZ3Nb MF0pLnR5cGUgPT0gJ3MzJzoNCisJCXJhaXNlIFBhcmFtZXRlckVycm9yKCJFeHBlY3Rpbmcg UzMgVVJJIGluc3RlYWQgb2YgJyVzJyIgJSBhcmdzWzBdKQ0KKw0KKwlkZXN0aW5hdGlvbl9k aXIgPSBOb25lDQorCWRlc3RpbmF0aW9uX2ZpbGUgPSBOb25lDQorCWlmIGxlbihhcmdzKSA+ IDE6DQorCQlpZiBTM1VyaShhcmdzWy0xXSkudHlwZSA9PSAnczMnOg0KKwkJCSMgYWxsIFMz LCB1c2Ugb2JqZWN0IG5hbWVzIHRvIGxvY2FsIGRpcg0KKwkJCWNoZWNrX2FyZ3NfdHlwZShh cmdzLCB0eXBlPSJzMyIsIHZlcmJvc2VfdHlwZT0iUzMgVVJJIikJIyBNYXkgcmFpc2UgUGFy YW1ldGVyRXJyb3INCisJCWVsc2U6DQorCQkJaWYgKGxlbihhcmdzKSA+IDIpOg0KKwkJCQkj IGxhc3QgbXVzdCBiZSBkaXIsIGFsbCBwcmVjZWRpbmcgUzMNCisJCQkJaWYgbm90IG9zLnBh dGguaXNkaXIoYXJnc1stMV0pOg0KKwkJCQkJcmFpc2UgUGFyYW1ldGVyRXJyb3IoIkxhc3Qg cGFyYW1ldGVyIG11c3QgYmUgYSBkaXJlY3RvcnkiKQ0KKwkJCQlkZXN0aW5hdGlvbl9kaXIg PSBhcmdzLnBvcCgpDQorCQkJCWNoZWNrX2FyZ3NfdHlwZShhcmdzLCB0eXBlPSJzMyIsIHZl cmJvc2VfdHlwZT0iUzMgVVJJIikJIyBNYXkgcmFpc2UgUGFyYW1ldGVyRXJyb3INCisJCQll bHNlOg0KKwkJCQkjIGxhc3QgbXVzdCBiZSBhIGRpciBvciBhIGZpbGVuYW1lDQorCQkJCWlm IG9zLnBhdGguaXNkaXIoYXJnc1stMV0pOg0KKwkJCQkJZGVzdGluYXRpb25fZGlyID0gYXJn cy5wb3AoKQ0KKwkJCQllbHNlOg0KKwkJCQkJZGVzdGluYXRpb25fZmlsZSA9IGFyZ3MucG9w KCkNCisNCisJd2hpbGUgKGxlbihhcmdzKSk6DQorCQl1cmlfYXJnID0gYXJncy5wb3AoMCkN CisJCXVyaSA9IFMzVXJpKHVyaV9hcmcpDQorDQorCQlpZiBkZXN0aW5hdGlvbl9maWxlOg0K KwkJCWRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25fZmlsZQ0KKwkJZWxpZiBkZXN0aW5hdGlv bl9kaXI6DQorCQkJZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbl9kaXIgKyAiLyIgKyB1cmku b2JqZWN0KCkNCisJCWVsc2U6DQorCQkJIyBCeSBkZWZhdWx0IHRoZSBkZXN0aW5hdGlvbiBm aWxlbmFtZSBpcyB0aGUgb2JqZWN0IG5hbWUNCisJCQlkZXN0aW5hdGlvbiA9IHVyaS5vYmpl Y3QoKQ0KKw0KKwkJaWYgbm90IENvbmZpZygpLmZvcmNlIGFuZCBvcy5wYXRoLmV4aXN0cyhk ZXN0aW5hdGlvbik6DQorCQkJcmFpc2UgUGFyYW1ldGVyRXJyb3IoIkZpbGUgJXMgYWxyZWFk eSBleGlzdHMuIFVzZSAtLWZvcmNlIHRvIG92ZXJ3cml0ZSBpdCIgJSBkZXN0aW5hdGlvbikN CisJCXJlc3BvbnNlID0gczMub2JqZWN0X2dldF91cmkodXJpLCBkZXN0aW5hdGlvbikNCisJ CWlmIHJlc3BvbnNlWyJoZWFkZXJzIl0uaGFzX2tleSgieC1hbXotbWV0YS1zM3Rvb2xzLWdw Z2VuYyIpOg0KKwkJCWdwZ19kZWNyeXB0KGRlc3RpbmF0aW9uLCByZXNwb25zZVsiaGVhZGVy cyJdWyJ4LWFtei1tZXRhLXMzdG9vbHMtZ3BnZW5jIl0pDQorCQkJcmVzcG9uc2VbInNpemUi XSA9IG9zLnN0YXQoZGVzdGluYXRpb24pWzZdDQorCQlpZiBkZXN0aW5hdGlvbiAhPSAiLSI6 DQorCQkJb3V0cHV0KCJPYmplY3QgJXMgc2F2ZWQgYXMgJyVzJyAoJWQgYnl0ZXMpIiAlDQor CQkJCSh1cmksIGRlc3RpbmF0aW9uLCByZXNwb25zZVsic2l6ZSJdKSkNCisNCitkZWYgY21k X29iamVjdF9kZWwoYXJncyk6DQorCXMzID0gUzMoQ29uZmlnKCkpDQorDQorCXdoaWxlIChs ZW4oYXJncykpOg0KKwkJdXJpX2FyZyA9IGFyZ3MucG9wKDApDQorCQl1cmkgPSBTM1VyaSh1 cmlfYXJnKQ0KKwkJaWYgdXJpLnR5cGUgIT0gInMzIiBvciBub3QgdXJpLmhhc19vYmplY3Qo KToNCisJCQlyYWlzZSBQYXJhbWV0ZXJFcnJvcigiRXhwZWN0aW5nIFMzIFVSSSBpbnN0ZWFk IG9mICclcyciICUgdXJpX2FyZykNCisNCisJCXJlc3BvbnNlID0gczMub2JqZWN0X2RlbGV0 ZV91cmkodXJpKQ0KKwkJb3V0cHV0KCJPYmplY3QgJXMgZGVsZXRlZCIgJSB1cmkpDQorDQor ZGVmIGNtZF9zeW5jKGFyZ3MpOg0KKwlkZWYgX2J1aWxkX2F0dHJfaGVhZGVyKHNyYyk6DQor CQlhdHRycyA9IHt9DQorCQlzdCA9IG9zLnN0YXRfcmVzdWx0KG9zLnN0YXQoc3JjKSkNCisJ CWZvciBhdHRyIGluIGNmZy5wcmVzZXJ2ZV9hdHRyc19saXN0Og0KKwkJCWlmIGF0dHIgPT0g J3VuYW1lJzoNCisJCQkJdmFsID0gcHdkLmdldHB3dWlkKHN0LnN0X3VpZCkucHdfbmFtZQ0K KwkJCWVsaWYgYXR0ciA9PSAnZ25hbWUnOg0KKwkJCQl2YWwgPSBncnAuZ2V0Z3JnaWQoc3Qu c3RfZ2lkKS5ncl9uYW1lDQorCQkJZWxzZToNCisJCQkJdmFsID0gZ2V0YXR0cihzdCwgJ3N0 XycgKyBhdHRyKQ0KKwkJCWF0dHJzW2F0dHJdID0gdmFsDQorCQlyZXN1bHQgPSAiIg0KKwkJ Zm9yIGsgaW4gYXR0cnM6IHJlc3VsdCArPSAiJXM6JXMvIiAlIChrLCBhdHRyc1trXSkNCisJ CXJldHVybiB7ICd4LWFtei1tZXRhLXMzY21kLWF0dHJzJyA6IHJlc3VsdFs6LTFdIH0NCisJ c3JjID0gYXJncy5wb3AoMCkNCisJaWYgUzNVcmkoc3JjKS50eXBlICE9ICJmaWxlIjoNCisJ CXJhaXNlIFBhcmFtZXRlckVycm9yKCJTb3VyY2UgbXVzdCBiZSBhIGxvY2FsIHBhdGggaW5z dGVhZCBvZjogJXMiICUgc3JjKQ0KKwlkc3QgPSBhcmdzLnBvcCgwKQ0KKwlpZiBub3QgZHN0 LmVuZHN3aXRoKCcvJyk6DQorCQlkc3QgKz0gIi8iDQorCWRzdF91cmkgPSBTM1VyaShkc3Qp DQorCWlmIGRzdF91cmkudHlwZSAhPSAiczMiOg0KKwkJcmFpc2UgUGFyYW1ldGVyRXJyb3Io IkRlc3RpbmF0aW9uIG11c3QgYmUgYSBTMyBVUkkgaW5zdGVhZCBvZjogJXMiICUgZHN0KQ0K KwlpZiAobGVuKGFyZ3MpKToNCisJCXJhaXNlIFBhcmFtZXRlckVycm9yKCJUb28gbWFueSBw YXJhbWV0ZXJzISBFeHBlY3RlZDogJXMiICUgY29tbWFuZHNbJ3N5bmMnXVsncGFyYW0nXSkN CisNCisJczMgPSBTMyhDb25maWcoKSkNCisNCisJb3V0cHV0KCJDb21waWxpbmcgbGlzdCBv ZiBsb2NhbCBmaWxlcy4uLiIpDQorCWlmIG9zLnBhdGguaXNkaXIoc3JjKToNCisJCWxvY19i YXNlID0gb3MucGF0aC5qb2luKHNyYywgIiIpDQorCQlmaWxlbGlzdCA9IG9zLndhbGsoc3Jj KQ0KKwllbHNlOg0KKwkJbG9jX2Jhc2UgPSAiLi8iDQorCQlmaWxlbGlzdCA9IFsoICcuJywg W10sIFtzcmNdICldDQorCWxvY19iYXNlX2xlbiA9IGxlbihsb2NfYmFzZSkNCisJbG9jX2xp c3QgPSB7fQ0KKwlmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gZmlsZWxpc3Q6DQorCQkjIyBU T0RPOiBpbXBsZW1lbnQgZXhwbGljaXQgZXhjbHVkZQ0KKwkJZm9yIGYgaW4gZmlsZXM6DQor CQkJZnVsbF9uYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIGYpDQorCQkJaWYgbm90IG9zLnBh dGguaXNmaWxlKGZ1bGxfbmFtZSk6DQorCQkJCWNvbnRpbnVlDQorCQkJaWYgb3MucGF0aC5p c2xpbmsoZnVsbF9uYW1lKToNCisJCQkJIyMgU3luY2hyb25pemUgc3ltbGlua3MuLi4gb25l IGRheQ0KKwkJCQkjIyBmb3Igbm93IHNraXAgb3Zlcg0KKwkJCQljb250aW51ZQ0KKwkJCWZp bGUgPSBmdWxsX25hbWVbbG9jX2Jhc2VfbGVuOl0NCisJCQlzciA9IG9zLnN0YXRfcmVzdWx0 KG9zLmxzdGF0KGZ1bGxfbmFtZSkpDQorCQkJbG9jX2xpc3RbZmlsZV0gPSB7DQorCQkJCSdm dWxsX25hbWUnIDogZnVsbF9uYW1lLA0KKwkJCQknc2l6ZScgOiBzci5zdF9zaXplLCANCisJ CQkJJ210aW1lJyA6IHNyLnN0X210aW1lLA0KKwkJCQkjIyBUT0RPOiBQb3NzaWJseSBtb3Jl IHRvIHNhdmUgaGVyZS4uLg0KKwkJCX0NCisJbG9jX2NvdW50ID0gbGVuKGxvY19saXN0KQ0K KwkNCisJb3V0cHV0KCJSZXRyaWV2aW5nIGxpc3Qgb2YgcmVtb3RlIGZpbGVzLi4uIikNCisJ cmVzcG9uc2UgPSBzMy5idWNrZXRfbGlzdChkc3RfdXJpLmJ1Y2tldCgpLCBwcmVmaXggPSBk c3RfdXJpLm9iamVjdCgpKQ0KKw0KKwlyZW1fYmFzZSA9IGRzdF91cmkub2JqZWN0KCkNCisJ cmVtX2Jhc2VfbGVuID0gbGVuKHJlbV9iYXNlKQ0KKwlyZW1fbGlzdCA9IHt9DQorCXJlbV9j b3VudCA9IGxlbihyZXNwb25zZVsnbGlzdCddKQ0KKwlmb3Igb2JqZWN0IGluIHJlc3BvbnNl WydsaXN0J106DQorCQlrZXkgPSBvYmplY3RbJ0tleSddW3JlbV9iYXNlX2xlbjpdLmVuY29k ZSgndXRmLTgnKQ0KKwkJcmVtX2xpc3Rba2V5XSA9IHsgDQorCQkJJ3NpemUnIDogaW50KG9i amVjdFsnU2l6ZSddKSwNCisJCQkjICdtdGltZScgOiBkYXRlUzN0b1VuaXgob2JqZWN0WydM YXN0TW9kaWZpZWQnXSksICMjIFRoYXQncyB1cGxvYWQgdGltZSwgbm90IG91ciBsYXN0bW9k IHRpbWUgOi0oDQorCQkJJ21kNScgOiBvYmplY3RbJ0VUYWcnXVsxOi0xXSwNCisJCQknb2Jq ZWN0X2tleScgOiBvYmplY3RbJ0tleSddLmVuY29kZSgndXRmLTgnKSwNCisJCX0NCisJb3V0 cHV0KCJGb3VuZCAlZCBsb2NhbCBmaWxlcywgJWQgcmVtb3RlIGZpbGVzIiAlIChsb2NfY291 bnQsIHJlbV9jb3VudCkpDQorDQorCW91dHB1dCgiVmVyaWZ5aW5nIGNoZWNrc3Vtcy4uLiIp DQorCWZvciBmaWxlIGluIGxvY19saXN0LmtleXMoKToNCisJCWRlYnVnKCJDaGVja2luZyAl cyAuLi4iICUgZmlsZSkNCisJCWlmIHJlbV9saXN0Lmhhc19rZXkoZmlsZSk6DQorCQkJZGVi dWcoIiVzIGV4aXN0cyBpbiByZW1vdGUgbGlzdCIgJSBmaWxlKQ0KKwkJCSMjIENoZWNrIHNp emUgZmlyc3QNCisJCQlpZiByZW1fbGlzdFtmaWxlXVsnc2l6ZSddID09IGxvY19saXN0W2Zp bGVdWydzaXplJ106DQorCQkJCWRlYnVnKCIlcyBzYW1lIHNpemU6ICVzIiAlIChmaWxlLCBy ZW1fbGlzdFtmaWxlXVsnc2l6ZSddKSkNCisJCQkJIyMgLi4uIHNhbWUgc2l6ZSwgY2hlY2sg TUQ1DQorCQkJCWxvY19tZDUgPSBVdGlscy5oYXNoX2ZpbGVfbWQ1KGxvY19saXN0W2ZpbGVd WydmdWxsX25hbWUnXSkNCisJCQkJaWYgbG9jX21kNSA9PSByZW1fbGlzdFtmaWxlXVsnbWQ1 J106DQorCQkJCQlkZWJ1ZygiJXMgbWQ1IG1hdGNoZXM6ICVzIiAlIChmaWxlLCByZW1fbGlz dFtmaWxlXVsnbWQ1J10pKQ0KKwkJCQkJIyMgQ2hlY2tzdW1zIGFyZSB0aGUgc2FtZS4NCisJ CQkJCSMjIFJlbW92ZSBmcm9tIGxvY2FsLWxpc3QsIGFsbCB0aGF0IGlzIGxlZnQgdGhlcmUg d2lsbCBiZSB1cGxvYWRlZA0KKwkJCQkJZGVidWcoIiVzIHJlbW92ZWQgZnJvbSBsb2NhbCBs aXN0IC0gdXBsb2FkIG5vdCBuZWVkZWQiICUgZmlsZSkNCisJCQkJCWRlbChsb2NfbGlzdFtm aWxlXSkNCisJCQkJZWxzZToNCisJCQkJCWRlYnVnKCIhICVzIG1kNSBtaXNtYXRjaDogbG9j YWw9JXMgcmVtb3RlPSVzIiAlIChmaWxlLCBsb2NfbWQ1LCByZW1fbGlzdFtmaWxlXVsnbWQ1 J10pKQ0KKwkJCWVsc2U6DQorCQkJCWRlYnVnKCIhICVzIHNpemUgbWlzbWF0Y2g6IGxvY2Fs PSVzIHJlbW90ZT0lcyIgJSAoZmlsZSwgbG9jX2xpc3RbZmlsZV1bJ3NpemUnXSwgcmVtX2xp c3RbZmlsZV1bJ3NpemUnXSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJIyMg UmVtb3ZlIGZyb20gcmVtb3RlLWxpc3QsIGFsbCB0aGF0IGlzIGxlZnQgdGhlcmUgd2lsbCBi ZSBkZWxldGVkDQorCQkJZGVidWcoIiVzIHJlbW92ZWQgZnJvbSByZW1vdGUgbGlzdCIgJSBm aWxlKQ0KKwkJCWRlbChyZW1fbGlzdFtmaWxlXSkNCisNCisJb3V0cHV0KCJTdW1tYXJ5OiAl ZCBsb2NhbCBmaWxlcyB0byB1cGxvYWQsICVkIHJlbW90ZSBmaWxlcyB0byBkZWxldGUiICUg KGxlbihsb2NfbGlzdCksIGxlbihyZW1fbGlzdCkpKQ0KKwlmb3IgZmlsZSBpbiByZW1fbGlz dDoNCisJCXVyaSA9IFMzVXJpKCJzMzovLyIgKyBkc3RfdXJpLmJ1Y2tldCgpKyIvIityZW1f bGlzdFtmaWxlXVsnb2JqZWN0X2tleSddKQ0KKwkJaWYgY2ZnLmRlbGV0ZV9yZW1vdmVkOg0K KwkJCXJlc3BvbnNlID0gczMub2JqZWN0X2RlbGV0ZV91cmkodXJpKQ0KKwkJCW91dHB1dCgi ZGVsZXRlZCAnJXMnIiAlIHVyaSkNCisJCWVsc2U6DQorCQkJb3V0cHV0KCJub3QtZGVsZXRl ZCAnJXMnIiAlIHVyaSkNCisNCisJdG90YWxfc2l6ZSA9IDANCisJdG90YWxfY291bnQgPSBs ZW4obG9jX2xpc3QpDQorCXNlcSA9IDANCisJZHN0X2Jhc2UgPSBkc3RfdXJpLnVyaSgpDQor CWlmIG5vdCBkc3RfYmFzZVstMV0gPT0gIi8iOiBkc3RfYmFzZSArPSAiLyINCisJZmlsZV9s aXN0ID0gbG9jX2xpc3Qua2V5cygpDQorCWZpbGVfbGlzdC5zb3J0KCkNCisJZm9yIGZpbGUg aW4gZmlsZV9saXN0Og0KKwkJc2VxICs9IDENCisJCXNyYyA9IGxvY19saXN0W2ZpbGVdWydm dWxsX25hbWUnXQ0KKwkJdXJpID0gUzNVcmkoZHN0X2Jhc2UgKyBmaWxlKQ0KKwkJaWYgY2Zn LnByZXNlcnZlX2F0dHJzOg0KKwkJCWF0dHJfaGVhZGVyID0gX2J1aWxkX2F0dHJfaGVhZGVy KHNyYykNCisJCQlkZWJ1ZyhhdHRyX2hlYWRlcikNCisJCXJlc3BvbnNlID0gczMub2JqZWN0 X3B1dF91cmkoc3JjLCB1cmksIGF0dHJfaGVhZGVyKQ0KKwkJb3V0cHV0KCJzdG9yZWQgJyVz JyBhcyAnJXMnICglZCBieXRlcykgWyVkIG9mICVkXSIgJSAoc3JjLCB1cmksIHJlc3BvbnNl WyJzaXplIl0sIHNlcSwgdG90YWxfY291bnQpKQ0KKwkJdG90YWxfc2l6ZSArPSByZXNwb25z ZVsic2l6ZSJdDQorCW91dHB1dCgiRG9uZS4gVXBsb2FkZWQgJWQgYnl0ZXMuIiAlIHRvdGFs X3NpemUpDQorDQorZGVmIHJlc29sdmVfbGlzdChsc3QsIGFyZ3MpOg0KKwlyZXR2YWwgPSBb XQ0KKwlmb3IgaXRlbSBpbiBsc3Q6DQorCQlyZXR2YWwuYXBwZW5kKGl0ZW0gJSBhcmdzKQ0K KwlyZXR1cm4gcmV0dmFsDQorDQorZGVmIGdwZ19jb21tYW5kKGNvbW1hbmQsIHBhc3NwaHJh c2UgPSAiIik6DQorCXBfaW4sIHBfb3V0ID0gb3MucG9wZW40KGNvbW1hbmQpDQorCWlmIGNv bW1hbmQuY291bnQoIi0tcGFzc3BocmFzZS1mZCIpOg0KKwkJcF9pbi53cml0ZShwYXNzcGhy YXNlKyJcbiIpDQorCQlwX2luLmZsdXNoKCkNCisJZm9yIGxpbmUgaW4gcF9vdXQ6DQorCQlp bmZvKGxpbmUuc3RyaXAoKSkNCisJcF9waWQsIHBfZXhpdGNvZGUgPSBvcy53YWl0KCkNCisJ cmV0dXJuIHBfZXhpdGNvZGUNCisNCitkZWYgZ3BnX2VuY3J5cHQoZmlsZW5hbWUpOg0KKwl0 bXBfZmlsZW5hbWUgPSBVdGlscy5ta3RtcGZpbGUoKQ0KKwlhcmdzID0gew0KKwkJImdwZ19j b21tYW5kIiA6IGNmZy5ncGdfY29tbWFuZCwNCisJCSJwYXNzcGhyYXNlX2ZkIiA6ICIwIiwN CisJCSJpbnB1dF9maWxlIiA6IGZpbGVuYW1lLCANCisJCSJvdXRwdXRfZmlsZSIgOiB0bXBf ZmlsZW5hbWUsDQorCX0NCisJaW5mbygiRW5jcnlwdGluZyBmaWxlICUoaW5wdXRfZmlsZSlz IHRvICUob3V0cHV0X2ZpbGUpcy4uLiIgJSBhcmdzKQ0KKwljb21tYW5kID0gcmVzb2x2ZV9s aXN0KGNmZy5ncGdfZW5jcnlwdC5zcGxpdCgiICIpLCBhcmdzKQ0KKwljb2RlID0gZ3BnX2Nv bW1hbmQoY29tbWFuZCwgY2ZnLmdwZ19wYXNzcGhyYXNlKQ0KKwlyZXR1cm4gKGNvZGUsIHRt cF9maWxlbmFtZSwgImdwZyIpDQorDQorZGVmIGdwZ19kZWNyeXB0KGZpbGVuYW1lLCBncGdl bmNfaGVhZGVyID0gIiIsIGluX3BsYWNlID0gVHJ1ZSk6DQorCXRtcF9maWxlbmFtZSA9IFV0 aWxzLm1rdG1wZmlsZShmaWxlbmFtZSkNCisJYXJncyA9IHsNCisJCSJncGdfY29tbWFuZCIg OiBjZmcuZ3BnX2NvbW1hbmQsDQorCQkicGFzc3BocmFzZV9mZCIgOiAiMCIsDQorCQkiaW5w dXRfZmlsZSIgOiBmaWxlbmFtZSwgDQorCQkib3V0cHV0X2ZpbGUiIDogdG1wX2ZpbGVuYW1l LA0KKwl9DQorCWluZm8oIkRlY3J5cHRpbmcgZmlsZSAlKGlucHV0X2ZpbGUpcyB0byAlKG91 dHB1dF9maWxlKXMuLi4iICUgYXJncykNCisJY29tbWFuZCA9IHJlc29sdmVfbGlzdChjZmcu Z3BnX2RlY3J5cHQuc3BsaXQoIiAiKSwgYXJncykNCisJY29kZSA9IGdwZ19jb21tYW5kKGNv bW1hbmQsIGNmZy5ncGdfcGFzc3BocmFzZSkNCisJaWYgY29kZSA9PSAwIGFuZCBpbl9wbGFj ZToNCisJCWRlYnVnKCJSZW5hbWluZyAlcyB0byAlcyIgJSAodG1wX2ZpbGVuYW1lLCBmaWxl bmFtZSkpDQorCQlvcy51bmxpbmsoZmlsZW5hbWUpDQorCQlvcy5yZW5hbWUodG1wX2ZpbGVu YW1lLCBmaWxlbmFtZSkNCisJCXRtcF9maWxlbmFtZSA9IGZpbGVuYW1lDQorCXJldHVybiAo Y29kZSwgdG1wX2ZpbGVuYW1lKQ0KKw0KK2RlZiBydW5fY29uZmlndXJlKGNvbmZpZ19maWxl KToNCisJY2ZnID0gQ29uZmlnKCkNCisJb3B0aW9ucyA9IFsNCisJCSgiYWNjZXNzX2tleSIs ICJBY2Nlc3MgS2V5IiwgIkFjY2VzcyBrZXkgYW5kIFNlY3JldCBrZXkgYXJlIHlvdXIgaWRl bnRpZmllcnMgZm9yIEFtYXpvbiBTMyIpLA0KKwkJKCJzZWNyZXRfa2V5IiwgIlNlY3JldCBL ZXkiKSwNCisJCSgiZ3BnX3Bhc3NwaHJhc2UiLCAiRW5jcnlwdGlvbiBwYXNzd29yZCIsICJF bmNyeXB0aW9uIHBhc3N3b3JkIGlzIHVzZWQgdG8gcHJvdGVjdCB5b3VyIGZpbGVzIGZyb20g cmVhZGluZ1xuYnkgdW5hdXRob3JpemVkIHBlcnNvbnMgd2hpbGUgaW4gdHJhbnNmZXIgdG8g UzMiKSwNCisJCSgiZ3BnX2NvbW1hbmQiLCAiUGF0aCB0byBHUEcgcHJvZ3JhbSIpLA0KKwkJ KCJ1c2VfaHR0cHMiLCAiVXNlIEhUVFBTIHByb3RvY29sIiwgIldoZW4gdXNpbmcgc2VjdXJl IEhUVFBTIHByb3RvY29sIGFsbCBjb21tdW5pY2F0aW9uIHdpdGggQW1hem9uIFMzXG5zZXJ2 ZXJzIGlzIHByb3RlY3RlZCBmcm9tIDNyZCBwYXJ0eSBlYXZlc2Ryb3BwaW5nLiBUaGlzIG1l dGhvZCBpc1xuc2xvd2VyIHRoYW4gcGxhaW4gSFRUUCBhbmQgY2FuJ3QgYmUgdXNlZCBpZiB5 b3UncmUgYmVoaW5kIGEgcHJveHkiKSwNCisJCSgicHJveHlfaG9zdCIsICJIVFRQIFByb3h5 IHNlcnZlciBuYW1lIiwgIk9uIHNvbWUgbmV0d29ya3MgYWxsIGludGVybmV0IGFjY2VzcyBt dXN0IGdvIHRocm91Z2ggYSBIVFRQIHByb3h5LlxuVHJ5IHNldHRpbmcgaXQgaGVyZSBpZiB5 b3UgY2FuJ3QgY29uZWN0IHRvIFMzIGRpcmVjdGx5IiksDQorCQkoInByb3h5X3BvcnQiLCAi SFRUUCBQcm94eSBzZXJ2ZXIgcG9ydCIpLA0KKwkJXQ0KKwkjIyBPcHRpb24tc3BlY2ZpYyBk ZWZhdWx0cw0KKwlpZiBnZXRhdHRyKGNmZywgImdwZ19jb21tYW5kIikgPT0gIiI6DQorCQlz ZXRhdHRyKGNmZywgImdwZ19jb21tYW5kIiwgZmluZF9leGVjdXRhYmxlKCJncGciKSkNCisN CisJaWYgZ2V0YXR0cihjZmcsICJwcm94eV9ob3N0IikgPT0gIiIgYW5kIG9zLmdldGVudigi aHR0cF9wcm94eSIpOg0KKwkJcmVfbWF0Y2g9cmUubWF0Y2goIihodHRwOi8vKT8oW146XSsp OihcZCspIiwgb3MuZ2V0ZW52KCJodHRwX3Byb3h5IikpDQorCQlpZiByZV9tYXRjaDoNCisJ CQlzZXRhdHRyKGNmZywgInByb3h5X2hvc3QiLCByZV9tYXRjaC5ncm91cHMoKVsxXSkNCisJ CQlzZXRhdHRyKGNmZywgInByb3h5X3BvcnQiLCByZV9tYXRjaC5ncm91cHMoKVsyXSkNCisN CisJdHJ5Og0KKwkJd2hpbGUgMToNCisJCQlvdXRwdXQoIlxuRW50ZXIgbmV3IHZhbHVlcyBv ciBhY2NlcHQgZGVmYXVsdHMgaW4gYnJhY2tldHMgd2l0aCBFbnRlci4iKQ0KKwkJCW91dHB1 dCgiUmVmZXIgdG8gdXNlciBtYW51YWwgZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFs bCBvcHRpb25zLiIpDQorCQkJZm9yIG9wdGlvbiBpbiBvcHRpb25zOg0KKwkJCQlwcm9tcHQg PSBvcHRpb25bMV0NCisJCQkJIyMgT3B0aW9uLXNwZWNpZmljIGhhbmRsaW5nDQorCQkJCWlm IG9wdGlvblswXSA9PSAncHJveHlfaG9zdCcgYW5kIGdldGF0dHIoY2ZnLCAndXNlX2h0dHBz JykgPT0gVHJ1ZToNCisJCQkJCXNldGF0dHIoY2ZnLCBvcHRpb25bMF0sICIiKQ0KKwkJCQkJ Y29udGludWUNCisJCQkJaWYgb3B0aW9uWzBdID09ICdwcm94eV9wb3J0JyBhbmQgZ2V0YXR0 cihjZmcsICdwcm94eV9ob3N0JykgPT0gIiI6DQorCQkJCQlzZXRhdHRyKGNmZywgb3B0aW9u WzBdLCAwKQ0KKwkJCQkJY29udGludWUNCisNCisJCQkJdHJ5Og0KKwkJCQkJdmFsID0gZ2V0 YXR0cihjZmcsIG9wdGlvblswXSkNCisJCQkJCWlmIHR5cGUodmFsKSBpcyBib29sOg0KKwkJ CQkJCXZhbCA9IHZhbCBhbmQgIlllcyIgb3IgIk5vIg0KKwkJCQkJaWYgdmFsIG5vdCBpbiAo Tm9uZSwgIiIpOg0KKwkJCQkJCXByb21wdCArPSAiIFslc10iICUgdmFsDQorCQkJCWV4Y2Vw dCBBdHRyaWJ1dGVFcnJvcjoNCisJCQkJCXBhc3MNCisNCisJCQkJaWYgbGVuKG9wdGlvbikg Pj0gMzoNCisJCQkJCW91dHB1dCgiXG4lcyIgJSBvcHRpb25bMl0pDQorD... [truncated message content] |
From: Michal L. <mi...@lo...> - 2007-11-27 01:26:26
|
James Chan wrote: > Hello everyone, > Made a small edit to get just the md5 of the file so I can do a > md5sum on a local copy and compare the text output. Faster than getting > the binary from the server and then diffing it. > > Be nice to see it in there so I don't have to continue modifying it > myself in the future. Cheers! Hi James, thanks for contribution. Unfortunately the patch in this format is useless - it removes the whole file and then replaces with - presumably - your modified one. Can you please post a proper diff that displays just the changes you've made? I guess you you've changed the line endings from Unix (LF) to DOS (CR/LF), that's what made the diff confused. Thanks Michal |
From: James C. <ly...@gm...> - 2007-11-27 02:02:33
|
SW5kZXg6IHMzY21kDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gczNjbWQJKHJldmlzaW9uIDE1NikN CisrKyBzM2NtZAkod29ya2luZyBjb3B5KQ0KQEAgLTEyOSw2ICsxMjksMzAgQEANCiAJCQl1 cmkuY29tcG9zZV91cmkoYnVja2V0LCBvYmplY3RbIktleSJdKSwKIAkJCSkpCiAKK2RlZiBj bWRfZ2V0bWQ1KGFyZ3MpOgorCXMzID0gUzMoQ29uZmlnKCkpCisJaWYgbGVuKGFyZ3MpID4g MDoKKwkJdXJpID0gUzNVcmkoYXJnc1swXSkKKwkJaWYgdXJpLnR5cGUgPT0gInMzIiBhbmQg dXJpLmhhc19idWNrZXQoKToKKwkJCWJ1Y2tldCA9IHVyaS5idWNrZXQoKQorCQkJb2JqZWN0 ID0gdXJpLm9iamVjdCgpCisKKwkJCWlmIG9iamVjdC5lbmRzd2l0aCgnKicpOgorCQkJCW9i amVjdCA9IG9iamVjdFs6LTFdCisJCQl0cnk6CisJCQkJcmVzcG9uc2UgPSBzMy5idWNrZXRf bGlzdChidWNrZXQsIHByZWZpeCA9IG9iamVjdCkKKwkJCWV4Y2VwdCBTM0Vycm9yLCBlOgor CQkJCWlmIFMzLmNvZGVzLmhhc19rZXkoZS5pbmZvWyJDb2RlIl0pOgorCQkJCQllcnJvcihT My5jb2Rlc1tlLmluZm9bIkNvZGUiXV0gJSBidWNrZXQpCisJCQkJCXJldHVybgorCQkJCWVs c2U6CisJCQkJCXJhaXNlCisJCQlmb3Igb2JqZWN0IGluIHJlc3BvbnNlWyJsaXN0Il06CisJ CQkJb3V0cHV0KCIlcyAlcyIgJSAoCisJCQkJCW9iamVjdFsnRVRhZyddWzE6LTFdLAorCQkJ CQl1cmkub2JqZWN0KCksCisJCQkJCSkpCisKIGRlZiBjbWRfYnVja2V0X2NyZWF0ZShhcmdz KToKIAl1cmkgPSBTM1VyaShhcmdzWzBdKQogCWlmIG5vdCB1cmkudHlwZSA9PSAiczMiIG9y IG5vdCB1cmkuaGFzX2J1Y2tldCgpIG9yIHVyaS5oYXNfb2JqZWN0KCk6CkBAIC01OTAsNiAr NjE0LDcgQEANCiAJI3siY21kIjoibWtkaXIiLCAibGFiZWwiOiJNYWtlIGEgdmlydHVhbCBT MyBkaXJlY3RvcnkiLCAicGFyYW0iOiJzMzovL0JVQ0tFVC9wYXRoL3RvL2RpciIsICJmdW5j IjpjbWRfbWtkaXIsICJhcmdjIjoxfSwKIAl7ImNtZCI6InN5bmMiLCAibGFiZWwiOiJTeW5j aHJvbml6ZSBhIGRpcmVjdG9yeSB0cmVlIHRvIFMzIGFuZCBiYWNrIiwgInBhcmFtIjoiTE9D QUxfRElSIHMzOi8vQlVDS0VUWy9QUkVGSVhdIiwgImZ1bmMiOmNtZF9zeW5jLCAiYXJnYyI6 Mn0sCiAJeyJjbWQiOiJkdSIsICJsYWJlbCI6IkRpc2sgdXNhZ2UgYnkgYnVja2V0cyIsICJw YXJhbSI6IltzMzovL0JVQ0tFVFsvUFJFRklYXV0iLCAiZnVuYyI6Y21kX2R1LCAiYXJnYyI6 MH0sCisJeyJjbWQiOiJnZXRtZDUiLCAibGFiZWwiOiJHZXRzIHRoZSBtZDUgb2YgYW4gb2Jq ZWN0IiwgInBhcmFtIjoiW3MzOi8vQlVDS0VUWy9QUkVGSVhdXSIsICJmdW5jIjpjbWRfZ2V0 bWQ1LCAiYXJnYyI6MX0sCiAJXQogCiBkZWYgZm9ybWF0X2NvbW1hbmRzKHByb2duYW1lKToK |