oidc-lib
Version:
A library for creating OIDC Service Providers
1 lines • 1.1 MB
JSON
{"issuer":"ohip_smarthealthcard","oidc_lib_version":"^2.8.0","code":{"ohip_smarthealthcard.js":"DQptb2R1bGUuZXhwb3J0cyA9IHsNCglyZWdpc3RlckVuZHBvaW50czogcmVnaXN0ZXJFbmRwb2ludHMsDQoJaW52b2tlQXV0aFVzZXJBZ2VudDogaW52b2tlQXV0aFVzZXJBZ2VudCwNCglpbnZva2VDb25zZW50VXNlckFnZW50OiBpbnZva2VDb25zZW50VXNlckFnZW50LA0KCWdlbmVyYXRlQ3JlZGVudGlhbFJlc3BvbnNlOiBnZW5lcmF0ZUNyZWRlbnRpYWxSZXNwb25zZQ0KfQ0KDQpjb25zdCBkZWJ1Z2dpbmdfY3JlZGVudGlhbF9pc3N1ZXIgPSBmYWxzZTsNCmNvbnN0IGNvbnRlbnRNb2R1bGVOYW1lID0gJ29oaXBfc21hcnRoZWFsdGhjYXJkJzsNCmNvbnN0IGFwcGxpY2F0aW9uUGF0aCA9ICIvIiArIGNvbnRlbnRNb2R1bGVOYW1lOw0KY29uc3QgY2lVSVJlc3VsdCA9IGFwcGxpY2F0aW9uUGF0aCArICcvY2lVSVJlc3VsdCc7DQpjb25zdCBjaVN1Ym1pdEZpbGVSZXN1bHQgPSBhcHBsaWNhdGlvblBhdGggKyAnL2NpU3VibWl0RmlsZVJlc3VsdCc7DQoNCnZhciBwayA9IG51bGw7DQp2YXIgY2k7DQp2YXIgdmlld1BhdGg7DQp2YXIgZGJJbmZvOw0KdmFyIGNsaWVudF9hcGlfdXJsOw0KDQphc3luYyBmdW5jdGlvbiByZWdpc3RlckVuZHBvaW50cyhwa1NvdXJjZSkgew0KCXRyeXsNCgkJcGsgPSBwa1NvdXJjZTsNCg0KCQkvLyBzZXQgdXAgdGhlIGNsYWltcyBpc3N1ZXINCgkJdmlld1BhdGggPSBway5wYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgY29udGVudE1vZHVsZU5hbWUsICd2aWV3cycpOyANCgkJY2kgPSBway5pc3N1ZXIuaW5pdChwaywgY29udGVudE1vZHVsZU5hbWUsIGRlYnVnZ2luZ19jcmVkZW50aWFsX2lzc3Vlcik7DQoJCWNpLnJlZ2lzdGVyQXBpKHsNCgkJCWdldF9jbGFpbXM6IGNsYWltSXNzdWVyR2V0Q2xhaW1zLA0KCQkJcmVnaXN0ZXJfd2l0aF9iYWNrZW5kOiByZWdpc3Rlcl93aXRoX2JhY2tlbmQNCgkJfSk7DQoJCQ0KCQlkYkluZm8gPSBway5kYnNbY29udGVudE1vZHVsZU5hbWVdOw0KDQoJCS8vIFRoZSBjcmVkZW50aWFsIGlzc3VlciBhcHBsaWNhdGlvbiBwYWdlDQoJCXBrLmFwcC5vcHRpb25zKGFwcGxpY2F0aW9uUGF0aCwgcGsuY29ycygpKTsNCgkJcGsuYXBwLmdldChhcHBsaWNhdGlvblBhdGgsIHBrLnV0aWwuY29yc09wdGlvbnMoKSwgZnVuY3Rpb24ocmVxLCByZXMpew0KCQkJc3RhcnRBcHBsaWNhdGlvbihyZXEsIHJlcyk7DQoJCX0pOw0KDQoJCS8vIFRoZSBlbmRwb2ludCB0byB3aGljaCB0aGUgY3JlZGVudGlhbCBpc3N1ZXIncyBVSSBwb3N0cw0KCQkvLyB0aGUgcmVzdWx0cyBvZiB0aGUgdXNlciBpbnRlcmFjdGlvbg0KCQlway5hcHAub3B0aW9ucyhjaVVJUmVzdWx0LCBway5jb3JzKCkpOw0KCQlway5hcHAucG9zdChjaVVJUmVzdWx0LCBway51dGlsLmNvcnNPcHRpb25zKCksIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJCXByb2Nlc3NDcmVkZW50aWFsSXNzdWVyVUlSZXN1bHQocmVxLCByZXMpOw0KCQl9KTsNCgkJcGsuYXBwLmdldChjaVVJUmVzdWx0LCBway51dGlsLmNvcnNPcHRpb25zKCksIGZ1bmN0aW9uKHJlcSwgcmVzKXsNCgkJCXByb2Nlc3NDcmVkZW50aWFsSXNzdWVyVUlSZXN1bHQocmVxLCByZXMpOw0KCQl9KTsNCg0KCQkvLyBUaGUgZW5kcG9pbnQgdG8gd2hpY2ggdGhlIGNyZWRlbnRpYWwgaXNzdWVyJ3MgVUkgcG9zdHMNCgkJLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHVzZXIgaW50ZXJhY3Rpb24NCgkJcGsuYXBwLm9wdGlvbnMoY2lTdWJtaXRGaWxlUmVzdWx0LCBway5jb3JzKCkpOw0KCQlway5hcHAucG9zdChjaVN1Ym1pdEZpbGVSZXN1bHQsIHBrLnV0aWwuY29yc09wdGlvbnMoKSwgZnVuY3Rpb24ocmVxLCByZXMpew0KCQkJcHJvY2Vzc1N1Ym1pdEZpbGVVSVJlc3VsdChyZXEsIHJlcyk7DQoJCX0pOw0KCQlway5hcHAuZ2V0KGNpU3VibWl0RmlsZVJlc3VsdCwgcGsudXRpbC5jb3JzT3B0aW9ucygpLCBmdW5jdGlvbihyZXEsIHJlcyl7DQoJCQlwcm9jZXNzU3VibWl0RmlsZVVJUmVzdWx0KHJlcSwgcmVzKTsNCgkJfSk7DQoJfQ0KCWNhdGNoKGVycil7DQoJCWNvbnNvbGUubG9nKHBvc3NpYmxlRXJyb3IpOw0KCQljb25zb2xlLmxvZyhlcnIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gc3RhcnRBcHBsaWNhdGlvbihyZXEsIHJlcykgew0KCWNpLmRlZmF1bHRBcHBsaWNhdGlvbihyZXEsIHJlcywgY29udGVudE1vZHVsZU5hbWUsICdzdGFydF9hcHBsaWNhdGlvbicpOw0KfQ0KDQpmdW5jdGlvbiBwcmVzZW50Q3JlZGVudGlhbElzc3VlclVJKHJlcSwgcmVzLCBzdGF0ZU9iail7DQoJcmVzLnNldCAoew0KCQknQ2FjaGUtQ29udHJvbCc6ICduby1zdG9yZScsDQoJCSdQcmFnbWEnOiAnbm8tY2FjaGUnDQoJfSk7DQoNCgl2YXIgc3RhdGVPYmpCNjQgPSBway5iYXNlNjR1cmwuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHN0YXRlT2JqKSk7DQoJcGsubm9uY2VDYWNoZS5zZXQoc3RhdGVPYmouc3ViLCBzdGF0ZU9iakI2NCk7DQoNCgl2YXIgdGFyZ2V0X2xpbmtfdXJpID0gY2lVSVJlc3VsdCANCgkJKyBway51dGlsLmNyZWF0ZVBhcmFtZXRlclN0cmluZyh7c3RhdGVPYmpCNjRTdWI6IHN0YXRlT2JqLnN1Yn0sIHRydWUpOw0KDQogICAgcmVzLnJlbmRlcihway5wYXRoLmpvaW4odmlld1BhdGgsICdpc3N1ZXJVSScpLCB7DQogICAgCWxheW91dDogJ21haW5fYm9vdHN0cmFwJywNCiAgICAJY2xpZW50OiBjb250ZW50TW9kdWxlTmFtZSwNCiAgICAJdGFyZ2V0X2xpbmtfdXJpOiB0YXJnZXRfbGlua191cmkNCiAgICB9KTsNCn0NCg0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NyZWRlbnRpYWxJc3N1ZXJVSVJlc3VsdChyZXEsIHJlcyl7DQoJdmFyIHN0YXRlT2JqOw0KCWlmIChyZXEucXVlcnkuc3RhdGVPYmpCNjRTdWIpew0KCQl2YXIgc3RhdGVPYmpCNjQgPSBway5ub25jZUNhY2hlLmdldChyZXEucXVlcnkuc3RhdGVPYmpCNjRTdWIpOw0KCQlzdGF0ZU9iaiA9IEpTT04ucGFyc2UocGsuYmFzZTY0dXJsLmRlY29kZShzdGF0ZU9iakI2NCkpOw0KCX0NCg0KCWlmIChzdGF0ZU9iaiA9PT0gdW5kZWZpbmVkKXsNCgkJLy8gVE9ETyBjaGFuZ2UgdG8gdXNlciBtZXNzYWdlDQoJCXRocm93ICd2ZXJpZmllcjogRXJyb3IgcmV0cmlldmluZyBzdGF0ZU9iaic7DQoJfQ0KDQoJdmFyIHZhbGlkX3Byb3ZlbmFuY2VzID0gc3RhdGVPYmouY29uZmlnLnZhbGlkX3Byb3ZlbmFuY2VzOw0KCWlmICghdmFsaWRfcHJvdmVuYW5jZXMpew0KCQl2YWxpZF9wcm92ZW5hbmNlcyA9ICcnOw0KCX0NCg0KCXZhciBhY2NvdW50SW5mbyA9IHt9Ow0KCWlmIChzdGF0ZU9iai5jb25maWcuaW5wdXRfY3JlZGVudGlhbF90eXBlKXsNCgkJdmFyIGlkX3Rva2VuOw0KCQl2YXIgaWRUb2tlblN0cmluZyA9IHJlcS5ib2R5LmlkX3Rva2VuOw0KCQlpZiAoaWRUb2tlblN0cmluZyl7DQoJCQlpZF90b2tlbiA9IEpTT04ucGFyc2UoaWRUb2tlblN0cmluZyk7DQoJCX0NCg0KCQlpZiAoaWRfdG9rZW4gPT09IHVuZGVmaW5lZCl7DQoJCQlyZXMucmVuZGVyKHBrLnBhdGguam9pbih2aWV3UGF0aCwgJ2lzc3VlclVJRXJyb3InKSwgew0KCQkJCWxheW91dDogJ21haW5fYm9vdHN0cmFwJywNCgkJCQljb25maWc6IHN0YXRlT2JqLmNvbmZpZw0KCQkJfSk7CQkNCgkJCXJldHVybjsNCgkJfQ0KDQoJCXZhciB2YzsNCgkJaWYgKGlkX3Rva2VuLnByZXNlbnRlZFZjcyl7DQoJCQlpZiAoaWRfdG9rZW4ucHJlc2VudGVkVmNzLmxlbmd0aCA-IDApew0KCQkJCXZhciBwcmVzZW50ZWRWYyA9IGlkX3Rva2VuLnByZXNlbnRlZFZjc1swXTsNCgkJCQl2YyA9IHByZXNlbnRlZFZjLnZjOw0KCQkJfQ0KCQl9DQoJCWlmICh2YyA9PT0gdW5kZWZpbmVkKXsNCgkJCXRocm93ICdwcm9jZXNzQ3JlZGVudGlhbElzc3VlclVJUmVzdWx0OiB2YyBub3QgcHJlc2VudCc7CQkJCQ0KCQl9DQoNCgkJYWNjb3VudEluZm8gPSB2Yy5jcmVkZW50aWFsU3ViamVjdDsNCgkJaWYgKGFjY291bnRJbmZvID09PSB1bmRlZmluZWQpew0KCQkJdGhyb3cgJ3Byb2Nlc3NDcmVkZW50aWFsSXNzdWVyVUlSZXN1bHQ6IGNyZWRlbnRpYWxTdWJqZWN0IG5vdCBwcmVzZW50JzsNCgkJfQ0KCX0NCgkNCgl2YXIgcHJvdmVuYW5jZV92ZXJpZmllZCA9IGZhbHNlOw0KCXZhciBjbGFpbXNQYXJhbSA9IHN0YXRlT2JqLnBhcmFtcy5jbGFpbXM7DQoJdmFyIHNoY190ZXh0Ow0KCXZhciBzY2g7DQoJaWYgKGNsYWltc1BhcmFtKXsNCgkJdmFyIGNsYWltc09iaiA9IEpTT04ucGFyc2UoY2xhaW1zUGFyYW0pOw0KCQlpZiAoY2xhaW1zT2JqICYmIGNsYWltc09iai5pZF90b2tlbiAmJiBjbGFpbXNPYmouaWRfdG9rZW4uc2hjICYmIGNsYWltc09iai5pZF90b2tlbi5zaGMudmFsdWUpew0KCQkJc2hjID0gY2xhaW1zT2JqLmlkX3Rva2VuLnNoYy52YWx1ZTsNCgkJCXZhciBzaGNfbWFwID0gc21hcnRIZWFsdGhDYXJkX3NoY19tYXAoc2hjKTsNCgkJCWlmIChzaGNfbWFwLm51bV9jaHVua3Mpew0KCQkJCXZhciB2YWw7DQoJCQkJc3RyID0gJyc7DQoJCQkJZm9yICh2YXIgaT0wOyBpIDwgc2hjX21hcC5udW1lcmljLmxlbmd0aDsgaSsrKXsNCgkJCQkJdmFyIHZhbCA9ICgoc2hjX21hcC5udW1lcmljLmNoYXJDb2RlQXQoaSsrKSAtIDQ4KSAqIDEwKSArIHNoY19tYXAubnVtZXJpYy5jaGFyQ29kZUF0KGkpIC0gMzsNCgkJCQkJc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodmFsKTsNCgkJCQl9DQoJCQkJc2hjID0gew0KCQkJCQl2ZXJpZmlhYmxlQ3JlZGVudGlhbDogWyBzdHIgXQ0KCQkJCX07DQoJCQl9DQoJCQllbHNlIGlmICh0eXBlb2Ygc2hjID09PSAnc3RyaW5nJyAmJiBzaGMuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSl7DQoJCQkJdmFyIHVybCA9IG5ldyBVUkwoc2hjKTsNCgkJCQl2YXIgcHJvdmVuYW5jZSA9ICdodHRwczovLycgKyB1cmwuaG9zdDsNCg0KCQkJCWlmICh2YWxpZF9wcm92ZW5hbmNlcy5pbmNsdWRlcyhwcm92ZW5hbmNlKSl7DQoJCQkJCXByb3ZlbmFuY2VfdmVyaWZpZWQgPSB0cnVlOw0KCQkJCX0NCg0KCQkJCXZhciBvcHRpb25zID0gew0KCQkJCQl1cmw6IHNoYywNCgkJCQkJbWV0aG9kOiAnR0VUJywNCgkJCQkgICAgaGVhZGVyczogWyB7IG5hbWU6ICdBY2NlcHQnLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0gXSwNCgkJCQkgICAgcGFyc2VKc29uUmVzcG9uc2U6IHRydWUNCgkJCQl9DQoJCQkJdmFyIHNoYyA9IGF3YWl0IHBrLnV0aWwuanNvbkh0dHBEYXRhKG9wdGlvbnMpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJdmFyIHBhdGllbnRJbmZvOw0KCWlmIChzaGMpew0KCQlpZiAoIXNoYy52ZXJpZmlhYmxlQ3JlZGVudGlhbCB8fCAhc2hjLnZlcmlmaWFibGVDcmVkZW50aWFsWzBdKXsNCgkJCXRocm93ICgnTm8gdmVyaWZpYWJsZUNyZWRlbnRpYWwgaW4gc21hcnRIZWFsdGhDYXJkX2dldCcpOw0KCQl9DQoNCgkJdmFyIGNvbXBzID0gc2hjLnZlcmlmaWFibGVDcmVkZW50aWFsWzBdLnNwbGl0KCcuJyk7DQoJCXZhciBwYXlsb2FkQnVmID0gcGsuYmFzZTY0dXJsLnRvQnVmZmVyKGNvbXBzWzFdKTsNCgkJdmFyIGluZmxhdGVkID0gcGsuemxpYi5pbmZsYXRlUmF3U3luYyhwYXlsb2FkQnVmKS50b1N0cmluZygpOw0KCQl2YXIgcGF5bG9hZCA9IEpTT04ucGFyc2UoaW5mbGF0ZWQpOw0KDQogICAgICAgIHZhciBpc3MgPSBhd2FpdCBway5KU09OUGF0aCh7anNvbjogcGF5bG9hZCwgcGF0aDogIiQuaXNzIn0pOw0KICAgICAgICB2YXIgZW50cmllcyA9IGF3YWl0IHBrLkpTT05QYXRoKHtqc29uOiBwYXlsb2FkLCBwYXRoOiAiJC52Yy5jcmVkZW50aWFsU3ViamVjdC5maGlyQnVuZGxlLmVudHJ5WypdIn0pOw0KICAgICAgICB2YXIgb2JqLCBwYXRpZW50UmVzb3VyY2UsIHBhdGllbnRVcmw7DQogICAgICAgIGZvciAodmFyIGk9MDsgaSA8IGVudHJpZXMubGVuZ3RoO2krKyl7DQogICAgICAgICAgICBvYmogPSBlbnRyaWVzW2ldOw0KICAgICAgICAgICAgaWYgKG9iai5yZXNvdXJjZS5yZXNvdXJjZVR5cGUgPT09ICdQYXRpZW50Jyl7DQogICAgICAgICAgICAgICAgcGF0aWVudFJlc291cmNlID0gb2JqLnJlc291cmNlOw0KICAgICAgICAgICAgICAgIHBhdGllbnRVcmwgPSBvYmouZnVsbFVybDsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghcGF0aWVudFJlc291cmNlIHx8ICFwYXRpZW50VXJsKXsNCiAgICAgICAgICAgIHRocm93ICgnRmhpciBoYXMgbm8gUGF0aWVudCByZXNvdXJjZScpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGdpdmVuQXJyID0gcGF0aWVudFJlc291cmNlLm5hbWVbMF0uZ2l2ZW47DQogICAgICAgIHZhciBnaXZlbl9uYW1lID0gZ2l2ZW5BcnJbMF0gKyAoZ2l2ZW5BcnJbMV0gPyAnICcgKyBnaXZlbkFyclsxXSA6ICcnKTsNCiAgICAgICAgcGF0aWVudEluZm8gPSB7DQogICAgICAgIAlwcm92ZW5hbmNlX3ZlcmlmaWVkOiBwcm92ZW5hbmNlX3ZlcmlmaWVkLA0KICAgICAgICAJaXNzOiBpc3MsDQogICAgICAgICAgICB1cmw6IHBhdGllbnRVcmwsDQogICAgICAgICAgICBiaXJ0aERhdGU6IHBhdGllbnRSZXNvdXJjZS5iaXJ0aERhdGUsDQogICAgICAgICAgICBmYW1pbHk6IHBhdGllbnRSZXNvdXJjZS5uYW1lWzBdLmZhbWlseSwNCiAgICAgICAgICAgIGdpdmVuX25hbWU6IGdpdmVuX25hbWUsDQogICAgICAgICAgICBpbW11bml6YXRpb25zOiBbXQ0KICAgICAgICB9DQoNCiAgICAgICAgYWNjb3VudEluZm8uc2hjID0gc2hjOw0KICAgICAgICBhY2NvdW50SW5mby5maXJzdE5hbWUgPSBwYXRpZW50SW5mby5naXZlbl9uYW1lOw0KICAgICAgICBhY2NvdW50SW5mby5sYXN0TmFtZSA9IHBhdGllbnRJbmZvLmZhbWlseTsNCiAgICAgICAgYWNjb3VudEluZm8ucHJvdmVuYW5jZV92ZXJpZmllZCA9IHBhdGllbnRJbmZvLnByb3ZlbmFuY2VfdmVyaWZpZWQ7DQoJfQ0KDQoJYXdhaXQgcmVnaXN0ZXJfd2l0aF9iYWNrZW5kKHN0YXRlT2JqLCBhY2NvdW50SW5mbyk7DQoNCgl2YXIgYW5jaWxsYXJ5Q2xhaW1zID0gew0KCQluYW1lT25DYXJkOiBwYXRpZW50SW5mby5naXZlbl9uYW1lICsgJyAnICsgcGF0aWVudEluZm8uZmFtaWx5DQoJfQ0KDQoJYXdhaXQgY2kuZXhlY3V0ZUJhc2ljQWRjUmVxdWVzdChyZXEsIHJlcywgc3RhdGVPYmosIGFuY2lsbGFyeUNsYWltcyk7DQp9DQoNCmZ1bmN0aW9uIHByZXNlbnRTdWJtaXRGaWxlVUkocmVxLCByZXMsIHN0YXRlT2JqKXsNCglyZXMuc2V0ICh7DQoJCSdDYWNoZS1Db250cm9sJzogJ25vLXN0b3JlJywNCgkJJ1ByYWdtYSc6ICduby1jYWNoZScNCgl9KTsNCg0KCXZhciBzdGF0ZU9iakI2NCA9IHBrLmJhc2U2NHVybC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3RhdGVPYmopKTsNCglway5ub25jZUNhY2hlLnNldChzdGF0ZU9iai5zdWIsIHN0YXRlT2JqQjY0KTsNCg0KCXZhciB0YXJnZXRfbGlua191cmkgPSBjaVN1Ym1pdEZpbGVSZXN1bHQgDQoJCSsgcGsudXRpbC5jcmVhdGVQYXJhbWV0ZXJTdHJpbmcoe3N0YXRlT2JqQjY0U3ViOiBzdGF0ZU9iai5zdWJ9LCBmYWxzZSk7DQoNCgl2YXIgaXNzOw0KCXZhciBhcHBfaW5zdGFuY2UgPSB7DQoJCXRhcmdldF9saW5rX3VyaTogdGFyZ2V0X2xpbmtfdXJpLA0KCQl3YWxsZXRfZXJyb3JfdXJsOiB0YXJnZXRfbGlua191cmkJDQoJfQ0KDQogICAgcmVzLnJlbmRlcihway5wYXRoLmpvaW4odmlld1BhdGgsICdzdWJtaXRGaWxlVUknKSwgew0KICAgIAlsYXlvdXQ6ICdtYWluX2Jvb3RzdHJhcCcsDQogICAgCS8vIGFwcF9jb25maWc6IGFwcF9jb25maWcsDQogICAgCS8vIGFwcF9pbnN0YW5jZV9wYXJhbXM6IEpTT04uc3RyaW5naWZ5KGFwcF9pbnN0YW5jZSksDQogICAgCWFwcF9jb25maWdfcGFyYW1zOiBKU09OLnN0cmluZ2lmeShhcHBfY29uZmlnKSwNCiAgICAJc3RhdGVPYmpCNjRTdWI6IHN0YXRlT2JqLnN1YiwNCiAgICAJY2xhaW1zOiBzdGF0ZU9iai5wYXJhbXMuY2xhaW1zDQogICAgfSk7DQp9DQoNCmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTdWJtaXRGaWxlVUlSZXN1bHQocmVxLCByZXMpew0KCXZhciBzdGF0ZU9iajsNCglpZiAocmVxLmJvZHkuc3RhdGVPYmpCNjRTdWIpew0KCQl2YXIgc3RhdGVPYmpCNjQgPSBway5ub25jZUNhY2hlLmdldChyZXEuYm9keS5zdGF0ZU9iakI2NFN1Yik7DQoJCXN0YXRlT2JqID0gSlNPTi5wYXJzZShway5iYXNlNjR1cmwuZGVjb2RlKHN0YXRlT2JqQjY0KSk7DQoJfQ0KDQoJaWYgKHN0YXRlT2JqID09PSB1bmRlZmluZWQpew0KCQkvLyBUT0RPIGNoYW5nZSB0byB1c2VyIG1lc3NhZ2UNCgkJdGhyb3cgJ3ZlcmlmaWVyOiBFcnJvciByZXRyaWV2aW5nIHN0YXRlT2JqJzsNCgl9DQoNCgl2YXIgY3JlZGVudGlhbFN1YmplY3QgPSB7DQoJCXNtYXJ0SGVhbHRoQ2FyZDogcmVxLmJvZHkuc21hcnRIZWFsdGhDYXJkLA0KCQlwYXRpZW50SW5mbzogcmVxLmJvZHkucGF0aWVudEluZm8NCgl9Ow0KDQoJYXdhaXQgcmVnaXN0ZXJfd2l0aF9iYWNrZW5kKHN0YXRlT2JqLCBjcmVkZW50aWFsU3ViamVjdCk7DQoNCglhd2FpdCBjaS5leGVjdXRlQmFzaWNBZGNSZXF1ZXN0KHJlcSwgcmVzLCBzdGF0ZU9iaiwgY3JlZGVudGlhbFN1YmplY3QpOw0KfQ0KDQphc3luYyBmdW5jdGlvbiBpbnZva2VBdXRoVXNlckFnZW50KHJlcSwgcmVzLCBwYXJhbXMsIGVuY29kZWRfc3RzX3N0YXRlX2J1bmRsZSwgYWNjZXNzX3Rva2VuKXsNCgl2YXIgc3RhdGVPYmogPSBhd2FpdCBjaS5pbnZva2VBdXRoVXNlckFnZW50KHJlcSwgcmVzLCBwYXJhbXMsIGVuY29kZWRfc3RzX3N0YXRlX2J1bmRsZSwgYWNjZXNzX3Rva2VuKTsNCglpZiAoc3RhdGVPYmouY29uZmlnLmluc3RydWN0aW9ucyA9PT0gInVudmVyaWZpZWQiKXsNCgkJcHJlc2VudFN1Ym1pdEZpbGVVSShyZXEsIHJlcywgc3RhdGVPYmopOw0KCX0NCgllbHNlew0KCQlwcmVzZW50Q3JlZGVudGlhbElzc3VlclVJKHJlcSwgcmVzLCBzdGF0ZU9iaik7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBnZW5lcmF0ZUNyZWRlbnRpYWxSZXNwb25zZShyZXMsIHBhcmFtcywgY29uc2VudEluZm8sIGNvbnRlbnRfbW9kdWxlX3N0YXRlKXsNCgljaS5nZW5lcmF0ZUNyZWRlbnRpYWxSZXNwb25zZShyZXMsIHBhcmFtcywgY29uc2VudEluZm8sIGNvbnRlbnRfbW9kdWxlX3N0YXRlKTsNCn0NCg0KZnVuY3Rpb24gaW52b2tlQ29uc2VudFVzZXJBZ2VudChyZXMsIHNjb3BlSW5mbywgcmVnaXN0cmF0aW9uSW5mbywgZW5jb2RlZF9zdHNfc3RhdGVfYnVuZGxlLCBjb250ZW50X21vZHVsZV9zdGF0ZSkgew0KCWNpLmludm9rZUNvbnNlbnRVc2VyQWdlbnQocmVzLCBzY29wZUluZm8sIHJlZ2lzdHJhdGlvbkluZm8sIGVuY29kZWRfc3RzX3N0YXRlX2J1bmRsZSwgY29udGVudF9tb2R1bGVfc3RhdGUpOw0KfQ0KDQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KYXN5bmMgZnVuY3Rpb24gY2xhaW1Jc3N1ZXJHZXRDbGFpbXMoc3RhdGVPYmopew0KCXZhciBhY2NvdW50SW5mbzsNCgl2YXIgcmV0VmFsOw0KCXRyeXsNCgkJYWNjb3VudEluZm8gPSBhd2FpdCBkYkluZm8ucHJvdmlkZXIuZ2V0RG9jdW1lbnQoDQoJCQlkYkluZm8sICdhY2NvdW50cycsIHN0YXRlT2JqLnN1Yik7DQoJfQ0KCWNhdGNoKGVycil7DQoJCWlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpew0KCQkJYWNjb3VudEluZm8gPSB7fTsNCgkJfQ0KCQllbHNlew0KCQkJdGhyb3coZXJyKTsNCgkJfQ0KCX0NCg0KCXZhciBjcmVkZW50aWFsU3ViamVjdCA9IHsNCgkJc21hcnRIZWFsdGhDYXJkOiBhY2NvdW50SW5mby5zaGMudmVyaWZpYWJsZUNyZWRlbnRpYWwsDQoJCWxhc3ROYW1lOiBhY2NvdW50SW5mby5sYXN0TmFtZSwNCgkJZmlyc3ROYW1lOiBhY2NvdW50SW5mby5maXJzdE5hbWUsDQoJCXByb3ZlbmFuY2VfdmVyaWZpZWQ6IGFjY291bnRJbmZvLnByb3ZlbmFuY2VfdmVyaWZpZWQNCgl9DQoNCgl2YXIgcmV0VmFsID0gew0KCQljcmVkZW50aWFsU3ViamVjdA0KCX0NCg0KCXJldHVybiByZXRWYWw7DQp9DQoNCmFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyX3dpdGhfYmFja2VuZChzdGF0ZU9iaiwgcGFyYW1zKXsNCgl0cnl7DQoNCgkJdmFyIGFjY291bnRJbmZvOw0KCQl0cnl7DQoJCQlhY2NvdW50SW5mbyA9IGF3YWl0IGRiSW5mby5wcm92aWRlci5nZXREb2N1bWVudCgNCgkJCQlkYkluZm8sICdhY2NvdW50cycsIHN0YXRlT2JqLnN1Yik7DQoJCX0NCgkJY2F0Y2goZXJyKXsNCgkJCWlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpew0KCQkJCXRocm93KGVycik7DQoJCQl9DQoJCX0NCg0KCQl2YXIgYmFja2VuZF9pZDsNCgkJaWYgKCFhY2NvdW50SW5mbyB8fCAhYWNjb3VudEluZm8uYmFja2VuZF9pZCl7DQoJCQliYWNrZW5kX2lkID0gYXdhaXQgcGsuc2ltcGxlX2NyeXB0by5yYW5kb21TdHJpbmcoKTsNCgkJfQ0KDQoJCXZhciBhY2NvdW50SW5mbyA9IHsNCgkJCWlkOiBzdGF0ZU9iai5zdWIsDQoJCQloZWFsdGhOdW1iZXI6IHBhcmFtcy5oZWFsdGhOdW1iZXIsDQoJCQliYWNrZW5kX2lkOiBiYWNrZW5kX2lkLA0KCQkJdmVyc2lvbk51bWJlcjogcGFyYW1zLnZlcnNpb25OdW1iZXIsDQoJCQlkYXRlT2ZCaXJ0aDogcGFyYW1zLmRhdGVPZkJpcnRoLA0KCQkJZmlyc3ROYW1lOiBwYXJhbXMuZmlyc3ROYW1lLA0KCQkJbGFzdE5hbWU6IHBhcmFtcy5sYXN0TmFtZSwNCgkJCXBvc3RhbENvZGU6IHBhcmFtcy5wb3N0YWxDb2RlLA0KCQkJY29kZTogcGFyYW1zLmNvZGUsDQoJCQltb2JpbGVQaG9uZU51bWJlcjogcGFyYW1zLm1vYmlsZVBob25lTnVtYmVyLA0KCQkJc2hjOiBwYXJhbXMuc2hjLA0KCQkJcHJvdmVuYW5jZV92ZXJpZmllZDogcGFyYW1zLnByb3ZlbmFuY2VfdmVyaWZpZWQNCgkJfQ0KDQoJCXRyeXsNCgkJCWFjY291bnRJbmZvID0gYXdhaXQgZGJJbmZvLnByb3ZpZGVyLmNyZWF0ZU9yVXBkYXRlRG9jdW1lbnQoDQoJCQkJZGJJbmZvLCAnYWNjb3VudHMnLCBhY2NvdW50SW5mbyk7DQoJCX0NCgkJY2F0Y2goZXJyKXsNCgkJCXBrLnV0aWwuZXJyb3IoJ3JlZ2lzdGVyX3dpdGhfYmFja2VuZCcsICdFcnJvciB3cml0aW5nIHRvIGFjY291bnRzJywgZXJyKTsNCgkJCXRocm93KGVycik7DQoJCX0NCg0KCQlyZXR1cm4gYWNjb3VudEluZm87DQoJfQ0KCWNhdGNoKGVycil7DQoJCXJldHVybih7DQoJCQllcnJvcjogZXJyDQoJCX0pDQoJfQ0KfQ0KDQpmdW5jdGlvbiBzbWFydEhlYWx0aENhcmRfZ2V0KHN0YXRlT2JqLCBwYXJhbXMpew0KCWlmICghcGFyYW1zLnNoYyl7DQoJCXRocm93ICgnTm8gc2hjIGluIHNtYXJ0SGVhbHRoQ2FyZF9nZXQnKTsNCgl9DQoNCgkvLyBoYW5kbGUgcmV0cmlldmluZyBvZiBzbWFydGhlYWx0aGNhcmQgZnJvbSBVUkwNCg0KCXJldHVybiBwYXJhbXMuc2hjOyANCn0NCg0KZnVuY3Rpb24gc21hcnRIZWFsdGhDYXJkX3NoY19tYXAocXJfZW5jb2Rpbmcpew0KCXZhciByZWdleCA9IC9zaGM6XC8oKD86XGRcL1xkXC8pfCkoXGQqKS9nOw0KCXZhciBzaGNfbWFwID0ge307DQoJdmFyIGdyb3VwcyA9IHJlZ2V4LmV4ZWMocXJfZW5jb2RpbmcpOw0KCWlmIChncm91cHMpew0KCQlpZiAoZ3JvdXBzWzJdKXsNCgkJCXNoY19tYXAubnVtZXJpYyA9IGdyb3Vwc1syXTsNCgkJfQ0KDQoJCWlmIChncm91cHNbMV0pew0KCQkJcmVnZXgxID0gLyhcZCopXC8oXGQqKVwvL2c7DQoJCQl2YXIgc3ViZ3JvdXBzID0gcmVnZXgxLmV4ZWMoZ3JvdXBzWzFdKTsNCgkJCWlmIChzdWJncm91cHMpew0KCQkJCXNoY19tYXAuY2h1bmsgPSBzdWJncm91cHNbMV07DQoJCQkJc2hjX21hcC5udW1fY2h1bmtzID0gc3ViZ3JvdXBzWzJdOwkJCQkNCgkJCX0NCgkJfQ0KCQllbHNlIGlmIChncm91cHNbMl0pew0KCQkJc2hjX21hcC5jaHVuayA9IDE7DQoJCQlzaGNfbWFwLm51bV9jaHVua3MgPSAxOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIHNoY19tYXA7DQp9DQo","oidc_config.json":"ew0KICAiY29uZmlnIjogew0KICAgICJpc19jYXJkIjogdHJ1ZSwNCiAgICAiY2xpZW50IjogIm9oaXBfc21hcnRoZWFsdGhjYXJkIiwNCiAgICAiY2FyZF90aXRsZSI6ICJJbW11bml6YXRpb24gU3RhdHVzIiwNCiAgICAiaW50ZXJmYWNlIjogImludGVyYWN0aXZlIiwNCiAgICAiY29tcGFueV9uYW1lIjogIk9udGFyaW8gQ09WSUQgQ2FyZCBJc3N1ZXIiLA0KICAgICJpbnN0cnVjdGlvbnMiOiAibi9hIiwNCiAgICAiYWRjX21ldGhvZCI6ICJyZWFsdGltZSIsDQogICAgIm91dHB1dF9jcmVkZW50aWFsX3R5cGUiOiAiPC0tU01BUlRfQ1JFREVOVElBTF9IT1NULS0-L3NtYXJ0LWNyZWRlbnRpYWwvT0gtU21hcnRIZWFsdGhDYXJkLVByb29mIiwNCiAgICAib3V0cHV0X2NyZWRlbnRpYWxfY29udGV4dCI6ICJ1bmRlZmluZWQvdjEiLA0KICAgICJvdXRwdXRfY3JlZGVudGlhbF9kZXNjcmlwdGlvbiI6ICJDdXJyZW50IGNvdmlkIGltbXVuaXphdGlvbiBzdGF0dXMiLA0KICAgICJvdXRwdXRfY3JlZGVudGlhbF9jb2xvcnMiOiAiIzExMjIzMyAjRkZGRkZGICM4ODk5QUEiLA0KICAgICJ2YWxpZF9wcm92ZW5hbmNlcyI6IFsNCiAgICAgICJodHRwczovL2NvdmF4LmRldi5vbnRhcmlvaGVhbHRoLmNhOjE0NDMiDQogICAgXSwNCiAgICAiY2FyZF90ZXh0Ijogew0KICAgICAgIm5hbWVPbkNhcmQiOiB7DQogICAgICAgICJjc3MiOiB7DQogICAgICAgICAgInBvc2l0aW9uIjogImFic29sdXRlIiwNCiAgICAgICAgICAiYm90dG9tIjogIjU0cHgiLA0KICAgICAgICAgICJjb2xvciI6ICIjNDI1QzM4IiwNCiAgICAgICAgICAid2lkdGgiOiAiMzUwcHgiLA0KICAgICAgICAgICJ0ZXh0LWFsaWduIjogImNlbnRlciIsDQogICAgICAgICAgImZvbnQtc2l6ZSI6ICIxLjFlbSIsDQogICAgICAgICAgImZvbnQtZmFtaWx5IjogInNlcmlmIiwNCiAgICAgICAgICAiZm9udC13ZWlnaHQiOiAiYm9sZGVyIg0KICAgICAgICB9DQogICAgICB9DQogICAgfSwgICAgDQogICAgImNyZWRlbnRpYWxUVEwiOiAxNzI4MDAsDQogICAgImNsaWVudF9hcGlfdXJsIjogIjwtLUNMSUVOVF9BUEktLT4vY2xpZW50X2FwaSIsDQogICAgImRpc2FibGUtaW5wdXRfY3JlZGVudGlhbF90eXBlIjogIjwtLVNNQVJUX0NSRURFTlRJQUxfSE9TVC0tPi9zbWFydC1jcmVkZW50aWFsL09udGFyaW8tSGVhbHRoLUluc3VyYW5jZS1QbGFuIiwNCiAgICAic2NvcGUiOiAib2lkYyINCiAgfSwNCiAgImNvbGxlY3Rpb25zIjogew0KICAgICAgImFjY291bnRzIjogew0KICAgICAgICAia2V5UGF0aCI6ICJpZCINCiAgICAgIH0NCiAgfSwNCiAgImNvbmZpZ19maWxlcyI6IFsgDQogICAgIi9vaGlwX3NtYXJ0aGVhbHRoY2FyZC9vaWRjX2NvbmZpZy5qc29uIg0KICBdDQp9","data":{"display_render.js":"KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitpKyInIik7dGhyb3cgYS5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKJ3VzZSBzdHJpY3QnCgpleHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoCmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheQpleHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5Cgp2YXIgbG9va3VwID0gW10KdmFyIHJldkxvb2t1cCA9IFtdCnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXkKCnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nCmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgbG9va3VwW2ldID0gY29kZVtpXQogIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaQp9CgovLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuCi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnMKcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyCnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2MwoKZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7CiAgdmFyIGxlbiA9IGI2NC5sZW5ndGgKCiAgaWYgKGxlbiAlIDQgPiAwKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKQogIH0KCiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kCiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyCiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKQogIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuCgogIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuCiAgICA_IDAKICAgIDogNCAtICh2YWxpZExlbiAlIDQpCgogIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl0KfQoKLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhCmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkgewogIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpCiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXQogIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdCiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuCn0KCmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHsKICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW4KfQoKZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkgewogIHZhciB0bXAKICB2YXIgbGVucyA9IGdldExlbnMoYjY0KQogIHZhciB2YWxpZExlbiA9IGxlbnNbMF0KICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXQoKICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKQoKICB2YXIgY3VyQnl0ZSA9IDAKCiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFycwogIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwCiAgICA_IHZhbGlkTGVuIC0gNAogICAgOiB2YWxpZExlbgoKICB2YXIgaQogIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkgewogICAgdG1wID0KICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwKICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8CiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8CiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldCiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRgogICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4-IDgpICYgMHhGRgogICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGCiAgfQoKICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7CiAgICB0bXAgPQogICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8CiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA-PiA0KQogICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGCiAgfQoKICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7CiAgICB0bXAgPQogICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfAogICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfAogICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMikKICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA-PiA4KSAmIDB4RkYKICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRgogIH0KCiAgcmV0dXJuIGFycgp9CgpmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkgewogIHJldHVybiBsb29rdXBbbnVtID4-IDE4ICYgMHgzRl0gKwogICAgbG9va3VwW251bSA-PiAxMiAmIDB4M0ZdICsKICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsKICAgIGxvb2t1cFtudW0gJiAweDNGXQp9CgpmdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHsKICB2YXIgdG1wCiAgdmFyIG91dHB1dCA9IFtdCiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHsKICAgIHRtcCA9CiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICsKICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICsKICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpCiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSkKICB9CiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKQp9CgpmdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkgewogIHZhciB0bXAKICB2YXIgbGVuID0gdWludDgubGVuZ3RoCiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzCiAgdmFyIHBhcnRzID0gW10KICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDMKCiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlcgogIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHsKICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA_IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpCiAgfQoKICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzCiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHsKICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdCiAgICBwYXJ0cy5wdXNoKAogICAgICBsb29rdXBbdG1wID4-IDJdICsKICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArCiAgICAgICc9PScKICAgICkKICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHsKICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdCiAgICBwYXJ0cy5wdXNoKAogICAgICBsb29rdXBbdG1wID4-IDEwXSArCiAgICAgIGxvb2t1cFsodG1wID4-IDQpICYgMHgzRl0gKwogICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICsKICAgICAgJz0nCiAgICApCiAgfQoKICByZXR1cm4gcGFydHMuam9pbignJykKfQoKfSx7fV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoQnVmZmVyKXsoZnVuY3Rpb24gKCl7Ci8qIQogKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICoKICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz4KICogQGxpY2Vuc2UgIE1JVAogKi8KLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KCid1c2Ugc3RyaWN0JwoKdmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpCnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpCgpleHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlcgpleHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyCmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MAoKdmFyIEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmYKZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RICgovKioKICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDoKICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdCkKICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0CiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpCiAqCiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKywKICogT3BlcmEgMTEuNissIGlPUyA0LjIrLgogKgogKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGUKICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YAogKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0CiAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLgogKi8KQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpCgppZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHsKICBjb25zb2xlLmVycm9yKAogICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICsKICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LicKICApCn0KCmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHsKICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ_CiAgdHJ5IHsKICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKQogICAgYXJyLl9fcHJvdG9fXyA9IHsgX19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH0KICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyCiAgfSBjYXRjaCAoZSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQp9CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHsKICBlbnVtZXJhYmxlOiB0cnVlLAogIGdldDogZnVuY3Rpb24gKCkgewogICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWQKICAgIHJldHVybiB0aGlzLmJ1ZmZlcgogIH0KfSkKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAnb2Zmc2V0JywgewogIGVudW1lcmFibGU6IHRydWUsCiAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZAogICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldAogIH0KfSkKCmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7CiAgaWYgKGxlbmd0aCA-IEtfTUFYX0xFTkdUSCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIGxlbmd0aCArICciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKQogIH0KICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZQogIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpCiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGUKICByZXR1cm4gYnVmCn0KCi8qKgogKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXIKICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZgogKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzCiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0CiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuCiAqCiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC4KICovCgpmdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7CiAgLy8gQ29tbW9uIGNhc2UuCiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7CiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicKICAgICAgKQogICAgfQogICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZykKICB9CiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpCn0KCi8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3CmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAhPSBudWxsICYmCiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywgewogICAgdmFsdWU6IG51bGwsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgIHdyaXRhYmxlOiBmYWxzZQogIH0pCn0KCkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgoKZnVuY3Rpb24gZnJvbSAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkgewogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCkKICB9CgogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7CiAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh2YWx1ZSkKICB9CgogIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoCiAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICsKICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKQogICAgKQogIH0KCiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fAogICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkpIHsKICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkKICB9CgogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAnVGhlICJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJwogICAgKQogIH0KCiAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKQogIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHsKICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpCiAgfQoKICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpCiAgaWYgKGIpIHJldHVybiBiCgogIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJgogICAgICB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgcmV0dXJuIEJ1ZmZlci5mcm9tKAogICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoCiAgICApCiAgfQoKICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgKwogICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKQogICkKfQoKLyoqCiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yCiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLgogKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pCiAqIEJ1ZmZlci5mcm9tKGFycmF5KQogKiBCdWZmZXIuZnJvbShidWZmZXIpCiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKQogKiovCkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHsKICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKQp9CgovLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6Ci8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4CkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGUKQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkKCmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHsKICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpCiAgfSBlbHNlIGlmIChzaXplIDwgMCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIHNpemUgKyAnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJykKICB9Cn0KCmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykgewogIGFzc2VydFNpemUoc2l6ZSkKICBpZiAoc2l6ZSA8PSAwKSB7CiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpCiAgfQogIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHsKICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzCiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkCiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuCiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJwogICAgICA_IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKQogICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpCiAgfQogIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSkKfQoKLyoqCiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS4KICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKQogKiovCkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykgewogIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZykKfQoKZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHsKICBhc3NlcnRTaXplKHNpemUpCiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA_IDAgOiBjaGVja2VkKHNpemUpIHwgMCkKfQoKLyoqCiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuCiAqICovCkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7CiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpCn0KLyoqCiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLgogKi8KQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7CiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpCn0KCmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHsKICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHsKICAgIGVuY29kaW5nID0gJ3V0ZjgnCiAgfQoKICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKQogIH0KCiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwCiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpCgogIHZhciBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZykKCiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7CiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGwKICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuCiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJykKICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpCiAgfQoKICByZXR1cm4gYnVmCn0KCmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7CiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMAogIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKQogIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1CiAgfQogIHJldHVybiBidWYKfQoKZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignIm9mZnNldCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJykKICB9CgogIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcibGVuZ3RoIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKQogIH0KCiAgdmFyIGJ1ZgogIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KQogIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KQogIH0gZWxzZSB7CiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKQogIH0KCiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UKICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZQogIHJldHVybiBidWYKfQoKZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7CiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7CiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDAKICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuKQoKICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBidWYKICAgIH0KCiAgICBvYmouY29weShidWYsIDAsIDAsIGxlbikKICAgIHJldHVybiBidWYKICB9CgogIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHsKICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcigwKQogICAgfQogICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKQogIH0KCiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkgewogICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpCiAgfQp9CgpmdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHsKICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW4KICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLikKICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKQogIH0KICByZXR1cm4gbGVuZ3RoIHwgMAp9CgpmdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHsKICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEKICAgIGxlbmd0aCA9IDAKICB9CiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKQp9CgpCdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikgewogIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiYKICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2UKfQoKQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7CiAgaWYgKGlzSW5zdGFuY2UoYSwgVWludDhBcnJheSkpIGEgPSBCdWZmZXIuZnJvbShhLCBhLm9mZnNldCwgYS5ieXRlTGVuZ3RoKQogIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aCkKICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAnVGhlICJidWYxIiwgImJ1ZjIiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5JwogICAgKQogIH0KCiAgaWYgKGEgPT09IGIpIHJldHVybiAwCgogIHZhciB4ID0gYS5sZW5ndGgKICB2YXIgeSA9IGIubGVuZ3RoCgogIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7CiAgICBpZiAoYVtpXSAhPT0gYltpXSkgewogICAgICB4ID0gYVtpXQogICAgICB5ID0gYltpXQogICAgICBicmVhawogICAgfQogIH0KCiAgaWYgKHggPCB5KSByZXR1cm4gLTEKICBpZiAoeSA8IHgpIHJldHVybiAxCiAgcmV0dXJuIDAKfQoKQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykgewogIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7CiAgICBjYXNlICdoZXgnOgogICAgY2FzZSAndXRmOCc6CiAgICBjYXNlICd1dGYtOCc6CiAgICBjYXNlICdhc2NpaSc6CiAgICBjYXNlICdsYXRpbjEnOgogICAgY2FzZSAnYmluYXJ5JzoKICAgIGNhc2UgJ2Jhc2U2NCc6CiAgICBjYXNlICd1Y3MyJzoKICAgIGNhc2UgJ3Vjcy0yJzoKICAgIGNhc2UgJ3V0ZjE2bGUnOgogICAgY2FzZSAndXRmLTE2bGUnOgogICAgICByZXR1cm4gdHJ1ZQogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlCiAgfQp9CgpCdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKQogIH0KCiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApCiAgfQoKICB2YXIgaQogIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkgewogICAgbGVuZ3RoID0gMAogICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoCiAgICB9CiAgfQoKICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aCkKICB2YXIgcG9zID0gMAogIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7CiAgICB2YXIgYnVmID0gbGlzdFtpXQogICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkgewogICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpCiAgICB9CiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKQogICAgfQogICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpCiAgICBwb3MgKz0gYnVmLmxlbmd0aAogIH0KICByZXR1cm4gYnVmZmVyCn0KCmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHsKICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHsKICAgIHJldHVybiBzdHJpbmcubGVuZ3RoCiAgfQogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7CiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGgKICB9CiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAnVGhlICJzdHJpbmciIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICsKICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmcKICAgICkKICB9CgogIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoCiAgdmFyIG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpCiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMAoKICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb24KICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZQogIGZvciAoOzspIHsKICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgICAgY2FzZSAnYXNjaWknOgogICAgICBjYXNlICdsYXRpbjEnOgogICAgICBjYXNlICdiaW5hcnknOgogICAgICAgIHJldHVybiBsZW4KICAgICAgY2FzZSAndXRmOCc6CiAgICAgIGNhc2UgJ3V0Zi04JzoKICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGgKICAgICAgY2FzZSAndWNzMic6CiAgICAgIGNhc2UgJ3Vjcy0yJzoKICAgICAgY2FzZSAndXRmMTZsZSc6CiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzoKICAgICAgICByZXR1cm4gbGVuICogMgogICAgICBjYXNlICdoZXgnOgogICAgICAgIHJldHVybiBsZW4gPj4-IDEKICAgICAgY2FzZSAnYmFzZTY0JzoKICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aAogICAgICBkZWZhdWx0OgogICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgewogICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA_IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjgKICAgICAgICB9CiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKQogICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZQogICAgfQogIH0KfQpCdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGgKCmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHsKICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZQoKICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0ICJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5CiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS4KCiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kCiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLgogIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sCiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uCiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7CiAgICBzdGFydCA9IDAKICB9CiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzIKICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LgogIGlmIChzdGFydCA-IHRoaXMubGVuZ3RoKSB7CiAgICByZXR1cm4gJycKICB9CgogIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkgewogICAgZW5kID0gdGhpcy5sZW5ndGgKICB9CgogIGlmIChlbmQgPD0gMCkgewogICAgcmV0dXJuICcnCiAgfQoKICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLgogIGVuZCA-Pj49IDAKICBzdGFydCA-Pj49IDAKCiAgaWYgKGVuZCA8PSBzdGFydCkgewogICAgcmV0dXJuICcnCiAgfQoKICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JwoKICB3aGlsZSAodHJ1ZSkgewogICAgc3dpdGNoIChlbmNvZGluZykgewogICAgICBjYXNlICdoZXgnOgogICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKQoKICAgICAgY2FzZSAndXRmOCc6CiAgICAgIGNhc2UgJ3V0Zi04JzoKICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCgogICAgICBjYXNlICdhc2NpaSc6CiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZCkKCiAgICAgIGNhc2UgJ2xhdGluMSc6CiAgICAgIGNhc2UgJ2JpbmFyeSc6CiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCgogICAgICBjYXNlICdiYXNlNjQnOgogICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKQoKICAgICAgY2FzZSAndWNzMic6CiAgICAgIGNhc2UgJ3Vjcy0yJzoKICAgICAgY2FzZSAndXRmMTZsZSc6CiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzoKICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCgogICAgICBkZWZhdWx0OgogICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKQogICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkKICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWUKICAgIH0KICB9Cn0KCi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSkKLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYAovLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudAovLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXIKLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLgovLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTQKQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlCgpmdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7CiAgdmFyIGkgPSBiW25dCiAgYltuXSA9IGJbbV0KICBiW21dID0gaQp9CgpCdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7CiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoCiAgaWYgKGxlbiAlIDIgIT09IDApIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpCiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKICAgIHN3YXAodGhpcywgaSwgaSArIDEpCiAgfQogIHJldHVybiB0aGlzCn0KCkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHsKICB2YXIgbGVuID0gdGhpcy5sZW5ndGgKICBpZiAobGVuICUgNCAhPT0gMCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJykKICB9CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkgewogICAgc3dhcCh0aGlzLCBpLCBpICsgMykKICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKQogIH0KICByZXR1cm4gdGhpcwp9CgpCdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7CiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoCiAgaWYgKGxlbiAlIDggIT09IDApIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpCiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHsKICAgIHN3YXAodGhpcywgaSwgaSArIDcpCiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNikKICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KQogICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpCiAgfQogIHJldHVybiB0aGlzCn0KCkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7CiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoCiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKQogIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKQp9CgpCdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZwoKQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHsKICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpCiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlCiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwCn0KCkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkgewogIHZhciBzdHIgPSAnJwogIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTCiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKQogIGlmICh0aGlzLmxlbmd0aCA-IG1heCkgc3RyICs9ICcgLi4uICcKICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc-Jwp9CgpCdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkgewogIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHsKICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpCiAgfQogIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICdUaGUgInRhcmdldCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArCiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldCkKICAgICkKICB9CgogIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7CiAgICBzdGFydCA9IDAKICB9CiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7CiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMAogIH0KICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHsKICAgIHRoaXNTdGFydCA9IDAKICB9CiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkgewogICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoCiAgfQoKICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA-IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKQogIH0KCiAgaWYgKHRoaXNTdGFydCA-PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkgewogICAgcmV0dXJuIDAKICB9CiAgaWYgKHRoaXNTdGFydCA-PSB0aGlzRW5kKSB7CiAgICByZXR1cm4gLTEKICB9CiAgaWYgKHN0YXJ0ID49IGVuZCkgewogICAgcmV0dXJuIDEKICB9CgogIHN0YXJ0ID4-Pj0gMAogIGVuZCA-Pj49IDAKICB0aGlzU3RhcnQgPj4-PSAwCiAgdGhpc0VuZCA-Pj49IDAKCiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDAKCiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0CiAgdmFyIHkgPSBlbmQgLSBzdGFydAogIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KQoKICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZCkKICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKQoKICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHsKICAgICAgeCA9IHRoaXNDb3B5W2ldCiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldCiAgICAgIGJyZWFrCiAgICB9CiAgfQoKICBpZiAoeCA8IHkpIHJldHVybiAtMQogIGlmICh5IDwgeCkgcmV0dXJuIDEKICByZXR1cm4gMAp9CgovLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA-PSBgYnl0ZU9mZnNldGAsCi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuCi8vCi8vIEFyZ3VtZW50czoKLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2gKLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXIKLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyCi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nCi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mCmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikgewogIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaAogIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTEKCiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQKICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7CiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXQKICAgIGJ5dGVPZmZzZXQgPSAwCiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikgewogICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmYKICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkgewogICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwCiAgfQogIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLgogIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkgewogICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgImZvbyIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlcgogICAgYnl0ZU9mZnNldCA9IGRpciA_IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpCiAgfQoKICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgogIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0CiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkgewogICAgaWYgKGRpcikgcmV0dXJuIC0xCiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMQogIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHsKICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwCiAgICBlbHNlIHJldHVybiAtMQogIH0KCiAgLy8gTm9ybWFsaXplIHZhbAogIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZykKICB9CgogIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mCiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7CiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzCiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gLTEKICAgIH0KICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpCiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdCiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHsKICAgICAgaWYgKGRpcikgewogICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKQogIH0KCiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11