UNPKG

oidc-lib

Version:

A library for creating OIDC Service Providers

1 lines 2.22 MB
{"issuer":"tester","description":"Tester for OIDC","oidc_lib_version":"^2.2.2","code":{"oidc_config.json":"ew0KCSJjb2xsZWN0aW9ucyI6IHsNCgkJImNsaWVudHMiOiB7IA0KCQkJImtleVBhdGgiOiAiaWQiLA0KCQkJImluZGV4ZXMiOiBbDQoJCQkJeyANCgkJCQkJIm5hbWUiOiAiY2xpZW50cyIsDQoJCQkJCSJrZXlQYXRoIjogWyJjbGllbnRfbmFtZSJdDQoJCQkJfQ0KCQkJXQ0KCQl9DQoJfSwNCgkiY29uZmlnIjogew0KCSAgICAiY3JlZGVudGlhbF9kZXNjcmlwdGlvbiI6ICJUZXN0ZXIgZm9yIE9JREMiDQoJfQkNCn0","tester.js":"bW9kdWxlLmV4cG9ydHMgPSB7DQoJcmVnaXN0ZXJFbmRwb2ludHM6IHJlZ2lzdGVyRW5kcG9pbnRzDQp9DQoNCmNvbnN0IG1vZHVsZU5hbWUgPSAndGVzdGVyJzsNCmNvbnN0IHRlc3RlckNvb2tpZUlkID0gJ3Rlc3Rlcl9pZF90b2tlbic7DQpjb25zdCB0ZXN0ZXJDb25maWcgPSAndGVzdGVyQ29uZmlnJzsNCmNvbnN0IFRlc3RlcklkVG9rZW5IaW50ID0gJ2lkVG9rZW5IaW50JzsNCmNvbnN0IFNFTEZJU1NVRUQgPSAnaHR0cHM6Ly9zZWxmLWlzc3VlZC5tZSc7DQp2YXIgZGVmYXVsdENsaWVudCA9ICdUZXN0ZXJQb2xpY3knOw0KDQp2YXIgcGsgPSBudWxsOw0KdmFyIGRiVXRpbHMgPSBudWxsOw0KdmFyIHZpZXdQYXRoID0gbnVsbDsNCnZhciBjb250ZW50TW9kdWxlTmFtZSA9ICd0ZXN0ZXInOw0KDQp2YXIgbV9pZHBLZXlzID0gbnVsbDsNCnZhciBnX2h0dHBzU2VydmVyVXJsID0gbnVsbDsgLy8gaWRwSXNzdWVyQmFzZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjb250ZW50IG1vZHVsZQ0KdmFyIGdfcmVuZGV6dm91c0luZm8gPSB7fTsNCnZhciBtX2FwcF9jbGllbnRfaWQgPSBudWxsOw0KdmFyIG1faWRwTWV0YWRhdGEgPSBudWxsOw0KdmFyIHppcCA9IG51bGw7DQoNCmNvbnN0IEVOQUJMRV9TRUxGX0lTU1VFRCA9ICdlbmFibGVfc2VsZl9pc3N1ZWQnOw0KdmFyIGNoYW5nZU5vdGlmaWNhdGlvblN5c3RlbTsNCg0KZnVuY3Rpb24gcmVnaXN0ZXJFbmRwb2ludHMocGtTb3VyY2UpIHsNCglwayA9IHBrU291cmNlOw0KCWRiVXRpbHMgPSBway5kYlV0aWxzOw0KCXZpZXdQYXRoID0gcGsucGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGNvbnRlbnRNb2R1bGVOYW1lLCAndmlld3MnKTsgDQoJZ19odHRwc1NlcnZlclVybCA9IHBrLnV0aWwuaHR0cHNTZXJ2ZXJVcmw7DQoJY2hhbmdlTm90aWZpY2F0aW9uU3lzdGVtID0gbmV3IGNoYW5nZU5vdGlmaWNhdGlvblN5c3RlbUZhY3RvcnkoKTsNCg0KCXppcCA9IHJlcXVpcmUoJ2V4cHJlc3MtZWFzeS16aXAnKTsNCglway5hcHAudXNlKHppcCgpKTsNCg0KCXZhciBlbmRwb2ludCA9ICcvdGVzdGVyL2F1dGhyZXNwLyonOw0KCXBrLmFwcC5vcHRpb25zKGVuZHBvaW50LCBway5jb3JzKCkpOw0KCXBrLmFwcC5wb3N0KGVuZHBvaW50LCBway51dGlsLmNvcnNPcHRpb25zKCksIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcHJvY2Vzc1Bvc3RSZXNwb25zZShyZXEsIHJlcyk7DQoJfSk7DQoJcGsuYXBwLmdldChlbmRwb2ludCwgcGsudXRpbC5jb3JzT3B0aW9ucygpLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NBdXRob3JpemF0aW9uUmVzcG9uc2UocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLnBvc3QoJy90ZXN0ZXIvcHJvY2Vzc19hamF4X3JlcXVlc3QnLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NBamF4UmVxdWVzdChyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAucG9zdCgnL3Rlc3Rlci9pbXBsaWNpdF9wb3N0LyonLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NJbXBsaWNpdFBvc3QocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL3Rlc3Rlci9yZWRpcmVjdF9hZnRlcl9sb2dpbicsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcHJvY2Vzc1JlZGlyZWN0QWZ0ZXJMb2dpbihyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAuZ2V0KCcvdGVzdGVyL3JlZ2lzdHJhdGlvbicsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcmVnaXN0cmF0aW9uVWkocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL3Rlc3Rlci9jb25maWd1cmF0aW9uJywgZnVuY3Rpb24ocmVxLCByZXMpew0KCQljb25maWd1cmF0aW9uVWkocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLnBvc3QoJy90ZXN0ZXIvY29uZmlndXJhdGlvbicsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcHJvY2Vzc0NvbmZpZ3VyYXRpb25SZXNwb25zZShyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAuZ2V0KCcvdGVzdGVyL3Rlc3RBdXRoZW50aWNhdGlvbicsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJdGVzdEF1dGhlbnRpY2F0aW9uVWkocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLnBvc3QoJy90ZXN0ZXIvdGVzdF9wYXJhbXMnLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NUZXN0UGFyYW1zKHJlcSwgcmVzKTsNCgl9KTsNCg0KCXBrLmFwcC5nZXQoJy90ZXN0ZXIvc2VydmVyJywgZnVuY3Rpb24ocmVxLCByZXMpew0KCQl0ZXN0ZXJzZXJ2ZXIocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL3JlZ2lzdGVyLXB3YScsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcmVnaXN0ZXJQd2EocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL2V4dGVuc2lvbicsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcmVnaXN0ZXJFeHRlbnNpb24ocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL2RvY3MnLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NEb2NJbmRleChyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAuZ2V0KCcvcHJvY2Vzc0NhcmRJbWFnZScsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcHJvY2Vzc0NhcmRJbWFnZShyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAuZ2V0KCcvJywgZnVuY3Rpb24ocmVxLCByZXMpew0KCQlwcm9jZXNzRG9jSW5kZXgocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL2RvY3MvKicsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJcHJvY2Vzc0RvYyhyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAuZ2V0KCcvdGVzdGVyL3Byb2Nlc3NfY2xhaW1fc291cmNlJywgZnVuY3Rpb24ocmVxLCByZXMpew0KCQlwcm9jZXNzQ2xhaW1Tb3VyY2UocmVxLCByZXMpOw0KCX0pOw0KDQoJcGsuYXBwLmdldCgnL3Rlc3Rlci9kaWRfZGlzY292ZXInLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NEaWREaXNjb3ZlcihyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAuZ2V0KCcvdGVzdGVyL3JlbmRlenZvdXMnLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCXByb2Nlc3NSZW5kZXp2b3VzKHJlcSwgcmVzKTsNCgl9KTsNCg0KCXBrLmFwcC5nZXQoJy90ZXN0ZXIvY2hhbmdlTm90aWZpY2F0aW9ucycsIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJY2hhbmdlTm90aWZpY2F0aW9uU3lzdGVtLmdldChyZXEsIHJlcyk7DQoJfSk7DQoNCglway5hcHAucG9zdCgnL3Rlc3Rlci9jaGFuZ2VOb3RpZmljYXRpb25zJywgZnVuY3Rpb24ocmVxLCByZXMpew0KCQljaGFuZ2VOb3RpZmljYXRpb25TeXN0ZW0ucG9zdChyZXEsIHJlcyk7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NSZWRpcmVjdEFmdGVyTG9naW4ocmVxLCByZXMpew0KCXZhciBjb29raWVDb250ZW50ID0gcGsubm9uY2VDYWNoZS5nZXQodGVzdGVyQ29va2llSWQpOw0KDQoJaWYgKCFjb29raWVDb250ZW50KXsNCgkJdGhyb3cgIk5vIGNvb2tpZSBmb3VuZCBpbiBwcm9jZXNzUmVkaXJlY3RBZnRlckxvZ2luIjsNCgl9DQoJaWYgKGNvb2tpZUNvbnRlbnQuZXJyICE9PSB1bmRlZmluZWQpew0KCQlyZXMucmVuZGVyKHZpZXdQYXRoICsgJy9lcnJvcl9yZWNlaXZlZCcsIHsNCiAgCQkJZXJyb3I6IGNvb2tpZUNvbnRlbnQuZXJyLmVycm9yLA0KICAJCQllcnJvcl9kZXNjcmlwdGlvbjogY29va2llQ29udGVudC5lcnIuZXJyb3JfZGVzY3JpcHRpb24NCgkJfSk7DQoJCXJldHVybjsNCgl9DQoNCgl2YXIgaXNzdWVyTWVzc2FnZSA9ICdUb2tlbiByZWNlaXZlZCc7DQoJaWYgKGNvb2tpZUNvbnRlbnQuaXNzdWVyICE9PSB1bmRlZmluZWQpDQoJCWlzc3Vlck1lc3NhZ2UgPSAnVG9rZW4gcmVjZWl2ZWQgZnJvbSAnICsgY29va2llQ29udGVudC5pc3N1ZXI7DQoNCgl2YXIgY29kZU1lc3NhZ2UgPSAnJzsNCglpZiAoY29va2llQ29udGVudC5jb2RlICE9PSB1bmRlZmluZWQpDQoJCWNvZGVNZXNzYWdlID0gJ0NvZGU6ICcgKyBjb29raWVDb250ZW50LmNvZGU7DQoNCgl2YXIgYWNjZXNzX3Rva2VuTWVzc2FnZSA9ICcnOw0KCWlmIChjb29raWVDb250ZW50LmFjY2Vzc190b2tlbiAhPT0gdW5kZWZpbmVkKQ0KCQlhY2Nlc3NfdG9rZW5NZXNzYWdlID0gJ0FjY2VzcyBUb2tlbjogJyArIGNvb2tpZUNvbnRlbnQuYWNjZXNzX3Rva2VuOw0KDQoJdmFyIHRva2VuVHlwZU1lc3NhZ2UgPSAnJzsNCglpZiAoY29va2llQ29udGVudC50b2tlbl90eXBlICE9PSB1bmRlZmluZWQpDQoJCXRva2VuVHlwZU1lc3NhZ2UgPSAnVG9rZW4gVHlwZTogJyArIGNvb2tpZUNvbnRlbnQudG9rZW5fdHlwZTsNCg0KCXJlcy5yZW5kZXIodmlld1BhdGggKyAnL3Rva2VuUmVzdWx0Jywgew0KCQlsYXlvdXQ6ICdtYWluX3BlcnNvbmFsJywNCiAgICAJaXNzdWVyTWVzc2FnZTogaXNzdWVyTWVzc2FnZSwgIA0KICAgIAl0b2tlbkFzQXJyYXk6IGNvb2tpZUNvbnRlbnQudG9rZW5Bc0FycmF5LA0KICAgIAljb2RlTWVzc2FnZTogY29kZU1lc3NhZ2UgKyAnPGJyLz4nLA0KICAgIAlhY2Nlc3NfdG9rZW5NZXNzYWdlOiBhY2Nlc3NfdG9rZW5NZXNzYWdlICsgJzxici8-JywNCiAgICAJdG9rZW5UeXBlTWVzc2FnZTogdG9rZW5UeXBlTWVzc2FnZSArICc8YnIvPicNCiAgICB9KTsNCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc0ltcGxpY2l0UG9zdChyZXEsIHJlcyl7DQoJcGsudXRpbC5sb2dfZGV0YWlsKCctLS0gVEVTVEVSOiAgUFJPQ0VTUyBJTVBMSUNJVCBQT1NUJyk7DQoJcGsudXRpbC5sb2dfZGV0YWlsKCdib2R5IHBhcmFtcycsIHJlcS5ib2R5KTsNCg0KCWhhbmRsZUlkcFRva2VuUmVzdWx0KHJlcywgcmVxLmJvZHksIGZhbHNlKTsNCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc1Rlc3RQYXJhbXMocmVxLCByZXMpew0KCXZhciBwYXlsb2FkID0gbmV3IEJ1ZmZlcihyZXEuYm9keS5wYXlsb2FkLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKTsNCglyZXEuYm9keSA9IEpTT04ucGFyc2UocGF5bG9hZCk7DQoJY29udGVudE1vZHVsZU5hbWUgPSByZXEuYm9keS5tb2R1bGUudG9Mb3dlckNhc2UoKTsNCgkJZmV0Y2htX2lkcE1ldGFkYXRhKHJlcSwgcmVzKTsNCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc1Rlc3RQYXJhbXNJc3N1ZWRCeUF1dGhvcml0eShyZXEsIHJlcyl7DQoJdmFyIHBhcmFtcyA9IHJlcS5ib2R5Ow0KCW1fYXBwX2NsaWVudF9pZCA9IHBhcmFtcy5jbGllbnRfaWQ7DQoNCgl2YXIgcGFyYW1ldGVyQXJyYXkgPSBbXTsNCglmb3IgKHZhciBwYXJhbSBpbiBwYXJhbXMpew0KCQl2YXIgdmFsdWUgPSBwYXJhbXNbcGFyYW1dOw0KCQlpZiAodmFsdWUgPT09ICcnKXsNCiAgICAgIGNvbnRpbnVlOw0KCQl9DQoNCgkJc3dpdGNoKHBhcmFtKXsNCiAgICAgIGNhc2UgJ21vZHVsZSc6DQogICAgICBjYXNlICdtZXRob2QnOg0KICAgICAgICBjb250aW51ZTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIGJyZWFrOw0KCQl9DQoNCgkJaWYgKHBhcmFtZXRlckFycmF5LmluZGV4T2YocGFyYW0pID49IDApew0KICAgICAgdGhyb3cgJ0Vycm9yOiBwYXJhbWV0ZXIgcmVxdWVzdGVkIG1vcmUgdGhhbiBvbmNlOiAnICsgcGFyYW07DQoJCX0gICAgICANCg0KCQl2YXIgaW5mbyA9IHsgJ3BhcmFtJzogcGFyYW0sICd2YWx1ZSc6IHZhbHVlIH07DQoJCXBhcmFtZXRlckFycmF5LnB1c2goaW5mbyk7CQkNCgl9DQoNCglpZiAocGFyYW1zLm1ldGhvZCA9PT0gJ1BPU1QnICYmIHBhcmFtcy5yZXNwb25zZV90eXBlID09PSAnY29kZScpew0KCQlpZiAocGFyYW1zLnJlc3BvbnNlX21vZGUgPT09IHVuZGVmaW5lZCl7DQogICAgICBwYXJhbSA9ICdyZXNwb25zZV9tb2RlJzsNCiAgICAgIHZhbHVlID0gJ2Zvcm1fcG9zdCc7ICAgICAgDQogICAgICB2YXIgaW5mbyA9IHsgJ3BhcmFtJzogcGFyYW0sICd2YWx1ZSc6IHZhbHVlIH07DQogICAgICBwYXJhbWV0ZXJBcnJheS5wdXNoKGluZm8pOwkJDQoJCX0NCgl9DQoNCgljb25zb2xlLmxvZyhwYXJhbWV0ZXJBcnJheSk7DQoNCiAgICByZXMucmVuZGVyKHZpZXdQYXRoICsgJy9yZXBvc3QnLCB7DQogICAgCWNvbnRlbnRNb2R1bGU6ICBjb250ZW50TW9kdWxlTmFtZSwNCgkJYXV0aG9yaXphdGlvbkVuZHBvaW50OiBtX2lkcE1ldGFkYXRhLmF1dGhvcml6YXRpb25fZW5kcG9pbnQsICAgIAkNCiAgICAJbWV0aG9kOiByZXEuYm9keS50ZXN0ZXJfbWV0aG9kLA0KICAgIAlwYXJhbWV0ZXJBcnJheTogcGFyYW1ldGVyQXJyYXkNCiAgICB9KTsNCn0NCg0KLyoNCmZ1bmN0aW9uIHByb2Nlc3NUZXN0UGFyYW1zSXNzdWVkQnlTZWxmKHJlcSwgcmVzKXsNCgltX2FwcF9jbGllbnRfaWQgPSByZXEuYm9keS5jbGllbnRfaWQ7DQoJdmFyIHBhcmFtcyA9IHJlcS5ib2R5Ow0KDQoJdmFyIG9pZGNSZXF1ZXN0ID0ge307DQoJZm9yICh2YXIgcGFyYW0gaW4gcGFyYW1zKXsNCgkJdmFyIHZhbHVlID0gcGFyYW1zW3BhcmFtXTsNCgkJaWYgKHZhbHVlID09PSAnJyl7DQogICAgICBjb250aW51ZTsNCgkJfQ0KDQoJCXN3aXRjaChwYXJhbSl7DQogICAgICBjYXNlICdtb2R1bGUnOg0KICAgICAgICBjb250aW51ZTsNCiAgICAgIGNhc2UgJ21ldGhvZCc6DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgYnJlYWs7DQoJCX0NCg0KCQlvaWRjUmVxdWVzdFtwYXJhbV0gPSB2YWx1ZTsJCQ0KCX0NCg0KCWlmIChwYXJhbXMubWV0aG9kID09PSAnUE9TVCcgJiYgcGFyYW1zLnJlc3BvbnNlX3R5cGUgPT09ICdjb2RlJyAmJiBwYXJhbXMucmVzcG9uc2VfbW9kZSA9PT0gdW5kZWZpbmVkKXsNCgkJb2lkY1JlcXVlc3RbJ3Jlc3BvbnNlX21vZGUnXSA9ICdmb3JtX3Bvc3QnOw0KCX0NCgkNCglway51dGlsLmxvZ19kZXRhaWwoJ3NlbGYtaXNzdWVkIHBhcmFtcycsIG9pZGNSZXF1ZXN0KTsNCgl2YXIgbG9naW5SZWRpcmVjdCA9IGNhbGN1bGF0ZURpZFVybChyZXEsIG9pZGNSZXF1ZXN0KTsNCglyZXMuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGxvZ2luUmVkaXJlY3QpOw0KCXJlcy5zdGF0dXNDb2RlID0gMzAyOw0KCXJlcy5lbmQoKTsNCn0NCg0KZnVuY3Rpb24gY2FsY3VsYXRlRGlkVXJsKHJlcSwgb2lkY1JlcXVlc3QsIGRlZmF1bHRMb2dpblJlZGlyZWN0KXsNCgl2YXIgcGFyYW1zID0gcmVxLmJvZHk7DQoJaWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5kaWQgPT09IHVuZGVmaW5lZCl7DQoJCXBhcmFtcyA9IHJlcS5xdWVyeTsNCgkJaWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkKXsNCiAgICAgIHJldHVybjsNCgkJfQ0KCX0NCg0KCXZhciB1cmxPdmVycmlkZTsNCglpZiAocGFyYW1zLmRpZCAhPT0gdW5kZWZpbmVkKXsNCgkJdXJsT3ZlcnJpZGUgPSBwYXJhbXMuZGlkOw0KCX0NCg0KCXZhciBsb2dpblJlZGlyZWN0ID0gcmVxLmhlYWRlcnNbJ3gtZGlkLW9wZW5pZCddOw0KCWlmICh1cmxPdmVycmlkZSAhPT0gdW5kZWZpbmVkKXsNCgkJbG9naW5SZWRpcmVjdCA9IHVybE92ZXJyaWRlOw0KCX0NCg0KCXZhciBwYXJhbXMgPSBjcmVhdGVQYXJhbWV0ZXJTdHJpbmcob2lkY1JlcXVlc3QpOw0KCWlmIChsb2dpblJlZGlyZWN0ID09PSB1bmRlZmluZWQpew0KCQlpZiAoZGVmYXVsdExvZ2luUmVkaXJlY3QgIT09IHVuZGVmaW5lZCl7DQogICAgICBsb2dpblJlZGlyZWN0ID0gZGVmYXVsdExvZ2luUmVkaXJlY3Q7DQoJCX0NCgkJZWxzZXsNCiAgICAgIGxvZ2luUmVkaXJlY3QgPSBnX2h0dHBzU2VydmVyVXJsLmhyZWYgKyAncGVyc29uYWwvaW5kZXguaHRtbD8nICsgcGFyYW1zOyAgICAgIA0KCQl9DQoJfQ0KCWVsc2V7DQoJCWlmIChsb2dpblJlZGlyZWN0ID09PSAnd2ViK29wZW5pZCcpew0KICAgICAgbG9naW5SZWRpcmVjdCA9ICd3ZWIrb3BlbmlkOicgKyBwYXJhbXM7CQkNCgkJfQ0KCQllbHNlew0KICAgICAgaWYgKCFsb2dpblJlZGlyZWN0LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpew0KICAgICAgICBpZiAobG9naW5SZWRpcmVjdC5zdGFydHNXaXRoKCdodHRwOi8vJykpew0KICAgICAgICAJbG9naW5SZWRpcmVjdCA9IGxvZ2luUmVkaXJlY3Quc3Vic3RyaW5nKDcpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBsb2dpblJlZGlyZWN0ID0gJ2h0dHBzOi8vJyArIGxvZ2luUmVkaXJlY3Q7DQogICAgICB9DQoNCiAgICAgIGxvZ2luUmVkaXJlY3QgKz0gJy9wZXJzb25hbC9pbmRleC5odG1sPycgKyBwYXJhbXM7ICAgICAgDQoJCX0NCgl9CQ0KDQoJcmV0dXJuIGxvZ2luUmVkaXJlY3Q7DQp9DQoqLw0KDQphc3luYyBmdW5jdGlvbiBwcm9jZXNzQXV0aG9yaXphdGlvblJlc3BvbnNlKHJlcSwgcmVzKXsNCglway51dGlsLmxvZ19kZXRhaWwoJy0tLSBURVNURVI6IFJFQ0VJVkVEIEF1dGhvcml6YXRpb24gUmVzcG9uc2UgKEdFVCkgLS0tJyk7DQoJaWYgKCFyZXEucXVlcnkuY29kZSl7DQoJCXZhciBjbGllbnRfaWQgPSByZXEucGF0aC5zdWJzdHIocmVxLnBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpOw0KCSAgICByZXMucmVuZGVyKHZpZXdQYXRoICsgJy9pbXBsaWNpdCcsIHsNCgkgICAgCWNsaWVudF9pZDogY2xpZW50X2lkDQoJICAgIH0pOw0KCX0NCgllbHNlew0KCQkvLyB0aGUgcmVzcG9uc2UgaXMgcGFydCBvZiBBVXRob3JpemF0aW9uIENvZGUgRmxvdw0KCQl2YXIgY2xpZW50X2lkID0gcmVxLnBhcmFtc1swXTsNCgkJdmFyIGNvZGUgPSByZXEucXVlcnkuY29kZTsNCgkJdmFyIGFjY2Vzc190b2tlbiA9IHJlcS5xdWVyeS5hY2Nlc3NfdG9rZW47DQoJCXZhciB0b2tlbl90eXBlID0gcmVxLnF1ZXJ5LnRva2VuX3R5cGU7DQoJCXZhciBzdGF0ZSA9IHBrLnV0aWwucGFyc2VQYXJhbWV0ZXJTdHJpbmcocmVxLnF1ZXJ5LnN0YXRlKTsNCg0KICAgIAlwb3NzaWJsZUVycm9yID0gIlVuYWJsZSB0byBnZXQgbWV0YWRhdGEgd2hpbGUgcHJvY2Vzc2luZyBjb2RlLiINCgkgICAgdmFyIG1ldGFkYXRhOw0KCQl2YXIgb3B0aW9ucyA9IHsNCgkJCXVybDogc3RhdGUuaXNzICsgJy8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbicsDQoJCQltZXRob2Q6ICdHRVQnLA0KCQkgICAgaGVhZGVyczogWyANCgkJICAgIAl7IG5hbWU6ICdBY2NlcHQnLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0NCgkJICAgIAkvLyB7IG5hbWU6ICdwYXJzZUpzb25SZXNwb25zZScsIHZhbHVlOiAndHJ1ZScgfSwNCgkJICAgCV0NCgkJfTsNCgkJdHJ5IHsNCgkJCXZhciBtZXRhZGF0YVN0cmluZyA9IGF3YWl0IHBrLnV0aWwuanNvbkh0dHBEYXRhKG9wdGlvbnMpOw0KCQkJbWV0YWRhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhU3RyaW5nKTsNCgkJfQ0KCQljYXRjaChlcnIpew0KCQkJdGhyb3coZXJyKTsNCgkJfQ0KDQoJICAgIGlmICghbWV0YWRhdGEudG9rZW5fZW5kcG9pbnQpew0KCSAgICAJdGhyb3coJ0Vycm9yOiBtZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIHRva2VuX2VuZHBvaW50JykNCgkgICAgfQ0KDQoJICAgIHBvc3NpYmxlRXJyb3IgPSAiVW5hYmxlIHRvIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3aGlsZSBwcm9jZXNzaW5nIGNvZGUiDQoJICAgIHZhciBjaVBhcmFtcyA9IHsNCgkgICAgCWNsaWVudF9pZDogY2xpZW50X2lkDQoJICAgIH0gDQoJICAgIHZhciBjb250ZW50TW9kdWxlTmFtZSA9IHJlcS5wYXRoLnNwbGl0KCcvJylbMV07DQoJICAgIHZhciBjbGllbnRfaW5mbyA9IGF3YWl0IHBrLmNsaWVudF9pbmZvLmxvYWQoY2lQYXJhbXMsIGNvbnRlbnRNb2R1bGVOYW1lKTsNCgkJdmFyIGJhc2ljc3RyID0gIkJhc2ljICIgKyBway5iYXNlNjR1cmwudG9CYXNlNjQocGsuYmFzZTY0dXJsLmVuY29kZSgNCgkJCWNsaWVudF9pZCArICc6JyArIGNsaWVudF9pbmZvLmNsaWVudF9zZWNyZXQpKTsNCgkJdmFyIHBvc3RCb2R5ID0gew0KCQkJZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsDQoJCQljb2RlOiByZXEucXVlcnkuY29kZSwNCgkJCXJlZGlyZWN0X3VyaTogY2xpZW50X2luZm8ucmVkaXJlY3RfdXJpc1swXQ0KCQl9DQoNCgkJdmFyIG9wdGlvbnMgPSB7DQoJCQl1cmw6IG1ldGFkYXRhLnRva2VuX2VuZHBvaW50LA0KCQkJbWV0aG9kOiAnUE9TVCcsDQoJCSAgICBoZWFkZXJzOiBbIA0KCQkgICAgCXsgbmFtZTogJ0NvbnRlbnQtVHlwZScsIHZhbHVlOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LA0KCQkgICAgCXsgbmFtZTogJ0F1dGhvcml6YXRpb24nLCB2YWx1ZTogYmFzaWNzdHIgfQ0KCQkgICAgCS8vIHsgbmFtZTogJ3BhcnNlSnNvblJlc3BvbnNlJywgdmFsdWU6ICd0cnVlJyB9LA0KCQkgICAJXSwNCgkJCXBvc3REYXRhOiBway51dGlsLmNyZWF0ZVBhcmFtZXRlclN0cmluZyhwb3N0Qm9keSkuc3Vic3RyKDEpDQoJCX0NCg0KCQl0cnkgew0KCQkJdmFyIHRva2VuUmVzdWx0U3RyaW5nID0gYXdhaXQgcGsudXRpbC5qc29uSHR0cERhdGEob3B0aW9ucyk7DQoJCQlhdXRob3JpemF0aW9uX3Jlc3VsdCA9IEpTT04ucGFyc2UodG9rZW5SZXN1bHRTdHJpbmcpOw0KCQkJaGFuZGxlSWRwVG9rZW5SZXN1bHQocmVzLCBhdXRob3JpemF0aW9uX3Jlc3VsdCwgdHJ1ZSk7DQoJCX0NCgkJY2F0Y2goZXJyKXsNCg0KCQkJdGhyb3coZXJyKTsNCgkJfQ0KDQoJfQ0KfQ0KDQpmdW5jdGlvbiBwcm9jZXNzUG9zdFJlc3BvbnNlKHJlcSwgcmVzKXsNCglway51dGlsLmxvZ19kZXRhaWwoJy0tLSBURVNURVI6IFJFQ0VJVkVEIFBvc3QgQXV0aFJlc3BvbnNlIC0tLScpOw0KDQoJdmFyIGNvbXBvbmVudHMgPSByZXEub3JpZ2luYWxVcmwuc3BsaXQoJy8nKTsNCglpZiAoY29tcG9uZW50cy5sZW5ndGggPCA0KXsNCgkJdGhyb3cgJ0ludmFsaWQgY29tcG9uZW50cyBsZW5ndGggaW4gcHJvY2Vzc1Bvc3RSZXNwb25zZSc7DQoJfQ0KDQoJLy8gdmFyIGNsaWVudF9pZCA9IGdfaHR0cHNTZXJ2ZXJVcmwuaHJlZiArIHJlcS5vcmlnaW5hbFVybC5zdWJzdHJpbmcoMSk7DQoJdmFyIGNsaWVudF9pZCA9IHJlcS5wYXRoLnN1YnN0cihyZXEucGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7DQoJcGsudXRpbC5sb2dfZGV0YWlsKCdPcmlnaW5hdGluZyBjbGllbnRfaWQ6ICcgKyBjbGllbnRfaWQpOw0KCXBrLnV0aWwubG9nX2RldGFpbCgnUmVxdWVzdCBib2R5JywgcmVxLmJvZHkpOw0KCXBrLnV0aWwubG9nX2RldGFpbCgnUmVxdWVzdCBxdWVyeScsIHJlcS5xdWVyeSk7DQoNCg0KCXZhciBjb2RlX2NvbnRlbnQ7DQoJdmFyIHRva2VuX2NvbnRlbnQ7DQoJdmFyIGVycjsNCglpZiAocmVxLnF1ZXJ5ICE9PSB1bmRlZmluZWQpew0KCQlpZiAocmVxLnF1ZXJ5LmVycm9yICE9PSB1bmRlZmluZWQpew0KICAgICAgCQllcnIgPSByZXEucXVlcnk7DQoJCX0NCgkJZWxzZSBpZiAocmVxLnF1ZXJ5LmNvZGUgIT09IHVuZGVmaW5lZCl7DQogICAgICAJCWNvZGVfY29udGVudCA9IHJlcS5xdWVyeTsNCgkJfQ0KCQllbHNlIHsNCgkJCWZvciAodmFyIGsgaW4gcmVxLnF1ZXJ5KXsNCgkJCQl0b2tlbl9jb250ZW50ID0gcmVxLnF1ZXJ5Ow0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJaWYgKHJlcS5ib2R5ICE9PSB1bmRlZmluZWQpew0KCQlpZiAocmVxLmJvZHkuZXJyb3IgIT09IHVuZGVmaW5lZCl7DQoJCQllcnIgPSByZXEuYm9keTsNCgkJfQ0KCQllbHNlIGlmIChyZXEuYm9keS5jb2RlICE9PSB1bmRlZmluZWQpew0KCQkJY29kZV9jb250ZW50ID0gcmVxLmJvZHk7DQoJCX0NCgkJZWxzZSB7DQoJCQlpZiAodG9rZW5fY29udGVudCA9PT0gdW5kZWZpbmVkKXsNCgkJCQlmb3IgKHZhciBrIGluIHJlcS5ib2R5KXsNCgkJCQkJdG9rZW5fY29udGVudCA9IHJlcS5ib2R5Ow0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoZXJyICE9PSB1bmRlZmluZWQpew0KCQlyZXMucmVuZGVyKHZpZXdQYXRoICsgJy9lcnJvcl9yZWNlaXZlZCcsIHsNCgkJCWVycm9yOiBlcnIuZXJyb3IsDQoJCQllcnJvcl9kZXNjcmlwdGlvbjogZXJyLmVycm9yX2Rlc2NyaXB0aW9uDQoJCX0pOw0KCQlyZXR1cm47CQkNCgl9DQoNCglpZiAodG9rZW5fY29udGVudCAhPT0gdW5kZWZpbmVkKXsNCgkJaGFuZGxlSWRwVG9rZW5SZXN1bHQocmVzLCB0b2tlbl9jb250ZW50LCB0cnVlKTsNCgkJcmV0dXJuOw0KCX0NCgkNCgl2YXIgY2xpZW50X2luZm8gPSB7DQoJCWNsaWVudF9pZDogY2xpZW50X2lkDQoJfTsNCg0KCXBrLmNsaWVudF9pbmZvLmxvYWQoY2xpZW50X2luZm8sIGNvbnRlbnRNb2R1bGVOYW1lKQ0KCS50aGVuKGZ1bmN0aW9uKGNsaWVudF9pbmZvKXsNCgkJdmFyIHBvc3RfZGF0YSA9IHBrLnF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh7DQoJICAgICAgJ2NvZGUnIDogY29kZV9jb250ZW50LmNvZGUsDQoJICAgICAgJ2dyYW50X3R5cGUnOiAnYXV0aG9yaXphdGlvbl9jb2RlJywNCgkgICAgICAnY2xpZW50X2lkJzogY2xpZW50X2lkLA0KCSAgICAgICdyZWRpcmVjdF91cmknIDogY2xpZW50X2luZm8ucmVkaXJlY3RfdXJpc1swXSwNCgkgICAgICAnY2xpZW50X3NlY3JldCcgOiBjbGllbnRfaW5mby5jbGllbnRfc2VjcmV0DQoJICAJfSk7DQoNCgkJICAvLyBBbiBvYmplY3Qgb2Ygb3B0aW9ucyB0byBpbmRpY2F0ZSB3aGVyZSB0byBwb3N0IHRvDQoJCXZhciBwb3N0X29wdGlvbnMgPSB7DQogICAgICAgIHByb3RvY29sOiBnX2h0dHBzU2VydmVyVXJsLnByb3RvY29sLA0KCQkgIGhvc3Q6IGdfaHR0cHNTZXJ2ZXJVcmwuaG9zdG5hbWUsDQoJCSAgcG9ydDogZ19odHRwc1NlcnZlclVybC5wb3J0LA0KCQkgIHBhdGg6ICcvJyArIGNvbnRlbnRNb2R1bGVOYW1lICsgJy90b2tlbicsDQoJCSAgbWV0aG9kOiAnUE9TVCcsDQoJCSAgaGVhZGVyczogew0KCQkgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsDQoJCSAgICAgICdDb250ZW50LUxlbmd0aCc6IEJ1ZmZlci5ieXRlTGVuZ3RoKHBvc3RfZGF0YSkNCgkJICB9DQoJCX07DQoNCgkJLy8gU2V0IHVwIHRoZSByZXF1ZXN0DQoJCXZhciBmdW5jOw0KCQlpZiAocG9zdF9vcHRpb25zLnByb3RvY29sID09PSAnaHR0cCcpew0KICAgICAgICAJZnVuYyA9IHBrLmh0dHAucmVxdWVzdDsNCgkJfQ0KCQllbHNlIHsNCiAgICAgICAgCWZ1bmMgPSBway5odHRwcy5yZXF1ZXN0OyAgCQ0KCQl9DQoNCgkJdmFyIHBvc3RfcmVxID0gZnVuYyhwb3N0X29wdGlvbnMsIGZ1bmN0aW9uKHBvc3RyZXMpIHsNCgkJICBwb3N0cmVzLnNldEVuY29kaW5nKCd1dGY4Jyk7DQoJCSAgcG9zdHJlcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgew0KCQkgIAl2YXIgY29udGVudE9iamVjdCA9IEpTT04ucGFyc2UoY2h1bmspOwkNCgkJICAgIGhhbmRsZUlkcFRva2VuUmVzdWx0KHJlcywgY29udGVudE9iamVjdCwgdHJ1ZSk7DQoJCSAgfSk7DQoJCX0pOw0KDQoJCS8vIHBvc3QgdGhlIGRhdGENCgkJcG9zdF9yZXEud3JpdGUocG9zdF9kYXRhKTsNCgkJcG9zdF9yZXEuZW5kKCk7DQoJfSwgZnVuY3Rpb24oZXJyKXsNCgkJcGsudXRpbC5sb2dfZGV0YWlsKCdFcnJvciBpbiBUZXN0ZXIgcHJvY2Vzc1Bvc3RSZXNwb25zZSBmb3IgJyArIGNsaWVudF9pZCwgZXJyKTsNCgl9KTsNCn0NCg0KZnVuY3Rpb24gaGFuZGxlTWV0YWRhdGEoY29udGVudCwgcmVxLCByZXMpew0KCW1faWRwTWV0YWRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpOw0KDQoJdmFyIHVybE9iaiA9IG5ldyBway51dGlsLnVybChtX2lkcE1ldGFkYXRhLmp3a3NfdXJpKTsNCgkgIHZhciBvcHRpb25zID0gew0KCSAgCSAgcHJvdG9jb2w6IHVybE9iai5wcm90b2NvbCwNCgkgICAgICBob3N0OiB1cmxPYmouaG9zdG5hbWUsDQoJICAgICAgcG9ydDogdXJsT2JqLnBvcnQsDQoJICAgICAgcGF0aDogdXJsT2JqLnBhdGhuYW1lLA0KCSAgICAgIG1ldGhvZDogJ0dFVCcsDQoJICAgICAgaGVhZGVyczogew0KCSAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLA0KCSAgICAgIH0NCgkgIH07DQoNCgkgIGdldEpzb25IdHRwRGF0YShvcHRpb25zLCBoYW5kbGVLZXksIHJlcSwgcmVzKTsNCn0NCg0KZnVuY3Rpb24gdGVzdGVyR2V0UHJvcGVydHkoY2xpZW50X2lkLCBwcm9wZXJ0eU5hbWUpIHsNCgl2YXIgY2xpZW50ID0gdGVtcENsaWVudC5jbGllbnRzW2NsaWVudF9pZF07DQoJaWYgKGNsaWVudCA9PT0gdW5kZWZpbmVkKXsNCgkJdGhyb3cgIkludmFsaWQgQ2xpZW50IjsNCgl9DQoNCglyZXR1cm4gY2xpZW50W3Byb3BlcnR5TmFtZV07DQp9DQoNCmZ1bmN0aW9uIHRva2VuVG9BcnJheSh0b2tlbil7DQoJdmFyIGFyciA9IFtdOw0KCWZvciAodmFyIGtleSBpbiB0b2tlbil7DQoJCXZhciB2YWwgPSB0b2tlbltrZXldOw0KCQlpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpew0KICAgICAgdmFsID0gJzxwcmU-JyArIEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgIiAgIikgKyAnPC9wcmU-JzsNCgkJfQ0KCQlpZiAoa2V5ID09PSAnX2NsYWltX25hbWVzJyl7DQogICAgICB2YXIgYnV0dG9uSHRtbCA9ICc8dGFibGU-JzsNCiAgICAgIHZhciBjbGFpbV9uYW1lcyA9IHRva2VuW2tleV07DQogICAgICBmb3IgKHZhciBrMSBpbiBjbGFpbV9uYW1lcyl7DQogICAgICAgIHZhciBzb3VyY2VJZCA9IGNsYWltX25hbWVzW2sxXTsNCiAgICAgICAgdmFyIGxvY2F0aW9uX2RldGFpbHMgPSB0b2tlbi5fY2xhaW1fc291cmNlc1tzb3VyY2VJZF07DQogICAgICAgIGxvY2F0aW9uX2RldGFpbHMuY2xhaW1faWQgPSBrMTsNCiAgICAgICAgdmFyIGZldGNoZXJQYXJhbSA9IHBrLmJhc2U2NHVybC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkobG9jYXRpb25fZGV0YWlscykpOw0KICAgICAgICB2YXIgcm93SWQgPSAnY2xhaW1fbmFtZXNfJyArIGsxOyANCiAgICAgICAgYnV0dG9uSHRtbCArPSAnPHRyIGlkPSInICsgcm93SWQgKyAnIj4nOw0KICAgICAgICBidXR0b25IdG1sICs9ICc8dGQ-PGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSIgXA0Kb25jbGljaz0idmZldGNoKFwnJyArIGZldGNoZXJQYXJhbSArICdcJywgXCcnICsgcm93SWQgKyAnXCcpOyI-JyArIGsxICsgJzwvYnV0dG9uPicNCiAgICAgICAgYnV0dG9uSHRtbCArPSAnPC90ZD48L3RyPlxyXG4nOw0KICAgICAgfQ0KICAgICAgdmFsICs9IGJ1dHRvbkh0bWwgKyAnPC90YWJsZT4nDQoJCX0NCg0KCQl2YXIgY2xhaW0gPSB7DQogICAgICBuYW1lOiBrZXksDQogICAgICB2YWx1ZTogdmFsDQoJCX07DQoJCWFyci5wdXNoKGNsYWltKTsNCgl9DQoJcmV0dXJuIGFycjsNCn0NCg0KZnVuY3Rpb24gZGVsZXRlQ29va2llKHBhcmFtcywgcmVzKXsNCgl2YXIgY29va2llTmFtZSA9IGNvbnRlbnRNb2R1bGVOYW1lICsgJ191c2VyX2F1dGgnOw0KCXBrLnV0aWwubG9nX2RldGFpbCgnLS0tIFRFU1RFUjogREVMRVRJTkcgQ09PS0lFIC0tLSAnICsgY29va2llTmFtZSk7CQ0KCS8vIFRFTVBPUkFSWSAtIENMRUFOIFVQIFRFU1RJTkcNCglyZXMuY2xlYXJDb29raWUoJ2hlbGxvX21nbXQnKTsNCglyZXMuY2xlYXJDb29raWUoJ3N0c19oZWxsbycpOw0KCXJlcy5jbGVhckNvb2tpZShjb29raWVOYW1lKTsNCglzZW5kQWpheFJlc3BvbnNlKHJlcywgJ2RlbGV0ZV9jb29raWUnLCB7fSk7DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NBamF4UmVxdWVzdCAocmVxLCByZXMpew0KCXBrLnV0aWwubG9nX2RldGFpbCgnLS0tIFRFU1RFUjogUFJPQ0VTUyBBSkFYIFJFUVVFU1QgLS0tJyk7CQ0KCXZhciBwYXJhbXMgPSByZXEuYm9keTsNCglway51dGlsLmxvZ19kZXRhaWwoJ3BhcmFtcycsIHBhcmFtcyk7DQoNCglzd2l0Y2ggKHBhcmFtcy5vcCl7DQoJCWNhc2UgJ2RlbGV0ZV9jb29raWUnOg0KICAgICAgZGVsZXRlQ29va2llKHBhcmFtcywgcmVzKTsNCiAgICAgIGJyZWFrOw0KDQoJCWRlZmF1bHQ6DQogICAgICBzZW5kQWpheEVycm9yKHJlcywgJ3Vua25vd25fb3AnLCBwYXJhbXMub3ApOw0KCX0NCn0NCg0KZnVuY3Rpb24gc2VuZEFqYXhFcnJvcihyZXMsIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbil7DQoJcGsudXRpbC5sb2dfZGV0YWlsKCdTRU5ESU5HIEFKQVggRVJST1InLCBlcnJvcik7DQoJdmFyCWNvbnRlbnQgPSB7DQoJCWVycm9yOiBlcnJvciwNCgkJZXJyb3JfZGVzY3JpcHRpb246IGVycm9yX2Rlc2NyaXB0aW9uDQoJfTsNCg0KCXNlbmRBamF4UmVzcG9uc2UocmVzLCAnZXJyb3InLCBjb250ZW50KTsNCn0NCg0KZnVuY3Rpb24gc2VuZEFqYXhSZXNwb25zZShyZXMsIGtpbmQsIGNvbnRlbnQpew0KCXBrLnV0aWwubG9nX2RldGFpbCgnU0VORElORyBBSkFYIFJFU1BPTlNFJyk7DQoJdmFyIHBheWxvYWQgPSB7DQoJCWtpbmQ6IGtpbmQsDQoJCWNvbnRlbnQ6IGNvbnRlbnQNCgl9Ow0KCXJlcy5zZXQgKHsNCgkJJ0NhY2hlLUNvbnRyb2wnOiAnbm8tY2FjaGUnLA0KCQknUHJhZ21hJzogJ25vLWNhY2hlJywNCgkJJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJw0KCX0pOw0KCXJlcy5qc29uKHBheWxvYWQpOyAgICAgICAgCQ0KfQ0KDQpmdW5jdGlvbiB0ZXN0KHJlcSwgcmVzKXsNCglyZXMucmVuZGVyKHZpZXdQYXRoICsgJy90ZXN0Jyk7DQp9DQoNCmZ1bmN0aW9uIHRlc3RlcnNlcnZlcihyZXEsIHJlcyl7DQoJdmFyIHBhdGggPSByZXEucXVlcnlbJ3AnXTsNCglpZiAocGF0aCA9PT0gdW5kZWZpbmVkKXsNCgkJdGhyb3cgInBhdGggKCdwJyBwYXJhbWV0ZXIpIGlzIG5vdCBzZXQiOw0KCX0NCg0KCXZhciB0YXJnZXQgPSAnc2VydmVyJyArIHBhdGg7DQoNCgkvLyB2YXIgY29udGVudCA9IHBrLmZzLnJlYWRGaWxlU3luYyh0YXJnZXQpOw0KCS8vIHJlcy5zZW5kKGNvbnRlbnQsICd1dGY4Jyk7DQoJLy8gcmVzLmVuZCgpOw0KCXJlcy5zZW5kRmlsZShway5wYXRoLmpvaW4oX19kaXJuYW1lLCB0YXJnZXQpKTsNCn0NCg0KZnVuY3Rpb24gbG9hZF90ZXN0ZXJfY29uZmlnKHJlcSl7DQoJdmFyIHRjb25maWcgPSByZXEuY29va2llc1t0ZXN0ZXJDb25maWddOw0KCWlmICh0Y29uZmlnID09PSB1bmRlZmluZWQpew0KCQl0Y29uZmlnID0ge307DQoJfQ0KDQoJcmV0dXJuIHRjb25maWc7DQp9DQoNCmZ1bmN0aW9uIGNvbmZpZ3VyYXRpb25VaShyZXEsIHJlcyl7DQoJcGsudXRpbC5sb2dfZGV0YWlsKCctLS0gVEVTVEVSOiBDT05GSUdVUkFUSU9OIFVJIC0tLSAnKTsJDQoJcGsudXRpbC5sb2dfZGV0YWlsKCdoZWFkZXJzJywgcmVxLmhlYWRlcnMpOw0KDQoJcGsuZGJzWyd0ZXN0ZXInXS5wcm92aWRlci5xdWVyeUNvbGxlY3Rpb24ocGsuZGJzWydzdHMnXSwgJ2NsaWVudHMnKQ0KCS50aGVuKGZ1bmN0aW9uKGNsaWVudEFycmF5KXsNCgkJdmFyIGZvcm1WYWx1ZXMgPSBsb2FkX3Rlc3Rlcl9jb25maWcocmVxKTsNCg0KCQl2YXIgY2xpZW50U2V0ID0ge307DQoJCXZhciBjbGllbnRJZEFycmF5ID0gW107DQoJCWlmIChjbGllbnRBcnJheSAhPT0gdW5kZWZpbmVkICYmIGNsaWVudEFycmF5Lmxlbmd0aCA-IDApew0KICAgICAgCQlmb3IodmFyIGk9MDsgaTxjbGllbnRBcnJheS5sZW5ndGg7IGkrKyl7DQogICAgICAgIAkJdmFyIHJlZ2lzdHJhdGlvbiA9IGNsaWVudEFycmF5W2ldOw0KICAgICAgICAJCWlmIChyZWdpc3RyYXRpb24udGVzdF9hY2NvdW50ICE9PSAidHJ1ZSIpew0KICAgICAgICAJCQljb250aW51ZTsNCiAgICAgICAgCQl9DQoNCgkJICAgICAgICBjbGllbnRTZXRbcmVnaXN0cmF0aW9uLmNsaWVudF9pZF0gPSB7DQoJCSAgICAgICAgCWNsaWVudF9pZDogcmVnaXN0cmF0aW9uLmNsaWVudF9pZCwNCgkJICAgICAgICAJY2xpZW50X25hbWU6IHJlZ2lzdHJhdGlvbi5jbGllbnRfbmFtZSwNCgkJICAgICAgICAJY2xpZW50X3NlY3JldDogcmVnaXN0cmF0aW9uLmNsaWVudF9zZWNyZXQsDQoJCSAgICAgICAgCXJlZGlyZWN0X3VyaTogcmVnaXN0cmF0aW9uLnJlZGlyZWN0X3VyaXNbMF0sDQoJCSAgICAgICAgCWNsaWVudF91cmk6IHJlZ2lzdHJhdGlvbi5jbGllbnRfdXJpLA0KCQkgICAgICAgIAlzY29wZTogcmVnaXN0cmF0aW9uLnNjb3BlLA0KCQkgICAgICAgIAlsb2dvX3VyaTogcmVnaXN0cmF0aW9uLmxvZ29fdXJpDQoJCSAgICAgICAgfTsNCiAgICAgICAgDQoJCSAgICAgICAgY2xpZW50SWRBcnJheS5wdXNoKHJlZ2lzdHJhdGlvbi5jbGllbnRfaWQpOw0KICAgICAgCQl9DQoNCiAgICAgIAkJbGFiX2NvbmZpZ3VyYXRpb24uY2xpZW50X2lkLnZhbHVlcyA9IGNsaWVudElkQXJyYXk7DQogICAgICAJCWlmIChmb3JtVmFsdWVzLmNsaWVudF9pZCA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAJCWZvcm1WYWx1ZXMuY2xpZW50X2lkID0gY2xpZW50SWRBcnJheVswXTsNCg0KICAgICAgICAJdmFyIGNsaWVudENsYWltc2V0ID0gY2xpZW50U2V0W2Zvcm1WYWx1ZXMuY2xpZW50X2lkXTsNCg0KICAgICAgCQlpZiAoZm9ybVZhbHVlcy5yZWRpcmVjdF91cmkgPT09IHVuZGVmaW5lZCkNCiAgICAgICAgCQlmb3JtVmFsdWVzLnJlZGlyZWN0X3VyaSA9IGNsaWVudENsYWltc2V0LnJlZGlyZWN0X3VyaTsNCiAgICAgIAkJaWYgKGZvcm1WYWx1ZXMuY2xpZW50X3VyaSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAJCWZvcm1WYWx1ZXMuY2xpZW50X3VyaSA9IGNsaWVudENsYWltc2V0LmNsaWVudF91cmk7DQogICAgICAJCWlmIChmb3JtVmFsdWVzLnNjb3BlID09PSB1bmRlZmluZWQpDQogICAgICAgIAkJZm9ybVZhbHVlcy5zY29wZSA9IGNsaWVudENsYWltc2V0LnNjb3BlOw0KICAgICAgCQlpZiAoZm9ybVZhbHVlcy5sb2dvX3VyaSA9PT0gdW5kZWZpbmVkKQ0KICAgICAgICAJCWZvcm1WYWx1ZXMubG9nb191cmkgPSBjbGllbnRDbGFpbXNldC5sb2dvX3VyaTsNCgkJfQ0KDQoJCXZhciBtb2R1bGVTZXQgPSBbXTsNCgkJZm9yICh2YXIgY20gaW4gcGsuY29udGVudF9tb2R1bGVzKXsNCgkgICAgCWlmIChway5jb250ZW50X21vZHVsZXNbY21dLmludm9rZUF1dGhVc2VyQWdlbnQgPT09IHVuZGVmaW5lZCl7DQogICAgICAgIAkJY29udGludWU7DQogICAgICAJCX0NCg0KICAgICAgCQltb2R1bGVTZXQucHVzaChjbSk7DQoJCX0NCg0KCQlyZXMuY2xlYXJDb29raWUoJ3Rlc3ROb25jZScpOw0KDQoJCXJlcy5yZW5kZXIodmlld1BhdGggKyAnL2NvbmZpZ3VyYXRpb24nLCB7DQoJICAgICAgbGF5b3V0OiAndGVzdGxhYicsDQoJICAgICAgY2xpZW50U2V0OiBKU09OLnN0cmluZ2lmeShjbGllbnRTZXQpLA0KCSAgICAgIG1vZHVsZVNldDogSlNPTi5zdHJpbmdpZnkobW9kdWxlU2V0KSwNCgkgICAgICBmb3JtVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KGxhYl9jb25maWd1cmF0aW9uKSwNCgkgICAgICBmb3JtVmFsdWVzOiBKU09OLnN0cmluZ2lmeShmb3JtVmFsdWVzKQ0KCQl9KTsNCgl9LCBmdW5jdGlvbihlcnIpew0KICAgICAgcGsudXRpbC5sb2dfZGV0YWlsKCdFcnJvciByZWFkaW5nIGNsaWVudHMgZnJvbSBkYXRhYmFzZScsIGVycik7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NDb25maWd1cmF0aW9uUmVzcG9uc2UocmVxLCByZXMpew0KCXJlcy5jb29raWUodGVzdGVyQ29uZmlnLCByZXEuYm9keSwgMCk7DQoNCgl2YXIgcmVzcG9uc2UgPSB7DQoJCXN0YXR1czogJ09LJywNCgkJcmVzdWx0OiB7fQ0KCX0NCg0KCXJlcy5zZXQgKHsNCgkJJ0NhY2hlLUNvbnRyb2wnOiAnbm8tc3RvcmUnLA0KCQknUHJhZ21hJzogJ25vLWNhY2hlJw0KCX0pOw0KDQoJcGsudXRpbC5sb2dfZGV0YWlsKCdTVFMgU0VORElORyBjb25maWd1cmF0aW9uIFJlc3BvbnNlXHJcbicpDQoJcmVzLmpzb24ocmVzcG9uc2UpOw0KCXJlcy5lbmQoKTsJDQp9DQoNCmZ1bmN0aW9uIHRlc3RBdXRoZW50aWNhdGlvblVpKHJlcSwgcmVzKXsNCgl2YXIgZm9ybVZhbHVlcyA9IGxvYWRfdGVzdGVyX2NvbmZpZyhyZXEpOw0KDQoJaWYgKGZvcm1WYWx1ZXMubW9kdWxlID09PSB1bmRlZmluZWQpew0KCQl2YXIgbG9jYXRpb24gPSBnX2h0dHBzU2VydmVyVXJsLmhyZWYgKyAndGVzdGVyL2NvbmZpZ3VyYXRpb24nOw0KCQlyZXMuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGxvY2F0aW9uKTsNCgkJcmVzLnN0YXR1c0NvZGUgPSAzMDI7DQoJCXJlcy5lbmQoKTsNCgkJcmV0dXJuOwkJDQoJfQ0KDQoJdmFyIG1vZHVsZU5hbWUgPSBmb3JtVmFsdWVzLm1vZHVsZS50b0xvd2VyQ2FzZSgpOw0KCWlmIChway51dGlsLmNvbmZpZy5jb250ZW50X21vZHVsZXNbbW9kdWxlTmFtZV0uc2VsZkFzc2VydGVkKXsNCgkJZm9ybVZhbHVlcy5jbGllbnRfaWQgPSBmb3JtVmFsdWVzLnJlZGlyZWN0X3VyaTsNCgkJaWYgKGZvcm1WYWx1ZXMuY2xpZW50X3NlY3JldCAhPT0gdW5kZWZpbmVkKQ0KICAgICAgZGVsZXRlIGZvcm1WYWx1ZXMuY2xpZW50X3NlY3JldDsNCgl9DQoJZWxzZXsNCgkJaWYgKGZvcm1WYWx1ZXMucmVnaXN0cmF0aW9uICE9PSB1bmRlZmluZWQpDQogICAgICBkZWxldGUgZm9ybVZhbHVlcy5yZWdpc3RyYXRpb247DQoJfQ0KDQoJLy8gaW5jcmVtZW50IHRoZSB2YWx1ZSBvZiB0aGUgbm9uY2Ugb24gZWFjaCB0ZXN0DQoJdmFyIG5Db29raWUgPSByZXEuY29va2llc1sndGVzdE5vbmNlJ107DQoJaWYgKCFuQ29va2llKXsNCgkJbkNvb2tpZSA9IGZvcm1WYWx1ZXMubm9uY2U7DQoJfQ0KDQoJdmFyIG5yZWdleHAgPSAvKFtBLVphLXpdKykoWzAtOV0qKS9nOw0KCXZhciBubWF0Y2ggPSBucmVnZXhwLmV4ZWMobkNvb2tpZSk7DQoJdmFyIG5yb290ID0gbm1hdGNoWzFdCQkJDQoJdmFyIG5pbnRQYXJ0ID0gbm1hdGNoWzJdDQoJdmFyIG5pbnRWYWwgPSAobmludFBhcnQgPyBOdW1iZXIobmludFBhcnQpIDogMCkgKyAxOw0KDQoJZm9ybVZhbHVlcy5ub25jZSA9IG5yb290ICsgbGVmdFBhZChuaW50VmFsLCAzKTsNCglyZXMuY29va2llKCd0ZXN0Tm9uY2UnLCBmb3JtVmFsdWVzLm5vbmNlKTsNCg0KCS8vIGFkZCB0aGUgaXNzIHRvIG91ciBzdGF0ZQ0KCXZhciBpc3MgPSBnX2h0dHBzU2VydmVyVXJsLmhyZWYgKyBmb3JtVmFsdWVzLm1vZHVsZTsNCgl2YXIgc3RhdGUgPSAiaXNzPSIgKyBpc3M7DQoJaWYgKGZvcm1WYWx1ZXMuc3RhdGUpew0KCQlzdGF0ZSArPSAiJiIgKyBmb3JtVmFsdWVzLnN0YXRlOw0KCX0NCglmb3JtVmFsdWVzLnN0YXRlID0gc3RhdGU7DQoNCglyZXMucmVuZGVyKHZpZXdQYXRoICsgJy90ZXN0QXV0aGVudGljYXRpb24nLCB7DQoJCWxheW91dDogJ3Rlc3RsYWInLA0KCQlmb3JtVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KGxhYl90ZXN0QXV0aGVudGljYXRpb24pLA0KCQlmb3JtVmFsdWVzOiBKU09OLnN0cmluZ2lmeShmb3JtVmFsdWVzKQ0KCX0pOw0KDQoJZnVuY3Rpb24gbGVmdFBhZChudW1iZXIsIHRhcmdldExlbmd0aCkgew0KCSAgICB2YXIgb3V0cHV0ID0gbnVtYmVyICsgJyc7DQoJICAgIHdoaWxlIChvdXRwdXQubGVuZ3RoIDwgdGFyZ2V0TGVuZ3RoKSB7DQoJICAgICAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7DQoJICAgIH0NCgkgICAgcmV0dXJuIG91dHB1dDsNCgl9CQ0KfQ0KDQpmdW5jdGlvbiByZWdpc3RyYXRpb25VaShyZXEsIHJlcyl7DQoNCgl2YXIgZm9ybVZhbHVlcyA9IHt9Ow0KDQoJcmVzLnJlbmRlcih2aWV3UGF0aCArICcvcmVnaXN0cmF0aW9uJywgew0KCQlsYXlvdXQ6ICd0ZXN0bGFiJywNCgkJZm9ybVRlbXBsYXRlOiBKU09OLnN0cmluZ2lmeShsYWJfcmVnaXN0cmF0aW9uKSwNCgkJZm9ybVZhbHVlczogSlNPTi5zdHJpbmdpZnkoZm9ybVZhbHVlcykNCgl9KTsNCn0NCg0KY29uc3QgbGFiX3JlZ2lzdHJhdGlvbiA9IHsNCglmaWVsZHNldF8wOiB7DQoJCWlucHV0OiAnZmllbGRzZXQnLA0KCQlsZWdlbmQ6ICJFbnRpdHkgSW5mb3JtYXRpb24iLA0KCQljb250ZW50OiB7DQogICAgICB0ZXN0X2FjY291bnQ6IHsNCiAgICAgICAgaW5wdXQ6ICdib29sZWFuJywNCiAgICAgICAgZGVmYXVsdDogJ2ZhbHNlJw0KICAgICAgfSwNCiAgICAgIGNsaWVudF9pZDogew0KICAgICAgICBpbnB1dDogJ3RleHQnLA0KICAgICAgICBkZWZhdWx0OiAnc3VwcHJlc3MhJw0KICAgICAgfSwNCiAgICAgIGNsaWVudF9zZWNyZXQ6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ3N1cHByZXNzIScNCiAgICAgIH0sDQogICAgICByZWdpc3RyYXRpb25fYWNjZXNzX3Rva2VuOiB7DQogICAgICAgIGlucHV0OiAndGV4dCcsDQogICAgICAgIGRlZmF1bHQ6ICdzdXBwcmVzcyEnDQogICAgICB9LA0KICAgICAgcmVnaXN0cmF0aW9uX2NsaWVudF91cmk6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ3N1cHByZXNzIScNCiAgICAgIH0sDQogICAgICBjbGllbnRfaWRfaXNzdWVkX2F0OiB7DQogICAgICAgIGlucHV0OiAndGV4dCcsDQogICAgICAgIGRlZmF1bHQ6ICdzdXBwcmVzcyEnDQogICAgICB9LA0KICAgICAgY2xpZW50X3NlY3JldF9leHBpcmVzX2F0OiB7DQogICAgICAgIGlucHV0OiAndGV4dCcsDQogICAgICAgIGRlZmF1bHQ6ICdzdXBwcmVzcyEnDQogICAgICB9DQoJCX0NCgl9LA0KCWZpZWxkc2V0XzE6IHsNCgkJaW5wdXQ6ICdmaWVsZHNldCcsDQoJCWxlZ2VuZDogIkVudGl0eSBJbmZvcm1hdGlvbiIsDQoJCWNvbnRlbnQ6IHsNCiAgICAgIGNvbnRhY3RzOiB7DQogICAgICAgIHR5cGU6ICdhcnJheScsDQogICAgICAgIGlucHV0OiAndGV4dCcNCg0KICAgICAgfSwNCiAgICAgIGNsaWVudF9uYW1lOiB7DQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICBsb2dvX3VyaTogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgY2xpZW50X3VyaTogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgcG9saWN5X3VyaTogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgdG9zX3VyaTogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgandrc191cmk6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfQ0KCQl9DQoJfSwNCglmaWVsZHNldF8yOiB7DQoJCWlucHV0OiAnZmllbGRzZXQnLA0KCQlsZWdlbmQ6ICJFbnRpdHkgUGFyYW1ldGVycyIsDQoJCWNvbnRlbnQ6IHsNCiAgICAgIHJlZGlyZWN0X3VyaXM6IHsNCiAgICAgICAgdHlwZTogJ2FycmF5JywNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIHJlc3BvbnNlX3R5cGVzOiB7DQogICAgICAgIHR5cGU6ICdhcnJheScsDQogICAgICAgIGlucHV0OiAnY2hlY2tib3hlcycsDQogICAgICAgIHZhbHVlczogWydjb2RlJywgJ2lkX3Rva2VuJywgJ2lkX3Rva2VuIHRva2VuJywgJ2NvZGUgaWRfdG9rZW4nLCAnY29kZSB0b2tlbicsICdjb2RlIGlkX3Rva2VuIHRva2VuJ10sDQogICAgICAgIGRlZmF1bHQ6IFsnY29kZSddDQogICAgICB9LA0KICAgICAgZ3JhbnRfdHlwZXM6IHsNCiAgICAgICAgdHlwZTogJ2FycmF5JywNCiAgICAgICAgaW5wdXQ6ICdjaGVja2JveGVzJywNCiAgICAgICAgdmFsdWVzOiBbJ2F1dGhvcml6YXRpb25fY29kZScsICdpbXBsaWNpdCcsICdyZWZyZXNoX3Rva2VuJ10sDQogICAgICAgIGRlZmF1bHQ6IFsnYXV0aG9yaXphdGlvbl9jb2RlJ10NCiAgICAgIH0sDQogICAgICBhcHBsaWNhdGlvbl90eXBlOiB7DQogICAgICAgIGlucHV0OiAncmFkaW8nLA0KICAgICAgICB2YWx1ZXM6IFsnbmF0aXZlJywgJ3dlYiddLA0KICAgICAgICBkZWZhdWx0OiAnd2ViJw0KICAgICAgfSwNCiAgICAgIHNlY3Rvcl9pZGVudGlmaWVyX3VyaTogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgc3ViamVjdF90eXBlOiB7DQogICAgICAgIHR5cGU6ICdhcnJheScsDQogICAgICAgIGlucHV0OiAnY2hlY2tib3hlcycsDQogICAgICAgIHZhbHVlczogWydwYWlyd2lzZScsICdwdWJsaWMnXQ0KICAgICAgfSwNCiAgICAgIGlkX3Rva2VuX3NpZ25lZF9yZXNwb25zZV9hbGc6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ1JTMjU2Jw0KICAgICAgfSwNCiAgICAgIGlkX3Rva2VuX2VuY3J5cHRlZF9yZXNwb25zZV9hbGc6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIGlkX3Rva2VuX2VuY3J5cHRlZF9yZXNwb25zZV9lbmM6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ0FMMTI4Q0JDLUhTMjU2Jw0KICAgICAgfSwNCiAgICAgIHVzZXJpbmZvX3NpZ25lZF9yZXNwb25zZV9hbGc6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIHVzZXJpbmZvX2VuY3J5cHRlZF9yZXNwb25zZV9hbGc6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIHVzZXJpbmZvX2VuY3J5cHRlZF9yZXNwb25zZV9lbmM6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ0FMMTI4Q0JDLUhTMjU2Jw0KICAgICAgfSwNCiAgICAgIHJlcXVlc3Rfb2JqZWN0X3NpZ25pbmdfYWxnOiB7DQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICByZXF1ZXN0X29iamVjdF9lbmNyeXB0aW9uX2FsZzogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgcmVxdWVzdF9vYmplY3RfZW5jcnlwdGlvbl9lbmM6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ0FMMTI4Q0JDLUhTMjU2Jw0KICAgICAgfSwNCiAgICAgIHRva2VuX2VuZHBvaW50X2F1dGhfbWV0aG9kOiB7DQogICAgICAgIGlucHV0OiAnc2VsZWN0JywNCiAgICAgICAgdmFsdWVzOiBbJ2NsaWVudF9zZWNyZXRfcG9zdCcsICdjbGllbnRfc2VjcmV0X2Jhc2ljJywgJ2NsaWVudF9zZWNyZXRfand0JywgJ3ByaXZhdGVfa2V5X2p3dCcsICdub25lJ10sDQogICAgICAgIGRlZmF1bHQ6ICdjbGllbnRfc2VjcmV0X2Jhc2ljJw0KICAgICAgfSwNCiAgICAgIHRva2VuX2VuZHBvaW50X2F1dGhfc2lnbmluZ19hbGc6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIGRlZmF1bHRfbWF4X2FnZTogew0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgcmVxdWlyZV9hdXRoX3RpbWU6IHsNCiAgICAgICAgaW5wdXQ6ICdib29sZWFuJywNCiAgICAgICAgZGVmYXVsdDogJ2ZhbHNlJw0KICAgICAgfSwNCiAgICAgIGRlZmF1bHRfYWNyX3ZhbHVlczogew0KICAgICAgICB0eXBlOiAnYXJyYXknLA0KICAgICAgICBpbnB1dDogJ3N0cmluZycNCiAgICAgIH0sDQogICAgICBpbml0aWF0ZV9sb2dpbl91cmk6IHsNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIHJlcXVlc3RfdXJpczogew0KICAgICAgICB0eXBlOiAnYXJyYXknLA0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9DQoJCX0NCgl9LA0KCXN1Ym1pdDogew0KCQlpbnB1dDogJ2J1dHRvbicsDQoJCW1ldGhvZDogJ3N1Ym1pdFJlZ2lzdHJhdGlvbigpJw0KCX0NCn0NCg0KY29uc3QgbGFiX3Rlc3RBdXRoZW50aWNhdGlvbiA9IHsNCglmaWVsZHNldF8wOiB7DQoJCWlucHV0OiAnZmllbGRzZXQnLA0KCQlsZWdlbmQ6ICJFbnRpdHkgSW5mb3JtYXRvbiIsDQoJCWNvbnRlbnQ6IHsNCiAgICAgIGNsaWVudF9pZDogew0KICAgICAgICBsYWJlbDogJ0NsaWVudCBJRCcsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sICAgICAgDQogICAgICBjbGllbnRfc2VjcmV0OiB7DQogICAgICAgIGxhYmVsOiAnQ2xpZW50IFNlY3JldCcsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICByZWRpcmVjdF91cmk6IHsNCiAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBVcmknLA0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9DQoJCX0NCgl9LA0KCWZpZWxkc2V0XzE6IHsNCgkJaW5wdXQ6ICdmaWVsZHNldCcsDQoJCWxlZ2VuZDogIkJhc2ljIFBhcmFtZXRlcnMiLA0KCQljb250ZW50OiB7DQogICAgICByZXNwb25zZV90eXBlOiB7DQogICAgICAgIGxhYmVsOiAnUmVzcG9uc2UgVHlwZScsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICByZXNwb25zZV9tb2RlOiB7DQogICAgICAgIGxhYmVsOiAnUmVzcG9uc2UgTW9kZScsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICBwcm9tcHQ6IHsNCiAgICAgICAgbGFiZWw6ICdQcm9tcHQnLA0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgc3RhdGU6IHsNCiAgICAgICAgbGFiZWw6ICdTdGF0ZScsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICBub25jZTogew0KICAgICAgICBsYWJlbDogJ05vbmNlJywNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIGFjcl92YWx1ZXM6IHsNCiAgICAgICAgbGFiZWw6ICdBQ1IgVmFsdWVzJywNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIG1heF9hZ2U6IHsNCiAgICAgICAgbGFiZWw6ICdNYXggQWdlJywNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfQ0KCQl9DQoJfSwNCglmaWVsZHNldF8yOiB7DQoJCWlucHV0OiAnZmllbGRzZXQnLA0KCQlsZWdlbmQ6ICJTY29wZSBhbmQgQ2xhaW1zIiwNCgkJY29udGVudDogew0KICAgICAgc2NvcGU6IHsNCiAgICAgICAgbGFiZWw6ICdTY29wZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcycsDQogICAgICAgIGxhYmVsX2NsYXNzOiAncmlnaHQnLA0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LA0KICAgICAgZmllbGRzZXRfMzogew0KICAgICAgICBpbnB1dDogJ2ZpZWxkc2V0JywNCiAgICAgICAgbGVnZW5kOiAiSWQgVG9rZW4gQ2xhaW1zIiwNCiAgICAgICAgY29udGVudDogew0KICAgICAgICAJaWRfdG9rZW5fY2xhaW1zOiB7DQogICAgICAgIAkJaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgCQlsYWJlbDogJ0NsYWltcyBzZXBhcmF0ZWQgYnkgc3BhY2VzJywNCiAgICAgICAgCQlsYWJlbF9jbGFzczogJ3JpZ2h0Jw0KICAgICAgICAJfSwNCiAgICAgICAgCWlkX3Rva2VuX2NsYWltc19lc3NlbnRpYWw6IHsNCiAgICAgICAgCQlpbnB1dDogJ2NoZWNrYm94JywNCiAgICAgICAgCQlsYWJlbDogJ0Vzc2VudGlhbCcsDQogICAgICAgIAkJbGFiZWxfY2xhc3M6ICdpbmxpbmUnICAgICAgICAJfQ0KICAgICAgICB9DQogICAgICB9LA0KICAgICAgZmllbGRzZXRfNDogew0KICAgICAgICBpbnB1dDogJ2ZpZWxkc2V0JywNCiAgICAgICAgbGVnZW5kOiAiVXNlciBJbmZvIENsYWltcyIsDQogICAgICAgIGNvbnRlbnQ6IHsNCiAgICAgICAgCXVzZXJpbmZvX2NsYWltczogew0KICAgICAgICAJCWlucHV0OiAndGV4dCcsDQogICAgICAgIAkJbGFiZWw6ICdDbGFpbXMgc2VwYXJhdGVkIGJ5IHNwYWNlcycsDQogICAgICAgIAkJbGFiZWxfY2xhc3M6ICdyaWdodCcNCiAgICAgICAgCX0sDQogICAgICAgIAl1c2VyaW5mb19jbGFpbXNfZXNzZW50aWFsOiB7DQogICAgICAgIAkJaW5wdXQ6ICdjaGVja2JveCcsDQogICAgICAgIAkJbGFiZWw6ICdFc3NlbnRpYWwnLA0KICAgICAgICAJCWxhYmVsX2NsYXNzOiAnaW5saW5lJw0KICAgICAgICAJfQ0KICAgICAgICB9DQogICAgICB9DQoJCX0NCgl9LA0KCWZpZWxkc2V0XzU6IHsNCgkJaW5wdXQ6ICdmaWVsZHNldCcsDQoJCWxlZ2VuZDogIk1pc2NlbGxhbmVvdXMiLA0KCQljb250ZW50OiB7DQogICAgICBzdWJtaXRfaWRfdG9rZW5faGludDogew0KICAgICAgICBsYWJlbDogJ1N1Ym1pdCBsYXN0IGlkX3Rva2VuIGFzIHRva2VuIGhpbnQ_JywNCiAgICAgICAgbGFiZWxfY2xhc3M6ICdpbmxpbmUnLA0KICAgICAgICBpbnB1dDogJ2NoZWNrYm94Jw0KICAgICAgfSwNCiAgICAgIGRlbGV0ZV9jb29raWVzOiB7DQogICAgICAgIGxhYmVsOiAnRGVsZXRlIGNvb2tpZXMgcHJpb3IgdG8gcmVxdWVzdD8nLA0KICAgICAgICBsYWJlbF9jbGFzczogJ2lubGluZScsDQogICAgICAgIGlucHV0OiAnY2hlY2tib3gnDQogICAgICB9LA0KICAgICAgZGVsZXRlX2RhdGFiYXNlczogew0KICAgICAgICBsYWJlbDogJ0RlbGV0ZSBkYXRhYmFzZXMgcHJpb3IgdG8gcmVxdWVzdD8nLA0KICAgICAgICBsYWJlbF9jbGFzczogJ2lubGluZScsDQogICAgICAgIGlucHV0OiAnY2hlY2tib3gnDQogICAgICB9LA0KICAgICAgc3VibWl0X2NsaWVudF9yZWdpc3RyYXRpb246IHsNCiAgICAgICAgbGFiZWw6ICdTdWJtaXQgY2xpZW50IHJlZ2lzdHJhdGlvbj8nLA0KICAgICAgICBsYWJlbF9jbGFzczogJ2lubGluZScsDQogICAgICAgIGlucHV0OiAnY2hlY2tib3gnDQogICAgICB9LA0KICAgICAgcmVnaXN0cmF0aW9uOiB7DQogICAgICAgIGlucHV0OiAndGV4dCcsDQogICAgICAgIHR5cGU6ICdvYmplY3QnLA0KICAgICAgICBsYWJlbDogJ0NsaWVudCBSZWdpc3RyYXRpb24nLA0KICAgICAgICBsYWJlbF9jbGFzczogJ3JpZ2h0Jw0KICAgICAgfQ0KCQl9DQoJfSwNCglzdWJtaXQ6IHsNCgkJaW5wdXQ6ICdidXR0b24nLA0KCQltZXRob2Q6ICdzdWJtaXRUZXN0QXV0aGVudGljYXRpb24oKScNCgl9DQp9DQoNCmNvbnN0IGxhYl9jb25maWd1cmF0aW9uID0gew0KCW1vZHVsZTogew0KCQlsYWJlbDogJ01vZHVsZSBVbmRlciBUZXN0JywNCgkJaW5wdXQ6ICdyYWRpbycNCgl9LA0KCW1ldGhvZDogew0KCQlsYWJlbDogJ0hUVFAgUmVkaXJlY3Rpb24gTWV0aG9kJywNCgkJaW5wdXQ6ICdyYWRpbycsDQoJCXZhbHVlczogWydHRVQnLCAnUE9TVCddLA0KCQlkZWZhdWx0OiAnUE9TVCcNCgl9LA0KCWNsaWVudF9pZDogew0KCQlsYWJlbDogJ1JlbHlpbmcgUGFydHkgRm9yIFRlc3RzJywNCgkJaW5wdXQ6ICdzZWxlY3QnLA0KCQl2YWx1ZXM6IFtdLA0KCQlkZWZhdWx0OiAnJw0KCX0sDQoJZmllbGRzZXRfMDogew0KCQlpbnB1dDogJ2ZpZWxkc2V0JywNCgkJbGVnZW5kOiAiRGVmYXVsdCBQYXJhbWV0ZXJzIEZvciBUZXN0cyIsDQoJCWNvbnRlbnQ6IHsNCiAgICAgIHN0YXRlOiB7DQogICAgICAgIGxhYmVsOiAnU3RhdGUnLA0KICAgICAgICBpbnB1dDogJ3RleHQnDQogICAgICB9LCAgICAgIA0KICAgICAgcmVzcG9uc2VfdHlwZTogew0KICAgICAgICBsYWJlbDogJ1Jlc3BvbnNlIFR5cGUnLA0KICAgICAgICBpbnB1dDogJ3NlbGVjdCcsDQogICAgICAgIHZhbHVlczogWydjb2RlJywgJ2lkX3Rva2VuJywgJ2lkX3Rva2VuIHRva2VuJywgJ2NvZGUgaWRfdG9rZW4nLCAnY29kZSB0b2tlbicsICdjb2RlIGlkX3Rva2VuIHRva2VuJ10sDQogICAgICAgIGRlZmF1bHQ6ICdpZF90b2tlbicNCiAgICAgIH0sDQogICAgICByZXNwb25zZV9tb2RlOiB7DQogICAgICAgIGxhYmVsOiAnUmVzcG9uc2UgTW9kZScsDQogICAgICAgIGlucHV0OiAnc2VsZWN0JywNCiAgICAgICAgdmFsdWVzOiBbJ2RlZmF1bHQgZm9yIHJlc3BvbnNlX3R5cGUnLCAnZm9ybV9wb3N0JywgJ3F1ZXJ5JywgJ2ltcGxpY2l0J10sDQogICAgICAgIGRlZmF1bHQ6ICdkZWZhdWx0IGZvciByZXNwb25zZV90eXBlJw0KICAgICAgfSwNCiAgICAgIHByb21wdDogew0KICAgICAgICBsYWJlbDogJ1Byb21wdCcsDQogICAgICAgIGlucHV0OiAnc2VsZWN0JywNCiAgICAgICAgdmFsdWVzOiBbJ2VtcHR5JywgJ25vbmUnLCAnbG9naW4nLCAnY29uc2VudCddLA0KICAgICAgICBkZWZhdWx0OiAnY29uc2VudCcNCiAgICAgIH0sDQogICAgICBub25jZTogew0KICAgICAgICBsYWJlbDogJ05vbmNlJywNCiAgICAgICAgaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgZGVmYXVsdDogJ3Rlc3ROb25jZTk5OScNCiAgICAgIH0sDQogICAgICBhY3JfdmFsdWVzOiB7DQogICAgICAgIGxhYmVsOiAnQUNSIFZhbHVlcycsDQogICAgICAgIHR5cGU6ICdhcnJheScsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0sDQogICAgICBtYXhfYWdlOiB7DQogICAgICAgIGxhYmVsOiAnTWF4IEFnZScsDQogICAgICAgIGlucHV0OiAndGV4dCcNCiAgICAgIH0NCgkJfQ0KCX0sDQoJZmllbGRzZXRfMTogew0KCQlpbnB1dDogJ2ZpZWxkc2V0JywNCgkJbGVnZW5kOiAiU2NvcGUgYW5kIENsYWltcyIsDQoJCWNvbnRlbnQ6IHsNCiAgICAgIHNjb3BlOiB7DQogICAgICAgIGxhYmVsOiAnU2NvcGVzIHNlcGFyYXRlZCBieSBhIHNwYWNlJywNCiAgICAgICAgaW5wdXQ6ICd0ZXh0Jw0KICAgICAgfSwNCiAgICAgIGZpZWxkc2V0XzI6IHsNCiAgICAgICAgaW5wdXQ6ICdmaWVsZHNldCcsDQogICAgICAgIGxlZ2VuZDogIklkIFRva2VuIENsYWltcyIsDQogICAgICAgIGNvbnRlbnQ6IHsNCiAgICAgICAgCWlkX3Rva2VuX2NsYWltczogew0KICAgICAgICAJCWlucHV0OiAndGV4dCcsDQogICAgICAgIAkJbGFiZWw6ICdDbGFpbXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UnLA0KICAgICAgICAJCWxhYmVsX2NsYXNzOiAncmlnaHQnDQogICAgICAgIAl9LA0KICAgICAgICAJaWRfdG9rZW5fY2xhaW1zX2Vzc2VudGlhbDogew0KICAgICAgICAJCWlucHV0OiAnY2hlY2tib3gnLA0KICAgICAgICAJCWxhYmVsOiAnRXNzZW50aWFsJywNCiAgICAgICAgCQlsYWJlbF9jbGFzczogJ2lubGluZScgICAgICAgIAl9DQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICBmaWVsZHNldF8zOiB7DQogICAgICAgIGlucHV0OiAnZmllbGRzZXQnLA0KICAgICAgICBsZWdlbmQ6ICJVc2VyIEluZm8gQ2xhaW1zIiwNCiAgICAgICAgY29udGVudDogew0KICAgICAgICAJdXNlcmluZm9fY2xhaW1zOiB7DQogICAgICAgIAkJaW5wdXQ6ICd0ZXh0JywNCiAgICAgICAgCQlsYWJlbDogJ0NsYWltcyBzZXBhcmF0ZWQgYnkgYSBzcGFjZScsDQogICAgICAgIAkJbGFiZWxfY2xhc3M6ICdyaWdodCcNCiAgICAgICAgCX0sDQogICAgICAgIAl1c2VyaW5mb19jbGFpbXNfZXNzZW50aWFsOiB7DQogICAgICAgIAkJaW5wdXQ6ICdjaGVja2JveCcsDQogICAgICAgIAkJbGFiZWw6ICdFc3NlbnRpYWwnLA0KICAgICAgICAJCWxhYmVsX2NsYXNzOiAnaW5saW5lJw0KICAgICAgICAJfQ0KICAgICAgICB9DQogICAgICB9DQoJCX0NCgl9LA0KCWNsaWVudF9zZWNyZXQ6IHsNCgkJaW5wdXQ6ICdoaWRkZW4nDQoJfSwNCglyZWRpcmVjdF91cmk6IHsNCgkJaW5wdXQ6ICdoaWRkZW4nDQoJfSwNCglzdWJtaXQ6IHsNCgkJaW5wdXQ6ICdidXR0b24nLA0KCQltZXRob2Q6ICdzdWJtaXRDb25maWd1cmF0aW9uKCknDQoJfQ0KfQ0KDQpmdW5jdGlvbiBpc3NldChwYXJhbSl7DQoJaWYgKHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcpew0KCQlpZiAocGFyYW0gPT09IHVuZGVmaW5lZCB8fCBwYXJhbSA9PT0gbnVsbCB8fCBwYXJhbS5sZW5ndGggPT09IDApDQogICAgICByZXR1cm4gZmFsc2U7DQoJfQ0KCXJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiByZWdpc3RlclB3YShyZXEsIHJlcyl7DQoJdmFyIHB3YV9wYXRoID0gZ19odHRwc1NlcnZlclVybC5ocmVmICsgJ3BlcnNvbmFsL2luZGV4Lmh0bWw_b3BlbmlkPSVzJzsNCglyZXMucmVuZGVyKHZpZXdQYXRoICsgJy9yZWdpc3Rlcl9wd2EnLCB7DQoJCWxheW91dDogJ21haW5fcGVyc29uYWwnLA0KCQlwd2FfcGF0aDogcHdhX3BhdGgNCgl9KQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVQYXJhbWV0ZXJTdHJpbmcob2JqKXsNCgl2YXIgcmVzdWx0ID0gJyc7DQoJdmFyIHNlcGFyYXRvciA9ICcnOw0KCWZvciAodmFyIGtleSBpbiBvYmopew0KCQlyZXN1bHQgKz0gc2VwYXJhdG9yICsgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pOw0KCQlzZXBhcmF0b3IgPSAnJic7DQoJfQ0KDQoJcmV0dXJuIHJlc3VsdDsNCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc0RvY0luZGV4KHJlcSwgcmVzKXsNCgl2YXIgZmlsZUxpc3QgPSBway5mcy5yZWFkZGlyU3luYygiLi9kb2N1bWVudGF0aW9uIik7DQoJdmFyIGl0ZW1zID0gW107DQoJZm9yICh2YXIgaT0wOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspew0KCQl2YXIgaHJlZiA9IGZpbGVMaXN0W2ldOw0KCQl2YXIgZXh0ID0gaHJlZi5zdWJzdHJpbmcoaHJlZi5sYXN0SW5kZXhPZignLicpKTsNCgkJc3dpdGNoIChleHQpew0KICAgICAgY2FzZSAnLmh0bSc6DQogICAgICBjYXNlICcucGRmJzoNCiAgICAgIGNhc2UgJy5tcDQnOg0KICAgICAgICBicmVhazsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIGNvbnRpbnVlOw0KCQl9DQoNCgkJdmFyIG5hbWUgPSBocmVmLnN1YnN0cmluZygwLCBocmVmLmxlbmd0aCAtIDQpOw0KCQl2YXIgaXRlbSA9IHsgbmFtZTogbmFtZSwgaHJlZjogJy9kb2NzLycgKyBocmVmIH07DQoJCWl0ZW1zLnB1c2goaXRlbSk7DQoJfQ0KCXJlcy5zZXQgKHsNCgkJJ0NhY2hlLUNvbnRyb2wnOiAnbm8tY2FjaGUnLA0KCX0pOwkNCglyZXMucmVuZGVyKHZpZXdQYXRoICsgJy9kb2NJbmRleCcsIHsNCgkJbGF5b3V0OiAnZG9jJywNCgkJdGl0bGU6ICdDbGFpbWVyIGRvY3VtZW50YXRpb24gaW5kZXgnLA0KCQlpdGVtczogaXRlbXMNCgl9KTsNCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc0RvYyhyZXEsIHJlcyl7DQoJdmFyIGNvbXBvbmVudHMgPSByZXEub3JpZ2luYWxVcmwuc3BsaXQoJy8nKTsNCgl2YXIgZmlsZU5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoY29tcG9uZW50c1syXSk7DQoJdmFyIGV4dEluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsNCgl2YXIgdGl0bGUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZXh0SW5kZXgpOw0KCXZhciBleHQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZXh0SW5kZXgpOw0KCXZhciBsYXlvdXQ7DQoJc3dpdGNoIChleHQpew0KCQljYXNlICcuaHRtJzoNCiAgICAgIGxheW91dCA9ICdkb2MnOw0KICAgICAgYnJlYWs7DQoJCWNhc2UgJy5wZGYnOg0KCQljYXNlICcubXA0JzoNCiAgICAgIGxheW91dCA9ICdiaW5hcnknOw0KICAgICAgYnJlYWs7DQoJCWRlZmF1bHQ6DQogICAgICByZXR1cm47DQoJfQ0KDQoJaWYgKGxheW91dCA9PT0gJ2JpbmFyeScpew0KCQl2YXIgb3B0aW9ucyA9IHsNCiAgICAgIHJvb3Q6IF9fZGlybmFtZSArICAnLy4uLy4uL2RvY3VtZW50YXRpb24vJywNCiAgICAgIGRvdGZpbGVzOiAnZGVueScsDQoJCX07DQoNCgkJdHJ5IHsNCiAgICAgIHJlcy5zZW5kRmlsZShmaWxlTmFtZSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikgew0KICAgICAgICBpZiAoZXJyKSB7DQogICAgICAgIAlway51dGlsLmxvZ19kZXRhaWwoJ2Vycm9yIHNlbmRpbmcgZG9jIGJpbmFyeScsIGVycik7DQogICAgICAgIH0NCiAgICAgICAgcmVzLmVuZCgpOw0KICAgICAgfSk7CQ0KCQl9DQoJCWNhdGNoIChlcnIpew0KICAgICAgcGsudXRpbC5sb2dfZGV0YWlsKCdjYXVnaHQgZXJyb3Igc2VuZGluZyBkb2MgYmluYXJ5JywgZXJyKTsgICAgICANCgkJfQ0KCX0NCgllbHNlew0KCQl2YXIgcGF0aCA9ICcuL2RvY3VtZW50YXRpb24vJyArIGZpbGVOYW1lOyANCgkJdmFyCWNvbnRlbnQgPSBway5mcy5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKTsNCg0KCQlyZXMucmVuZGVyKHZpZXdQYXRoICsgJy9kb2NDb250ZW50Jywgew0KICAgICAgbGF5b3V0OiBsYXlvdXQsDQogICAgICB0aXRsZTogdGl0bGUsDQogICAgICBjb250ZW50OiBjb250ZW50DQoJCX0pOw0KCX0NCn0NCg0KZnVuY3Rpb24gcmVnaXN0ZXJFeHRlbnNpb24ocmVxLCByZXMpew0KCXBrLnV0aWwubG9nX2RldGFpbCgnRXh0ZW5zaW9uIGhlYWRlcnMnLCByZXEuaGVhZGVycyk7DQoJaWYgKHJlcS5xdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHJlcS5xdWVyeS5icm93c2VyID09PSB1bmRlZmluZWQpew0KCQlyZXMucmVuZGVyKHZpZXdQYXRoICsgJy9leHRlbnNpb25fZG93bmxvYWRpbmcnLCB7DQogICAgICBsYXlvdXQ6ICdkb2MnDQoJCX0pOwkNCgkJcmV0dXJuOwkNCgl9DQoNCgl2YXIgZXh0ZW5zaW9uTmFtZXNwYWNlOw0KCXN3aXRjaCAocmVxLnF1ZXJ5LmJyb3dzZXIpew0KCQljYXNlICdjaHJvbWUnOg0KICAgICAgZXh0ZW5zaW9uTmFtZXNwYWNlID0gJ2Nocm9tZSc7DQogICAgICBicmVhazsNCgkJY2FzZSAnZWRnZSc6DQoJCWNhc2UgJ2ZpcmVmb3gnOg0KICAgICAgZXh0ZW5zaW9uTmFtZXNwYWNlID0gJ2Jyb3dzZXInDQogICAgICBicmVhazsNCgkJZGVmYXVsdDoNCiAgICAgIHJlcy5zZW5kKCdVbnN1cHBvcnRlZCBicm93c2VyJyk7DQogICAgICByZXMuZW5kKCk7DQogICAgICByZXR1cm47DQoJfQ0KDQoJdmFyIGV4dGVuc2lvbk5hbWUgPSAnaXRzLW91ci13ZWInOw0KCXZhciBicm93c2VyID0gcmVxLnF1ZXJ5LmJyb3dzZXI7DQoNCgl2YXIgcGF0aEhlYWQgPSBway5wYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vcGVyc29uYWxfb3AvZXh0ZW5zaW9ucy8nKTsNCgl2YXIgY29tbW9uUGF0aCA9IHBhdGhIZWFkICsgJ2NvbW1vbi8nOw0KCXZhciBicm93c2VyUGF0aCA9IHBhdGhIZWFkICsgYnJvd3NlciArICcvJw0KCXZhciBtYW5pZmVzdEZpbGUgPSAnL21hbmlmZXN0Lmpzb24nOw0KCXZhciBkZWZhdWx0SG9zdFVybFRhcmdldCA9IC9ce1x7XHtkZWZhdWx0SG9zdFVybFx9XH1cfS9nOw0KCXZhciBleHRlbnNpb25OYW1lc3BhY2VUYXJnZXQgPSAvXHtce1x7ZXh0ZW5zaW9uTmFtZXNwYWNlXH1cfVx9L2c7DQoNCgl2YXIgYmFja2dyb3VuZCA9IHBrLmZzLnJlYWRGaWxlU3luYyhjb21tb25QYXRoICsgZXh0ZW5zaW9uTmFtZSArICcvYmFja2dyb3VuZF90ZW1wbGF0ZScsICd1dGY4Jyk7DQoJdmFyIGRlZmF1bHRIb3N0VXJsID0gZ19odHRwc1NlcnZlclVybC5ocmVmLnN1YnN0cmluZygwLCBnX2h0dHBzU2VydmVyVXJsLmhyZWYubGVuZ3RoIC0gMSk7IA0KCWJhY2tncm91bmQgPSBiYWNrZ3JvdW5kLnJlcGxhY2UoZGVmYXVsdEhvc3RVcmxUYXJnZXQsIGRlZmF1bHRIb3N0VXJsKTsNCgliYWNrZ3JvdW5kID0gYmFja2dyb3VuZC5yZXBsYWNlKGV4dGVuc2lvbk5hbWVzcGFjZVRhcmdldCwgZXh0ZW5zaW9uTmFtZXNwYWNlKTsNCg0KCXZhciBjb25maWd1cmVfaW13ID0gcGsuZnMucmVhZEZpbGVTeW5jKGNvbW1vblBhdGggKyBleHRlbnNpb25OYW1lICsgJy9wb3B1cC9jb25maWd1cmVfaW13X3RlbXBsYXRlJywgJ3V0ZjgnKTsNCgljb25maWd1cmVfaW13ID0gY29uZmlndXJlX2ltdy5yZXBsYWNlKGV4dGVuc2lvbk5hbWVzcGFjZVRhcmdldCwgZXh0ZW5zaW9uTmFtZXNwYWNlKTsNCg0KCXZhciBhcmNoaXZlID0gew0KICAgICAgICBmaWxlbmFtZTogJ2NsYWltZXJfZGlkX2V4dGVuc2lvbl9mb3JfJyArIGJyb3dzZXIgKyAnLnppcCcJCQ0KCX0NCg0KCXZhciBjb250ZW50QXJyYXkgPSBbDQogICAgICAgIHsgDQogICAgICAgIAljb250ZW50OiBiYWNrZ3JvdW5kLA0KICAgICAgbmFtZTogZXh0ZW5zaW9uTmFtZSArICcvYmFja2dyb3VuZC5qcycsDQogICAgICBtb2RlOiAwNzU1LA0KICAgICAgY29tbWVudDogJ1Byb3ZpZGVzIGN1c3RvbWl6ZWQgdXJsIGZvciBleHRlbnNpb24nLA0KICAgICAgZGF0ZTogbmV3IERhdGUoKSwNCiAgICAgIHR5cGU6ICdmaWxlJyANCgkJfSwNCiAgICAgICAgeyANCiAgICAgICAgCWNvbnRlbnQ6IGNvbmZpZ3VyZV9pbXcsDQogICAgICBuYW1lOiBleHRlbnNpb25OYW1lICsgJy9wb3B1cC9jb25maWd1cmVfaW13LmpzJywNCiAgICAgIG1vZGU6IDA3NTUsDQogICAgICBjb21tZW50OiAnUHJvdmlkZXMgY3VzdG9taXplZCB1cmwgZm9yIGV4dGVuc2lvbicsDQogICAgICBkYXRlOiBuZXcgRGF0ZSgpLA0KICAgICAgdHlwZTogJ2ZpbGUnIA0KCQl9LA0KICAgICAgICB7IHBhdGg6IGNvbW1vblBhdGggKyBleHRlbnNpb25OYW1lICsgJy8nLCBuYW1lOiBleHRlbnNpb25OYW1lIH0NCiAgICBdOw0KDQogICAgdmFyIG1hbmlmZXN0UGF0aCA9IGJyb3dzZXJQYXRoICsgZXh0ZW5zaW9uTmFtZSArIG1hbmlmZXN0RmlsZTsNCiAgICBmaWxlRXhpc3RzKG1hbmlmZXN0UGF0aCkNCiAgICAudGhlbihmdW5jdGlvbihmaWxlRm91bmQpew0KICAgIAlpZiAoZmlsZUZvdW5kICE9PSBudWxsKXsNCiAgICAgIHZhciBtYW5pZmVzdEl0ZW0gPSB7IHBhdGg6IGZpbGVGb3VuZCwgbmFtZTogZXh0ZW5zaW9uTmFtZSArIG1hbmlmZXN0RmlsZSB9Ow0KICAgICAgY29udGVudEFycmF5LnB1c2gobWFuaWZlc3RJdGVtKTsgICAgICAgICAgCQkNCiAgICAJfQ0KDQogICAgCWFyY2hpdmUuZmlsZXMgPSBjb250ZW50QXJyYXk7DQoJICAgIHJlcy56aXAoYXJjaGl2ZSkNCgkgICAgLnRoZW4oZnVuY3Rpb24ob2JqKXsNCiAgICAgIHZhciB6aXBGaWxlU2l6ZUluQnl0ZXMgPSBvYmouc2l6ZTsNCiAgICAgIHZhciBpZ25vcmVkRmlsZUFycmF5ID0gb2JqLmlnbm9yZWQ7DQoJCX0pDQoJCS5jYXRjaChmdW5jdGlvbihlcnIpew0KICAgICAgY29uc29sZS5sb2coZXJyKTsJLy9pZiB6aXAgZmFpbGVkDQoJCX0pOw0KICAgIH0sIGZ1bmN0aW9uKGVycil7DQogICAgCXBrLnV0aWwubG9nX2RldGFpbCgnRXJyb3IgaW4gcmVnaXN0ZXJFeHRlbnNpb24nLCBlcnIpOw0KICAgIH0pDQp9DQoNCmZ1bmN0aW9uIGZpbGVFeGlzdHMobWFuaWZlc3RQYXRoKXsNCglyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KCSAgICBway5mcy5zdGF0KG1hbmlmZXN0UGF0aCwgKGVyciwgc3RhdHMpID0-IHsNCgkgICAgICAgIGlmIChlcnIpew0KCSAgICAgICAgCWlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpew0KCQkgICAgICAgICAgICByZWplY3QoJ3VuZXhwZWN0ZWQgZXJyb3IgY2hlY2tpbmcgZXhpc3RhbmNlIG9mICcgKyBwYXRoKTsNCgkgICAgCSAgICAgICAgcmV0dXJuOw0KCSAgICAgICAgCX0NCgkgICAgICAgIAllbHNlew0KCSAgICAgICAgCQlyZXNvbHZlKG51bGwpOw0KCSAgICAgICAgCX0NCgkgICAgICAgIH0NCgkgICAgICAgIGVsc2V7DQoJICAgICAgICAJcmVzb2x2ZShtYW5pZmVzdFBhdGgpOw0KCSAgICAgICAgfQ0KCSAgICB9KTsgDQoJfSk7DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NDYXJkSW1hZ2UocmVxLCByZXMpew0KCXJlcy5yZW5kZXIodmlld1BhdGggKyAnL2NhcmRJbWFnZScsIHsNCgkJbGF5b3V0OiAnbWFpbl9wZXJzb25hbCcNCgl9KTsNCn0NCg0KZnVuY3Rpb24gZmV0Y2htX2lkcE1ldGFkYXRhKHJlcSwgcmVzKXsNCgkgIHZhciBvcHRpb25zID0gew0KCSAgCSAgcHJvdG9jb2w6IGdfaHR0cHNTZXJ2ZXJVcmwucHJvdG9jb2wsDQoJICAgICAgaG9zdDogZ19odHRwc1NlcnZlclVybC5ob3N0bmFtZSwNCgkgICAgICBwb3J0OiBnX2h0dHBzU2VydmVyVXJsLnBvcnQsDQoJICAgICAgcGF0aDogJy8nICsgY29udGVudE1vZHVsZU5hbWUgKyAnLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJywNCgkgICAgICBtZXRob2Q6ICdHRVQnLA0KCSAgICAgIGhlYWRlcnM6IHsNCgkgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywNCgkgICAgICB9DQoJICB9Ow0KDQoJICBnZXRKc29uSHR0cERhdGEob3B0aW9ucywgaGFuZGxlTWV0YWRhdGEsIHJlcSwgcmVzKTsNCn0NCg0KZnVuY3Rpb24gZ2V0SnNvbkh0dHBEYXRhKG9wdGlvbnMsIGNhbGxiYWNrLCByZXEsIHJlcyl7DQoJdmFyIGZ1bmM7DQoJaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwczonKXsNCgkJZnVuYyA9IHBrLmh0dHBzLnJlcXVlc3Q7IA0KCX0NCgllbHNlIHsNCgkJZnVuYyA9IHBrLmh0dHAucmVxdWVzdDsNCgl9DQoNCgl2YXIgcG9zdF9yZXEgPSBmdW5jKG9wdGlvbnMsIGZ1bmN0aW9uKHBvc3RfcmVzKSB7DQoJCXBvc3RfcmVzLnNldEVuY29kaW5nKCd